Warning, /plasma-mobile/calindori/src/contents/ui/WeekView.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 ListView {
0014     id: root
0015 
0016     property int fstDayOfWeek: _appLocale.firstDayOfWeek
0017     property date startDate
0018     property date selectedWeekDate: firstDateOfWeek(startDate)
0019     property date selectedDate: startDate
0020     property var cal
0021     property bool wideScreen
0022 
0023     signal nextWeek
0024     signal previousWeek
0025     signal goCurrentWeek
0026     signal addEvent
0027     signal addTodo
0028 
0029     /**
0030     * @brief Get the date of the first day of a week, given a date in the week
0031     *
0032     */
0033 
0034     function firstDateOfWeek(inputDate)
0035     {
0036         var t = inputDate;
0037         t.setDate(inputDate.getDate() - inputDate.getDay() + (inputDate.getDay() >= fstDayOfWeek ? fstDayOfWeek : fstDayOfWeek-7));
0038         t.setHours(inputDate.getHours())
0039         t.setMinutes(0);
0040         t.setSeconds(0);
0041 
0042         return t;
0043     }
0044 
0045     /**
0046     * @brief Remove the editor page from the stack. If an incidence page exists in the page stack, remove it as well
0047     *
0048     */
0049     function removeEditorPage() {
0050         pageStack.pop();
0051         if(pageStack.lastItem && pageStack.lastItem.hasOwnProperty("isIncidencePage")) {
0052             pageStack.pop(incidencePage);
0053         }
0054     }
0055 
0056     function moveDate(startDt, offset)
0057     {
0058         var movedDt = startDt;
0059         movedDt.setDate(startDt.getDate() + offset);
0060 
0061         return movedDt;
0062     }
0063 
0064     onNextWeek: {
0065         selectedWeekDate = moveDate(selectedWeekDate, 7);
0066         selectedDate = selectedWeekDate;
0067         currentIndex = 0;
0068     }
0069 
0070     onPreviousWeek: {
0071         selectedWeekDate = moveDate(selectedWeekDate, -7);
0072         selectedDate = selectedWeekDate;
0073         currentIndex = 0;
0074     }
0075 
0076     onGoCurrentWeek: {
0077         selectedWeekDate = firstDateOfWeek(startDate);
0078         selectedDate = startDate;
0079         currentIndex = selectedDate.getDay() >= fstDayOfWeek ? selectedDate.getDay() - fstDayOfWeek : 7 - (selectedDate.getDay() +  fstDayOfWeek)
0080     }
0081 
0082     onCurrentIndexChanged: {
0083         if (pageStack.depth > 1) {
0084             pageStack.pop(null);
0085         }
0086     }
0087 
0088     model: 7
0089     currentIndex: selectedDate.getDay() >= fstDayOfWeek ? selectedDate.getDay() - fstDayOfWeek : 7 - (selectedDate.getDay() +  fstDayOfWeek)
0090 
0091     delegate: Kirigami.SwipeListItem {
0092         id: dayListItem
0093 
0094         property var weekDay: model.index
0095         property var itemDate: {
0096                     var dt = root.selectedWeekDate;
0097                     dt.setDate(dt.getDate() + index);
0098                     dt.setHours(dt.getHours() + 1);
0099                     dt.setMinutes(0);
0100                     dt.setSeconds(0);
0101                     dt.setMilliseconds(0);
0102 
0103                     return dt;
0104         }
0105 
0106         alwaysVisibleActions: false
0107 
0108         contentItem: RowLayout {
0109             spacing: Kirigami.Units.largeSpacing * 2
0110 
0111             ColumnLayout  {
0112                 Layout.minimumWidth: Kirigami.Units.gridUnit * 2
0113 
0114                 Controls2.Label {
0115                     text: _appLocale.dayName(model.index + fstDayOfWeek, Locale.ShortFormat)
0116                     Layout.alignment: Qt.AlignHCenter
0117                 }
0118 
0119                 Controls2.Label {
0120                     font: Kirigami.Theme.smallFont
0121                     text: itemDate.toLocaleDateString(_appLocale, "d MMM")
0122                     Layout.alignment: Qt.AlignHCenter
0123                 }
0124             }
0125 
0126             ColumnLayout {
0127 
0128                 Repeater {
0129                     model: Calindori.IncidenceModel {
0130                         appLocale: _appLocale
0131                         filterDt: moveDate(root.selectedWeekDate, dayListItem.weekDay)
0132                         filterMode: 4
0133                     }
0134 
0135                     IncidenceItemDelegate {
0136                         itemBackgroundColor: model.type === 0 ? Kirigami.Theme.backgroundColor : Qt.darker(Kirigami.Theme.backgroundColor, 1.1)
0137                         label: model.summary
0138                         subtitle: (model.type == 0 ? model.displayStartEndTime : (model.displayDueTime || model.displayStartTime))
0139                         Layout.fillWidth: true
0140 
0141                         onClicked: {
0142                             if(pageStack.lastItem && pageStack.lastItem.hasOwnProperty("isIncidencePage")) {
0143                                 pageStack.pop(incidencePage);
0144                             }
0145 
0146                             pageStack.push(incidencePage, { incidence: model })
0147                         }
0148                     }
0149                 }
0150             }
0151         }
0152 
0153         actions: [
0154             Kirigami.Action {
0155                 iconName: "resource-calendar-insert"
0156                 text: i18n("Create Event")
0157 
0158                 onTriggered: pageStack.push(eventEditor, { startDt: itemDate })
0159             },
0160 
0161             Kirigami.Action {
0162                 iconName: "task-new"
0163                 text: i18n("Create Task")
0164 
0165                 onTriggered: pageStack.push(todoEditor, { startDt: itemDate })}
0166         ]
0167 
0168         onClicked: { root.selectedDate = moveDate(root.selectedWeekDate, model.index) }
0169 
0170     }
0171 
0172     Component {
0173         id: incidencePage
0174 
0175         IncidencePage {
0176             calendar: root.cal
0177         }
0178     }
0179 
0180     Component {
0181         id: eventEditor
0182 
0183         EventEditorPage {
0184             calendar: root.cal
0185 
0186             onEditcompleted: removeEditorPage()
0187         }
0188     }
0189 
0190     Component {
0191         id: todoEditor
0192 
0193         TodoEditorPage {
0194             onEditcompleted: removeEditorPage()
0195         }
0196     }
0197 }