Alisa/native/MainPage.qml
2024-07-12 11:15:16 +02:00

274 lines
10 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 2.15
Rectangle {
id: root
SystemPalette { id: activeColors; colorGroup: SystemPalette.Active }
SystemPalette { id: inactiveColors; colorGroup: SystemPalette.Inactive }
SystemPalette { id: disabledColors; colorGroup: SystemPalette.Disabled }
function getColors() {
return active ? activeColors : inactiveColors;
}
property string authToken: ""
property string searchText: "" // Property to hold the search text
signal logout()
Rectangle {
id: s1
anchors {
top: parent.top
left: parent.left
right: parent.right
}
height: 50
color: getColors().midlight
RowLayout {
anchors.fill: parent
spacing: 10
anchors.margins: 5
TextField {
id: searchField
placeholderText: qsTr("Search")
Layout.alignment: Qt.AlignVCenter
Layout.fillWidth: true
onTextChanged: {
searchText = text
filterModel() // Filter model based on search text
}
}
Button {
text: qsTr("Add License")
Layout.alignment: Qt.AlignVCenter
onClicked: {
// Create and show a new window
var newWindow = addLicenseWindow.createObject(null, { authToken: authToken });
if (newWindow !== null) {
newWindow.show();
} else {
console.log("Failed to create new window");
}
}
}
Button {
text: qsTr("Add License Group")
Layout.alignment: Qt.AlignVCenter
onClicked: {
// Create and show a new window
var newWindow = addLicenseGroupWindow.createObject(null, { authToken: authToken });
if (newWindow !== null) {
newWindow.show();
} else {
console.log("Failed to create new window");
}
}
}
Button {
text: qsTr("Dellete Group")
Layout.alignment: Qt.AlignVCenter
onClicked: {
//
var newWindow = addDellgrup.createObject(null, { authToken: authToken });
if (newWindow !== null) {
newWindow.show();
} else {
console.log("Failed to create new window");
}
}
}
Button {
id: loginB
text: qsTr("Logout")
Layout.alignment: Qt.AlignVCenter
onClicked: {
logout();
}
}
}
}
Rectangle {
id: s2
anchors {
top: s1.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
color: getColors().window
ColumnLayout {
anchors.fill: parent
spacing: 0
Rectangle {
height: 50
id: rect1
width: parent.width
color: getColors().midlight
RowLayout {
anchors.fill: parent
spacing: 10
anchors.margins: 5
Text { text: qsTr("Name"); color: getColors().text; Layout.preferredWidth: 150; font.bold: true }
Text { text: qsTr("Key"); color: getColors().text; Layout.preferredWidth: 150; font.bold: true }
Text { text: qsTr("Amount"); color: getColors().text; Layout.preferredWidth: 100; font.bold: true }
Text { text: qsTr("Start"); color: getColors().text; Layout.preferredWidth: 100; font.bold: true }
Text { text: qsTr("End"); color: getColors().text; Layout.preferredWidth: 100; font.bold: true }
Text { text: qsTr("Group"); color: getColors().text; Layout.preferredWidth: 150; font.bold: true }
Text { text: qsTr("Actions"); color: getColors().text; Layout.preferredWidth: 100; font.bold: true }
}
}
ScrollView {
Layout.fillWidth: true
Layout.fillHeight: true
ListView {
id: listView
Layout.fillWidth: true
Layout.fillHeight: true
model: filteredApiDataModel // Use the filtered model
delegate: Rectangle {
width: listView.width
height: 50
color: (index % 2 === 0) ? getColors().button : getColors().highlight // Alternating row colors
RowLayout {
anchors.fill: parent
spacing: 10
anchors.margins: 5
Text { text: model.name; color: getColors().text; Layout.preferredWidth: 150; elide: Text.ElideRight }
Text { text: model.key; color: getColors().text; Layout.preferredWidth: 150; elide: Text.ElideRight }
Text { text: model.amount; color: getColors().text; Layout.preferredWidth: 100; elide: Text.ElideRight }
Text { text: model.start; color: getColors().text; Layout.preferredWidth: 100; elide: Text.ElideRight }
Text { text: model.end; color: getColors().text; Layout.preferredWidth: 100; elide: Text.ElideRight }
Text { text: model.group; color: getColors().text; Layout.preferredWidth: 150; elide: Text.ElideRight }
Button {
text: qsTr("Delete")
Layout.preferredWidth: 100
onClicked: {
deleteLicense(model.id)
}
}
}
}
}
}
ListModel {
id: apiDataModel
}
ListModel {
id: filteredApiDataModel
}
}
}
Component {
id: addLicenseWindow
AddData {
id: dataWindow
authToken: authToken
}
}
Component {
id: addLicenseGroupWindow
AddGroup {
id: dataWindow
authToken: authToken
}
}
Component.onCompleted: {
loadLicenses()
}
function loadLicenses() {
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.clan-war.net/api/v1/licenses");
xhr.setRequestHeader("Authorization", "Bearer " + authToken);
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
var jsonResponse = JSON.parse(xhr.responseText);
apiDataModel.clear();
for (var i = 0; i < jsonResponse.length; i++) {
for (var ii = 0; ii < jsonResponse[i].licenses.length; ii++) {
apiDataModel.append({
group: jsonResponse[i].name,
name: jsonResponse[i].licenses[ii].name,
start: jsonResponse[i].licenses[ii].start ?? "Indefinitely",
end: jsonResponse[i].licenses[ii].end ?? "Indefinitely",
amount: jsonResponse[i].licenses[ii].amount ? jsonResponse[i].licenses[ii].amount.toString() : "∞",
key: jsonResponse[i].licenses[ii].key,
id: jsonResponse[i].licenses[ii].id
});
}
}
filterModel() // Filter the model after loading data
} else {
console.log("Error: " + xhr.status);
}
}
}
xhr.send();
}
function filterModel() {
filteredApiDataModel.clear()
for (var i = 0; i < apiDataModel.count; ++i) {
var item = apiDataModel.get(i)
var name = item.name ? item.name.toString().toLowerCase() : ""
var key = item.key ? item.key.toString().toLowerCase() : ""
var amount = item.amount ? item.amount.toString().toLowerCase() : ""
var start = item.start ? item.start.toString().toLowerCase() : ""
var end = item.end ? item.end.toString().toLowerCase() : ""
var group = item.group ? item.group.toString().toLowerCase() : ""
if (name.indexOf(searchText.toLowerCase()) !== -1 ||
key.indexOf(searchText.toLowerCase()) !== -1 ||
amount.indexOf(searchText.toLowerCase()) !== -1 ||
start.indexOf(searchText.toLowerCase()) !== -1 ||
end.indexOf(searchText.toLowerCase()) !== -1 ||
group.indexOf(searchText.toLowerCase()) !== -1) {
filteredApiDataModel.append(item)
}
}
}
function deleteLicense(id) {
var xhr = new XMLHttpRequest();
xhr.open("DELETE", "https://api.clan-war.net/api/v1/licenses/" + id);
xhr.setRequestHeader("Authorization", "Bearer " + authToken);
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status === 200) {
console.log("License deleted successfully");
loadLicenses(); // Reload licenses after deletion
} else {
console.log("Error deleting license: " + xhr.status);
}
}
}
xhr.send();
}
}