From abcaa2e980b8c9e43d529c6c821ad1a43c8d328c Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Fri, 14 Apr 2023 16:29:15 +0600 Subject: [PATCH] =?UTF-8?q?TSK-1142=20=D0=A1=20=D1=82=D1=80=D1=83=D0=B4?= =?UTF-8?q?=D0=BE=D0=BC=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=20Filtered=20views=20(#2984)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Denis Bykhov --- models/notification/src/index.ts | 4 + models/view/src/migration.ts | 35 ++++++++- packages/ui/src/index.ts | 1 - .../src/components/ChannelPresenter.svelte | 3 +- .../components/DirectMessagePresenter.svelte | 2 +- .../src/components/DmPresenter.svelte | 3 +- .../src/components/VacancyApplications.svelte | 14 +--- .../src/components/VacancyCard.svelte | 5 +- .../components/issues/edit/SubIssues.svelte | 12 +-- .../projects/ProjectPresenter.svelte | 3 +- .../src/components/filter/FilterBar.svelte | 73 ++++--------------- .../src/components/filter/FilterButton.svelte | 8 +- .../src/components/navigator}/NavLink.svelte | 5 +- plugins/view-resources/src/filter.ts | 28 ++++++- plugins/view-resources/src/index.ts | 7 +- .../src/components/Applications.svelte | 3 +- .../src/components/Navigator.svelte | 3 +- .../src/components/SavedView.svelte | 28 +++---- .../src/components/Workbench.svelte | 3 +- .../src/components/navigator/SpacesNav.svelte | 16 +--- .../components/navigator/StarredNav.svelte | 6 +- 21 files changed, 131 insertions(+), 131 deletions(-) rename {packages/ui/src/components => plugins/view-resources/src/components/navigator}/NavLink.svelte (92%) diff --git a/models/notification/src/index.ts b/models/notification/src/index.ts index 6088367954..f02a7c92ee 100644 --- a/models/notification/src/index.ts +++ b/models/notification/src/index.ts @@ -291,6 +291,10 @@ export function createModel (builder: Builder): void { }, notification.action.Unsubscribe ) + + builder.mixin(notification.class.DocUpdates, core.class.Class, view.mixin.IgnoreActions, { + actions: [view.action.Delete, view.action.Open] + }) } export { notificationOperation } from './migration' diff --git a/models/view/src/migration.ts b/models/view/src/migration.ts index c14acb808a..d35fa5c417 100644 --- a/models/view/src/migration.ts +++ b/models/view/src/migration.ts @@ -13,10 +13,20 @@ // limitations under the License. // -import core, { AnyAttribute, DOMAIN_TX, Ref, TxCreateDoc, TxCUD, TxProcessor, TxRemoveDoc } from '@hcengineering/core' +import core, { + AnyAttribute, + Class, + Doc, + DOMAIN_TX, + Ref, + TxCreateDoc, + TxCUD, + TxProcessor, + TxRemoveDoc +} from '@hcengineering/core' import { MigrateOperation, MigrationClient, MigrationUpgradeClient } from '@hcengineering/model' -import { BuildModelKey, FilteredView, Viewlet, ViewletPreference } from '@hcengineering/view' import { DOMAIN_PREFERENCE } from '@hcengineering/preference' +import { BuildModelKey, FilteredView, Viewlet, ViewletPreference } from '@hcengineering/view' import view from './plugin' async function migrateViewletPreference (client: MigrationClient): Promise { @@ -78,6 +88,26 @@ async function migrateSavedFilters (client: MigrationClient): Promise { } } +async function migrateSavedFiltersViewlets (client: MigrationClient): Promise { + const preferences = await client.find(DOMAIN_PREFERENCE, { + _class: view.class.FilteredView, + viewletId: /^\S{24}$/ as any, + attachedTo: 'tracker' as any + }) + for (const pref of preferences) { + await client.update( + DOMAIN_PREFERENCE, + { + _id: pref._id + }, + { + viewletId: 'tracker:viewlet:IssueList' as Ref, + filterClass: 'tracker:class:Issue' as Ref> + } + ) + } +} + async function fixViewletPreferenceRemovedAttributes (client: MigrationClient): Promise { const removeTxes = await client.find>(DOMAIN_TX, { _class: core.class.TxRemoveDoc, @@ -148,6 +178,7 @@ export const viewOperation: MigrateOperation = { async migrate (client: MigrationClient): Promise { await migrateViewletPreference(client) await migrateSavedFilters(client) + await migrateSavedFiltersViewlets(client) await fixViewletPreferenceRemovedAttributes(client) await fixPreferenceObjectKey(client) }, diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index 87a037aa5d..d55c47ad5b 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -171,7 +171,6 @@ export { NotificationPosition } from './components/notifications/NotificationPos export { NotificationSeverity } from './components/notifications/NotificationSeverity' export { Notification } from './components/notifications/Notification' export { default as Wizard } from './components/wizard/Wizard.svelte' -export { default as NavLink } from './components/NavLink.svelte' export { default as StepsDialog } from './components/StepsDialog.svelte' export * from './types' diff --git a/plugins/chunter-resources/src/components/ChannelPresenter.svelte b/plugins/chunter-resources/src/components/ChannelPresenter.svelte index 1c5742ed06..57d97540c8 100644 --- a/plugins/chunter-resources/src/components/ChannelPresenter.svelte +++ b/plugins/chunter-resources/src/components/ChannelPresenter.svelte @@ -15,7 +15,8 @@ diff --git a/plugins/view-resources/src/filter.ts b/plugins/view-resources/src/filter.ts index 9895f8b08f..adb51e68d0 100644 --- a/plugins/view-resources/src/filter.ts +++ b/plugins/view-resources/src/filter.ts @@ -10,10 +10,10 @@ import core, { Ref } from '@hcengineering/core' import { getResource } from '@hcengineering/platform' -import { createQuery, getClient, LiveQuery } from '@hcengineering/presentation' +import { LiveQuery, createQuery, getClient } from '@hcengineering/presentation' import { AnyComponent, getCurrentLocation, locationToUrl } from '@hcengineering/ui' import { Filter, FilterMode, KeyFilter } from '@hcengineering/view' -import { writable } from 'svelte/store' +import { get, writable } from 'svelte/store' import view from './plugin' /** @@ -21,6 +21,30 @@ import view from './plugin' */ export const filterStore = writable([]) +export function setFilters (filters: Filter[]): void { + const old = get(filterStore) + old.forEach((p) => p.onRemove?.()) + filterStore.set(filters) +} + +export function removeFilter (i: number): void { + const old = get(filterStore) + old[i]?.onRemove?.() + old.splice(i, 1) + filterStore.set(old) +} + +export function updateFilter (filter: Filter): void { + const old = get(filterStore) + const index = old.findIndex((p) => p.index === filter.index) + if (index === -1) { + old.push(filter) + } else { + old[index] = filter + } + filterStore.set(old) +} + export async function objectInResult (filter: Filter): Promise> { return { $in: filter.value } } diff --git a/plugins/view-resources/src/index.ts b/plugins/view-resources/src/index.ts index a8cd9ed3d9..764ac0d1c3 100644 --- a/plugins/view-resources/src/index.ts +++ b/plugins/view-resources/src/index.ts @@ -60,6 +60,8 @@ import ObjectPresenter from './components/ObjectPresenter.svelte' import RolePresenter from './components/RolePresenter.svelte' import SpacePresenter from './components/SpacePresenter.svelte' import SpaceRefPresenter from './components/SpaceRefPresenter.svelte' +import StatusPresenter from './components/status/StatusPresenter.svelte' +import StatusRefPresenter from './components/status/StatusRefPresenter.svelte' import StringEditor from './components/StringEditor.svelte' import StringPresenter from './components/StringPresenter.svelte' import Table from './components/Table.svelte' @@ -68,8 +70,6 @@ import TimestampPresenter from './components/TimestampPresenter.svelte' import UpDownNavigator from './components/UpDownNavigator.svelte' import ValueSelector from './components/ValueSelector.svelte' import ViewletSettingButton from './components/ViewletSettingButton.svelte' -import StatusPresenter from './components/status/StatusPresenter.svelte' -import StatusRefPresenter from './components/status/StatusRefPresenter.svelte' import { afterResult, @@ -83,8 +83,8 @@ import { } from './filter' import { IndexedDocumentPreview } from '@hcengineering/presentation' -import { showEmptyGroups } from './viewOptions' import { statusSort } from './utils' +import { showEmptyGroups } from './viewOptions' export { getActions, invokeAction } from './actions' export { default as ActionContext } from './components/ActionContext.svelte' export { default as ActionHandler } from './components/ActionHandler.svelte' @@ -96,6 +96,7 @@ export { default as List } from './components/list/List.svelte' export { default as MarkupPresenter } from './components/MarkupPresenter.svelte' export { default as MarkupPreviewPopup } from './components/MarkupPreviewPopup.svelte' export { default as ContextMenu } from './components/Menu.svelte' +export { default as NavLink } from './components/navigator/NavLink.svelte' export { default as ObjectBox } from './components/ObjectBox.svelte' export { default as ObjectPresenter } from './components/ObjectPresenter.svelte' export { default as ObjectSearchBox } from './components/ObjectSearchBox.svelte' diff --git a/plugins/workbench-resources/src/components/Applications.svelte b/plugins/workbench-resources/src/components/Applications.svelte index 574a61018a..cd26fdf4f0 100644 --- a/plugins/workbench-resources/src/components/Applications.svelte +++ b/plugins/workbench-resources/src/components/Applications.svelte @@ -15,7 +15,8 @@ diff --git a/plugins/workbench-resources/src/components/Workbench.svelte b/plugins/workbench-resources/src/components/Workbench.svelte index 85aaed6559..45ab6e24c5 100644 --- a/plugins/workbench-resources/src/components/Workbench.svelte +++ b/plugins/workbench-resources/src/components/Workbench.svelte @@ -29,7 +29,6 @@ DatePickerPopup, Label, Location, - NavLink, PanelInstance, Popup, PopupAlignment, @@ -50,7 +49,7 @@ showPopup } from '@hcengineering/ui' import view from '@hcengineering/view' - import { ActionContext, ActionHandler, migrateViewOpttions } from '@hcengineering/view-resources' + import { ActionContext, ActionHandler, NavLink, migrateViewOpttions } from '@hcengineering/view-resources' import type { Application, NavigatorModel, SpecialNavModel, ViewConfiguration } from '@hcengineering/workbench' import { getContext, onDestroy, onMount, tick } from 'svelte' import { get } from 'svelte/store' diff --git a/plugins/workbench-resources/src/components/navigator/SpacesNav.svelte b/plugins/workbench-resources/src/components/navigator/SpacesNav.svelte index 18ed32f02d..557f87242d 100644 --- a/plugins/workbench-resources/src/components/navigator/SpacesNav.svelte +++ b/plugins/workbench-resources/src/components/navigator/SpacesNav.svelte @@ -20,21 +20,13 @@ import { getResource } from '@hcengineering/platform' import preference from '@hcengineering/preference' import { getClient } from '@hcengineering/presentation' + import { Action, IconAdd, IconEdit, IconSearch, getCurrentLocation, navigate, showPopup } from '@hcengineering/ui' import { - Action, - getCurrentLocation, - IconAdd, - IconEdit, - IconSearch, - navigate, NavLink, - showPopup - } from '@hcengineering/ui' - import { - getActions as getContributedActions, - getObjectPresenter, TreeItem, - TreeNode + TreeNode, + getActions as getContributedActions, + getObjectPresenter } from '@hcengineering/view-resources' import { SpacesNavModel } from '@hcengineering/workbench' import { createEventDispatcher } from 'svelte' diff --git a/plugins/workbench-resources/src/components/navigator/StarredNav.svelte b/plugins/workbench-resources/src/components/navigator/StarredNav.svelte index 1480504485..5e6122236a 100644 --- a/plugins/workbench-resources/src/components/navigator/StarredNav.svelte +++ b/plugins/workbench-resources/src/components/navigator/StarredNav.svelte @@ -17,12 +17,12 @@ import core from '@hcengineering/core' import notification, { LastView } from '@hcengineering/notification' import { NotificationClientImpl } from '@hcengineering/notification-resources' - import { getResource, IntlString } from '@hcengineering/platform' + import { IntlString, getResource } from '@hcengineering/platform' import preference from '@hcengineering/preference' import { getClient } from '@hcengineering/presentation' - import { Action, IconEdit, NavLink } from '@hcengineering/ui' + import { Action, IconEdit } from '@hcengineering/ui' import view from '@hcengineering/view' - import { getActions as getContributedActions, TreeItem, TreeNode } from '@hcengineering/view-resources' + import { NavLink, TreeItem, TreeNode, getActions as getContributedActions } from '@hcengineering/view-resources' import { classIcon, getSpaceName } from '../../utils' export let label: IntlString