Warning, /plasma-mobile/calindori/src/contents/ui/EventEditorPage.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.ScrollablePage { 0014 id: root 0015 0016 property string uid 0017 property alias summary: summary.text 0018 property alias description: incidenceEditor.description 0019 property alias startDt: startDateSelector.selectorDate 0020 property alias startHour: startTimeSelector.selectorHour 0021 property alias startMinute: startTimeSelector.selectorMinutes 0022 property alias startPm: startTimeSelector.selectorPm 0023 property alias allDay: allDaySelector.checked 0024 property alias location: incidenceEditor.location 0025 property var calendar 0026 property var incidenceData 0027 property alias endDt: endDateSelector.selectorDate 0028 property alias endHour: endTimeSelector.selectorHour 0029 property alias endMinute: endTimeSelector.selectorMinutes 0030 property alias endPm: endTimeSelector.selectorPm 0031 property alias repeatType: repeatSelector.repeatType 0032 property alias repeatEvery: repeatSelector.repeatEvery 0033 property alias repeatStopAfter: repeatSelector.stopAfter 0034 property alias incidenceStatus: incidenceEditor.incidenceStatus 0035 property bool isEditorPage: true 0036 0037 signal editcompleted(var vevent) 0038 0039 Component.onCompleted: { 0040 if(incidenceData == null && Calindori.CalindoriConfig.alwaysRemind) 0041 { 0042 incidenceAlarmsModel.addAlarm(Calindori.CalindoriConfig.preEventRemindTime * 60) 0043 } 0044 } 0045 0046 title: uid === "" ? i18n("Create Event") : root.summary 0047 0048 ColumnLayout { 0049 anchors.centerIn: parent 0050 spacing: Kirigami.Units.smallSpacing 0051 0052 Kirigami.FormLayout { 0053 id: basicInfo 0054 0055 Layout.fillWidth: true 0056 0057 Controls2.TextField { 0058 id: summary 0059 0060 text: incidenceData ? incidenceData.summary : "" 0061 Kirigami.FormData.label: i18n("Summary:") 0062 } 0063 0064 RowLayout { 0065 spacing: 0 0066 Kirigami.FormData.label: i18n("Start:") 0067 Layout.fillWidth: true 0068 0069 DateSelectorButton { 0070 id: startDateSelector 0071 0072 selectorTitle: i18n("Start Date") 0073 invalidDateStr: "-" 0074 Layout.fillWidth: true 0075 } 0076 0077 TimeSelectorButton { 0078 id: startTimeSelector 0079 0080 selectorTitle: i18n("Start Time") 0081 selectorDate: root.startDt 0082 selectorHour: (root.incidenceData ? root.incidenceData.dtstart.getHours() : root.startDt.getHours() ) % 12 0083 selectorMinutes: root.incidenceData ? root.incidenceData.dtstart.getMinutes() : root.startDt.getMinutes() 0084 selectorPm: root.incidenceData ? (root.incidenceData.dtstart.getHours() >=12) : (root.startDt.getHours() >=12) 0085 enabled: !allDaySelector.checked 0086 Layout.alignment: Qt.AlignRight 0087 Layout.minimumWidth: Kirigami.Units.gridUnit * 4 0088 } 0089 } 0090 0091 RowLayout { 0092 spacing: 0 0093 Kirigami.FormData.label: i18n("End:") 0094 Layout.fillWidth: true 0095 0096 DateSelectorButton { 0097 id: endDateSelector 0098 0099 enabled: !allDaySelector.checked 0100 selectorTitle: i18n("End Date") 0101 invalidDateStr: "-" 0102 Layout.fillWidth: true 0103 0104 Component.onCompleted: { 0105 var newDt; 0106 0107 if(root.incidenceData) { 0108 newDt = root.incidenceData.dtend; 0109 } 0110 else { 0111 newDt= root.startDt; 0112 newDt.setMinutes(newDt.getMinutes() + Calindori.CalindoriConfig.eventsDuration); 0113 newDt.setSeconds(0); 0114 } 0115 0116 selectorDate = newDt; 0117 } 0118 } 0119 0120 TimeSelectorButton { 0121 id: endTimeSelector 0122 0123 selectorTitle: i18n("End Time") 0124 selectorDate: root.endDt 0125 selectorHour: root.endDt.getHours() % 12 0126 selectorMinutes: root.endDt.getMinutes() 0127 selectorPm: (root.endDt.getHours() >=12) 0128 enabled: !allDaySelector.checked && (root.endDt != undefined && !isNaN(root.endDt)) 0129 Layout.alignment: Qt.AlignRight 0130 Layout.minimumWidth: Kirigami.Units.gridUnit * 4 0131 } 0132 } 0133 0134 Controls2.CheckBox { 0135 id: allDaySelector 0136 0137 enabled: !isNaN(root.startDt) 0138 checked: incidenceData ? incidenceData.allday: false 0139 text: i18n("All day") 0140 } 0141 0142 Controls2.ToolButton { 0143 id: repeatSelector 0144 0145 property int repeatType: incidenceData != null && incidenceData.isRepeating ? incidenceData.repeatType : _repeatModel.noRepeat 0146 property int repeatEvery: incidenceData != null && incidenceData.isRepeating ? incidenceData.repeatEvery : 1 0147 property string repeatDescription: _repeatModel && _repeatModel.periodDecription(repeatType) 0148 property int stopAfter: incidenceData != null && incidenceData.isRepeating ? incidenceData.repeatStopAfter: -1 0149 0150 contentItem: Controls2.Label { 0151 leftPadding: Kirigami.Units.largeSpacing 0152 rightPadding: Kirigami.Units.largeSpacing 0153 text: _repeatModel && _repeatModel.repeatDescription(parent.repeatType, parent.repeatEvery, parent.stopAfter) 0154 } 0155 0156 Kirigami.FormData.label: i18n("Repeat:") 0157 Layout.fillWidth: true 0158 0159 onClicked: recurPickerSheet.init(repeatType, repeatEvery, stopAfter) 0160 } 0161 0162 } 0163 0164 Item { 0165 height: Kirigami.Units.largeSpacing 0166 } 0167 0168 Controls2.TabBar { 0169 id: bar 0170 0171 Layout.fillWidth: Kirigami.Settings.isMobile 0172 Layout.alignment: Qt.AlignHCenter 0173 0174 Controls2.TabButton { 0175 text: i18n("Details") 0176 } 0177 0178 Controls2.TabButton { 0179 text: i18n("Reminders") 0180 } 0181 0182 Controls2.TabButton { 0183 text: i18n("Attendees") 0184 } 0185 } 0186 0187 StackLayout { 0188 currentIndex: bar.currentIndex 0189 0190 IncidenceEditor { 0191 id: incidenceEditor 0192 0193 calendar: root.calendar 0194 incidenceData: root.incidenceData 0195 incidenceType: 0 0196 } 0197 0198 Reminders { 0199 enabled: (root.startDt !== undefined) && !isNaN(root.startDt) 0200 alarmsModel: incidenceAlarmsModel 0201 } 0202 0203 Attendees { 0204 attendeesModel: incidenceAttendeesModel 0205 incidenceData: root.incidenceData 0206 } 0207 0208 } 0209 } 0210 0211 actions { 0212 0213 left: Kirigami.Action { 0214 id: cancelAction 0215 0216 text: i18n("Cancel") 0217 icon.name : "dialog-cancel" 0218 shortcut: "Esc" 0219 0220 onTriggered: editcompleted(null) 0221 } 0222 0223 main: Kirigami.Action { 0224 text: i18n("Save") 0225 icon.name: "dialog-ok" 0226 enabled: summary.text 0227 0228 onTriggered: { 0229 var vevent = { "uid" : root.uid, "startDate": root.startDt, "summary": root.summary, "description": root.description, "startHour": root.startHour + (root.startPm ? 12 : 0), "startMinute": root.startMinute, "allDay": root.allDay, "location": root.location, "endDate": root.endDt, "endHour": root.endHour + (root.endPm ? 12 : 0), "endMinute": root.endMinute, "alarms": incidenceAlarmsModel.alarms(), "periodType": root.repeatType, "repeatEvery": root.repeatEvery, "stopAfter": root.repeatStopAfter, "status": root.incidenceStatus}; 0230 0231 var validation = Calindori.CalendarController.validateEvent(vevent); 0232 0233 if(validation.success) { 0234 validationFooter.visible = false; 0235 Calindori.CalendarController.upsertEvent(vevent, incidenceAttendeesModel.attendees()); 0236 editcompleted(vevent); 0237 } 0238 else { 0239 validationFooter.text = validation.reason; 0240 validationFooter.visible = true; 0241 } 0242 } 0243 } 0244 } 0245 0246 footer: Kirigami.InlineMessage { 0247 id: validationFooter 0248 0249 showCloseButton: true 0250 type: Kirigami.MessageType.Warning 0251 visible: false 0252 } 0253 0254 Calindori.IncidenceAlarmsModel { 0255 id: incidenceAlarmsModel 0256 0257 alarmProperties: { "calendar" : root.calendar, "uid": root.uid } 0258 } 0259 0260 Calindori.AttendeesModel { 0261 id: incidenceAttendeesModel 0262 0263 uid: root.uid 0264 } 0265 0266 RecurrencePickerSheet { 0267 id: recurPickerSheet 0268 0269 onRecurrencePicked: { 0270 repeatSelector.repeatType = recurPickerSheet.selectedRepeatType; 0271 repeatSelector.repeatEvery = recurPickerSheet.selectedRepeatEvery 0272 repeatSelector.stopAfter = recurPickerSheet.selectedStopAfter; 0273 } 0274 } 0275 }