From 696541af2db46879ae2980b0b53aa48f909f77e5 Mon Sep 17 00:00:00 2001 From: Denis Bykhov Date: Tue, 16 May 2023 01:29:31 +0600 Subject: [PATCH] Saved filter improve (#3180) Signed-off-by: Denis Bykhov --- models/view/src/index.ts | 17 ++- models/view/src/migration.ts | 52 +++------ plugins/view-assets/lang/en.json | 6 +- plugins/view-assets/lang/ru.json | 6 +- .../src/components/filter/AddSavedView.svelte | 75 ++++++++++++ .../src/components/filter/FilterBar.svelte | 66 ++++++++++- .../src/components/filter/FilterButton.svelte | 23 +++- .../src/components/filter/FilterSave.svelte | 12 +- plugins/view-resources/src/filter.ts | 16 ++- plugins/view-resources/src/index.ts | 1 + plugins/view-resources/src/plugin.ts | 3 +- plugins/view/src/index.ts | 14 ++- .../src/components/SavedView.svelte | 109 +++++++++++++----- server/core/src/fulltext.ts | 2 +- server/core/src/indexer/fulltextPush.ts | 10 +- server/core/src/indexer/indexer.ts | 6 + 16 files changed, 319 insertions(+), 99 deletions(-) create mode 100644 plugins/view-resources/src/components/filter/AddSavedView.svelte diff --git a/models/view/src/index.ts b/models/view/src/index.ts index d8243f5daa..4810629628 100644 --- a/models/view/src/index.ts +++ b/models/view/src/index.ts @@ -13,23 +13,22 @@ // limitations under the License. // -import type { Class, Client, Data, Doc, DocumentQuery, Ref, Space } from '@hcengineering/core' +import type { Account, Class, Client, Data, Doc, DocumentQuery, Domain, Ref, Space } from '@hcengineering/core' import { DOMAIN_MODEL } from '@hcengineering/core' 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 { DOMAIN_PREFERENCE } from '@hcengineering/preference' import type { AnyComponent, Location } from '@hcengineering/ui' import type { Action, ActionCategory, + ActivityAttributePresenter, AllValuesFunc, ArrayEditor, AttributeEditor, AttributeFilter, AttributePresenter, - ActivityAttributePresenter, BuildModelKey, ClassFilters, ClassSortFuncs, @@ -57,9 +56,9 @@ import type { ObjectValidator, PreviewPresenter, SortFunc, - SpacePresenter, SpaceHeader, SpaceName, + SpacePresenter, ViewAction, ViewActionInput, ViewContext, @@ -75,6 +74,8 @@ export { viewId } from '@hcengineering/view' export { viewOperation } from './migration' export { ViewAction, Viewlet } +export const DOMAIN_VIEW = 'view' as Domain + export function createAction> ( builder: Builder, data: Data>, @@ -108,14 +109,18 @@ export function classPresenter ( } } -@Model(view.class.FilteredView, core.class.Doc, DOMAIN_PREFERENCE) -export class TFilteredView extends TPreference implements FilteredView { +@Model(view.class.FilteredView, core.class.Doc, DOMAIN_VIEW) +export class TFilteredView extends TDoc implements FilteredView { name!: string location!: Location filters!: string viewOptions?: ViewOptions filterClass?: Ref> viewletId?: Ref | null + users!: Ref[] + createdBy!: Ref + attachedTo!: string + sharable?: boolean } @Model(view.class.FilterMode, core.class.Doc, DOMAIN_MODEL) diff --git a/models/view/src/migration.ts b/models/view/src/migration.ts index d35fa5c417..c64165165f 100644 --- a/models/view/src/migration.ts +++ b/models/view/src/migration.ts @@ -13,20 +13,11 @@ // limitations under the License. // -import core, { - AnyAttribute, - Class, - Doc, - DOMAIN_TX, - Ref, - TxCreateDoc, - TxCUD, - TxProcessor, - TxRemoveDoc -} from '@hcengineering/core' +import core, { AnyAttribute, DOMAIN_TX, Ref, TxCreateDoc, TxCUD, TxProcessor, TxRemoveDoc } from '@hcengineering/core' import { MigrateOperation, MigrationClient, MigrationUpgradeClient } from '@hcengineering/model' import { DOMAIN_PREFERENCE } from '@hcengineering/preference' import { BuildModelKey, FilteredView, Viewlet, ViewletPreference } from '@hcengineering/view' +import { DOMAIN_VIEW } from '.' import view from './plugin' async function migrateViewletPreference (client: MigrationClient): Promise { @@ -68,41 +59,25 @@ async function migrateViewletPreference (client: MigrationClient): Promise } async function migrateSavedFilters (client: MigrationClient): Promise { - const preferences = await client.find(DOMAIN_PREFERENCE, { + await client.move( + DOMAIN_PREFERENCE, + { + _class: view.class.FilteredView + }, + DOMAIN_VIEW + ) + const preferences = await client.find(DOMAIN_VIEW, { _class: view.class.FilteredView, - viewOptions: { $exists: true } + users: { $exists: false } }) 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, + DOMAIN_VIEW, { _id: pref._id }, { - viewOptions: pref.viewOptions - } - ) - } -} - -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> + users: [pref.createdBy] } ) } @@ -178,7 +153,6 @@ 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/plugins/view-assets/lang/en.json b/plugins/view-assets/lang/en.json index d66ac783cb..5a574a10a5 100644 --- a/plugins/view-assets/lang/en.json +++ b/plugins/view-assets/lang/en.json @@ -78,6 +78,10 @@ "ThisMonth": "This month", "NextMonth": "Next month", "NotSpecified": "Not specified", - "CustomDate": "Custom date" + "CustomDate": "Custom date", + "AddSavedView": "Add saved view", + "Public": "Public", + "Hide": "Hide", + "SaveAs": "Save as" } } diff --git a/plugins/view-assets/lang/ru.json b/plugins/view-assets/lang/ru.json index ea2b33262b..925fc53fea 100644 --- a/plugins/view-assets/lang/ru.json +++ b/plugins/view-assets/lang/ru.json @@ -75,6 +75,10 @@ "ThisMonth": "Этот месяц", "NextMonth": "Следующий месяц", "NotSpecified": "Не указана", - "CustomDate": "Выбранная дата" + "AddSavedView": "Добавить сохраненное отображение", + "CustomDate": "Выбранная дата", + "Public": "Публичныйы", + "Hide": "Спрятать", + "SaveAs": "Сохранить как" } } diff --git a/plugins/view-resources/src/components/filter/AddSavedView.svelte b/plugins/view-resources/src/components/filter/AddSavedView.svelte new file mode 100644 index 0000000000..17430ddcbe --- /dev/null +++ b/plugins/view-resources/src/components/filter/AddSavedView.svelte @@ -0,0 +1,75 @@ + + +
dispatch('changeContent')}> +
+ +
+
+
+ {#each views as value} + + {/each} +
+
+
diff --git a/plugins/view-resources/src/components/filter/FilterBar.svelte b/plugins/view-resources/src/components/filter/FilterBar.svelte index 1405a5ac0c..d48d07533b 100644 --- a/plugins/view-resources/src/components/filter/FilterBar.svelte +++ b/plugins/view-resources/src/components/filter/FilterBar.svelte @@ -13,17 +13,19 @@ // limitations under the License. --> {#if visible && $filterStore && $filterStore.length > 0} @@ -135,6 +175,7 @@ {filter} on:change={() => { makeQuery(query, $filterStore) + updateFilter(filter) }} on:remove={() => { removeFilter(i) @@ -146,7 +187,22 @@ -