Warning, /plasma-mobile/calindori/src/contents/ui/ManageCalendarsPage.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2020 Dimitris Kardarakos <dimkard@posteo.net>
0003 * SPDX-FileCopyrightText: 2022 Devin Lin <devin@kde.org>
0004 *
0005 * SPDX-License-Identifier: GPL-3.0-or-later
0006 */
0007
0008 import QtQuick 2.15
0009 import QtQuick.Layouts 1.15
0010 import QtQuick.Controls 2.15 as Controls
0011 import QtQml.Models 2.15
0012 import org.kde.kirigami 2.19 as Kirigami
0013 import org.kde.calindori 0.1 as Calindori
0014
0015 Kirigami.ScrollablePage {
0016 id: root
0017
0018 property var applicationFooter
0019 property var calendarModel
0020 property bool isExternal: false
0021
0022 mainAction: Kirigami.Action {
0023 text: root.isExternal ? i18n("Add") : i18n("Create")
0024 iconName: root.isExternal ? "resource-calendar-child-insert" : "resource-calendar-insert"
0025 onTriggered: {
0026 applicationWindow().pageStack.push(calendarEditor,
0027 {mode: root.isExternal ? CalendarEditor.Mode.AddExisting : CalendarEditor.Mode.Create});
0028 }
0029 }
0030
0031 ListView {
0032 id: listView
0033 model: calendarModel
0034 currentIndex: -1
0035
0036 Kirigami.PlaceholderMessage {
0037 anchors.centerIn: parent
0038 visible: listView.count === 0
0039
0040 icon.name: "view-calendar"
0041 text: root.isExternal ? i18n("No external calendars found") :
0042 i18n("No calendars found")
0043 explanation: root.isExternal ? i18n("Import an existing calendar file.") :
0044 i18n("Add a new calendar.")
0045 helpfulAction: root.mainAction
0046 }
0047
0048 // create new calendar editor
0049 Component {
0050 id: calendarEditor
0051
0052 CalendarEditor {
0053 loadedCalendar: root.calendar
0054 onCalendarEditorSaved: pageStack.pop()
0055 onCalendarEditorCancelled: pageStack.pop()
0056 }
0057 }
0058
0059 // dialog that pops up for editing
0060 Kirigami.MenuDialog {
0061 id: modifyDialog
0062 property var calendarName: ""
0063 property bool calendarActive: Calindori.CalindoriConfig !== null ? (Calindori.CalindoriConfig.activeCalendar === calendarName) : false
0064
0065 title: i18n("Modify " + calendarName)
0066 actions: [
0067 Kirigami.Action {
0068 text: i18n("Activate")
0069 iconName: "dialog-ok"
0070 visible: !modifyDialog.calendarActive
0071
0072 onTriggered: {
0073 modifyDialog.close();
0074 Calindori.CalindoriConfig.activeCalendar = modifyDialog.calendarName;
0075 popExtraLayers();
0076 showPassiveNotification(i18n("Calendar %1 has been activated", modifyDialog.calendarName));
0077 }
0078 },
0079
0080 Kirigami.Action {
0081 text: i18n("Delete")
0082 iconName: "entry-delete"
0083 visible: !Calindori.CalindoriConfig.isExternal(modifyDialog.calendarName)
0084 onTriggered: {
0085 modifyDialog.close();
0086 if (modifyDialog.calendarActive) {
0087 showPassiveNotification(i18n("Calendar must not be active when being deleted."));
0088 } else {
0089 deleteSheet.calendarName = modifyDialog.calendarName;
0090 deleteSheet.timer.restart();
0091 }
0092 }
0093 },
0094
0095 Kirigami.Action {
0096 text: i18n("Remove")
0097 iconName: "edit-delete"
0098 visible: Calindori.CalindoriConfig.isExternal(modifyDialog.calendarName)
0099 onTriggered: {
0100 modifyDialog.close();
0101 if (modifyDialog.calendarActive) {
0102 showPassiveNotification(i18n("Calendar must not be active when being deleted."));
0103 } else {
0104 Calindori.CalindoriConfig.removeCalendar(modifyDialog.calendarName);
0105 }
0106 }
0107 },
0108
0109 Kirigami.Action {
0110 text: i18n("Edit details")
0111 iconName: "edit-entry"
0112 onTriggered: {
0113 modifyDialog.close();
0114 applicationWindow().pageStack.push(editor, { calendarName: modifyDialog.calendarName });
0115 }
0116 },
0117
0118 Kirigami.Action {
0119 text: i18n("Import calendar file")
0120 iconName: "document-import"
0121 onTriggered: {
0122 modifyDialog.close();
0123 root.applicationFooter.targetCalendarName = modifyDialog.calendarName;
0124 fileChooser.open();
0125 }
0126 },
0127
0128 Kirigami.Action {
0129 text: i18n("Export calendar to file")
0130 iconName: "document-export"
0131 onTriggered: {
0132 modifyDialog.close();
0133 var exportResult = Calindori.CalendarController.exportData(modifyDialog.calendarName);
0134 root.applicationFooter.text = exportResult.reason;
0135
0136 if (!(exportResult.success)) {
0137 root.applicationFooter.footerMode = MessageBoard.FooterMode.EndExportFailure;
0138 return;
0139 }
0140
0141 root.applicationFooter.targetFolder = exportResult.targetFolder;
0142 root.applicationFooter.footerMode = MessageBoard.FooterMode.EndExportSuccess;
0143 }
0144 }
0145 ]
0146 }
0147
0148 // confirmation dialog for deletion
0149 Kirigami.PromptDialog {
0150 id: deleteSheet
0151 property string calendarName
0152
0153 title: i18n("Confirm")
0154 subtitle: i18n("All data included in this calendar will be deleted. Proceed with deletion?")
0155
0156 standardButtons: Kirigami.Dialog.Yes | Kirigami.Dialog.No
0157 onAccepted: {
0158 var toRemoveCalendarComponent = Qt.createQmlObject("import org.kde.calindori 0.1 as Calindori; Calindori.LocalCalendar { name: \"" + calendarName + "\"}",deleteSheet);
0159 toRemoveCalendarComponent.deleteCalendar();
0160 Calindori.CalindoriConfig.removeCalendar(calendarName);
0161 }
0162
0163 // workaround for dialog closing immediately
0164 property var timer: Timer {
0165 interval: 50
0166 running: false
0167 onTriggered: deleteSheet.open();
0168 }
0169 }
0170
0171 // calendar editor
0172 Component {
0173 id: editor
0174
0175 CalendarEditor {
0176 id: editor
0177 mode: CalendarEditor.Mode.Edit
0178 ownerName: Calindori.CalindoriConfig.ownerName(editor.calendarName)
0179 ownerEmail: Calindori.CalindoriConfig.ownerEmail(editor.calendarName)
0180
0181 onCalendarEditorCancelled: applicationWindow().pageStack.pop()
0182 onCalendarEditorSaved: {
0183 applicationWindow().pageStack.pop();
0184 if (Calindori.CalindoriConfig.activeCalendar && (Calindori.CalindoriConfig.activeCalendar.name === editor.calendarName)) {
0185 Calindori.CalindoriConfig.activeCalendar.ownerName = ownerName;
0186 Calindori.CalindoriConfig.activeCalendar.ownerEmail = ownerEmail;
0187 }
0188 }
0189 }
0190 }
0191
0192 FileChooser {
0193 id: fileChooser
0194
0195 onAccepted: Calindori.DataHandler.importFromUrl(fileUrl)
0196 }
0197
0198 // list delegate
0199 delegate: Kirigami.SwipeListItem {
0200 property string calendarName: modelData
0201
0202 contentItem: RowLayout {
0203 spacing: 0
0204
0205 Kirigami.Icon {
0206 Layout.leftMargin: Kirigami.Units.largeSpacing
0207 Layout.rightMargin: Kirigami.Units.largeSpacing + Kirigami.Units.smallSpacing
0208 Layout.alignment: Qt.AlignVCenter
0209 source: "view-calendar"
0210 implicitHeight: Kirigami.Units.iconSizes.smallMedium
0211 implicitWidth: Kirigami.Units.iconSizes.smallMedium
0212 }
0213
0214 Kirigami.Heading {
0215 Layout.fillWidth: true
0216 type: Kirigami.Heading.Secondary
0217 level: 6
0218 text: calendarName
0219 elide: Text.ElideRight
0220 }
0221 }
0222
0223 onClicked: {
0224 modifyDialog.calendarName = calendarName
0225 modifyDialog.open();
0226 }
0227
0228 actions: [
0229 Kirigami.Action {
0230 text: i18n("Modify")
0231 icon.name: "entry-edit"
0232 onTriggered: {
0233 modifyDialog.calendarName = calendarName
0234 modifyDialog.open();
0235 }
0236 }
0237 ]
0238 }
0239
0240 }
0241 }