diff --git a/models/view/src/index.ts b/models/view/src/index.ts index 70e403c574..1f9f9d5891 100644 --- a/models/view/src/index.ts +++ b/models/view/src/index.ts @@ -60,7 +60,8 @@ import type { Viewlet, ViewletDescriptor, ViewletPreference, - ViewOptionsModel + ViewOptionsModel, + ViewOptions } from '@hcengineering/view' import view from './plugin' @@ -99,6 +100,8 @@ export class TFilteredView extends TPreference implements FilteredView { name!: string location!: Location filters!: string + viewOptions?: ViewOptions + viewletId?: Ref | null } @Model(view.class.FilterMode, core.class.Doc, DOMAIN_MODEL) diff --git a/models/view/src/migration.ts b/models/view/src/migration.ts index f2a71dc5af..30b0f6038f 100644 --- a/models/view/src/migration.ts +++ b/models/view/src/migration.ts @@ -15,8 +15,9 @@ import { Ref } from '@hcengineering/core' import { MigrateOperation, MigrationClient, MigrationUpgradeClient } from '@hcengineering/model' -import { Viewlet, ViewletPreference } from '@hcengineering/view' +import { FilteredView, Viewlet, ViewletPreference } from '@hcengineering/view' import { DOMAIN_PREFERENCE } from '@hcengineering/preference' +import view from './plugin' async function migrateViewletPreference (client: MigrationClient): Promise { const targets: Record = { @@ -56,9 +57,31 @@ async function migrateViewletPreference (client: MigrationClient): Promise } } +async function migrateSavedFilters (client: MigrationClient): Promise { + const preferences = await client.find(DOMAIN_PREFERENCE, { + _class: view.class.FilteredView, + viewOptions: { $exists: true } + }) + for (const pref of preferences) { + if (pref.viewOptions === undefined) continue + if (Array.isArray(pref.viewOptions.groupBy)) continue + pref.viewOptions.groupBy = [pref.viewOptions.groupBy] + await client.update( + DOMAIN_PREFERENCE, + { + _id: pref._id + }, + { + viewOptions: pref.viewOptions + } + ) + } +} + export const viewOperation: MigrateOperation = { async migrate (client: MigrationClient): Promise { await migrateViewletPreference(client) + await migrateSavedFilters(client) }, async upgrade (client: MigrationUpgradeClient): Promise {} } diff --git a/plugins/gmail/package.json b/plugins/gmail/package.json index 21f2307191..394fde7bb0 100644 --- a/plugins/gmail/package.json +++ b/plugins/gmail/package.json @@ -31,5 +31,9 @@ "@hcengineering/ui": "^0.6.3", "@hcengineering/contact": "^0.6.9", "@hcengineering/setting": "^0.6.2" + }, + "repository": "https://github.com/hcengineering/anticrm", + "publishConfig": { + "registry": "https://npm.pkg.github.com" } } diff --git a/plugins/tracker-resources/src/components/issues/KanbanView.svelte b/plugins/tracker-resources/src/components/issues/KanbanView.svelte index 446ae9b5b6..409bf9f7c2 100644 --- a/plugins/tracker-resources/src/components/issues/KanbanView.svelte +++ b/plugins/tracker-resources/src/components/issues/KanbanView.svelte @@ -62,7 +62,7 @@ export let viewOptions: ViewOptions $: currentSpace = space || tracker.team.DefaultTeam - $: groupBy = (viewOptions.groupBy ?? noCategory) as IssuesGrouping + $: groupBy = (viewOptions.groupBy[0] ?? noCategory) as IssuesGrouping $: orderBy = viewOptions.orderBy $: sort = { [orderBy[0]]: orderBy[1] } $: dontUpdateRank = orderBy[0] !== IssuesOrdering.Manual diff --git a/plugins/tracker-resources/src/components/issues/edit/SubIssuesSelector.svelte b/plugins/tracker-resources/src/components/issues/edit/SubIssuesSelector.svelte index 46836d35e7..da03fc18aa 100644 --- a/plugins/tracker-resources/src/components/issues/edit/SubIssuesSelector.svelte +++ b/plugins/tracker-resources/src/components/issues/edit/SubIssuesSelector.svelte @@ -47,21 +47,30 @@ const query = createQuery() const statusesQuery = createQuery() - let statuses: WithLookup[] = [] + $: update(value) - $: if (value.$lookup?.subIssues !== undefined) { - query.unsubscribe() - subIssues = value.$lookup.subIssues as Issue[] - subIssues.sort((a, b) => (a.rank ?? '').localeCompare(b.rank ?? '')) - } else { - query.query(tracker.class.Issue, { attachedTo: value._id }, (res) => (subIssues = res), { - sort: { rank: SortingOrder.Ascending } - }) + function update (value: WithLookup): void { + if (value.$lookup?.subIssues !== undefined) { + query.unsubscribe() + subIssues = value.$lookup.subIssues as Issue[] + subIssues.sort((a, b) => (a.rank ?? '').localeCompare(b.rank ?? '')) + } else if (value.subIssues > 0) { + query.query(tracker.class.Issue, { attachedTo: value._id }, (res) => (subIssues = res), { + sort: { rank: SortingOrder.Ascending } + }) + } else { + query.unsubscribe() + } + if (value.subIssues > 0 || value.$lookup?.subIssues !== undefined) { + statusesQuery.query(tracker.class.IssueStatus, {}, (res) => (statuses = res), { + lookup: { category: tracker.class.IssueStatusCategory } + }) + } else { + statusesQuery.unsubscribe() + } } - statusesQuery.query(tracker.class.IssueStatus, {}, (res) => (statuses = res), { - lookup: { category: tracker.class.IssueStatusCategory } - }) + let statuses: WithLookup[] = [] $: if (statuses && subIssues) { const doneStatuses = statuses.filter((s) => s.category === tracker.issueStatusCategory.Completed).map((p) => p._id) diff --git a/plugins/tracker-resources/src/components/issues/related/RelatedIssues.svelte b/plugins/tracker-resources/src/components/issues/related/RelatedIssues.svelte index b8b9f4c4d5..801b715911 100644 --- a/plugins/tracker-resources/src/components/issues/related/RelatedIssues.svelte +++ b/plugins/tracker-resources/src/components/issues/related/RelatedIssues.svelte @@ -14,8 +14,8 @@ -->
- -
- { - viewOptions.groupBy = e.detail - dispatch('update', { key: 'groupBy', value: e.detail }) - }} - /> -
+ {#each groups as group, i} + +
+ !viewOptions.groupBy.includes(p.id) || [group, noCategory].includes(p.id))} + selected={group} + width="10rem" + justify="left" + on:selected={(e) => selectGrouping(e.detail, i)} + /> +
+ {/each} -
+
- {#each categories as category, i} - {@const items = groupedDocs[category] ?? []} - - {/each} +