From 14181885a8b64a9d15a6ddacb95a5787fcebf7af Mon Sep 17 00:00:00 2001 From: Andrey Sobolev Date: Tue, 9 Aug 2022 13:40:21 +0700 Subject: [PATCH] Minor fixes (#2249) Signed-off-by: Andrey Sobolev --- packages/ui/src/components/SelectPopup.svelte | 18 ++++++++++++++++++ .../src/components/CreateIssue.svelte | 6 ++++-- .../src/components/projects/EditProject.svelte | 8 ++++++++ .../src/components/sprints/EditSprint.svelte | 8 ++++++++ .../components/sprints/SprintBrowser.svelte | 2 +- .../components/sprints/SprintSelector.svelte | 6 ++++-- plugins/tracker-resources/src/issues.ts | 6 +++++- .../components/filter/FilterTypePopup.svelte | 2 +- .../src/components/filter/ObjectFilter.svelte | 8 ++++---- tests/sanity/tests/tracker.projects.spec.ts | 4 ++-- 10 files changed, 55 insertions(+), 13 deletions(-) diff --git a/packages/ui/src/components/SelectPopup.svelte b/packages/ui/src/components/SelectPopup.svelte index b42c61eda9..b2033772d6 100644 --- a/packages/ui/src/components/SelectPopup.svelte +++ b/packages/ui/src/components/SelectPopup.svelte @@ -35,6 +35,11 @@ component?: AnySvelteComponent props?: Record + + category?: { + icon?: Asset + label: IntlString + } } export let placeholder: IntlString | undefined = undefined @@ -151,6 +156,19 @@ + + {@const obj = filteredObjects[row]} + {#if obj.category && ((row === 0 && obj.category.label !== undefined) || obj.category.label !== filteredObjects[row - 1]?.category?.label)} +
+
+ {#if obj.category.icon} + + {/if} +
+
+ {/if} +
diff --git a/plugins/tracker-resources/src/components/CreateIssue.svelte b/plugins/tracker-resources/src/components/CreateIssue.svelte index 6d26ed79b8..d4a376a6eb 100644 --- a/plugins/tracker-resources/src/components/CreateIssue.svelte +++ b/plugins/tracker-resources/src/components/CreateIssue.svelte @@ -41,13 +41,14 @@ import SetDueDateActionPopup from './SetDueDateActionPopup.svelte' import SetParentIssueActionPopup from './SetParentIssueActionPopup.svelte' import SprintSelector from './sprints/SprintSelector.svelte' + import { activeProject, activeSprint } from '../issues' export let space: Ref export let status: Ref | undefined = undefined export let priority: IssuePriority = IssuePriority.NoPriority export let assignee: Ref | null = null - export let project: Ref | null = null - export let sprint: Ref | null = null + export let project: Ref | null = $activeProject ?? null + export let sprint: Ref | null = $activeSprint ?? null let issueStatuses: WithLookup[] | undefined export let parentIssue: Issue | undefined @@ -140,6 +141,7 @@ description: object.description, assignee: object.assignee, project: object.project, + sprint: object.sprint, number: (incResult as any).object.sequence, status: object.status, priority: object.priority, diff --git a/plugins/tracker-resources/src/components/projects/EditProject.svelte b/plugins/tracker-resources/src/components/projects/EditProject.svelte index 7030fea55d..c7c221f3d7 100644 --- a/plugins/tracker-resources/src/components/projects/EditProject.svelte +++ b/plugins/tracker-resources/src/components/projects/EditProject.svelte @@ -7,6 +7,8 @@ import tracker from '../../plugin' import IssuesView from '../issues/IssuesView.svelte' import ProjectPopup from './ProjectPopup.svelte' + import { activeProject } from '../../issues' + import { onDestroy } from 'svelte' export let project: Project @@ -22,6 +24,12 @@ } }) } + + $: $activeProject = project?._id + + onDestroy(() => { + $activeProject = undefined + }) diff --git a/plugins/tracker-resources/src/components/sprints/EditSprint.svelte b/plugins/tracker-resources/src/components/sprints/EditSprint.svelte index bc7a417d39..181ca48d80 100644 --- a/plugins/tracker-resources/src/components/sprints/EditSprint.svelte +++ b/plugins/tracker-resources/src/components/sprints/EditSprint.svelte @@ -4,6 +4,8 @@ import { Sprint } from '@anticrm/tracker' import { Button, EditBox, Icon, showPopup } from '@anticrm/ui' import { DocAttributeBar } from '@anticrm/view-resources' + import { onDestroy } from 'svelte' + import { activeSprint } from '../../issues' import tracker from '../../plugin' import Expanded from '../icons/Expanded.svelte' import IssuesView from '../issues/IssuesView.svelte' @@ -24,6 +26,12 @@ } }) } + + $: $activeSprint = sprint?._id + + onDestroy(() => { + $activeSprint = undefined + }) diff --git a/plugins/tracker-resources/src/components/sprints/SprintBrowser.svelte b/plugins/tracker-resources/src/components/sprints/SprintBrowser.svelte index b1d256857f..34b59259e2 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintBrowser.svelte +++ b/plugins/tracker-resources/src/components/sprints/SprintBrowser.svelte @@ -34,7 +34,7 @@ const resultSprintsQuery = createQuery() const sprintOptions: FindOptions = { - sort: { modifiedOn: SortingOrder.Descending }, + sort: { startDate: SortingOrder.Descending }, limit: ENTRIES_LIMIT, lookup: { lead: contact.class.Employee } } diff --git a/plugins/tracker-resources/src/components/sprints/SprintSelector.svelte b/plugins/tracker-resources/src/components/sprints/SprintSelector.svelte index bd35f65866..dd8ef1943d 100644 --- a/plugins/tracker-resources/src/components/sprints/SprintSelector.svelte +++ b/plugins/tracker-resources/src/components/sprints/SprintSelector.svelte @@ -20,6 +20,7 @@ import type { ButtonKind, ButtonSize } from '@anticrm/ui' import { Button, ButtonShape, eventToHTMLElement, SelectPopup, showPopup } from '@anticrm/ui' import tracker from '../../plugin' + import { sprintStatusAssets } from '../../types' export let value: Ref | null | undefined export let shouldShowLabel: boolean = true @@ -45,7 +46,7 @@ rawSprints = res }, { - sort: { modifiedOn: SortingOrder.Ascending } + sort: { startDate: SortingOrder.Descending } } ) @@ -76,7 +77,8 @@ ...rawSprints.map((p) => ({ id: p._id, icon: tracker.icon.Sprint, - text: p.label + text: p.label, + category: sprintStatusAssets[p.status] })) ] diff --git a/plugins/tracker-resources/src/issues.ts b/plugins/tracker-resources/src/issues.ts index 38b0c68ebe..646d73e649 100644 --- a/plugins/tracker-resources/src/issues.ts +++ b/plugins/tracker-resources/src/issues.ts @@ -1,10 +1,14 @@ import { Doc, Ref, TxOperations } from '@anticrm/core' import { getClient } from '@anticrm/presentation' -import { Issue, Team, trackerId } from '@anticrm/tracker' +import { Issue, Project, Sprint, Team, trackerId } from '@anticrm/tracker' import { getCurrentLocation, getPanelURI, Location } from '@anticrm/ui' import { workbenchId } from '@anticrm/workbench' +import { writable } from 'svelte/store' import tracker from './plugin' +export const activeProject = writable | undefined>(undefined) +export const activeSprint = writable | undefined>(undefined) + export function getIssueId (team: Team, issue: Issue): string { return `${team.identifier}-${issue.number}` } diff --git a/plugins/view-resources/src/components/filter/FilterTypePopup.svelte b/plugins/view-resources/src/components/filter/FilterTypePopup.svelte index 2ec472212f..45d01b1769 100644 --- a/plugins/view-resources/src/components/filter/FilterTypePopup.svelte +++ b/plugins/view-resources/src/components/filter/FilterTypePopup.svelte @@ -156,7 +156,7 @@ } function hasNested (type: KeyFilter): boolean { - const targetClass = (hierarchy.getAttribute(_class, type.key).type as RefTo).to + const targetClass = (hierarchy.getAttribute(type._class, type.key).type as RefTo).to const clazz = hierarchy.getClass(targetClass) return hierarchy.hasMixin(clazz, view.mixin.ClassFilters) } diff --git a/plugins/view-resources/src/components/filter/ObjectFilter.svelte b/plugins/view-resources/src/components/filter/ObjectFilter.svelte index 3345c25ee7..a9a61c4508 100644 --- a/plugins/view-resources/src/components/filter/ObjectFilter.svelte +++ b/plugins/view-resources/src/components/filter/ObjectFilter.svelte @@ -32,14 +32,14 @@ const hierarchy = client.getHierarchy() const tkey = '$lookup.' + filter.key.key const key = { key: tkey } - const lookup = buildConfigLookup(hierarchy, _class, [tkey]) - const promise = getPresenter(client, _class, key, key, lookup) + const lookup = buildConfigLookup(hierarchy, filter.key._class, [tkey]) + const promise = getPresenter(client, filter.key._class, key, key, lookup) filter.modes = filter.modes === undefined ? [view.filter.FilterObjectIn, view.filter.FilterObjectNin] : filter.modes filter.mode = filter.mode === undefined ? filter.modes[0] : filter.mode let values: (Doc | undefined | null)[] = [] let objectsPromise: Promise> | undefined - $: targetClass = (hierarchy.getAttribute(_class, filter.key.key).type as RefTo).to + $: targetClass = (hierarchy.getAttribute(filter.key._class, filter.key.key).type as RefTo).to $: clazz = hierarchy.getClass(targetClass) const targets = new Map() $: isState = clazz._id === task.class.State ?? false @@ -69,7 +69,7 @@ await objectsPromise } targets.clear() - const baseObjects = await client.findAll(_class, {}, { projection: { [filter.key.key]: 1 } }) + const baseObjects = await client.findAll(filter.key._class, {}, { projection: { [filter.key.key]: 1 } }) for (const object of baseObjects) { const value = getObjectValue(filter.key.key, object) ?? undefined targets.set(value, (targets.get(value) ?? 0) + 1) diff --git a/tests/sanity/tests/tracker.projects.spec.ts b/tests/sanity/tests/tracker.projects.spec.ts index b3060deaec..2eb13fa1b4 100644 --- a/tests/sanity/tests/tracker.projects.spec.ts +++ b/tests/sanity/tests/tracker.projects.spec.ts @@ -29,11 +29,11 @@ test.describe('project tests', () => { await page.click('button:has-text("New issue")') await page.fill('[placeholder="Issue\\ title"]', 'issue') await page.click('form button:has-text("Project")') - await page.click(`.popup button:has-text("${prjId}")`) + await page.click(`.selectPopup button:has-text("${prjId}")`) await page.click('form button:has-text("Save issue")') await page.waitForSelector('form.antiCard', { state: 'detached' }) await page.click(`.gridElement button:has-text("${prjId}")`) - await page.click('.popup button:has-text("No project")') + await page.click('.selectPopup button:has-text("No project")') }) test('create-project-with-status', async ({ page }) => {