From 3d88fdaaddca15b98efa938f0b2813420d56ad84 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sun, 2 Oct 2022 13:01:29 +0200 Subject: [PATCH 001/129] feat: add display of kanban card attachment image --- src/components/tasks/partials/attachments.vue | 5 +- src/components/tasks/partials/kanban-card.vue | 134 +++++++++++------- src/modelTypes/ITask.ts | 6 +- src/models/attachment.ts | 2 + 4 files changed, 91 insertions(+), 56 deletions(-) diff --git a/src/components/tasks/partials/attachments.vue b/src/components/tasks/partials/attachments.vue index 5b70d84bc..70d6b049b 100644 --- a/src/components/tasks/partials/attachments.vue +++ b/src/components/tasks/partials/attachments.vue @@ -145,6 +145,7 @@ import User from '@/components/misc/user.vue' import BaseButton from '@/components/base/BaseButton.vue' import AttachmentService from '@/services/attachment' +import {SUPPORTED_IMAGE_SUFFIX} from '@/models/attachment' import type AttachmentModel from '@/models/attachment' import type {IAttachment} from '@/modelTypes/IAttachment' import type {ITask} from '@/modelTypes/ITask' @@ -223,10 +224,8 @@ async function deleteAttachment() { } const attachmentImageBlobUrl = ref(null) -const SUPPORTED_SUFFIX = ['.jpg', '.png', '.bmp', '.gif'] - async function viewOrDownload(attachment: AttachmentModel) { - if (SUPPORTED_SUFFIX.some((suffix) => attachment.file.name.endsWith(suffix)) ) { + if (SUPPORTED_IMAGE_SUFFIX.some((suffix) => attachment.file.name.endsWith(suffix)) ) { attachmentImageBlobUrl.value = await attachmentService.getBlobUrl(attachment) } else { downloadAttachment(attachment) diff --git a/src/components/tasks/partials/kanban-card.vue b/src/components/tasks/partials/kanban-card.vue index 1ee64f36c..af16719ed 100644 --- a/src/components/tasks/partials/kanban-card.vue +++ b/src/components/tasks/partials/kanban-card.vue @@ -11,62 +11,70 @@ @click.ctrl="() => toggleTaskDone(task)" @click.meta="() => toggleTaskDone(task)" > - - - - - - - - + +
+ + + + - - -

{{ task.title }}

- - {{ task.percentDone * 100 }}% - - \ No newline at end of file diff --git a/src/i18n/lang/en.json b/src/i18n/lang/en.json index 2a8615b8d..780ce3b79 100644 --- a/src/i18n/lang/en.json +++ b/src/i18n/lang/en.json @@ -696,7 +696,8 @@ "copyUrlTooltip": "Copy the url of this attachment for usage in text", "setAsCover": "Make cover", "unsetAsCover": "Remove cover", - "successfullyChangedCoverImage": "The cover image was successfully changed." + "successfullyChangedCoverImage": "The cover image was successfully changed.", + "usedAsCover": "Cover image" }, "comment": { "title": "Comments", From fd71de4b5d99311227c76426b2250ca780dba9ef Mon Sep 17 00:00:00 2001 From: kolaente Date: Wed, 5 Oct 2022 16:02:44 +0200 Subject: [PATCH 011/129] fix(task): setting a priority was not properly saved --- cypress/e2e/task/task.spec.ts | 23 +++++++++++++++ src/views/tasks/TaskDetailView.vue | 47 +++++++++++++++++------------- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/cypress/e2e/task/task.spec.ts b/cypress/e2e/task/task.spec.ts index b5fa3c57f..af95b56c1 100644 --- a/cypress/e2e/task/task.spec.ts +++ b/cypress/e2e/task/task.spec.ts @@ -80,6 +80,7 @@ describe('Task', () => { describe('Task Detail View', () => { beforeEach(() => { TaskCommentFactory.truncate() + LabelTaskFactory.truncate() }) it('Shows all task details', () => { @@ -417,5 +418,27 @@ describe('Task', () => { cy.get('.global-notification') .should('contain', 'Success') }) + + it('Can set a priority for a task', () => { + const tasks = TaskFactory.create(1, { + id: 1, + }) + cy.visit(`/tasks/${tasks[0].id}`) + + cy.get('.task-view .action-buttons .button') + .contains('Set Priority') + .click() + cy.get('.task-view .columns.details .column') + .contains('Priority') + .get('.select select') + .select('Urgent') + cy.get('.global-notification') + .should('contain', 'Success') + + cy.get('.task-view .columns.details .column') + .contains('Priority') + .get('.select select') + .should('have.value', '4') + }) }) }) diff --git a/src/views/tasks/TaskDetailView.vue b/src/views/tasks/TaskDetailView.vue index 434cb9ed9..8c7606c9e 100644 --- a/src/views/tasks/TaskDetailView.vue +++ b/src/views/tasks/TaskDetailView.vue @@ -39,7 +39,7 @@
@@ -443,7 +443,7 @@ import TaskModel, {TASK_DEFAULT_COLOR} from '@/models/task' import type {ITask} from '@/modelTypes/ITask' import type {IList} from '@/modelTypes/IList' -import {PRIORITIES} from '@/constants/priorities' +import {PRIORITIES, type Priority} from '@/constants/priorities' import {RIGHTS} from '@/constants/rights' import BaseButton from '@/components/base/BaseButton.vue' @@ -676,21 +676,19 @@ function setFieldActive(fieldName: keyof typeof activeFields) { } async function saveTask(args?: { - task: ITask, - showNotification?: boolean, - undoCallback?: () => void, - }) { - const { - task: currentTask, - showNotification, - undoCallback, - } = { - ...{ - task: cloneDeep(task), - showNotification: true, - }, - ...args, - } + task: ITask, + undoCallback?: () => void, +}) { + const { + task: currentTask, + undoCallback, + } = { + ...{ + task: cloneDeep(task), + }, + ...args, + } + if (!canWrite.value) { return } @@ -711,10 +709,6 @@ async function saveTask(args?: { Object.assign(task, newTask) setActiveFields() - if (!showNotification) { - return - } - let actions = [] if (undoCallback !== null) { actions = [{ @@ -760,6 +754,17 @@ async function toggleFavorite() { Object.assign(task, newTask) await namespaceStore.loadNamespacesIfFavoritesDontExist() } + +async function setPriority(priority: Priority) { + const newTask: ITask = { + ...task, + priority, + } + + return saveTask({ + task: newTask, + }) +}