Warning, /libraries/kunifiedpush/src/kcm/ui/main.qml is written in an unsupported language. File is not indexed.
0001 /* 0002 SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org> 0003 SPDX-License-Identifier: LGPL-2.0-or-later 0004 */ 0005 0006 import QtQuick 0007 import QtQuick.Layouts 0008 import QtQuick.Controls as QQC2 0009 import org.kde.kirigami as Kirigami 0010 import org.kde.kirigami.delegates as KirigamiDelegates 0011 import org.kde.kcmutils as KCM 0012 import org.kde.kunifiedpush.kcm 0013 0014 KCM.ScrollViewKCM { 0015 id: root 0016 readonly property var pushProviderConfig: kcm.pushProviderConfiguration(pushProviderBox.currentText) 0017 0018 header: QQC2.Control { 0019 padding: Kirigami.Units.largeSpacing 0020 0021 background: Rectangle { 0022 Kirigami.Theme.colorSet: Kirigami.Theme.Window 0023 Kirigami.Theme.inherit: false 0024 0025 color: Kirigami.Theme.backgroundColor 0026 } 0027 0028 contentItem: ColumnLayout { 0029 id: headerColumn 0030 0031 // type of distributor, and if it is our own one, distributor status information 0032 Kirigami.InlineMessage { 0033 Layout.fillWidth: true 0034 showCloseButton: false 0035 type: Kirigami.MessageType.Error 0036 text: i18n("There is no push notification service running!") 0037 icon.name: "dialog-error" 0038 visible: !kcm.hasDistributor 0039 } 0040 Kirigami.InlineMessage { 0041 Layout.fillWidth: true 0042 showCloseButton: false 0043 type: Kirigami.MessageType.Information 0044 text: i18n("There is a 3rd party push notification service running. Push notifications are available, but cannot be configured here.") 0045 icon.name: "dialog-information" 0046 visible: !kcm.hasKDEDistributor && kcm.hasDistributor 0047 } 0048 Kirigami.InlineMessage { 0049 Layout.fillWidth: true 0050 showCloseButton: false 0051 type: Kirigami.MessageType.Positive 0052 text: i18n("<b>Online</b><br>Connected to the push notification server and operational.") 0053 icon.name: "media-playback-playing" 0054 visible: kcm.hasKDEDistributor && kcm.distributorStatus == DistributorStatus.Connected 0055 } 0056 Kirigami.InlineMessage { 0057 Layout.fillWidth: true 0058 showCloseButton: false 0059 type: Kirigami.MessageType.Information 0060 text: i18n("<b>Idle</b><br>There are no applications using push notifications.") 0061 icon.name: "media-playback-paused" 0062 visible: kcm.hasKDEDistributor && kcm.distributorStatus == DistributorStatus.Idle 0063 } 0064 Kirigami.InlineMessage { 0065 Layout.fillWidth: true 0066 showCloseButton: false 0067 type: Kirigami.MessageType.Warning 0068 text: i18n("<b>Offline</b><br>Network connection to the server could not be established.") 0069 icon.name: "network-disconnect" 0070 visible: kcm.hasKDEDistributor && kcm.distributorStatus == DistributorStatus.NoNetwork 0071 } 0072 Kirigami.InlineMessage { 0073 Layout.fillWidth: true 0074 showCloseButton: false 0075 type: Kirigami.MessageType.Error 0076 text: i18n("<b>Offline</b><br>Could not authenticate at the server.") 0077 icon.name: "dialog-error" 0078 visible: kcm.hasKDEDistributor && kcm.distributorStatus == DistributorStatus.AuthenticationError 0079 } 0080 Kirigami.InlineMessage { 0081 Layout.fillWidth: true 0082 showCloseButton: false 0083 type: Kirigami.MessageType.Warning 0084 text: i18n("<b>Offline</b><br>Push notifications are not set up yet.") 0085 icon.name: "configure" 0086 visible: kcm.hasKDEDistributor && kcm.distributorStatus == DistributorStatus.NoSetup 0087 } 0088 0089 // push provider configuration 0090 Kirigami.FormLayout { 0091 id: topForm 0092 visible: kcm.hasKDEDistributor 0093 Layout.fillWidth: true 0094 QQC2.ComboBox { 0095 id: pushProviderBox 0096 Kirigami.FormData.label: i18n("Push provider:") 0097 model: ["Gotify", "NextPush", "Ntfy"] 0098 currentIndex: find(kcm.pushProviderId) 0099 Component.onCompleted: currentIndex = find(kcm.pushProviderId) 0100 } 0101 } 0102 0103 Component { 0104 id: gotifyForm 0105 Kirigami.FormLayout { 0106 readonly property bool dirty: urlField.text != root.pushProviderConfig['Url'] || tokenField.text != root.pushProviderConfig['ClientToken'] 0107 0108 function config() { 0109 let c = root.pushProviderConfig; 0110 c['Url'] = urlField.text; 0111 c['ClientToken'] = tokenField.text; 0112 return c; 0113 } 0114 0115 twinFormLayouts: [topForm] 0116 QQC2.TextField { 0117 id: urlField 0118 Kirigami.FormData.label: i18n("Url:") 0119 text: root.pushProviderConfig['Url'] 0120 } 0121 QQC2.TextField { 0122 id: tokenField 0123 Kirigami.FormData.label: i18n("Client token:") 0124 text: root.pushProviderConfig['ClientToken'] 0125 } 0126 } 0127 } 0128 Component { 0129 id: nextpushForm 0130 Kirigami.FormLayout { 0131 id: nextpushConfig 0132 readonly property bool dirty: urlField.text != root.pushProviderConfig['Url'] || userField.text != root.pushProviderConfig['Username'] || appPassword != root.pushProviderConfig['AppPassword'] 0133 property string appPassword: root.pushProviderConfig['AppPassword']; 0134 function config() { 0135 let c = root.pushProviderConfig; 0136 c['Url'] = urlField.text; 0137 c['Username'] = userField.text; 0138 c['AppPassword'] = appPassword; 0139 return c; 0140 } 0141 0142 twinFormLayouts: [topForm] 0143 QQC2.TextField { 0144 id: urlField 0145 Kirigami.FormData.label: i18n("Url:") 0146 text: root.pushProviderConfig['Url'] 0147 } 0148 QQC2.Label { 0149 id: userField 0150 Kirigami.FormData.label: i18n("User name:") 0151 text: root.pushProviderConfig['Username'] 0152 } 0153 RowLayout { 0154 QQC2.Button { 0155 enabled: urlField.text != "" 0156 text: i18n("Authenticate") 0157 onClicked: { 0158 authBusy.running = true; 0159 kcm.nextcloudAuthenticate(urlField.text); 0160 } 0161 0162 } 0163 QQC2.BusyIndicator { 0164 id: authBusy 0165 running: false 0166 } 0167 } 0168 Connections { 0169 target: kcm 0170 0171 function onNextcloudAuthenticated(loginName, appPassword) { 0172 userField.text = loginName; 0173 nextpushConfig.appPassword = appPassword 0174 authBusy.running = false; 0175 } 0176 } 0177 } 0178 } 0179 Component { 0180 id: ntfyForm 0181 Kirigami.FormLayout { 0182 id: ntfyConfig 0183 readonly property bool dirty: urlField.text != root.pushProviderConfig['Url'] 0184 0185 function config() { 0186 let c = root.pushProviderConfig; 0187 c['Url'] = urlField.text; 0188 return c; 0189 } 0190 0191 twinFormLayouts: [topForm] 0192 QQC2.TextField { 0193 id: urlField 0194 Kirigami.FormData.label: i18n("Url:") 0195 text: root.pushProviderConfig['Url'] 0196 } 0197 } 0198 } 0199 0200 Loader { 0201 id: providerFormLoader 0202 Layout.fillWidth: true 0203 visible: kcm.hasKDEDistributor 0204 sourceComponent: { 0205 switch (pushProviderBox.currentIndex) { 0206 case 0: 0207 return gotifyForm; 0208 case 1: 0209 return nextpushForm; 0210 case 2: 0211 return ntfyForm; 0212 } 0213 return undefined; 0214 } 0215 } 0216 0217 Connections { 0218 target: kcm 0219 0220 function onSaveRequested() { 0221 kcm.setPushProviderConfiguration(pushProviderBox.currentText, providerFormLoader.item.config()); 0222 } 0223 } 0224 Binding { 0225 target: kcm 0226 property: "needsSave" 0227 value: providerFormLoader.item.dirty || pushProviderBox.currentText != kcm.pushProviderId 0228 } 0229 } 0230 } 0231 0232 // registered clients 0233 view: ListView { 0234 model: kcm.clientModel 0235 header: Kirigami.InlineViewHeader { 0236 width: ListView.view.width 0237 text: i18n("Applications") 0238 } 0239 visible: count > 0 0240 0241 delegate: QQC2.ItemDelegate { 0242 width: ListView.view.width 0243 0244 text: model.display 0245 0246 down: false 0247 highlighted: false 0248 hoverEnabled: false 0249 0250 Kirigami.Theme.useAlternateBackgroundColor: true 0251 0252 contentItem: RowLayout { 0253 spacing: 0 0254 KirigamiDelegates.IconTitleSubtitle { 0255 title: model.name 0256 subtitle: model.description 0257 icon.source: model.iconName 0258 } 0259 Item { 0260 Layout.fillWidth: true 0261 } 0262 QQC2.ToolButton { 0263 icon.name: "edit-delete" 0264 0265 onClicked: removePrompt.open() 0266 0267 QQC2.ToolTip.text: i18n("Unregister application from push notifications") 0268 0269 Kirigami.PromptDialog { 0270 id: removePrompt 0271 0272 parent: QQC2.Overlay.overlay 0273 0274 title: i18nc("@title:window", "Unregister Application") 0275 subtitle: i18nc("%1 is an application name", "Are you sure you want to unregister '%1'?", model.name) 0276 standardButtons: Kirigami.Dialog.Ok | Kirigami.Dialog.Cancel 0277 0278 onAccepted: kcm.forceUnregister(model.token) 0279 } 0280 } 0281 } 0282 } 0283 } 0284 }