From fecff25fd65454cf1baf18a9dcb54c419baf9d3d Mon Sep 17 00:00:00 2001 From: Andrey Sobolev <haiodo@users.noreply.github.com> Date: Sat, 15 Apr 2023 01:12:13 +0700 Subject: [PATCH] TSK-1194: Fix filter (#2990) Signed-off-by: Andrey Sobolev <haiodo@gmail.com> --- packages/presentation/src/status.ts | 2 +- .../ui/src/components/DropdownLabels.svelte | 4 +- .../src/components/filter/ObjectFilter.svelte | 11 ++- .../src/components/SpecialView.svelte | 86 +++++++++---------- 4 files changed, 50 insertions(+), 53 deletions(-) diff --git a/packages/presentation/src/status.ts b/packages/presentation/src/status.ts index bfdb337ca7..10c4681d59 100644 --- a/packages/presentation/src/status.ts +++ b/packages/presentation/src/status.ts @@ -231,7 +231,7 @@ export class StatusMiddleware extends BasePresentationMiddleware implements Pres statusFields.push(attr) const v = (query as any)[attr.name] - if (v !== undefined) { + if (v != null) { // Only add filter if we have filer inside. if (typeof v === 'string') { target.push(v as Ref<Status>) diff --git a/packages/ui/src/components/DropdownLabels.svelte b/packages/ui/src/components/DropdownLabels.svelte index 1e16582d05..5fe21f9829 100644 --- a/packages/ui/src/components/DropdownLabels.svelte +++ b/packages/ui/src/components/DropdownLabels.svelte @@ -70,7 +70,7 @@ { placeholder, items, multiselect, selected }, container, (result) => { - if (result) { + if (result != null) { if (allowDeselect && selected === result) { selected = undefined dispatch('selected', undefined) @@ -83,7 +83,7 @@ mgr?.setFocusPos(focusIndex) }, (result) => { - if (result) { + if (result != null) { selected = result dispatch('selected', result) } diff --git a/plugins/view-resources/src/components/filter/ObjectFilter.svelte b/plugins/view-resources/src/components/filter/ObjectFilter.svelte index 322053b86f..02be8c150a 100644 --- a/plugins/view-resources/src/components/filter/ObjectFilter.svelte +++ b/plugins/view-resources/src/components/filter/ObjectFilter.svelte @@ -57,11 +57,11 @@ const statuses = val const result: (Doc | undefined)[] = [] statusesCount = [] - const unique = [...new Set(val.map((v) => v?.name))] + const unique = [...new Set(val.map((v) => v?.name?.trim()?.toLocaleLowerCase()))] unique.forEach((label, i) => { let count = 0 statuses.forEach((state) => { - if (state?.name === label) { + if (state?.name?.trim()?.toLocaleLowerCase() === label?.trim()?.toLowerCase()) { if (!count) result[i] = state count += targets.get(state?._id) ?? 0 } @@ -76,7 +76,12 @@ await objectsPromise } targets.clear() - const baseObjects = await client.findAll(filter.key._class, space ? { space } : {}, { + + const spaces = ( + await client.findAll(core.class.Space, { archived: true }, { projection: { _id: 1, archived: 1, _class: 1 } }) + ).map((it) => it._id) + + const baseObjects = await client.findAll(filter.key._class, space ? { space } : { space: { $nin: spaces } }, { projection: { [filter.key.key]: 1, space: 1 } }) for (const object of baseObjects) { diff --git a/plugins/workbench-resources/src/components/SpecialView.svelte b/plugins/workbench-resources/src/components/SpecialView.svelte index d762d67e68..f87fb4db95 100644 --- a/plugins/workbench-resources/src/components/SpecialView.svelte +++ b/plugins/workbench-resources/src/components/SpecialView.svelte @@ -15,7 +15,7 @@ <script lang="ts"> import { Class, Doc, Ref, Space, WithLookup } from '@hcengineering/core' import { Asset, IntlString } from '@hcengineering/platform' - import { createQuery, getClient } from '@hcengineering/presentation' + import { createQuery } from '@hcengineering/presentation' import { AnyComponent, Button, @@ -58,29 +58,36 @@ $: query = viewlet?.baseQuery ?? {} - $: searchQuery = search === '' ? query : { $search: search, ...query } + $: searchQuery = search === '' ? query : { ...query, $search: search } $: resultQuery = searchQuery const preferenceQuery = createQuery() let preference: ViewletPreference | undefined - const client = getClient() let loading = true let viewlets: WithLookup<Viewlet>[] = [] const viewletQuery = createQuery() - $: viewletQuery.query( - view.class.Viewlet, - { attachTo: _class, variant: { $exists: false } }, - (res) => (viewlets = res), - { - lookup: { - descriptor: view.class.ViewletDescriptor + $: { + viewletQuery.query( + view.class.Viewlet, + { + attachTo: _class, + variant: { $exists: false }, + descriptor: { $in: descriptors ?? [view.viewlet.Table] } + }, + (res) => { + viewlets = res + }, + { + lookup: { + descriptor: view.class.ViewletDescriptor + } } - } - ) + ) + } let key = makeViewletKey() @@ -90,33 +97,16 @@ }) ) - $: active = $activeViewlet[key] - - $: update(_class, active, descriptors) + $: update(_class, $activeViewlet[key], viewlets) async function update ( _class: Ref<Class<Doc>>, active: Ref<Viewlet> | null, - descriptors?: Ref<ViewletDescriptor>[] + viewlets: WithLookup<Viewlet>[] ): Promise<void> { - loading = true - viewlets = await client.findAll( - view.class.Viewlet, - { - attachTo: _class, - variant: { $exists: false }, - descriptor: { $in: descriptors ?? [view.viewlet.Table] } - }, - { - lookup: { - descriptor: view.class.ViewletDescriptor - } - } - ) preference = undefined viewlet = viewlets.find((viewlet) => viewlet._id === active) ?? viewlets[0] setActiveViewletId(viewlet._id) - loading = false } $: if (viewlet !== undefined) { @@ -202,22 +192,24 @@ query={searchQuery} {viewOptions} on:change={(e) => { - resultQuery = { ...e.detail, ...query } - }} - /> - <Component - is={viewlet.$lookup.descriptor.component} - props={{ - _class, - space, - options: viewlet.options, - config: preference?.config ?? viewlet.config, - viewlet, - viewOptions, - viewOptionsConfig: viewlet.viewOptions?.other, - createItemDialog: createComponent, - createItemLabel: createLabel, - query: resultQuery + resultQuery = { ...query, ...e.detail } }} /> + {#key viewlet?._id} + <Component + is={viewlet.$lookup.descriptor.component} + props={{ + _class, + space, + options: viewlet.options, + config: preference?.config ?? viewlet.config, + viewlet, + viewOptions, + viewOptionsConfig: viewlet.viewOptions?.other, + createItemDialog: createComponent, + createItemLabel: createLabel, + query: resultQuery + }} + /> + {/key} {/if}