From 4f38f25d11aed82ca81d682345011aa4974da3a9 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 15 Sep 2022 18:04:58 +0200 Subject: [PATCH 001/187] feat: add minimal task wizard --- src/components/misc/create-edit.vue | 6 +- .../quick-actions/quick-actions.vue | 2 +- src/i18n/lang/en.json | 7 +- src/router/index.ts | 10 +++ src/views/tasks/CreateTask.vue | 83 +++++++++++++++++++ 5 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 src/views/tasks/CreateTask.vue diff --git a/src/components/misc/create-edit.vue b/src/components/misc/create-edit.vue index 35441c32..fe07ed02 100644 --- a/src/components/misc/create-edit.vue +++ b/src/components/misc/create-edit.vue @@ -9,7 +9,7 @@ @close="$router.back()" :loading="loading" > -
+
@@ -72,6 +72,10 @@ defineProps({ type: Boolean, default: false, }, + padding: { + type: Boolean, + default: true, + }, }) const emit = defineEmits(['create', 'primary', 'tertiary']) diff --git a/src/components/quick-actions/quick-actions.vue b/src/components/quick-actions/quick-actions.vue index a9b3058e..dd3dd170 100644 --- a/src/components/quick-actions/quick-actions.vue +++ b/src/components/quick-actions/quick-actions.vue @@ -186,7 +186,7 @@ export default defineComponent({ if (this.selectedCmd !== null) { switch (this.selectedCmd.action) { case CMD_NEW_TASK: - return this.$t('quickActions.newTask') + return this.$t('task.create.title') case CMD_NEW_LIST: return this.$t('quickActions.newList') case CMD_NEW_NAMESPACE: diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 4674f6e8..41658568 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -616,6 +616,12 @@ "select": "Select a date range", "noTasks": "Nothing to do — Have a nice day!" }, + "create": { + "heading": "Create a task in {list}", + "title": "Enter the title of the new task…", + "descriptionPlaceholder": "Enter your description here…", + "description": "Add description…" + }, "detail": { "chooseDueDate": "Click here to set a due date", "chooseStartDate": "Click here to set a start date", @@ -933,7 +939,6 @@ "lists": "Lists", "teams": "Teams", "newList": "Enter the title of the new list…", - "newTask": "Enter the title of the new task…", "newNamespace": "Enter the title of the new namespace…", "newTeam": "Enter the name of the new team…", "createTask": "Create a task in the current list ({title})", diff --git a/src/router/index.ts b/src/router/index.ts index 2d150edf..f36f1025 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -23,6 +23,7 @@ import UpcomingTasksComponent from '../views/tasks/ShowTasks.vue' import LinkShareAuthComponent from '../views/sharing/LinkSharingAuth.vue' import ListNamespaces from '../views/namespaces/ListNamespaces.vue' import TaskDetailView from '../views/tasks/TaskDetailView.vue' +import CreateTask from '../views/tasks/CreateTask.vue' // Team Handling import ListTeamsComponent from '../views/teams/ListTeams.vue' // Label Handling @@ -348,6 +349,15 @@ const router = createRouter({ }, props: route => ({ listId: Number(route.params.listId as string) }), }, + { + path: '/lists/:listId/create-task', + name: 'task.create', + component: CreateTask, + meta: { + showAsModal: true, + }, + props: route => ({ listId: Number(route.params.listId as string) }), + }, { path: '/lists/:listId', name: 'list.index', diff --git a/src/views/tasks/CreateTask.vue b/src/views/tasks/CreateTask.vue new file mode 100644 index 00000000..7fc4d05c --- /dev/null +++ b/src/views/tasks/CreateTask.vue @@ -0,0 +1,83 @@ + + + + + From ec01f516a8f20c8bd83e532e27cece0fcb4bd741 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 21 Sep 2022 21:24:03 +0200 Subject: [PATCH 002/187] fix: use pina list store --- src/views/tasks/CreateTask.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/views/tasks/CreateTask.vue b/src/views/tasks/CreateTask.vue index 7fc4d05c..9a97d087 100644 --- a/src/views/tasks/CreateTask.vue +++ b/src/views/tasks/CreateTask.vue @@ -31,7 +31,6 @@ From d950aae3a507cab91e55fd980ad2db2d99adae87 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 21 Sep 2022 21:59:37 +0200 Subject: [PATCH 004/187] feat(task wizard): show error message when no title is provided --- src/views/tasks/CreateTask.vue | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/views/tasks/CreateTask.vue b/src/views/tasks/CreateTask.vue index 2edf99f1..9cf0e296 100644 --- a/src/views/tasks/CreateTask.vue +++ b/src/views/tasks/CreateTask.vue @@ -12,7 +12,10 @@ v-model="newTask.title" v-focus /> - +

+ {{ errorMessage }} +

+ { : t('task.new') }) +const errorMessage = ref('') const descriptionFormVisible = ref(false) const newTask = ref(new TaskModel({})) const taskService = ref(new TaskService()) @@ -70,6 +74,12 @@ const taskService = ref(new TaskService()) const parsedTask = computed(() => parseTaskText(newTask.value.title, getQuickAddMagicMode())) async function create() { + if (newTask.value.title === '') { + errorMessage.value = t('list.create.addTitleRequired') + return + } + errorMessage.value = '' + newTask.value.listId = props.listId newTask.value.title = parsedTask.value.text const assignees = await findAssignees(parsedTask.value.assignees) From 169f95af337e8d81270b3b48fd7a47a90f0b2cac Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 21 Sep 2022 22:18:35 +0200 Subject: [PATCH 005/187] fix(task wizard): creating new task --- src/services/task.ts | 4 ++-- src/views/tasks/CreateTask.vue | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/task.ts b/src/services/task.ts index bb41b685..15d2d21e 100644 --- a/src/services/task.ts +++ b/src/services/task.ts @@ -51,8 +51,8 @@ export default class TaskService extends AbstractService { model.startDate = parseDate(model.startDate) model.endDate = parseDate(model.endDate) model.doneAt = parseDate(model.doneAt) - model.created = formatISO(new Date(model.created)) - model.updated = formatISO(new Date(model.updated)) + model.created = +(model.created) ? parseDate(model.created) : null + model.updated = +(model.updated) ? parseDate(model.updated) : null // remove all nulls, these would create empty reminders for (const index in model.reminderDates) { diff --git a/src/views/tasks/CreateTask.vue b/src/views/tasks/CreateTask.vue index 9cf0e296..485f83f4 100644 --- a/src/views/tasks/CreateTask.vue +++ b/src/views/tasks/CreateTask.vue @@ -83,7 +83,7 @@ async function create() { newTask.value.listId = props.listId newTask.value.title = parsedTask.value.text const assignees = await findAssignees(parsedTask.value.assignees) - const dueDate = parsedTask.value.date !== null ? formatISO(parsedTask.date) : null + const dueDate = parsedTask.value.date !== null ? formatISO(parsedTask.value.date) : null const finalTask = new TaskModel({ ...newTask.value, From e492ce40d2539d6764cda23370015caf4d58f5c5 Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 21 Sep 2022 22:44:42 +0200 Subject: [PATCH 006/187] feat(task wizard): allow setting a due date via popup or quick add magic --- src/components/input/datepicker.vue | 8 +++++--- src/views/tasks/CreateTask.vue | 26 +++++++++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/components/input/datepicker.vue b/src/components/input/datepicker.vue index 733a9fab..89affd4d 100644 --- a/src/components/input/datepicker.vue +++ b/src/components/input/datepicker.vue @@ -1,8 +1,10 @@ From 8c61d99393a18b969881c621864ffc2532254c48 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 22 Sep 2022 18:59:21 +0200 Subject: [PATCH 010/187] feat(task wizard): styling --- src/views/tasks/CreateTask.vue | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/views/tasks/CreateTask.vue b/src/views/tasks/CreateTask.vue index aa61c5d1..ca5157a3 100644 --- a/src/views/tasks/CreateTask.vue +++ b/src/views/tasks/CreateTask.vue @@ -30,16 +30,16 @@ :preview-is-default="false" class="m-4" /> -
+
- + {{ date ? formatDateShort(date) : t('task.attributes.dueDate') }} -
+
From bfb8ab407b24cf9caa8fcf505a53c1e396d924e5 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 22 Sep 2022 19:18:16 +0200 Subject: [PATCH 011/187] feat(task wizard): add label removal --- src/views/tasks/CreateTask.vue | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/views/tasks/CreateTask.vue b/src/views/tasks/CreateTask.vue index ca5157a3..798855c1 100644 --- a/src/views/tasks/CreateTask.vue +++ b/src/views/tasks/CreateTask.vue @@ -45,6 +45,7 @@ :style="{'background': label.hexColor, 'color': label.textColor}" class="tag mr-2"> {{ label.title }} +
@@ -122,6 +123,16 @@ const realLabels = computed(() => { ] }) +function removeLabel(label: ILabel) { + while (true) { // Using a loop to remove all labels, including possible duplicates added via quick add magic + const index = labels.value.findIndex(el => el.toLowerCase() === label.title.toLowerCase()) + if (index === -1) { + break + } + labels.value.splice(index, 1) + } +} + async function create() { if (newTask.value.title === '') { errorMessage.value = t('list.create.addTitleRequired') From e520cd705341e52b46915129dd553a66994f3258 Mon Sep 17 00:00:00 2001 From: kolaente Date: Thu, 22 Sep 2022 19:24:50 +0200 Subject: [PATCH 012/187] feat(task wizard): add label add button --- src/views/tasks/CreateTask.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/views/tasks/CreateTask.vue b/src/views/tasks/CreateTask.vue index 798855c1..b28843d9 100644 --- a/src/views/tasks/CreateTask.vue +++ b/src/views/tasks/CreateTask.vue @@ -39,6 +39,9 @@ {{ date ? formatDateShort(date) : t('task.attributes.dueDate') }} + + {{ t('task.detail.actions.label') }} +
Date: Thu, 22 Sep 2022 20:03:25 +0000 Subject: [PATCH 013/187] chore(deps): update dependency esbuild to v0.15.9 --- package.json | 2 +- pnpm-lock.yaml | 154 +++++++++++++++++++++++-------------------------- 2 files changed, 72 insertions(+), 84 deletions(-) diff --git a/package.json b/package.json index 8dcea0be..fd2239cc 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "browserslist": "4.21.4", "caniuse-lite": "1.0.30001406", "cypress": "10.8.0", - "esbuild": "0.15.8", + "esbuild": "0.15.9", "eslint": "8.23.1", "eslint-plugin-vue": "9.5.1", "express": "4.18.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d79bf0a5..6d8fe817 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,7 +39,7 @@ specifiers: date-fns: 2.29.3 dompurify: 2.4.0 easymde: 2.18.0 - esbuild: 0.15.8 + esbuild: 0.15.9 eslint: 8.23.1 eslint-plugin-vue: 9.5.1 express: 4.18.1 @@ -146,7 +146,7 @@ devDependencies: browserslist: 4.21.4 caniuse-lite: 1.0.30001406 cypress: 10.8.0 - esbuild: 0.15.8 + esbuild: 0.15.9 eslint: 8.23.1 eslint-plugin-vue: 9.5.1_eslint@8.23.1 express: 4.18.1 @@ -1609,19 +1609,17 @@ packages: kuler: 2.0.0 dev: true - /@esbuild/android-arm/0.15.8: - resolution: {integrity: sha512-CyEWALmn+no/lbgbAJsbuuhT8s2J19EJGHkeyAwjbFJMrj80KJ9zuYsoAvidPTU7BgBf87r/sgae8Tw0dbOc4Q==} + /@esbuild/android-arm/0.15.9: + resolution: {integrity: sha512-VZPy/ETF3fBG5PiinIkA0W/tlsvlEgJccyN2DzWZEl0DlVKRbu91PvY2D6Lxgluj4w9QtYHjOWjAT44C+oQ+EQ==} engines: {node: '>=12'} cpu: [arm] os: [android] requiresBuild: true - dependencies: - esbuild-wasm: 0.15.8 dev: true optional: true - /@esbuild/linux-loong64/0.15.8: - resolution: {integrity: sha512-pE5RQsOTSERCtfZdfCT25wzo7dfhOSlhAXcsZmuvRYhendOv7djcdvtINdnDp2DAjP17WXlBB4nBO6sHLczmsg==} + /@esbuild/linux-loong64/0.15.9: + resolution: {integrity: sha512-O+NfmkfRrb3uSsTa4jE3WApidSe3N5++fyOVGP1SmMZi4A3BZELkhUUvj5hwmMuNdlpzAZ8iAPz2vmcR7DCFQA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -5863,19 +5861,17 @@ packages: resolution: {integrity: sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==} dev: true - /esbuild-android-64/0.15.8: - resolution: {integrity: sha512-bVh8FIKOolF7/d4AMzt7xHlL0Ljr+mYKSHI39TJWDkybVWHdn6+4ODL3xZGHOxPpdRpitemXA1WwMKYBsw8dGw==} + /esbuild-android-64/0.15.9: + resolution: {integrity: sha512-HQCX7FJn9T4kxZQkhPjNZC7tBWZqJvhlLHPU2SFzrQB/7nDXjmTIFpFTjt7Bd1uFpeXmuwf5h5fZm+x/hLnhbw==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true - dependencies: - esbuild-wasm: 0.15.8 dev: true optional: true - /esbuild-android-arm64/0.15.8: - resolution: {integrity: sha512-ReAMDAHuo0H1h9LxRabI6gwYPn8k6WiUeyxuMvx17yTrJO+SCnIfNc/TSPFvDwtK9MiyiKG/2dBYHouT/M0BXQ==} + /esbuild-android-arm64/0.15.9: + resolution: {integrity: sha512-E6zbLfqbFVCNEKircSHnPiSTsm3fCRxeIMPfrkS33tFjIAoXtwegQfVZqMGR0FlsvVxp2NEDOUz+WW48COCjSg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -5883,8 +5879,8 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.15.8: - resolution: {integrity: sha512-KaKcGfJ+yto7Fo5gAj3xwxHMd1fBIKatpCHK8znTJLVv+9+NN2/tIPBqA4w5rBwjX0UqXDeIE2v1xJP+nGEXgA==} + /esbuild-darwin-64/0.15.9: + resolution: {integrity: sha512-gI7dClcDN/HHVacZhTmGjl0/TWZcGuKJ0I7/xDGJwRQQn7aafZGtvagOFNmuOq+OBFPhlPv1T6JElOXb0unkSQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -5892,8 +5888,8 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.15.8: - resolution: {integrity: sha512-8tjEaBgAKnXCkP7bhEJmEqdG9HEV6oLkF36BrMzpfW2rgaw0c48Zrxe+9RlfeGvs6gDF4w+agXyTjikzsS3izw==} + /esbuild-darwin-arm64/0.15.9: + resolution: {integrity: sha512-VZIMlcRN29yg/sv7DsDwN+OeufCcoTNaTl3Vnav7dL/nvsApD7uvhVRbgyMzv0zU/PP0xRhhIpTyc7lxEzHGSw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -5901,8 +5897,8 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.15.8: - resolution: {integrity: sha512-jaxcsGHYzn2L0/lffON2WfH4Nc+d/EwozVTP5K2v016zxMb5UQMhLoJzvLgBqHT1SG0B/mO+a+THnJCMVg15zw==} + /esbuild-freebsd-64/0.15.9: + resolution: {integrity: sha512-uM4z5bTvuAXqPxrI204txhlsPIolQPWRMLenvGuCPZTnnGlCMF2QLs0Plcm26gcskhxewYo9LkkmYSS5Czrb5A==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -5910,8 +5906,8 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.15.8: - resolution: {integrity: sha512-2xp2UlljMvX8HExtcg7VHaeQk8OBU0CSl1j18B5CcZmSDkLF9p3utuMXIopG3a08fr9Hv+Dz6+seSXUow/G51w==} + /esbuild-freebsd-arm64/0.15.9: + resolution: {integrity: sha512-HHDjT3O5gWzicGdgJ5yokZVN9K9KG05SnERwl9nBYZaCjcCgj/sX8Ps1jvoFSfNCO04JSsHSOWo4qvxFuj8FoA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -5919,8 +5915,8 @@ packages: dev: true optional: true - /esbuild-linux-32/0.15.8: - resolution: {integrity: sha512-9u1E54BRz1FQMl86iaHK146+4ID2KYNxL3trLZT4QLLx3M7Q9n4lGG3lrzqUatGR2cKy8c33b0iaCzsItZWkFg==} + /esbuild-linux-32/0.15.9: + resolution: {integrity: sha512-AQIdE8FugGt1DkcekKi5ycI46QZpGJ/wqcMr7w6YUmOmp2ohQ8eO4sKUsOxNOvYL7hGEVwkndSyszR6HpVHLFg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -5928,8 +5924,8 @@ packages: dev: true optional: true - /esbuild-linux-64/0.15.8: - resolution: {integrity: sha512-4HxrsN9eUzJXdVGMTYA5Xler82FuZUu21bXKN42zcLHHNKCAMPUzD62I+GwDhsdgUBAUj0tRXDdsQHgaP6v0HA==} + /esbuild-linux-64/0.15.9: + resolution: {integrity: sha512-4RXjae7g6Qs7StZyiYyXTZXBlfODhb1aBVAjd+ANuPmMhWthQilWo7rFHwJwL7DQu1Fjej2sODAVwLbcIVsAYQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -5937,8 +5933,8 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.15.8: - resolution: {integrity: sha512-7DVBU9SFjX4+vBwt8tHsUCbE6Vvl6y6FQWHAgyw1lybC5gULqn/WnjHYHN2/LJaZRsDBvxWT4msEgwLGq1Wd3Q==} + /esbuild-linux-arm/0.15.9: + resolution: {integrity: sha512-3Zf2GVGUOI7XwChH3qrnTOSqfV1V4CAc/7zLVm4lO6JT6wbJrTgEYCCiNSzziSju+J9Jhf9YGWk/26quWPC6yQ==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -5946,8 +5942,8 @@ packages: dev: true optional: true - /esbuild-linux-arm64/0.15.8: - resolution: {integrity: sha512-1OCm7Aq0tEJT70PbxmHSGYDLYP8DKH8r4Nk7/XbVzWaduo9beCjGBB+tGZIHK6DdTQ3h00/4Tb/70YMH/bOtKg==} + /esbuild-linux-arm64/0.15.9: + resolution: {integrity: sha512-a+bTtxJmYmk9d+s2W4/R1SYKDDAldOKmWjWP0BnrWtDbvUBNOm++du0ysPju4mZVoEFgS1yLNW+VXnG/4FNwdQ==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -5955,8 +5951,8 @@ packages: dev: true optional: true - /esbuild-linux-mips64le/0.15.8: - resolution: {integrity: sha512-yeFoNPVFPEzZvFYBfUQNG2TjGRaCyV1E27OcOg4LOtnGrxb2wA+mkW3luckyv1CEyd00mpAg7UdHx8nlx3ghgA==} + /esbuild-linux-mips64le/0.15.9: + resolution: {integrity: sha512-Zn9HSylDp89y+TRREMDoGrc3Z4Hs5u56ozZLQCiZAUx2+HdbbXbWdjmw3FdTJ/i7t5Cew6/Q+6kfO3KCcFGlyw==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -5964,8 +5960,8 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.15.8: - resolution: {integrity: sha512-CEyMMUUNabXibw8OSNmBXhOIGhnjNVl5Lpseiuf00iKN0V47oqDrbo4dsHz1wH62m49AR8iG8wpDlTqfYgKbtg==} + /esbuild-linux-ppc64le/0.15.9: + resolution: {integrity: sha512-OEiOxNAMH9ENFYqRsWUj3CWyN3V8P3ZXyfNAtX5rlCEC/ERXrCEFCJji/1F6POzsXAzxvUJrTSTCy7G6BhA6Fw==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -5973,8 +5969,8 @@ packages: dev: true optional: true - /esbuild-linux-riscv64/0.15.8: - resolution: {integrity: sha512-OCGSOaspMUjexSCU8ZiA0UnV/NiRU+s2vIfEcAQWQ6u32R+2luyfh/4ZaY6jFbylJE07Esc/yRvb9Q5fXuClXA==} + /esbuild-linux-riscv64/0.15.9: + resolution: {integrity: sha512-ukm4KsC3QRausEFjzTsOZ/qqazw0YvJsKmfoZZm9QW27OHjk2XKSQGGvx8gIEswft/Sadp03/VZvAaqv5AIwNA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -5982,8 +5978,8 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.15.8: - resolution: {integrity: sha512-RHdpdfxRTSrZXZJlFSLazFU4YwXLB5Rgf6Zr5rffqSsO4y9JybgtKO38bFwxZNlDXliYISXN/YROKrG9s7mZQA==} + /esbuild-linux-s390x/0.15.9: + resolution: {integrity: sha512-uDOQEH55wQ6ahcIKzQr3VyjGc6Po/xblLGLoUk3fVL1qjlZAibtQr6XRfy5wPJLu/M2o0vQKLq4lyJ2r1tWKcw==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -5991,8 +5987,8 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.15.8: - resolution: {integrity: sha512-VolFFRatBH09T5QMWhiohAWCOien1R1Uz9K0BRVVTBgBaVBt7eArsXTKxVhUgRf2vwu2c2SXkuP0r7HLG0eozw==} + /esbuild-netbsd-64/0.15.9: + resolution: {integrity: sha512-yWgxaYTQz+TqX80wXRq6xAtb7GSBAp6gqLKfOdANg9qEmAI1Bxn04IrQr0Mzm4AhxvGKoHzjHjMgXbCCSSDxcw==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -6000,8 +5996,8 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.15.8: - resolution: {integrity: sha512-HTAPlg+n4kUeE/isQxlCfsOz0xJGNoT5LJ9oYZWFKABfVf4Ycu7Zlf5ITgOnrdheTkz8JeL/gISIOCFAoOXrSA==} + /esbuild-openbsd-64/0.15.9: + resolution: {integrity: sha512-JmS18acQl4iSAjrEha1MfEmUMN4FcnnrtTaJ7Qg0tDCOcgpPPQRLGsZqhes0vmx8VA6IqRyScqXvaL7+Q0Uf3A==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -6009,8 +6005,8 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.15.8: - resolution: {integrity: sha512-qMP/jR/FzcIOwKj+W+Lb+8Cfr8GZHbHUJxAPi7DUhNZMQ/6y7sOgRzlOSpRrbbUntrRZh0MqOyDhJ3Gpo6L1QA==} + /esbuild-sunos-64/0.15.9: + resolution: {integrity: sha512-UKynGSWpzkPmXW3D2UMOD9BZPIuRaSqphxSCwScfEE05Be3KAmvjsBhht1fLzKpiFVJb0BYMd4jEbWMyJ/z1hQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -6018,16 +6014,8 @@ packages: dev: true optional: true - /esbuild-wasm/0.15.8: - resolution: {integrity: sha512-Y7uCl5RNO4URjlemjdx++ukVHEMt5s5AfMWYUnMiK4Sry+pPCvQIctzXq6r6FKCyGKjX6/NGMCqR2OX6aLxj0w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /esbuild-windows-32/0.15.8: - resolution: {integrity: sha512-RKR1QHh4iWzjUhkP8Yqi75PPz/KS+b8zw3wUrzw6oAkj+iU5Qtyj61ZDaSG3Qf2vc6hTIUiPqVTqBH0NpXFNwg==} + /esbuild-windows-32/0.15.9: + resolution: {integrity: sha512-aqXvu4/W9XyTVqO/hw3rNxKE1TcZiEYHPsXM9LwYmKSX9/hjvfIJzXwQBlPcJ/QOxedfoMVH0YnhhQ9Ffb0RGA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -6035,8 +6023,8 @@ packages: dev: true optional: true - /esbuild-windows-64/0.15.8: - resolution: {integrity: sha512-ag9ptYrsizgsR+PQE8QKeMqnosLvAMonQREpLw4evA4FFgOBMLEat/dY/9txbpozTw9eEOYyD3a4cE9yTu20FA==} + /esbuild-windows-64/0.15.9: + resolution: {integrity: sha512-zm7h91WUmlS4idMtjvCrEeNhlH7+TNOmqw5dJPJZrgFaxoFyqYG6CKDpdFCQXdyKpD5yvzaQBOMVTCBVKGZDEg==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -6044,8 +6032,8 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.15.8: - resolution: {integrity: sha512-dbpAb0VyPaUs9mgw65KRfQ9rqiWCHpNzrJusoPu+LpEoswosjt/tFxN7cd2l68AT4qWdBkzAjDLRon7uqMeWcg==} + /esbuild-windows-arm64/0.15.9: + resolution: {integrity: sha512-yQEVIv27oauAtvtuhJVfSNMztJJX47ismRS6Sv2QMVV9RM+6xjbMWuuwM2nxr5A2/gj/mu2z9YlQxiwoFRCfZA==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -6053,34 +6041,34 @@ packages: dev: true optional: true - /esbuild/0.15.8: - resolution: {integrity: sha512-Remsk2dmr1Ia65sU+QasE6svJbsHe62lzR+CnjpUvbZ+uSYo1SitiOWPRfZQkCu82YWZBBKXiD/j0i//XWMZ+Q==} + /esbuild/0.15.9: + resolution: {integrity: sha512-OnYr1rkMVxtmMHIAKZLMcEUlJmqcbxBz9QoBU8G9v455na0fuzlT/GLu6l+SRghrk0Mm2fSSciMmzV43Q8e0Gg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.15.8 - '@esbuild/linux-loong64': 0.15.8 - esbuild-android-64: 0.15.8 - esbuild-android-arm64: 0.15.8 - esbuild-darwin-64: 0.15.8 - esbuild-darwin-arm64: 0.15.8 - esbuild-freebsd-64: 0.15.8 - esbuild-freebsd-arm64: 0.15.8 - esbuild-linux-32: 0.15.8 - esbuild-linux-64: 0.15.8 - esbuild-linux-arm: 0.15.8 - esbuild-linux-arm64: 0.15.8 - esbuild-linux-mips64le: 0.15.8 - esbuild-linux-ppc64le: 0.15.8 - esbuild-linux-riscv64: 0.15.8 - esbuild-linux-s390x: 0.15.8 - esbuild-netbsd-64: 0.15.8 - esbuild-openbsd-64: 0.15.8 - esbuild-sunos-64: 0.15.8 - esbuild-windows-32: 0.15.8 - esbuild-windows-64: 0.15.8 - esbuild-windows-arm64: 0.15.8 + '@esbuild/android-arm': 0.15.9 + '@esbuild/linux-loong64': 0.15.9 + esbuild-android-64: 0.15.9 + esbuild-android-arm64: 0.15.9 + esbuild-darwin-64: 0.15.9 + esbuild-darwin-arm64: 0.15.9 + esbuild-freebsd-64: 0.15.9 + esbuild-freebsd-arm64: 0.15.9 + esbuild-linux-32: 0.15.9 + esbuild-linux-64: 0.15.9 + esbuild-linux-arm: 0.15.9 + esbuild-linux-arm64: 0.15.9 + esbuild-linux-mips64le: 0.15.9 + esbuild-linux-ppc64le: 0.15.9 + esbuild-linux-riscv64: 0.15.9 + esbuild-linux-s390x: 0.15.9 + esbuild-netbsd-64: 0.15.9 + esbuild-openbsd-64: 0.15.9 + esbuild-sunos-64: 0.15.9 + esbuild-windows-32: 0.15.9 + esbuild-windows-64: 0.15.9 + esbuild-windows-arm64: 0.15.9 dev: true /escalade/3.1.1: @@ -12611,7 +12599,7 @@ packages: terser: optional: true dependencies: - esbuild: 0.15.8 + esbuild: 0.15.9 postcss: 8.4.16 resolve: 1.22.1 rollup: 2.78.0 From c2ba1b2828439d3bd1e846a4bb9a4c456562c460 Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Fri, 2 Sep 2022 11:17:21 +0200 Subject: [PATCH 014/187] feat: move attachments store to stores --- src/store/index.ts | 2 -- src/{store/modules => stores}/attachments.ts | 0 2 files changed, 2 deletions(-) rename src/{store/modules => stores}/attachments.ts (100%) diff --git a/src/store/index.ts b/src/store/index.ts index 6fa53407..3e0b1cda 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -17,7 +17,6 @@ import config from './modules/config' import auth from './modules/auth' import kanban from './modules/kanban' import tasks from './modules/tasks' -import attachments from './modules/attachments' import ListModel from '@/models/list' @@ -40,7 +39,6 @@ export const store = createStore({ auth, kanban, tasks, - attachments, }, state: () => ({ loading: false, diff --git a/src/store/modules/attachments.ts b/src/stores/attachments.ts similarity index 100% rename from src/store/modules/attachments.ts rename to src/stores/attachments.ts From 20e94206388ab694248942996fdb67b7be87e76f Mon Sep 17 00:00:00 2001 From: Dominik Pschenitschni Date: Fri, 2 Sep 2022 11:23:47 +0200 Subject: [PATCH 015/187] feat: port attachments store to pinia --- src/components/tasks/partials/attachments.vue | 18 ++++----- src/store/modules/tasks.ts | 6 ++- src/stores/attachments.ts | 37 +++++++++++-------- src/views/tasks/TaskDetailView.vue | 7 +++- 4 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/components/tasks/partials/attachments.vue b/src/components/tasks/partials/attachments.vue index 21337842..ff5bd6a3 100644 --- a/src/components/tasks/partials/attachments.vue +++ b/src/components/tasks/partials/attachments.vue @@ -138,9 +138,8 @@ diff --git a/src/store/modules/tasks.ts b/src/store/modules/tasks.ts index d18e218e..9f7248aa 100644 --- a/src/store/modules/tasks.ts +++ b/src/store/modules/tasks.ts @@ -27,6 +27,7 @@ import type { IList } from '@/modelTypes/IList' import type { RootStoreState, TaskState } from '@/store/types' import {useLabelStore} from '@/stores/labels' import {useListStore} from '@/stores/lists' +import {useAttachmentStore} from '@/stores/attachments' import {playPop} from '@/helpers/playPop' // IDEA: maybe use a small fuzzy search here to prevent errors @@ -138,7 +139,8 @@ const tasksStore : Module= { } ctx.commit('kanban/setTaskInBucketByIndex', newTask, {root: true}) } - ctx.commit('attachments/add', attachment, {root: true}) + const attachmentStore = useAttachmentStore() + attachmentStore.add(attachment) }, async addAssignee(ctx, { @@ -282,7 +284,7 @@ const tasksStore : Module= { const labelStore = useLabelStore() const labelAddsToWaitFor = parsedLabels.map(async labelTitle => { - let label = validateLabel(labelStore.labels, labelTitle) + let label = validateLabel(Object.values(labelStore.labels), labelTitle) if (typeof label === 'undefined') { // label not found, create it const labelModel = new LabelModel({title: labelTitle}) diff --git a/src/stores/attachments.ts b/src/stores/attachments.ts index 172696e4..7c0f16d5 100644 --- a/src/stores/attachments.ts +++ b/src/stores/attachments.ts @@ -1,29 +1,34 @@ -import type { Module } from 'vuex' +import {defineStore, acceptHMRUpdate} from 'pinia' import {findIndexById} from '@/helpers/utils' -import type { AttachmentState, RootStoreState } from '@/store/types' -import type { IAttachment } from '@/modelTypes/IAttachment' +import type {AttachmentState} from '@/store/types' +import type {IAttachment} from '@/modelTypes/IAttachment' -const store : Module = { - namespaced: true, - state: () => ({ +export const useAttachmentStore = defineStore('attachment', { + state: (): AttachmentState => ({ attachments: [], }), - mutations: { - set(state, attachments: IAttachment[]) { + + actions: { + set(attachments: IAttachment[]) { console.debug('Set attachments', attachments) - state.attachments = attachments + this.attachments = attachments }, - add(state, attachment: IAttachment) { + + add(attachment: IAttachment) { console.debug('Add attachement', attachment) - state.attachments.push(attachment) + this.attachments.push(attachment) }, - removeById(state, id: IAttachment['id']) { - const attachmentIndex = findIndexById(state.attachments, id) - state.attachments.splice(attachmentIndex, 1) + + removeById(id: IAttachment['id']) { + const attachmentIndex = findIndexById(this.attachments, id) + this.attachments.splice(attachmentIndex, 1) console.debug('Remove attachement', id) }, }, -} +}) -export default store \ No newline at end of file +// support hot reloading +if (import.meta.hot) { + import.meta.hot.accept(acceptHMRUpdate(useAttachmentStore, import.meta.hot)) +} \ No newline at end of file diff --git a/src/views/tasks/TaskDetailView.vue b/src/views/tasks/TaskDetailView.vue index 6401f420..ea67956e 100644 --- a/src/views/tasks/TaskDetailView.vue +++ b/src/views/tasks/TaskDetailView.vue @@ -463,6 +463,7 @@ import {getListTitle} from '@/helpers/getListTitle' import type {IList} from '@/modelTypes/IList' import {colorIsDark} from '@/helpers/color/colorIsDark' import {useNamespaceStore} from '@/stores/namespaces' +import {useAttachmentStore} from '@/stores/attachments' function scrollIntoView(el) { if (!el) { @@ -595,7 +596,8 @@ export default defineComponent({ return typeof this.task !== 'undefined' && typeof this.task.maxRight !== 'undefined' && this.task.maxRight > rights.READ }, hasAttachments() { - return this.$store.state.attachments.attachments.length > 0 + const attachmentsStore = useAttachmentStore() + return attachmentsStore.attachments.length > 0 }, shouldShowClosePopup() { return this.$route.name.includes('kanban') @@ -624,7 +626,8 @@ export default defineComponent({ try { this.task = await this.taskService.get({id: taskId}) - this.$store.commit('attachments/set', this.task.attachments) + const attachmentStore = useAttachmentStore() + attachmentStore.set(this.task.attachments) this.taskColor = this.task.hexColor this.setActiveFields() await this.$nextTick() From 5ffb13a3a805d779fe6444a267ebb9a786f24614 Mon Sep 17 00:00:00 2001 From: renovate Date: Fri, 23 Sep 2022 06:41:16 +0000 Subject: [PATCH 016/187] chore(deps): update pnpm to v7.12.2 (#2408) Reviewed-on: https://kolaente.dev/vikunja/frontend/pulls/2408 Co-authored-by: renovate Co-committed-by: renovate --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fd2239cc..8832efce 100644 --- a/package.json +++ b/package.json @@ -107,5 +107,5 @@ } }, "license": "AGPL-3.0-or-later", - "packageManager": "pnpm@7.12.1" + "packageManager": "pnpm@7.12.2" } From ede5cdd8cf5575bba96d3e7b6824a7ad7b414ea7 Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 23 Sep 2022 10:36:21 +0200 Subject: [PATCH 017/187] fix: only pass date to flatpickr if it's a valid date Resolves #2384 --- src/components/date/datepickerWithRange.vue | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/date/datepickerWithRange.vue b/src/components/date/datepickerWithRange.vue index e27acf7a..23181279 100644 --- a/src/components/date/datepickerWithRange.vue +++ b/src/components/date/datepickerWithRange.vue @@ -118,7 +118,13 @@ watch( newValue => { from.value = newValue.dateFrom to.value = newValue.dateTo - flatpickrRange.value = `${from.value} to ${to.value}` + // Only set the date back to flatpickr when it's an actual date. + // Otherwise flatpickr runs in an endless loop and slows down the browser. + const dateFrom = new Date(from.value) + const dateTo = new Date(to.value) + if (dateTo.getTime() === dateTo.getTime() && dateFrom.getTime() === dateFrom.getTime()) { + flatpickrRange.value = `${from.value} to ${to.value}` + } }, ) From aa64e9835c6b9ef2bb10ab8d2a1b4a695cb4321b Mon Sep 17 00:00:00 2001 From: kolaente Date: Fri, 23 Sep 2022 11:11:11 +0200 Subject: [PATCH 018/187] fix: loading state when creating a new task from list view --- src/components/tasks/add-task.vue | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/tasks/add-task.vue b/src/components/tasks/add-task.vue index 60004a92..9c7e0ece 100644 --- a/src/components/tasks/add-task.vue +++ b/src/components/tasks/add-task.vue @@ -3,7 +3,7 @@