From c261f8f7619018f9885eeaf93543a59acfefdd81 Mon Sep 17 00:00:00 2001 From: Vyacheslav Tumanov Date: Thu, 19 Jan 2023 20:38:18 +0500 Subject: [PATCH] Add support for user-saved filtered Views (#2521) Signed-off-by: Vyacheslav Tumanov --- models/view/src/index.ts | 16 ++++-- plugins/view-assets/lang/en.json | 6 ++- plugins/view-assets/lang/ru.json | 5 +- .../src/components/filter/FilterBar.svelte | 33 +++++------- .../src/components/filter/FilterSave.svelte | 51 +++++++++++++++++++ plugins/view/src/index.ts | 25 +++++++-- .../src/components/Navigator.svelte | 41 +++++++++++++-- .../src/components/Workbench.svelte | 1 + 8 files changed, 146 insertions(+), 32 deletions(-) create mode 100644 plugins/view-resources/src/components/filter/FilterSave.svelte diff --git a/models/view/src/index.ts b/models/view/src/index.ts index 20978a3523..31d12322fe 100644 --- a/models/view/src/index.ts +++ b/models/view/src/index.ts @@ -19,7 +19,7 @@ import { Builder, Mixin, Model } from '@hcengineering/model' import core, { TClass, TDoc } from '@hcengineering/model-core' import preference, { TPreference } from '@hcengineering/model-preference' import type { Asset, IntlString, Resource, Status } from '@hcengineering/platform' -import type { AnyComponent } from '@hcengineering/ui' +import type { AnyComponent, Location } from '@hcengineering/ui' import type { Action, ActionCategory, @@ -57,9 +57,11 @@ import type { Viewlet, ViewletDescriptor, ViewletPreference, - ViewOptionsModel + ViewOptionsModel, + FilteredView } from '@hcengineering/view' import view from './plugin' +import { DOMAIN_PREFERENCE } from '@hcengineering/preference' export { viewOperation } from './migration' export { ViewAction, Viewlet } @@ -91,6 +93,13 @@ export function classPresenter ( } } +@Model(view.class.FilteredView, core.class.Doc, DOMAIN_PREFERENCE) +export class TFilteredView extends TPreference implements FilteredView { + name!: string + location!: Location + filters!: string +} + @Model(view.class.FilterMode, core.class.Doc, DOMAIN_MODEL) export class TFilterMode extends TDoc implements FilterMode { label!: IntlString @@ -318,7 +327,8 @@ export function createModel (builder: Builder): void { TPreviewPresenter, TLinkPresenter, TArrayEditor, - TInlineAttributEditor + TInlineAttributEditor, + TFilteredView ) classPresenter( diff --git a/plugins/view-assets/lang/en.json b/plugins/view-assets/lang/en.json index d51744bb3a..6e318cdab7 100644 --- a/plugins/view-assets/lang/en.json +++ b/plugins/view-assets/lang/en.json @@ -55,6 +55,10 @@ "NoGrouping": "No grouping", "Grouping": "Grouping", "Ordering": "Ordering", - "Manual": "Manual" + "Manual": "Manual", + + "FilteredViews": "Filtered views", + "NewFilteredView": "New filtered view", + "FilteredViewName": "Filtered view name" } } diff --git a/plugins/view-assets/lang/ru.json b/plugins/view-assets/lang/ru.json index bda3d1653f..f309ed2339 100644 --- a/plugins/view-assets/lang/ru.json +++ b/plugins/view-assets/lang/ru.json @@ -53,6 +53,9 @@ "NoGrouping": "Нет группировки", "Grouping": "Группировка", "Ordering": "Сортировка", - "Manual": "Пользовательский" + "Manual": "Пользовательский", + "FilteredViews": "Фильтрованные отображения", + "NewFilteredView": "Новое фильтрованное отображение", + "FilteredViewName": "Имя фильтрованного отображения" } } diff --git a/plugins/view-resources/src/components/filter/FilterBar.svelte b/plugins/view-resources/src/components/filter/FilterBar.svelte index 65420e89eb..c220be3a08 100644 --- a/plugins/view-resources/src/components/filter/FilterBar.svelte +++ b/plugins/view-resources/src/components/filter/FilterBar.svelte @@ -23,6 +23,7 @@ import view from '../../plugin' import FilterSection from './FilterSection.svelte' import FilterTypePopup from './FilterTypePopup.svelte' + import FilterSave from './FilterSave.svelte' export let _class: Ref> export let query: DocumentQuery @@ -32,7 +33,6 @@ const dispatch = createEventDispatcher() let maxIndex = 1 - // const allFilters: boolean = true function onChange (e: Filter | undefined) { if (e === undefined) return @@ -78,6 +78,10 @@ } } + async function saveFilteredView () { + showPopup(FilterSave, {}) + } + let loading = false function load (_class: Ref>) { @@ -192,26 +196,13 @@ - - +