From ef8c626d9283480649b49ca44e78c4423236ca82 Mon Sep 17 00:00:00 2001
From: Denis Bunakalya <denis.bunakalya@xored.com>
Date: Fri, 13 Jan 2023 13:31:02 +0400
Subject: [PATCH] Allow to show filter items only for current space

Signed-off-by: Denis Bunakalya <denis.bunakalya@xored.com>
---
 .../src/components/filter/FilterButton.svelte    |  4 +++-
 .../src/components/filter/FilterTypePopup.svelte | 16 +++++++++++++++-
 .../src/components/filter/ObjectFilter.svelte    |  9 ++++++---
 .../src/components/filter/ValueFilter.svelte     | 15 ++++++++++-----
 .../src/components/SpecialView.svelte            |  5 +++--
 5 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/plugins/view-resources/src/components/filter/FilterButton.svelte b/plugins/view-resources/src/components/filter/FilterButton.svelte
index 70e3fda1b4..5b1e0bd9a6 100644
--- a/plugins/view-resources/src/components/filter/FilterButton.svelte
+++ b/plugins/view-resources/src/components/filter/FilterButton.svelte
@@ -13,7 +13,7 @@
 // limitations under the License.
 -->
 <script lang="ts">
-  import { Class, Doc, Ref } from '@hcengineering/core'
+  import { Class, Doc, Ref, Space } from '@hcengineering/core'
   import { getClient } from '@hcengineering/presentation'
   import { Button, eventToHTMLElement, IconAdd, IconClose, Icon, showPopup, Label } from '@hcengineering/ui'
   import { Filter } from '@hcengineering/view'
@@ -22,6 +22,7 @@
   import FilterTypePopup from './FilterTypePopup.svelte'
 
   export let _class: Ref<Class<Doc>> | undefined
+  export let space: Ref<Space> | undefined = undefined
 
   const client = getClient()
   const hierarchy = client.getHierarchy()
@@ -36,6 +37,7 @@
       FilterTypePopup,
       {
         _class,
+        space,
         target,
         index: 1,
         onChange
diff --git a/plugins/view-resources/src/components/filter/FilterTypePopup.svelte b/plugins/view-resources/src/components/filter/FilterTypePopup.svelte
index 9752c1f559..3b97f361ea 100644
--- a/plugins/view-resources/src/components/filter/FilterTypePopup.svelte
+++ b/plugins/view-resources/src/components/filter/FilterTypePopup.svelte
@@ -13,7 +13,18 @@
 // limitations under the License.
 -->
 <script lang="ts">
-  import core, { AnyAttribute, ArrOf, AttachedDoc, Class, Collection, Doc, Ref, RefTo, Type } from '@hcengineering/core'
+  import core, {
+    AnyAttribute,
+    ArrOf,
+    AttachedDoc,
+    Class,
+    Collection,
+    Doc,
+    Ref,
+    RefTo,
+    Type,
+    Space
+  } from '@hcengineering/core'
   import { getClient } from '@hcengineering/presentation'
   import { closePopup, closeTooltip, Icon, Label, showPopup, Submenu, resizeObserver } from '@hcengineering/ui'
   import { Filter, KeyFilter } from '@hcengineering/view'
@@ -22,6 +33,7 @@
   import view from '../../plugin'
 
   export let _class: Ref<Class<Doc>>
+  export let space: Ref<Space> | undefined = undefined
   export let target: HTMLElement
   export let filter: Filter | undefined
   export let index: number
@@ -144,6 +156,7 @@
       type.component,
       {
         _class,
+        space,
         filter: filter || {
           key: type,
           value: [],
@@ -183,6 +196,7 @@
     const targetClass = (hierarchy.getAttribute(_class, type.key).type as RefTo<Doc>).to
     return {
       _class: targetClass,
+      space,
       index,
       target,
       onChange: (e: Filter | undefined) => {
diff --git a/plugins/view-resources/src/components/filter/ObjectFilter.svelte b/plugins/view-resources/src/components/filter/ObjectFilter.svelte
index eb41fdb451..283b1616fe 100644
--- a/plugins/view-resources/src/components/filter/ObjectFilter.svelte
+++ b/plugins/view-resources/src/components/filter/ObjectFilter.svelte
@@ -13,7 +13,7 @@
 // limitations under the License.
 -->
 <script lang="ts">
-  import { Doc, FindResult, getObjectValue, RefTo, SortingOrder } from '@hcengineering/core'
+  import { Doc, FindResult, getObjectValue, RefTo, SortingOrder, Ref, Space } from '@hcengineering/core'
   import { translate } from '@hcengineering/platform'
   import presentation, { getClient } from '@hcengineering/presentation'
   import type { State } from '@hcengineering/task'
@@ -25,6 +25,7 @@
   import { buildConfigLookup, getPresenter } from '../../utils'
 
   export let filter: Filter
+  export let space: Ref<Space> | undefined = undefined
   export let onChange: (e: Filter) => void
 
   const client = getClient()
@@ -68,7 +69,9 @@
       await objectsPromise
     }
     targets.clear()
-    const baseObjects = await client.findAll(filter.key._class, {}, { projection: { [filter.key.key]: 1 } })
+    const baseObjects = await client.findAll(filter.key._class, space ? { space } : {}, {
+      projection: { [filter.key.key]: 1 }
+    })
     for (const object of baseObjects) {
       const value = getObjectValue(filter.key.key, object) ?? undefined
       targets.set(value, (targets.get(value) ?? 0) + 1)
@@ -84,7 +87,7 @@
             _id: { $in: Array.from(targets.keys()) }
           }
     const options = clazz.sortingKey !== undefined ? { sort: { [clazz.sortingKey]: SortingOrder.Ascending } } : {}
-    objectsPromise = client.findAll(targetClass, resultQuery, options)
+    objectsPromise = client.findAll(targetClass, { ...resultQuery, ...(space ? { space } : {}) }, options)
     values = await objectsPromise
     if (targets.has(undefined)) {
       values.unshift(undefined)
diff --git a/plugins/view-resources/src/components/filter/ValueFilter.svelte b/plugins/view-resources/src/components/filter/ValueFilter.svelte
index 854e815fe3..20ccb7eaf7 100644
--- a/plugins/view-resources/src/components/filter/ValueFilter.svelte
+++ b/plugins/view-resources/src/components/filter/ValueFilter.svelte
@@ -13,7 +13,7 @@
 // limitations under the License.
 -->
 <script lang="ts">
-  import { Class, Doc, FindResult, getObjectValue, Ref, SortingOrder } from '@hcengineering/core'
+  import { Class, Doc, FindResult, getObjectValue, Ref, SortingOrder, Space } from '@hcengineering/core'
   import { translate } from '@hcengineering/platform'
   import presentation, { getClient } from '@hcengineering/presentation'
   import ui, { Button, CheckBox, Label, Loading, resizeObserver, deviceOptionsStore } from '@hcengineering/ui'
@@ -24,6 +24,7 @@
   import { createEventDispatcher } from 'svelte'
 
   export let _class: Ref<Class<Doc>>
+  export let space: Ref<Space> | undefined = undefined
   export let filter: Filter
   export let onChange: (e: Filter) => void
 
@@ -59,10 +60,14 @@
       prefix = attr.attributeOf + '.'
       console.log('prefix', prefix)
     }
-    objectsPromise = client.findAll(_class, resultQuery, {
-      sort: { [filter.key.key]: SortingOrder.Ascending },
-      projection: { [prefix + filter.key.key]: 1 }
-    })
+    objectsPromise = client.findAll(
+      _class,
+      { ...resultQuery, ...(space ? { space } : {}) },
+      {
+        sort: { [filter.key.key]: SortingOrder.Ascending },
+        projection: { [prefix + filter.key.key]: 1 }
+      }
+    )
     const res = await objectsPromise
 
     for (const object of res) {
diff --git a/plugins/workbench-resources/src/components/SpecialView.svelte b/plugins/workbench-resources/src/components/SpecialView.svelte
index 03f61a5ab8..9624f7c8ed 100644
--- a/plugins/workbench-resources/src/components/SpecialView.svelte
+++ b/plugins/workbench-resources/src/components/SpecialView.svelte
@@ -13,7 +13,7 @@
 // limitations under the License.
 -->
 <script lang="ts">
-  import { Class, Doc, DocumentQuery, Ref } from '@hcengineering/core'
+  import { Class, Doc, DocumentQuery, Ref, Space } from '@hcengineering/core'
   import { Asset, getEmbeddedLabel, IntlString } from '@hcengineering/platform'
   import { createQuery, getClient } from '@hcengineering/presentation'
   import {
@@ -32,6 +32,7 @@
   import SourcePresenter from './search/SourcePresenter.svelte'
 
   export let _class: Ref<Class<Doc>>
+  export let space: Ref<Space> | undefined = undefined
   export let icon: Asset
   export let label: IntlString
   export let createLabel: IntlString | undefined
@@ -94,7 +95,7 @@
     <div class="ac-header__wrap-title mr-3">
       <span class="ac-header__icon"><Icon {icon} size={'small'} /></span>
       <span class="ac-header__title"><Label {label} /></span>
-      <div class="ml-4"><FilterButton {_class} /></div>
+      <div class="ml-4"><FilterButton {_class} {space} /></div>
     </div>
 
     <SearchEdit bind:value={search} />