From 1d94a1c3f893b0552fdae9a774d328dfc94ea299 Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Wed, 22 Mar 2023 17:08:19 +0700 Subject: [PATCH] TSK-915: Tracker status (#2802) Signed-off-by: Andrey Sobolev --- models/tracker/src/index.ts | 13 +- models/tracker/src/migration.ts | 12 +- plugins/tracker-assets/lang/en.json | 1 - plugins/tracker-assets/lang/ru.json | 1 - .../src/components/CreateIssue.svelte | 162 ++++++++---------- .../src/components/SubIssues.svelte | 16 +- .../src/components/issues/IssuePreview.svelte | 4 +- .../issues/IssueStatusActivity.svelte | 32 +--- .../components/issues/IssueStatusIcon.svelte | 24 +-- .../src/components/issues/StatusEditor.svelte | 45 ++--- .../components/issues/StatusPresenter.svelte | 11 +- .../issues/StatusRefPresenter.svelte | 17 +- .../issues/edit/ControlPanel.svelte | 7 +- .../issues/edit/CreateSubIssue.svelte | 24 ++- .../components/issues/edit/EditIssue.svelte | 32 +--- .../issues/edit/SubIssueList.svelte | 7 +- .../components/issues/edit/SubIssues.svelte | 82 +++------ .../issues/edit/SubIssuesSelector.svelte | 37 ++-- .../related/RelatedIssueSelector.svelte | 28 ++- .../issues/related/RelatedIssues.svelte | 34 +--- .../issues/timereport/EstimationPopup.svelte | 25 +-- .../timereport/SubIssuesEstimations.svelte | 7 +- .../components/sprints/IssueStatistics.svelte | 20 +-- .../templates/DraftIssueChildEditor.svelte | 16 +- .../templates/DraftIssueChildList.svelte | 16 +- .../workflow/StatusPresenter.svelte | 7 +- .../src/components/workflow/Statuses.svelte | 42 ++--- plugins/tracker-resources/src/plugin.ts | 1 - plugins/tracker-resources/src/utils.ts | 23 +++ plugins/tracker/src/index.ts | 9 - 30 files changed, 266 insertions(+), 489 deletions(-) diff --git a/models/tracker/src/index.ts b/models/tracker/src/index.ts index 8d084bbbc5..f7ad3320a3 100644 --- a/models/tracker/src/index.ts +++ b/models/tracker/src/index.ts @@ -73,8 +73,7 @@ import { Project, TimeReportDayType, TimeSpendReport, - trackerId, - WorkDayLength + trackerId } from '@hcengineering/tracker' import { KeyBinding, ViewOptionsModel } from '@hcengineering/view' import tracker from './plugin' @@ -92,11 +91,14 @@ export const DOMAIN_TRACKER = 'tracker' as Domain */ @Model(tracker.class.IssueStatus, core.class.AttachedDoc, DOMAIN_TRACKER) export class TIssueStatus extends TAttachedDoc implements IssueStatus { - name!: string + @Index(IndexKind.Indexed) + name!: string + description?: string color?: number @Prop(TypeRef(tracker.class.IssueStatusCategory), tracker.string.StatusCategory) + @Index(IndexKind.Indexed) category!: Ref @Prop(TypeString(), tracker.string.Rank) @@ -161,10 +163,6 @@ export class TTypeSprintStatus extends TType {} @Model(tracker.class.Project, core.class.Space, DOMAIN_SPACE) @UX(tracker.string.Project, tracker.icon.Project, 'Project') export class TProject extends TSpace implements Project { - @Prop(TypeString(), tracker.string.Title) - @Index(IndexKind.FullText) - reamLogo!: IntlString - @Prop(TypeString(), tracker.string.Identifier) @Index(IndexKind.FullText) identifier!: IntlString @@ -182,7 +180,6 @@ export class TProject extends TSpace implements Project { @Prop(TypeRef(contact.class.Employee), tracker.string.DefaultAssignee) defaultAssignee!: Ref - declare workDayLength: WorkDayLength declare defaultTimeReportDay: TimeReportDayType } diff --git a/models/tracker/src/migration.ts b/models/tracker/src/migration.ts index 3e775af4df..0f4b5fad33 100644 --- a/models/tracker/src/migration.ts +++ b/models/tracker/src/migration.ts @@ -39,8 +39,7 @@ import { IssueTemplate, IssueTemplateChild, Project, - TimeReportDayType, - WorkDayLength + TimeReportDayType } from '@hcengineering/tracker' import { DOMAIN_TRACKER } from '.' import tracker from './plugin' @@ -126,8 +125,7 @@ async function createDefaultProject (tx: TxOperations): Promise { issueStatuses: 0, defaultIssueStatus: defaultStatusId, defaultTimeReportDay: TimeReportDayType.PreviousWorkDay, - defaultAssignee: undefined, - workDayLength: WorkDayLength.EIGHT_HOURS + defaultAssignee: undefined }, tracker.project.DefaultProject ) @@ -157,14 +155,12 @@ async function fixProjectsIssueStatusesOrder (tx: TxOperations): Promise { async function upgradeProjectSettings (tx: TxOperations): Promise { const projects = await tx.findAll(tracker.class.Project, { - defaultTimeReportDay: { $exists: false }, - workDayLength: { $exists: false } + defaultTimeReportDay: { $exists: false } }) await Promise.all( projects.map((project) => tx.update(project, { - defaultTimeReportDay: TimeReportDayType.PreviousWorkDay, - workDayLength: WorkDayLength.EIGHT_HOURS + defaultTimeReportDay: TimeReportDayType.PreviousWorkDay }) ) ) diff --git a/plugins/tracker-assets/lang/en.json b/plugins/tracker-assets/lang/en.json index 0e8e2a6840..b7fba9479e 100644 --- a/plugins/tracker-assets/lang/en.json +++ b/plugins/tracker-assets/lang/en.json @@ -280,7 +280,6 @@ "DefaultTimeReportDay": "Select default day for time report", "DefaultAssignee": "Select default assignee for issues", - "WorkDayLength": "Select length of working day", "SevenHoursLength": "Seven Hours", "EightHoursLength": "Eight Hours", "CreatedOn": "Created on", diff --git a/plugins/tracker-assets/lang/ru.json b/plugins/tracker-assets/lang/ru.json index 8a2041cd3b..38a934da4f 100644 --- a/plugins/tracker-assets/lang/ru.json +++ b/plugins/tracker-assets/lang/ru.json @@ -280,7 +280,6 @@ "DefaultTimeReportDay": "Выберите день для временного отчета по умолчанию", "DefaultAssignee": "Выберите исполнителя по умолчанию", - "WorkDayLength": "Выберите длину рабочего дня", "SevenHoursLength": "Семь Часов", "EightHoursLength": "Восемь Часов", "CreatedOn": "Создана", diff --git a/plugins/tracker-resources/src/components/CreateIssue.svelte b/plugins/tracker-resources/src/components/CreateIssue.svelte index de13d57f8a..215b594ecb 100644 --- a/plugins/tracker-resources/src/components/CreateIssue.svelte +++ b/plugins/tracker-resources/src/components/CreateIssue.svelte @@ -24,8 +24,7 @@ fillDefaults, generateId, Ref, - SortingOrder, - WithLookup + SortingOrder } from '@hcengineering/core' import { getResource, translate } from '@hcengineering/platform' import { @@ -41,15 +40,15 @@ import tags, { TagElement, TagReference } from '@hcengineering/tags' import { calcRank, + Component as ComponentType, DraftIssueChild, Issue, IssueDraft, IssuePriority, IssueStatus, IssueTemplate, - Component as ComponentType, - Sprint, - Project + Project, + Sprint } from '@hcengineering/tracker' import { ActionIcon, @@ -62,8 +61,7 @@ IconMoreH, Label, Menu, - showPopup, - Spinner + showPopup } from '@hcengineering/ui' import view from '@hcengineering/view' import { ObjectBox } from '@hcengineering/view-resources' @@ -71,13 +69,13 @@ import { createEventDispatcher } from 'svelte' import { activeComponent, activeSprint, generateIssueShortLink, getIssueId, updateIssueRelation } from '../issues' import tracker from '../plugin' + import ComponentSelector from './ComponentSelector.svelte' import AssigneeEditor from './issues/AssigneeEditor.svelte' import IssueNotification from './issues/IssueNotification.svelte' import ParentIssue from './issues/ParentIssue.svelte' import PriorityEditor from './issues/PriorityEditor.svelte' import StatusEditor from './issues/StatusEditor.svelte' import EstimationEditor from './issues/timereport/EstimationEditor.svelte' - import ComponentSelector from './ComponentSelector.svelte' import SetDueDateActionPopup from './SetDueDateActionPopup.svelte' import SetParentIssueActionPopup from './SetParentIssueActionPopup.svelte' import SprintSelector from './sprints/SprintSelector.svelte' @@ -101,7 +99,6 @@ let subIssuesComponent: SubIssues - let issueStatuses: WithLookup[] | undefined let labels: TagReference[] = draft?.labels || [] let objectId: Ref = draft?.issueId || generateId() let saveTimer: number | undefined @@ -137,6 +134,15 @@ createOn: Date.now() } + $: _space = draft?.project || space + $: !originalIssue && !draft && updateIssueStatusId(currentProject, status) + $: !originalIssue && !draft && updateAssigneeId(currentProject) + $: canSave = getTitle(object.title ?? '').length > 0 + + $: if (object.space !== _space) { + object.space = _space + } + let object = originalIssue ? { ...originalIssue, @@ -145,15 +151,16 @@ attachments: 0, reportedTime: 0, reports: 0, - childInfo: [] + childInfo: [], + space: _space } - : toIssue(defaultIssue, draft) + : { ...toIssue(defaultIssue, draft), space: _space } fillDefaults(hierarchy, object, tracker.class.Issue) function resetObject (): void { templateId = undefined template = undefined - object = { ...defaultIssue } + object = { ...defaultIssue, space: _space } subIssues = [] labels = [] if (!originalIssue && !draft) { @@ -228,7 +235,6 @@ $: updateTemplate(template) const dispatch = createEventDispatcher() - const statusesQuery = createQuery() const spaceQuery = createQuery() let descriptionBox: AttachmentStyledBox @@ -238,22 +244,6 @@ attr: client.getHierarchy().getAttribute(tracker.class.Issue, 'labels') } - $: _space = draft?.project || space - $: !originalIssue && !draft && updateIssueStatusId(currentProject, status) - $: !originalIssue && !draft && updateAssigneeId(currentProject) - $: canSave = getTitle(object.title ?? '').length > 0 - - $: statusesQuery.query( - tracker.class.IssueStatus, - { attachedTo: _space }, - (statuses) => { - issueStatuses = statuses - }, - { - lookup: { category: tracker.class.IssueStatusCategory }, - sort: { rank: SortingOrder.Ascending } - } - ) $: spaceQuery.query(tracker.class.Project, { _id: _space }, (res) => { currentProject = res.shift() }) @@ -706,72 +696,64 @@ }} /> {/key} - {#if issueStatuses} - - {/if} + - {#if issueStatuses} -
- (object.status = detail)} - /> -
- + (object.priority = detail)} + shouldShowLabel={true} + on:change={({ detail }) => (object.status = detail)} /> - (object.assignee = detail)} - /> - { - addTagRef(evt.detail) - }} - on:delete={(evt) => { - labels = labels.filter((it) => it._id !== evt.detail) - }} - /> - - - - {#if object.dueDate !== null} - - {/if} - {:else} - + + (object.priority = detail)} + /> + (object.assignee = detail)} + /> + { + addTagRef(evt.detail) + }} + on:delete={(evt) => { + labels = labels.filter((it) => it._id !== evt.detail) + }} + /> + + + + {#if object.dueDate !== null} + {/if}
diff --git a/plugins/tracker-resources/src/components/SubIssues.svelte b/plugins/tracker-resources/src/components/SubIssues.svelte index 96cc30a9fe..9f5b1fdb00 100644 --- a/plugins/tracker-resources/src/components/SubIssues.svelte +++ b/plugins/tracker-resources/src/components/SubIssues.svelte @@ -15,19 +15,10 @@
diff --git a/plugins/tracker-resources/src/components/issues/IssueStatusIcon.svelte b/plugins/tracker-resources/src/components/issues/IssueStatusIcon.svelte index d9cd0530c8..62f858b444 100644 --- a/plugins/tracker-resources/src/components/issues/IssueStatusIcon.svelte +++ b/plugins/tracker-resources/src/components/issues/IssueStatusIcon.svelte @@ -13,19 +13,18 @@ // limitations under the License. --> @@ -103,11 +88,7 @@
- {#if selectedStatus}{/if} + {#if selectedStatus}{/if}
{#if selectedStatusLabel} {#if value} + {@const icon = $statusByIdStore.get(value._id)?.$lookup?.category?.icon}
- {#if value.$lookup?.category?.icon} + {#if icon} {/if} - + {value.name}
diff --git a/plugins/tracker-resources/src/components/issues/StatusRefPresenter.svelte b/plugins/tracker-resources/src/components/issues/StatusRefPresenter.svelte index f5f565dab8..a23248560a 100644 --- a/plugins/tracker-resources/src/components/issues/StatusRefPresenter.svelte +++ b/plugins/tracker-resources/src/components/issues/StatusRefPresenter.svelte @@ -13,20 +13,15 @@ // limitations under the License. --> - +{#if value} + +{/if} diff --git a/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte b/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte index 551ce997d5..4e4224bb6c 100644 --- a/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte +++ b/plugins/tracker-resources/src/components/issues/edit/ControlPanel.svelte @@ -15,11 +15,11 @@ @@ -158,39 +134,25 @@
- {#if issueStatuses} - {#if hasSubIssues && viewOptions && viewlet} - {#if !isCollapsed} - -
- -
-
+ {#if hasSubIssues && viewOptions && viewlet} + {#if !isCollapsed} + +
+ +
+
+ {/if} + {/if} + + {#if isCreating} + {@const project = projects.get(issue.space)} + {#if project !== undefined} +
+ (isCreating = false)} /> +
{/if} {/if} - - {#if isCreating} - {@const project = projects.get(issue.space)} - {@const statuses = issueStatuses.get(issue.space)} - {#if project !== undefined && statuses !== undefined} -
- (isCreating = false)} - /> -
- {/if} - {/if} -
- {/if} +