Warning, /plasma-mobile/calindori/src/contents/ui/TodoEditorPage.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * SPDX-FileCopyrightText: 2020 Dimitris Kardarakos <dimkard@posteo.net>
0003 *
0004 * SPDX-License-Identifier: GPL-3.0-or-later
0005 */
0006
0007 import QtQuick 2.7
0008 import QtQuick.Controls 2.0 as Controls2
0009 import QtQuick.Layouts 1.3
0010 import org.kde.kirigami 2.12 as Kirigami
0011 import org.kde.calindori 0.1 as Calindori
0012
0013 Kirigami.Page {
0014 id: root
0015
0016 property alias startDt: startDateSelector.selectorDate
0017 property string uid
0018 property alias summary: summary.text
0019 property alias description: incidenceEditor.description
0020 property alias startHour: startTimeSelector.selectorHour
0021 property alias startMinute: startTimeSelector.selectorMinutes
0022 property alias startPm: startTimeSelector.selectorPm
0023 property alias dueDt: dueDateSelector.selectorDate
0024 property alias dueHour: dueDtTimeSelector.selectorHour
0025 property alias dueMinute: dueDtTimeSelector.selectorMinutes
0026 property alias duePm: dueDtTimeSelector.selectorPm
0027 property alias allDay: allDaySelector.checked
0028 property alias location: incidenceEditor.location
0029 property alias completed: incidenceEditor.completed
0030 property var incidenceData
0031 property bool isEditorPage: true
0032
0033 signal editcompleted
0034
0035 title: uid === "" ? i18n("Create Task") : root.summary
0036
0037 ColumnLayout {
0038 anchors.centerIn: parent
0039 spacing: Kirigami.Units.smallSpacing
0040
0041 Kirigami.FormLayout {
0042 id: basicInfo
0043
0044 Layout.fillWidth: true
0045
0046 Controls2.TextField {
0047 id: summary
0048
0049 enabled: !root.completed
0050 text: incidenceData ? incidenceData.summary : ""
0051 Kirigami.FormData.label: i18n("Summary:")
0052 }
0053
0054 RowLayout {
0055 Kirigami.FormData.label: i18n("Start:")
0056 spacing: 0
0057 enabled: !root.completed
0058
0059 Layout.fillWidth: true
0060
0061 DateSelectorButton {
0062 id: startDateSelector
0063
0064 selectorTitle: i18n("Start Date")
0065 invalidDateStr: "-"
0066 Layout.fillWidth: true
0067 }
0068
0069 TimeSelectorButton {
0070 id: startTimeSelector
0071
0072 property bool validSelectedDt: startDateSelector.selectorDate != undefined && !isNaN(startDateSelector.selectorDate)
0073
0074 selectorDate: startDateSelector.selectorDate
0075 selectorTitle: i18n("Start Time")
0076 selectorHour: validSelectedDt ? selectorDate.getHours() % 12 : 0
0077 selectorMinutes: validSelectedDt ? selectorDate.getMinutes() : 0
0078 selectorPm: (validSelectedDt && (selectorDate.toLocaleTimeString(Qt.locale("en_US"), "AP") == "PM")) ? true : false
0079 enabled: !allDaySelector.checked && validSelectedDt
0080 Layout.alignment: Qt.AlignRight
0081 Layout.minimumWidth: Kirigami.Units.gridUnit * 3
0082 }
0083
0084 Controls2.ToolButton {
0085 id: clearStartDt
0086
0087 icon.name: "edit-clear-all"
0088 Layout.alignment: Qt.AlignRight
0089 Layout.minimumWidth: Kirigami.Units.gridUnit * 2
0090
0091 onClicked: {
0092 startDateSelector.selectorDate = new Date("invalid");
0093 incidenceAlarmsModel.removeAll();
0094 }
0095 }
0096 }
0097
0098 RowLayout {
0099 Kirigami.FormData.label: i18n("Due:")
0100 spacing: 0
0101 enabled: !root.completed
0102 Layout.fillWidth: true
0103
0104 DateSelectorButton {
0105 id: dueDateSelector
0106
0107 selectorTitle: i18n("Due Date")
0108 invalidDateStr: "-"
0109 Layout.fillWidth: true
0110
0111 Component.onCompleted: {
0112 // Do not bind, just initialize
0113 if (root.incidenceData && root.incidenceData.validDueDt) {
0114 selectorDate = root.incidenceData.due;
0115 }
0116 else if (root.incidenceData == undefined && (root.startDt != undefined) && !isNaN(root.startDt)) {
0117 var t = root.startDt;
0118 t.setHours(root.startHour + (startPm ? 12 : 0));
0119 t.setMinutes(root.startMinute);
0120 t.setSeconds(0);
0121 selectorDate = t;
0122 }
0123 else {
0124 selectorDate = new Date("invalid");
0125 }
0126 }
0127 }
0128
0129 TimeSelectorButton {
0130 id: dueDtTimeSelector
0131
0132 property bool validSelectedDt: dueDateSelector.selectorDate != undefined && !isNaN(dueDateSelector.selectorDate)
0133
0134 selectorDate: dueDateSelector.selectorDate
0135 selectorTitle: i18n("Due Time")
0136 selectorHour: validSelectedDt ? selectorDate.getHours() % 12 : 0
0137 selectorMinutes: validSelectedDt ? selectorDate.getMinutes() : 0
0138 selectorPm: validSelectedDt && (selectorDate.toLocaleTimeString(Qt.locale("en_US"), "AP") == "PM") ? true : false
0139 enabled: !allDaySelector.checked && validSelectedDt
0140 Layout.alignment: Qt.AlignRight
0141 Layout.minimumWidth: Kirigami.Units.gridUnit * 3
0142 }
0143
0144 Controls2.ToolButton {
0145 id: clearDueDt
0146
0147 icon.name: "edit-clear-all"
0148 Layout.alignment: Qt.AlignRight
0149 Layout.minimumWidth: Kirigami.Units.gridUnit * 2
0150
0151 onClicked: dueDateSelector.selectorDate = new Date("invalid")
0152 }
0153 }
0154
0155 Controls2.CheckBox {
0156 id: allDaySelector
0157
0158 enabled: (!isNaN(root.startDt) || !isNaN(root.dueDt)) && !root.completed
0159 checked: incidenceData ? incidenceData.allday: false
0160 Kirigami.FormData.label: i18n("All day:")
0161 }
0162
0163 Item {
0164 height: Kirigami.Units.largeSpacing
0165 }
0166 }
0167
0168 Controls2.TabBar {
0169 id: bar
0170
0171 Layout.fillWidth: true
0172
0173 Controls2.TabButton {
0174 text: i18n("Details")
0175 }
0176
0177 Controls2.TabButton {
0178 text: i18n("Reminders")
0179 }
0180 }
0181
0182 StackLayout {
0183 currentIndex: bar.currentIndex
0184
0185 IncidenceEditor {
0186 id: incidenceEditor
0187
0188 calendar: Calindori.CalendarController.activeCalendar
0189 incidenceData: root.incidenceData
0190 incidenceType: 1
0191 }
0192
0193 Reminders {
0194 enabled: root.startDt !== undefined && !isNaN(root.startDt) && !root.completed
0195
0196 alarmsModel: incidenceAlarmsModel
0197 }
0198 }
0199 }
0200
0201 actions {
0202 left: Kirigami.Action {
0203 id: cancelAction
0204
0205 text: i18n("Cancel")
0206 icon.name : "dialog-cancel"
0207 shortcut: "Esc"
0208
0209 onTriggered: {
0210 editcompleted();
0211 }
0212 }
0213
0214 main: Kirigami.Action {
0215 text: i18n("Save")
0216 icon.name : "dialog-ok"
0217 enabled: summary.text
0218
0219 onTriggered: {
0220 var vtodo = { "uid": root.uid, "summary":root.summary, "startDate": root.startDt , "startHour": root.startHour + (root.startPm ? 12 : 0), "startMinute": root.startMinute, "allDay": root.allDay, "description": root.description, "location": root.location, "completed": root.completed, "dueDate": root.dueDt, "dueHour": root.dueHour + (root.duePm ? 12 : 0), "dueMinute": root.dueMinute, "alarms": incidenceAlarmsModel.alarms() };
0221
0222 var validation = Calindori.CalendarController.validateTodo(vtodo);
0223
0224 if(validation.success) {
0225 validationFooter.visible = false;
0226 Calindori.CalendarController.upsertTodo(Calindori.CalendarController.activeCalendar, vtodo);
0227 editcompleted();
0228 }
0229 else {
0230 validationFooter.text = validation.reason;
0231 validationFooter.visible = true;
0232 }
0233 }
0234 }
0235 }
0236
0237 footer: Kirigami.InlineMessage {
0238 id: validationFooter
0239
0240 showCloseButton: true
0241 type: Kirigami.MessageType.Warning
0242 visible: false
0243 }
0244
0245 Calindori.IncidenceAlarmsModel {
0246
0247 id: incidenceAlarmsModel
0248
0249 alarmProperties: { "calendar" : Calindori.CalendarController.activeCalendar, "uid": root.uid }
0250 }
0251
0252 }