\n"
@@ -37,24 +37,25 @@ msgstr "Release-opmerkingen: "
msgid "Create Account"
msgstr "Account aanmaken"
-#: ../qml/Account_Page.qml:64 ../qml/Activities.qml:71 ../qml/Tasks.qml:69
-#: ../qml/components/SaveDiscardDialog.qml:64
+#: ../qml/Account_Page.qml:64 ../qml/Activities.qml:78 ../qml/Tasks.qml:69
+#: ../qml/Updates.qml:100 ../qml/components/SaveDiscardDialog.qml:64
msgid "Save"
msgstr "Opslaan"
-#: ../qml/Account_Page.qml:73 ../qml/Tasks.qml:77
+#: ../qml/Account_Page.qml:73 ../qml/Activities.qml:86 ../qml/Tasks.qml:77
+#: ../qml/Updates.qml:108 ../qml/components/ActivityDetailsCard.qml:177
+#: ../qml/components/UpdatesDetailsCard.qml:50
msgid "Edit"
msgstr "Bewerken"
-#: ../qml/Account_Page.qml:173
-#, fuzzy
-msgid "Connect With Api Key"
-msgstr "Verbinden met"
+#: ../qml/Account_Page.qml:133
+msgid "Your account has been saved, Enjoy using the app !"
+msgstr ""
-#: ../qml/Account_Page.qml:177
+#: ../qml/Account_Page.qml:208 ../qml/Account_Page.qml:222
#, fuzzy
-msgid "Connect With Password"
-msgstr "Verbinden met"
+msgid "Account Name"
+msgstr "Account"
#: ../qml/Account_Page.qml:255
msgid "Enter Odoo URL here"
@@ -80,35 +81,43 @@ msgstr "Gebruikersnaam"
msgid "Connect With"
msgstr "Verbinden met"
+#: ../qml/Account_Page.qml:520
+msgid "Hide"
+msgstr ""
+
+#: ../qml/Account_Page.qml:520
+msgid "show"
+msgstr ""
+
#: ../qml/Activities.qml:18 ../qml/Dashboard.qml:260
msgid "Activity"
msgstr "Activiteit"
-#: ../qml/Activities.qml:83 ../qml/Tasks.qml:58
+#: ../qml/Activities.qml:97 ../qml/Tasks.qml:58 ../qml/Updates.qml:118
#: ../qml/components/CreateUpdatePage.qml:86
msgid "Back"
msgstr "Terug"
-#: ../qml/Activities.qml:179
+#: ../qml/Activities.qml:330
msgid "Connected to"
msgstr "Verbonden met"
-#: ../qml/Activities.qml:189 ../qml/Projects.qml:43
+#: ../qml/Activities.qml:340 ../qml/Projects.qml:43
#: ../qml/components/WorkItemSelector.qml:127
msgid "Project"
msgstr "Project"
-#: ../qml/Activities.qml:207 ../qml/Dashboard.qml:254 ../qml/Dashboard3.qml:32
+#: ../qml/Activities.qml:362 ../qml/Dashboard.qml:254 ../qml/Dashboard3.qml:32
#: ../qml/Task_Page.qml:352 ../qml/Tasks.qml:45
#: ../qml/components/WorkItemSelector.qml:129
msgid "Task"
msgstr "Taak"
-#: ../qml/Activities.qml:239
+#: ../qml/Activities.qml:398
msgid "Summary"
msgstr "Samenvatting"
-#: ../qml/Activities.qml:329
+#: ../qml/Activities.qml:498
#, fuzzy
msgid "Activity Type"
msgstr "Activiteit"
@@ -143,7 +152,7 @@ msgstr "Achterstallig "
msgid "All"
msgstr "Alle"
-#: ../qml/Activity_Page.qml:613
+#: ../qml/Activity_Page.qml:627
msgid "No Activities Available"
msgstr "Geen activiteiten beschikbaar"
@@ -228,7 +237,7 @@ msgstr "Geen taken aan jou toegewezen"
msgid "Create"
msgstr "Aanmaken"
-#: ../qml/Project_Page.qml:55
+#: ../qml/Project_Page.qml:55 ../qml/Updates_Page.qml:61
msgid "New"
msgstr "Nieuw"
@@ -241,6 +250,8 @@ msgid "Project Name"
msgstr "Projectnaam"
#: ../qml/Projects.qml:333 ../qml/Projects.qml:398 ../qml/Projects.qml:464
+#: ../qml/components/ActivityDetailsCard.qml:182
+#: ../qml/components/UpdatesDetailsCard.qml:55
msgid "View"
msgstr "Bekijken"
@@ -252,7 +263,8 @@ msgstr "Taken"
msgid "Allocated Hours"
msgstr "Toegewezen uren"
-#: ../qml/ReadMorePage.qml:23 ../qml/components/CreateUpdateDialog.qml:121
+#: ../qml/ReadMorePage.qml:23 ../qml/Updates.qml:402
+#: ../qml/components/CreateUpdateDialog.qml:121
#: ../qml/components/CreateUpdatePage.qml:328
#: ../qml/components/RichTextPreview.qml:7
msgid "Description"
@@ -292,7 +304,8 @@ msgstr "Taaksynchronisatie forceren"
#: ../qml/Settings_Page.qml:549
msgid "Reset task timestamps to force fresh sync from Odoo"
-msgstr "Reset taaktijdstempels om nieuwe synchronisatie vanuit Odoo te forceren"
+msgstr ""
+"Reset taaktijdstempels om nieuwe synchronisatie vanuit Odoo te forceren"
#: ../qml/Settings_Page.qml:567
msgid "Reset Tasks Without Stages"
@@ -409,7 +422,8 @@ msgid "Select Deadline"
msgstr "Deadline selecteren"
#: ../qml/Timesheet.qml:542
-msgid "What Is Important Is Seldom Urgent, and What Is Urgent Is Seldom Important."
+msgid ""
+"What Is Important Is Seldom Urgent, and What Is Urgent Is Seldom Important."
"
1. Important & Urgent:
Here you write down important "
"activities, which also have to be done immediately. These are urgent "
"problems or projects with a hard deadline. I.e. If you manage a restaurant "
@@ -450,11 +464,48 @@ msgid "What Is Important Is Seldom Urgent, and What Is Urgent Is Seldom Importan
"short break from your work, but usually they are a great excuse to postpone "
"your important work for a while."
msgstr ""
-"\"Wat belangrijk is, is zelden urgent, en wat urgent is, is zelden belangrijk.\"
"
-"1. Belangrijk & Urgent:
Hier schrijf je belangrijke activiteiten op die ook onmiddellijk gedaan moeten worden. Dit zijn urgente problemen of projecten met een harde deadline. Stel je voor: als je een restaurant runt en een werknemer is niet komen opdagen, dan is dat een tamelijk urgent en acuut probleem. Alle seinen staan op rood, dus dit is een typische activiteit voor het eerste kwadrant."
-"
2. Belangrijk & Niet Urgent:
Als je de activiteiten in dit kwadrant voor de komende week laat liggen, gaat er niet direct iets mis. Maar wees voorzichtig: dit zijn activiteiten en projecten die je op de lange termijn vooruithelpen. Denk aan nadenken over een strategie, het verbeteren van werkprocessen in je team, investeren in relaties en investeren in jezelf. Bijvoorbeeld: je bent een teamleider die tijdens zijn functioneringsgesprek net te horen heeft gekregen dat er meer creatieve inbreng wordt verwacht. Zo'n uitkomst van een functioneringsgesprek is een opdracht die nooit urgent zal aanvoelen, maar wel zeer belangrijk is. Je kunt de belangrijke & niet-urgente activiteiten snel herkennen door de vraag te beantwoorden: als ik dit niet doe, kom ik dan op de lange termijn in de problemen? Als het antwoord ja is, dan heb je een belangrijke & niet-urgente activiteit. Als het antwoord nee is, dan is het een niet-belangrijke & niet-urgente activiteit."
-"
3. Urgent & Niet Belangrijk:
Dit kwadrant betreft activiteiten die je op de lange termijn niet helpen, maar die deze week wel schreeuwen om je aandacht. Een aanpassing in een presentatie die nog even snel gedaan moet worden voor een collega, of de melk die bijna op is. Bij taken in dit kwadrant is het erg belangrijk om na te gaan of ze daadwerkelijk urgent zijn. Vooral verzoeken van anderen lijken vaak erg dringend, terwijl ze soms best een dag of week kunnen wachten. Het is doorgaans prima om dit werk uit te stellen naar een geschikter moment, mits ik hier goed over communiceer. Als je de mogelijkheid hebt om deze taken in dit kwadrant te delegeren of uit te besteden, doe dat dan. Als je voor jezelf werkt is dit niet altijd mogelijk. In dat geval raad ik aan om je werkdag zo in te richten dat je zo min mogelijk wordt geleid door deze urgente taken, eventueel door elke dag een vast tijdblok te reserveren voor dit soort 'brandjes'. Op die manier behoud je controle over je agenda."
-"
4. Niet Belangrijk & Niet Urgent:
Dit soort werk wil je zo min mogelijk op je bord hebben, want het helpt je op geen enkele manier. Constant je mailbox verversen bijvoorbeeld. Maar ook vergaderingen zonder duidelijk doel vallen onder deze categorie. Je kunt ongetwijfeld zelf meer van dit soort 'drukdoenerij' voorbeelden aanwijzen: zaken die je doet, maar waar niemand echt baat bij heeft. Soms zijn deze activiteiten een prima korte onderbreking van je werk, maar meestal zijn ze een uitstekend excuus om je belangrijke werk nog even uit te stellen."
+"\"Wat belangrijk is, is zelden urgent, en wat urgent is, is zelden "
+"belangrijk.\"
1. Belangrijk & Urgent:
Hier schrijf je "
+"belangrijke activiteiten op die ook onmiddellijk gedaan moeten worden. Dit "
+"zijn urgente problemen of projecten met een harde deadline. Stel je voor: "
+"als je een restaurant runt en een werknemer is niet komen opdagen, dan is "
+"dat een tamelijk urgent en acuut probleem. Alle seinen staan op rood, dus "
+"dit is een typische activiteit voor het eerste kwadrant.
2. "
+"Belangrijk & Niet Urgent:
Als je de activiteiten in dit kwadrant voor "
+"de komende week laat liggen, gaat er niet direct iets mis. Maar wees "
+"voorzichtig: dit zijn activiteiten en projecten die je op de lange termijn "
+"vooruithelpen. Denk aan nadenken over een strategie, het verbeteren van "
+"werkprocessen in je team, investeren in relaties en investeren in jezelf. "
+"Bijvoorbeeld: je bent een teamleider die tijdens zijn functioneringsgesprek "
+"net te horen heeft gekregen dat er meer creatieve inbreng wordt verwacht. "
+"Zo'n uitkomst van een functioneringsgesprek is een opdracht die nooit urgent "
+"zal aanvoelen, maar wel zeer belangrijk is. Je kunt de belangrijke & niet-"
+"urgente activiteiten snel herkennen door de vraag te beantwoorden: als ik "
+"dit niet doe, kom ik dan op de lange termijn in de problemen? Als het "
+"antwoord ja is, dan heb je een belangrijke & niet-urgente activiteit. Als "
+"het antwoord nee is, dan is het een niet-belangrijke & niet-urgente "
+"activiteit.
3. Urgent & Niet Belangrijk:
Dit kwadrant "
+"betreft activiteiten die je op de lange termijn niet helpen, maar die deze "
+"week wel schreeuwen om je aandacht. Een aanpassing in een presentatie die "
+"nog even snel gedaan moet worden voor een collega, of de melk die bijna op "
+"is. Bij taken in dit kwadrant is het erg belangrijk om na te gaan of ze "
+"daadwerkelijk urgent zijn. Vooral verzoeken van anderen lijken vaak erg "
+"dringend, terwijl ze soms best een dag of week kunnen wachten. Het is "
+"doorgaans prima om dit werk uit te stellen naar een geschikter moment, mits "
+"ik hier goed over communiceer. Als je de mogelijkheid hebt om deze taken in "
+"dit kwadrant te delegeren of uit te besteden, doe dat dan. Als je voor "
+"jezelf werkt is dit niet altijd mogelijk. In dat geval raad ik aan om je "
+"werkdag zo in te richten dat je zo min mogelijk wordt geleid door deze "
+"urgente taken, eventueel door elke dag een vast tijdblok te reserveren voor "
+"dit soort 'brandjes'. Op die manier behoud je controle over je agenda."
+"
4. Niet Belangrijk & Niet Urgent:
Dit soort werk wil je zo "
+"min mogelijk op je bord hebben, want het helpt je op geen enkele manier. "
+"Constant je mailbox verversen bijvoorbeeld. Maar ook vergaderingen zonder "
+"duidelijk doel vallen onder deze categorie. Je kunt ongetwijfeld zelf meer "
+"van dit soort 'drukdoenerij' voorbeelden aanwijzen: zaken die je doet, maar "
+"waar niemand echt baat bij heeft. Soms zijn deze activiteiten een prima "
+"korte onderbreking van je werk, maar meestal zijn ze een uitstekend excuus "
+"om je belangrijke werk nog even uit te stellen."
#: ../qml/Timesheet.qml:564
msgid "Important, Urgent (1)"
@@ -484,6 +535,44 @@ msgstr "Actief"
msgid "Draft"
msgstr "Concept"
+#: ../qml/Updates.qml:41
+#, fuzzy
+msgid "Project Update"
+msgstr "Projectupdates"
+
+#: ../qml/Updates.qml:240 ../qml/components/AccountFilter.qml:68
+#: ../qml/components/ProjectSelector.qml:54
+msgid "Account:"
+msgstr "Account:"
+
+#: ../qml/Updates.qml:246
+#, fuzzy
+msgid "Unknown Account"
+msgstr "Onbekende gebruiker"
+
+#: ../qml/Updates.qml:260 ../qml/components/ProjectSelector.qml:76
+#, fuzzy
+msgid "Project:"
+msgstr "Project"
+
+#: ../qml/Updates.qml:266 ../qml/components/UpdatesDetailsCard.qml:127
+#, fuzzy
+msgid "Unknown Project"
+msgstr "Onbekende gebruiker"
+
+#: ../qml/Updates.qml:286 ../qml/components/CreateUpdateDialog.qml:87
+#: ../qml/components/CreateUpdatePage.qml:249
+msgid "Update Title"
+msgstr "Titel bijwerken"
+
+#: ../qml/Updates.qml:324 ../qml/components/CreateUpdatePage.qml:276
+msgid "Project Status"
+msgstr "Projectstatus"
+
+#: ../qml/Updates.qml:353 ../qml/components/CreateUpdatePage.qml:297
+msgid "Progress"
+msgstr "Voortgang"
+
#: ../qml/components/AccountDrawer.qml:28
#: ../qml/components/AccountDrawer.qml:61
msgid "Account Selection"
@@ -517,7 +606,8 @@ msgstr "Gegevens synchroniseren"
#: ../qml/components/AccountDrawer.qml:276
msgid "Note: Sync is not available for 'All Accounts' view"
-msgstr "Opmerking: Synchronisatie is niet beschikbaar voor weergave 'Alle accounts'"
+msgstr ""
+"Opmerking: Synchronisatie is niet beschikbaar voor weergave 'Alle accounts'"
#: ../qml/components/AccountDrawer.qml:285
msgid "Please select a specific account to sync data"
@@ -602,16 +692,14 @@ msgstr "Gegevens succesvol gesynchroniseerd!"
msgid "Success"
msgstr "Succes"
-#: ../qml/components/AccountFilter.qml:68
-msgid "Account:"
-msgstr "Account:"
-
#: ../qml/components/AccountSelector.qml:105
#: ../qml/components/AccountSelectorDialog.qml:153
msgid "Select an account"
msgstr "Selecteer een account"
#: ../qml/components/AccountSelectorDialog.qml:18
+#: ../qml/components/ProjectSelector.qml:61
+#: ../qml/components/ProjectSelector.qml:98
msgid "Select Account"
msgstr "Selecteer account"
@@ -624,44 +712,55 @@ msgstr "Kies een account om te gebruiken"
#: ../qml/components/CreateUpdatePage.qml:176
#: ../qml/components/CustomDatePicker.qml:131
#: ../qml/components/CustomDatePicker.qml:159
+#: ../qml/components/ProjectSelector.qml:136
+#: ../qml/components/ProjectSelector.qml:183
#: ../qml/components/SaveDiscardDialog.qml:94
#: ../qml/components/TimePickerPopup.qml:102
msgid "Cancel"
msgstr "Annuleren"
-#: ../qml/components/ActivityDetailsCard.qml:70
+#: ../qml/components/ActivityDetailsCard.qml:72
msgid "OVERDUE"
msgstr "ACHTERSTALLIG"
-#: ../qml/components/ActivityDetailsCard.qml:76
+#: ../qml/components/ActivityDetailsCard.qml:78
msgid "TODAY"
msgstr "VANDAAG"
-#: ../qml/components/ActivityDetailsCard.qml:82
+#: ../qml/components/ActivityDetailsCard.qml:84
msgid "PLANNED"
msgstr "GEPLAND"
-#: ../qml/components/ActivityDetailsCard.qml:255
+#: ../qml/components/ActivityDetailsCard.qml:187
+#, fuzzy
+msgid "Mark Done"
+msgstr "Donkere modus"
+
+#: ../qml/components/ActivityDetailsCard.qml:192
+msgid "Follow-up"
+msgstr ""
+
+#: ../qml/components/ActivityDetailsCard.qml:268
msgid "No Summary"
msgstr "Geen samenvatting"
-#: ../qml/components/ActivityDetailsCard.qml:266
+#: ../qml/components/ActivityDetailsCard.qml:279
msgid "No Notes"
msgstr "Geen opmerkingen"
-#: ../qml/components/ActivityDetailsCard.qml:278
+#: ../qml/components/ActivityDetailsCard.qml:291
msgid "Assigned to: "
msgstr "Toegewezen aan: "
-#: ../qml/components/ActivityDetailsCard.qml:278
+#: ../qml/components/ActivityDetailsCard.qml:291
msgid "Unassigned"
msgstr "Niet toegewezen"
-#: ../qml/components/ActivityDetailsCard.qml:302
+#: ../qml/components/ActivityDetailsCard.qml:315
msgid "Type ID: "
msgstr "Type-ID: "
-#: ../qml/components/ActivityDetailsCard.qml:344
+#: ../qml/components/ActivityDetailsCard.qml:356
msgid "Reschedule Activity Date"
msgstr "Activiteitsdatum opnieuw plannen"
@@ -698,11 +797,6 @@ msgstr "Kleur selecteren"
msgid "New Project Update"
msgstr "Nieuwe projectupdate"
-#: ../qml/components/CreateUpdateDialog.qml:87
-#: ../qml/components/CreateUpdatePage.qml:249
-msgid "Update Title"
-msgstr "Titel bijwerken"
-
#: ../qml/components/CreateUpdateDialog.qml:102
msgid "Progress:"
msgstr "Voortgang:"
@@ -730,10 +824,9 @@ msgstr "Niet-opgeslagen wijzigingen"
#: ../qml/components/CreateUpdatePage.qml:153
#, fuzzy
-msgid "You have unsaved changes. What would you like to do?\n"
+msgid "You have unsaved changes. What would you like to do?"
msgstr "Je hebt niet-opgeslagen wijzigingen. Wat wil je doen?\n"
-
#: ../qml/components/CreateUpdatePage.qml:156
#, fuzzy
msgid "Save Draft"
@@ -748,14 +841,6 @@ msgstr "Verwerpen"
msgid "Enter update title..."
msgstr "Voer updatetitel in..."
-#: ../qml/components/CreateUpdatePage.qml:276
-msgid "Project Status"
-msgstr "Projectstatus"
-
-#: ../qml/components/CreateUpdatePage.qml:297
-msgid "Progress"
-msgstr "Voortgang"
-
#: ../qml/components/CustomDatePicker.qml:110
msgid "Next Week"
msgstr "Volgende week"
@@ -897,13 +982,21 @@ msgstr "Meest tijdrovende projecten"
msgid "Most Time-Consuming Projects(No Data)"
msgstr "Meest tijdrovende projecten (geen gegevens)"
+#: ../qml/components/ProjectSelector.qml:83
+#: ../qml/components/ProjectSelector.qml:118
+#: ../qml/components/ProjectSelector.qml:147
+#, fuzzy
+msgid "Select Project"
+msgstr "Projecten synchroniseren..."
+
#: ../qml/components/SaveDiscardDialog.qml:52
-msgid "You have unsaved changes. What would you like to do?\n"
+#, fuzzy
+msgid ""
+"You have unsaved changes. What would you like to do?\n"
"\n"
-"Note: If you cancel, you can navigate back to continue editing.\n"
+"Note: If you cancel, you can navigate back to continue editing."
msgstr "Je hebt niet-opgeslagen wijzigingen. Wat wil je doen?\n"
-
#: ../qml/components/StageFilterMenu.qml:179
#, fuzzy
msgid "Filter by Stage"
@@ -913,6 +1006,18 @@ msgstr "Filter op toegewezenen"
msgid "Current: "
msgstr "Huidige: "
+#: ../qml/components/StatusSelector.qml:25
+msgid "On Track"
+msgstr ""
+
+#: ../qml/components/StatusSelector.qml:37
+msgid "At Risk"
+msgstr ""
+
+#: ../qml/components/StatusSelector.qml:49
+msgid "Off Track"
+msgstr ""
+
#: ../qml/components/TaskDetailsCard.qml:242
#: ../qml/components/TaskDetailsCard.qml:251
#: ../qml/components/TimeSheetDetailsCard.qml:147
@@ -970,31 +1075,26 @@ msgstr "Beschrijving toevoegen aan urenstaat"
msgid "Mark Ready for Sync"
msgstr "Markeren als gereed voor synchronisatie"
-#: ../qml/components/UpdatesDetailsCard.qml:59
+#: ../qml/components/UpdatesDetailsCard.qml:80
msgid "Untitled Update"
msgstr "Naamloze update"
-#: ../qml/components/UpdatesDetailsCard.qml:89
+#: ../qml/components/UpdatesDetailsCard.qml:110
msgid "By: "
msgstr "Door: "
-#: ../qml/components/UpdatesDetailsCard.qml:89
+#: ../qml/components/UpdatesDetailsCard.qml:110
msgid "No Date"
msgstr "Geen datum"
-#: ../qml/components/UpdatesDetailsCard.qml:89
+#: ../qml/components/UpdatesDetailsCard.qml:110
msgid "Unknown User"
msgstr "Onbekende gebruiker"
-#: ../qml/components/UpdatesDetailsCard.qml:97
+#: ../qml/components/UpdatesDetailsCard.qml:118
msgid "Details"
msgstr "Details"
-#: ../qml/components/UpdatesDetailsCard.qml:106
-#, fuzzy
-msgid "Unknown Project"
-msgstr "Onbekende gebruiker"
-
#: ../qml/components/WorkItemSelector.qml:128
#, fuzzy
msgid "Subproject"
@@ -1012,3 +1112,11 @@ msgstr "Toegewezenen"
#: ubtms.desktop.in.h:1
msgid "Time Management"
msgstr "Tijdbeheer"
+
+#, fuzzy
+#~ msgid "Connect With Api Key"
+#~ msgstr "Verbinden met"
+
+#, fuzzy
+#~ msgid "Connect With Password"
+#~ msgstr "Verbinden met"
diff --git a/pulse-socket b/pulse-socket
new file mode 120000
index 00000000..f67f038c
--- /dev/null
+++ b/pulse-socket
@@ -0,0 +1 @@
+/run/user/1000/pulse/native
\ No newline at end of file
diff --git a/qml/DatePicker.qml b/qml/DatePicker.qml
deleted file mode 100644
index 92166004..00000000
--- a/qml/DatePicker.qml
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * MIT License
- *
- * Copyright (c) 2025 CIT-Services
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-import QtQuick 2.0
-import QtQuick.Controls 2.2
-import QtQuick.Window 2.2
-
-ListView {
- id: root
- property int selectedYear: 2024
-
- signal clicked(date date)
-
- property date selectedDate: new Date()
- function isDesktop() {
- if (Screen.width > 1300) {
- return true;
- } else {
- return false;
- }
- }
- width: isDesktop() ? 450 : 600
- height: isDesktop() ? 450 : 600
- snapMode: ListView.SnapOneItem
- orientation: Qt.Horizontal
- clip: true
- anchors.margins: 0
-
- model: 500 * 12
-
- function set(year, month) {
- selectedYear = year;
- selectedDate = new Date(year, month, selectedDate.getDate());
- var index = year * 12 + month;
- listView.currentIndex = index;
- }
-
- Item {
- width: isDesktop() ? 400 : 600
- height: isDesktop() ? 345 : 600
- anchors.centerIn: parent
- Row {
- spacing: 10
- anchors {
- horizontalCenter: parent.horizontalCenter
- top: parent.top
- topMargin: isDesktop() ? 0 : 80
- }
-
- ComboBox {
- id: yearSelector
- width: isDesktop() ? 200 : 300
- height: isDesktop() ? 30 : 57
- textRole: "yearText"
- model: ListModel {
- Component.onCompleted: {
- var currentYear = new Date().getFullYear();
- for (var i = currentYear; i < currentYear + 10; ++i) {
- append({
- "yearText": i.toString()
- });
- }
- }
- }
-
- onCurrentTextChanged: {
- selectedYear = parseInt(currentText);
- }
- }
-
- Button {
- width: isDesktop() ? 80 : 100
- height: isDesktop() ? 30 : 50
-
- background: Rectangle {
- color: "#FB634E"
- radius: 10
- border.color: "#FB634E"
- border.width: 2
- anchors.fill: parent
- }
- contentItem: Text {
- anchors.fill: parent
- text: "Go"
- color: "#fff"
- font.pixelSize: isDesktop() ? 20 : 30
- horizontalAlignment: Text.AlignHCenter
- verticalAlignment: Text.AlignVCenter
- }
-
- onClicked: {
- var selectedYear = parseInt(yearSelector.currentText);
- root.set(selectedYear, root.selectedDate.getMonth());
- }
- }
- }
- }
-
- delegate: Item {
- property int month: index % 12
- property int firstDay: new Date(selectedYear, month, 1).getDay()
-
- width: root.width
- height: root.height
-
- Rectangle {
- width: parent.width
- height: isDesktop() ? 390 : 600
- color: "#121944"
- border.color: "#121944"
- }
-
- y: 10
-
- Column {
- spacing: isDesktop() ? 40 : 60
-
- Item {
- width: root.width
- height: isDesktop() ? root.height - grid.height - 100 : root.height - grid.height - 70
-
- Text {
- anchors {
- horizontalCenter: parent.horizontalCenter
- top: parent.top
- centerIn: parent
- }
-
- color: "#fff"
- text: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][month] + ' ' + selectedYear
- font {
- pixelSize: 0.5 * grid.cellHeight
- }
- }
- }
-
- Grid {
- id: grid
-
- width: root.width
- height: (isDesktop() ? 0.675 : 0.745) * root.height
- property real cellWidth: width / columns
- property real cellHeight: height / rows
-
- columns: 7
- rows: 7
-
- Repeater {
- model: grid.columns * grid.rows
-
- delegate: Rectangle {
- property int day: index - 7
- property int date: day - firstDay + 1
-
- width: grid.cellWidth
- height: grid.cellHeight
- border.width: 0.3 * radius
- border.color: new Date(selectedYear, month, date).toDateString() == selectedDate.toDateString() && text.text && day >= 0 ? 'black' : 'transparent'
- radius: 0.02 * root.height
- opacity: !mouseArea.pressed ? 1 : 0.3
-
- Text {
- id: text
-
- anchors.centerIn: parent
- font.pixelSize: 0.5 * parent.height
- font.bold: new Date(selectedYear, month, date).toDateString() == new Date().toDateString()
- text: {
- if (day < 0)
- ['S', 'M', 'T', 'W', 'T', 'F', 'S'][index];
- else if (new Date(selectedYear, month, date).getMonth() == month)
- date;
- else
- '';
- }
- }
-
- MouseArea {
- id: mouseArea
-
- anchors.fill: parent
- enabled: text.text && day >= 0
-
- onClicked: {
- selectedDate = new Date(selectedYear, month, date);
- root.clicked(selectedDate);
- }
- }
- }
- }
- }
- }
- }
-}
diff --git a/qml/TSApp.qml b/qml/TSApp.qml
index 25f711a8..b187e9ab 100644
--- a/qml/TSApp.qml
+++ b/qml/TSApp.qml
@@ -34,6 +34,7 @@ MainView {
applicationName: "ubtms"
property bool init: true
property alias globalTimerWidget: globalWidgets.globalTimerWidget
+ property alias modelDownloadTimerWidget: globalWidgets.modelDownloadTimerWidget
property alias backend_bridge: globalWidgets.backend_bridge
property alias imagePreviewer: globalWidgets.imagePreviewer
property alias accountPicker: globalWidgets.accountPicker
diff --git a/qml/UbuntuNumberAnimation.qml b/qml/UbuntuNumberAnimation.qml
deleted file mode 100644
index c9959e57..00000000
--- a/qml/UbuntuNumberAnimation.qml
+++ /dev/null
@@ -1,7 +0,0 @@
-// Fixed-duration animation helper matching the requested UbuntuNumberAnimation behavior.
-import QtQuick 2.12
-import Lomiri.Components 1.3
-
-NumberAnimation {
- duration: 150
-}
diff --git a/qml/app/AppLayout.qml b/qml/app/AppLayout.qml
index 3581fd3d..0c723699 100644
--- a/qml/app/AppLayout.qml
+++ b/qml/app/AppLayout.qml
@@ -3,10 +3,15 @@ import Lomiri.Components 1.3
import QtQuick.Window 2.2
import QtQuick.Layouts 1.11
import "../"
+import "navigation" as AppNavigation
import "pages" as AppPages
+import "../features/activities/pages" as ActivityPages
import "../features/dashboard/pages" as DashboardPages
+import "../features/projects/pages" as ProjectPages
import "../features/settings/pages" as SettingsPages
import "../features/tasks/pages" as TaskPages
+import "../features/timesheets/pages" as TimesheetPages
+import "../features/updates/pages" as UpdatePages
import "navigation/NavigationRoutes.js" as NavigationRoutes
AdaptivePageLayout {
@@ -76,7 +81,7 @@ AdaptivePageLayout {
id: splash_page
}
- Menu {
+ AppNavigation.MenuPage {
id: menu_page
navigationController: apLayout.navigationController
}
@@ -108,7 +113,7 @@ AdaptivePageLayout {
}
}
- Timesheet {
+ TimesheetPages.Timesheet {
id: timesheet_page
Connections {
@@ -122,7 +127,7 @@ AdaptivePageLayout {
}
}
- Activity_Page {
+ ActivityPages.Activity_Page {
id: activity_page
Connections {
@@ -150,7 +155,21 @@ AdaptivePageLayout {
}
}
- Project_Page {
+ TaskPages.MyTasksPage {
+ id: my_tasks_page
+
+ Connections {
+ target: rootApp
+ onAccountDataRefreshRequested: function(accountId) {
+ console.debug("🔄 Refreshing My Tasks data for account:", accountId);
+ if (my_tasks_page.visible && typeof my_tasks_page.refreshData === "function") {
+ my_tasks_page.refreshData();
+ }
+ }
+ }
+ }
+
+ ProjectPages.Project_Page {
id: project_page
Connections {
@@ -164,11 +183,11 @@ AdaptivePageLayout {
}
}
- Updates_Page {
+ UpdatePages.Updates_Page {
id: updates_page
}
- Aboutus {
+ AppPages.AboutPage {
id: aboutus_page
}
@@ -176,7 +195,7 @@ AdaptivePageLayout {
id: settings_page
}
- Timesheet_Page {
+ TimesheetPages.Timesheet_Page {
id: timesheet_list
Connections {
@@ -232,6 +251,8 @@ AdaptivePageLayout {
targetPage = activity_page;
else if (pageKey === "task")
targetPage = task_page;
+ else if (pageKey === "my_tasks")
+ targetPage = my_tasks_page;
else if (pageKey === "project")
targetPage = project_page;
else if (pageKey === "updates")
@@ -274,14 +295,14 @@ AdaptivePageLayout {
}
}
- setCurrentPage(pageNum);
+ setCurrentPage(pageNum, url);
if (globalDrawer) {
globalDrawer.close();
}
}
- function setCurrentPage(page) {
+ function setCurrentPage(page, url) {
console.debug("📄 Setting current page to:", page);
switch (page) {
case 0:
@@ -300,7 +321,7 @@ AdaptivePageLayout {
thirdPage = null;
break;
case 3:
- currentPage = task_page;
+ currentPage = String(url || "").indexOf("MyTasks") >= 0 ? my_tasks_page : task_page;
thirdPage = null;
break;
case 4:
@@ -400,6 +421,9 @@ AdaptivePageLayout {
if (task_page && typeof task_page.getTaskList === "function") {
task_page.getTaskList(task_page.currentFilter || "today", "");
}
+ if (my_tasks_page && typeof my_tasks_page.refreshData === "function") {
+ my_tasks_page.refreshData();
+ }
if (project_page && project_page.projectlist && typeof project_page.projectlist.refresh === "function") {
project_page.projectlist.refresh();
}
diff --git a/qml/app/GlobalWidgets.qml b/qml/app/GlobalWidgets.qml
index 227aca33..8eec9c24 100644
--- a/qml/app/GlobalWidgets.qml
+++ b/qml/app/GlobalWidgets.qml
@@ -8,6 +8,7 @@ Item {
property var rootApp
property alias globalTimerWidget: globalTimerWidget
+ property alias modelDownloadTimerWidget: modelDownloadTimerWidget
property alias backend_bridge: backend_bridge
property alias notifPopup: notifPopup
property alias imagePreviewer: imagePreviewer
@@ -27,6 +28,17 @@ Item {
}
}
+ // Model download progress bar for voice-to-text model - like sync
+ ModelDownloadTimerWidget {
+ id: modelDownloadTimerWidget
+ z: 9999
+ anchors.bottom: parent.bottom
+ visible: false
+ showNotification: function (title, message, type) {
+ notifPopup.open(title, message, type);
+ }
+ }
+
BackendBridge {
id: backend_bridge
onPythonError: function (tb) {
diff --git a/qml/Menu.qml b/qml/app/navigation/MenuPage.qml
similarity index 89%
rename from qml/Menu.qml
rename to qml/app/navigation/MenuPage.qml
index 3d258d33..7d721da8 100644
--- a/qml/Menu.qml
+++ b/qml/app/navigation/MenuPage.qml
@@ -27,27 +27,28 @@ import Lomiri.Components 1.3
import QtCharts 2.0
import QtQuick.Layouts 1.11
import Qt.labs.settings 1.0
-import "../models/Main.js" as Model
-import "../models/timesheet.js" as TimesheetModel
-import "../models/accounts.js" as Account
-import "components"
-import "app/navigation/NavigationRoutes.js" as NavigationRoutes
+import "../../components"
+import "NavigationRoutes.js" as NavigationRoutes
Page {
id: listpage
- title: i18n.dtr("ubtms", "Menu")
+
property bool isMultiColumn: apLayout.columns > 1
property var navigationController
+
+ title: i18n.dtr("ubtms", "Menu")
anchors.fill: parent
+
header: PageHeader {
id: header
title: listpage.title
+
StyleHints {
foregroundColor: "white"
-
backgroundColor: LomiriColors.orange
dividerColor: LomiriColors.slate
}
+
trailingActionBar.actions: [
Action {
iconName: "account"
@@ -57,8 +58,8 @@ Page {
}
},
Action {
- iconSource: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "images/daymode.png" : "images/darkmode.png"
- text: theme.name === "Ubuntu.Components.Themes.SuruDark" ? i18n.dtr("ubtms", "Light Mode") : i18n.dtr("ubtms","Dark Mode")
+ iconSource: theme.name === "Ubuntu.Components.Themes.SuruDark" ? "../../images/daymode.png" : "../../images/darkmode.png"
+ text: theme.name === "Ubuntu.Components.Themes.SuruDark" ? i18n.dtr("ubtms", "Light Mode") : i18n.dtr("ubtms", "Dark Mode")
onTriggered: {
Theme.name = theme.name === "Ubuntu.Components.Themes.SuruDark" ? "Ubuntu.Components.Themes.Ambiance" : "Ubuntu.Components.Themes.SuruDark";
}
@@ -84,10 +85,7 @@ Page {
id: menuColumn
width: parent.width
anchors.top: parent.top
- // anchors.topMargin: units.gu(2)
-
-
Rectangle {
width: parent.width
height: mainSection.height
@@ -96,10 +94,12 @@ Page {
Column {
id: mainSection
width: parent.width
+
NavigationMenuList {
width: parent.width
menuItems: NavigationRoutes.menuItems()
selectedPageUrl: apLayout && apLayout.currentMenuPageUrl ? apLayout.currentMenuPageUrl : ""
+
onItemSelected: function(item) {
if (navigationController && typeof navigationController.navigateMenuItem === "function") {
navigationController.navigateMenuItem(item);
@@ -108,13 +108,8 @@ Page {
}
}
}
-
}
}
-
-
-
-
}
}
}
diff --git a/qml/app/navigation/NavigationRoutes.js b/qml/app/navigation/NavigationRoutes.js
index 628c1ba2..48efe5f9 100644
--- a/qml/app/navigation/NavigationRoutes.js
+++ b/qml/app/navigation/NavigationRoutes.js
@@ -2,22 +2,22 @@
var _menuItems = [
{ textKey: "Dashboard", iconName: "home", iconColor: "#3498db", pageUrl: "features/dashboard/pages/Dashboard.qml", pageNum: 0 },
- { textKey: "Timesheet", iconName: "alarm-clock", iconColor: "#e67e22", pageUrl: "Timesheet_Page.qml", pageNum: 1 },
- { textKey: "Activities", iconName: "calendar", iconColor: "#e74c3c", pageUrl: "Activity_Page.qml", pageNum: 2 },
- { textKey: "My Tasks", iconName: "scope-manager", iconColor: "#2ecc71", pageUrl: "MyTasks.qml", pageNum: 3 },
+ { textKey: "Timesheet", iconName: "alarm-clock", iconColor: "#e67e22", pageUrl: "features/timesheets/pages/Timesheet_Page.qml", pageNum: 1 },
+ { textKey: "Activities", iconName: "calendar", iconColor: "#e74c3c", pageUrl: "features/activities/pages/Activity_Page.qml", pageNum: 2 },
+ { textKey: "My Tasks", iconName: "scope-manager", iconColor: "#2ecc71", pageUrl: "features/tasks/pages/MyTasksPage.qml", pageNum: 3 },
{ textKey: "All Tasks", iconName: "view-list-symbolic", iconColor: "#1abc9c", pageUrl: "features/tasks/pages/Task_Page.qml", pageNum: 3 },
- { textKey: "Projects", iconName: "folder-symbolic", iconColor: "#9b59b6", pageUrl: "Project_Page.qml", pageNum: 4 },
- { textKey: "Project Updates", iconName: "history", iconColor: "#f39c12", pageUrl: "Updates_Page.qml", pageNum: 5 },
- { textKey: "About Us", iconName: "info", iconColor: "#2980b9", pageUrl: "Aboutus.qml", pageNum: 7 },
+ { textKey: "Projects", iconName: "folder-symbolic", iconColor: "#9b59b6", pageUrl: "features/projects/pages/Project_Page.qml", pageNum: 4 },
+ { textKey: "Project Updates", iconName: "history", iconColor: "#f39c12", pageUrl: "features/updates/pages/Updates_Page.qml", pageNum: 5 },
+ { textKey: "About Us", iconName: "info", iconColor: "#2980b9", pageUrl: "app/pages/AboutPage.qml", pageNum: 7 },
{ textKey: "Settings", iconName: "settings", iconColor: "#7f8c8d", pageUrl: "features/settings/pages/Settings_Page.qml", pageNum: 6, showDivider: false }
];
var _deepLinkPages = {
"Task": "features/tasks/pages/Tasks.qml",
- "Activity": "Activities.qml",
- "ProjectUpdate": "Updates.qml",
- "Project": "Projects.qml",
- "Timesheet": "Timesheet.qml"
+ "Activity": "features/activities/pages/Activities.qml",
+ "ProjectUpdate": "features/updates/pages/Updates.qml",
+ "Project": "features/projects/pages/Projects.qml",
+ "Timesheet": "features/timesheets/pages/Timesheet.qml"
};
function menuItems() {
@@ -32,7 +32,7 @@ function resolvePageKey(pageNum, pageUrl) {
if (pageNum === 2)
return "activity";
if (pageNum === 3)
- return String(pageUrl || "").indexOf("MyTasks") === -1 ? "task" : "dynamic";
+ return String(pageUrl || "").indexOf("MyTasks") === -1 ? "task" : "my_tasks";
if (pageNum === 4)
return "project";
if (pageNum === 5)
diff --git a/qml/Aboutus.qml b/qml/app/pages/AboutPage.qml
similarity index 97%
rename from qml/Aboutus.qml
rename to qml/app/pages/AboutPage.qml
index e5a0824b..259c131f 100644
--- a/qml/Aboutus.qml
+++ b/qml/app/pages/AboutPage.qml
@@ -27,8 +27,8 @@ import Lomiri.Components 1.3
import QtCharts 2.0
import QtQuick.Layouts 1.11
import Qt.labs.settings 1.0
-import "../models/Main.js" as Model
-import "../models/constants.js" as AppConst
+import "../../../models/Main.js" as Model
+import "../../../models/constants.js" as AppConst
Page {
id: aboutPage
diff --git a/qml/app/pages/Splash.qml b/qml/app/pages/Splash.qml
index fd96e41d..34d44379 100644
--- a/qml/app/pages/Splash.qml
+++ b/qml/app/pages/Splash.qml
@@ -54,7 +54,7 @@ Page {
anchors.centerIn: parent
width: units.gu(30)
height: units.gu(30)
- source: "../../logo.png"
+ source: "../../images/logo.png"
opacity: 0.3
// Animate the opacity to fade in
diff --git a/qml/release_notes.txt b/qml/app/pages/release_notes.txt
similarity index 98%
rename from qml/release_notes.txt
rename to qml/app/pages/release_notes.txt
index d2a9a4dd..521a6087 100644
--- a/qml/release_notes.txt
+++ b/qml/app/pages/release_notes.txt
@@ -63,7 +63,7 @@
Time Management - Alpha Draft
-
+
Time Management is a native time-tracking and productivity application built exclusively for Ubuntu Touch phones.
@@ -141,7 +141,7 @@
- Time Management for Ubuntu Touch • Version 1.2.8 • © 2026 CIT Services
+ Time Management for Ubuntu Touch • Version 1.2.9 • © 2026 CIT Services