@teambit/workspace 1.0.868 → 1.0.869

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/{preview-1768760493634.js → preview-1768842065064.js} +2 -2
  2. package/dist/ui/workspace/workspace-overview/index.d.ts +1 -0
  3. package/dist/ui/workspace/workspace-overview/index.js +19 -0
  4. package/dist/ui/workspace/workspace-overview/index.js.map +1 -1
  5. package/dist/ui/workspace/workspace-overview/namespace-sort.js +3 -0
  6. package/dist/ui/workspace/workspace-overview/namespace-sort.js.map +1 -1
  7. package/dist/ui/workspace/workspace-overview/use-query-param-with-default.d.ts +6 -0
  8. package/dist/ui/workspace/workspace-overview/use-query-param-with-default.js +102 -0
  9. package/dist/ui/workspace/workspace-overview/use-query-param-with-default.js.map +1 -0
  10. package/dist/ui/workspace/workspace-overview/use-workspace-aggregation.d.ts +2 -1
  11. package/dist/ui/workspace/workspace-overview/use-workspace-aggregation.js +1 -3
  12. package/dist/ui/workspace/workspace-overview/use-workspace-aggregation.js.map +1 -1
  13. package/dist/ui/workspace/workspace-overview/workspace-filter-panel.d.ts +6 -1
  14. package/dist/ui/workspace/workspace-overview/workspace-filter-panel.js +13 -19
  15. package/dist/ui/workspace/workspace-overview/workspace-filter-panel.js.map +1 -1
  16. package/dist/ui/workspace/workspace-overview/workspace-overview.js +21 -11
  17. package/dist/ui/workspace/workspace-overview/workspace-overview.js.map +1 -1
  18. package/dist/ui/workspace/workspace-overview/workspace-overview.module.scss +5 -3
  19. package/package.json +19 -19
  20. package/ui/workspace/workspace-overview/index.ts +1 -0
  21. package/ui/workspace/workspace-overview/namespace-sort.ts +3 -0
  22. package/ui/workspace/workspace-overview/use-query-param-with-default.ts +115 -0
  23. package/ui/workspace/workspace-overview/use-workspace-aggregation.ts +6 -5
  24. package/ui/workspace/workspace-overview/workspace-filter-panel.tsx +22 -27
  25. package/ui/workspace/workspace-overview/workspace-overview.module.scss +5 -3
  26. package/ui/workspace/workspace-overview/workspace-overview.tsx +26 -6
@@ -1,5 +1,5 @@
1
- import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.868/dist/workspace.composition.js';
2
- import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.868/dist/workspace.docs.mdx';
1
+ import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.869/dist/workspace.composition.js';
2
+ import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.workspace_workspace@1.0.869/dist/workspace.docs.mdx';
3
3
 
4
4
  export const compositions = [compositions_0];
5
5
  export const overview = [overview_0];
@@ -1 +1,2 @@
1
1
  export { WorkspaceOverview } from './workspace-overview';
2
+ export { useQueryParamWithDefault, useListParamWithDefault } from './use-query-param-with-default';
@@ -9,6 +9,18 @@ Object.defineProperty(exports, "WorkspaceOverview", {
9
9
  return _workspaceOverview().WorkspaceOverview;
10
10
  }
11
11
  });
12
+ Object.defineProperty(exports, "useListParamWithDefault", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _useQueryParamWithDefault().useListParamWithDefault;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "useQueryParamWithDefault", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _useQueryParamWithDefault().useQueryParamWithDefault;
22
+ }
23
+ });
12
24
  function _workspaceOverview() {
13
25
  const data = require("./workspace-overview");
14
26
  _workspaceOverview = function () {
@@ -16,5 +28,12 @@ function _workspaceOverview() {
16
28
  };
17
29
  return data;
18
30
  }
31
+ function _useQueryParamWithDefault() {
32
+ const data = require("./use-query-param-with-default");
33
+ _useQueryParamWithDefault = function () {
34
+ return data;
35
+ };
36
+ return data;
37
+ }
19
38
 
20
39
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_workspaceOverview","data","require"],"sources":["index.ts"],"sourcesContent":["export { WorkspaceOverview } from './workspace-overview';\n"],"mappings":";;;;;;;;;;;AAAA,SAAAA,mBAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,kBAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"names":["_workspaceOverview","data","require","_useQueryParamWithDefault"],"sources":["index.ts"],"sourcesContent":["export { WorkspaceOverview } from './workspace-overview';\nexport { useQueryParamWithDefault, useListParamWithDefault } from './use-query-param-with-default';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAAA,mBAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,kBAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,0BAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,yBAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA","ignoreList":[]}
@@ -17,6 +17,9 @@ function getRootNamespace(ns) {
17
17
  }
18
18
  function namespacePriority(ns) {
19
19
  const root = getRootNamespace(ns);
20
+
21
+ // internal namespaces (starting with _) go last
22
+ if (root.startsWith('_')) return 4;
20
23
  if (PRIORITY_HIGH.includes(root)) return 0;
21
24
  if (PRIORITY_MED.includes(root)) return 1;
22
25
  if (PRIORITY_LOW.includes(root)) return 3;
@@ -1 +1 @@
1
- {"version":3,"names":["PRIORITY_HIGH","exports","PRIORITY_MED","PRIORITY_LOW","getRootNamespace","ns","split","namespacePriority","root","includes","sortNamespacesAdvanced","list","sort","a","b","pa","pb","localeCompare","sortItemsByNamespace","items","na","component","id","namespace","nb","name"],"sources":["namespace-sort.ts"],"sourcesContent":["import type { WorkspaceItem } from './workspace-overview.types';\n\nexport const PRIORITY_HIGH = ['ui', 'pages'] as string[];\nexport const PRIORITY_MED = ['design'] as string[];\nexport const PRIORITY_LOW = ['entities', 'provider', 'hooks', 'icons'] as string[];\n\nexport function getRootNamespace(ns: string): string {\n if (!ns) return '';\n return ns.split('/')[0]!;\n}\n\nexport function namespacePriority(ns: string): number {\n const root = getRootNamespace(ns);\n\n if (PRIORITY_HIGH.includes(root)) return 0;\n if (PRIORITY_MED.includes(root)) return 1;\n if (PRIORITY_LOW.includes(root)) return 3;\n return 2;\n}\n\nexport function sortNamespacesAdvanced(list: string[]): string[] {\n return [...list].sort((a, b) => {\n const pa = namespacePriority(a);\n const pb = namespacePriority(b);\n if (pa !== pb) return pa - pb;\n return a.localeCompare(b);\n });\n}\n\nexport function sortItemsByNamespace(items: WorkspaceItem[]): WorkspaceItem[] {\n return [...items].sort((a, b) => {\n const na = a.component.id.namespace || '/';\n const nb = b.component.id.namespace || '/';\n\n const pa = namespacePriority(na);\n const pb = namespacePriority(nb);\n if (pa !== pb) return pa - pb;\n\n return a.component.id.name.localeCompare(b.component.id.name);\n });\n}\n"],"mappings":";;;;;;;;;;AAEO,MAAMA,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG,CAAC,IAAI,EAAE,OAAO,CAAa;AACjD,MAAME,YAAY,GAAAD,OAAA,CAAAC,YAAA,GAAG,CAAC,QAAQ,CAAa;AAC3C,MAAMC,YAAY,GAAAF,OAAA,CAAAE,YAAA,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAa;AAE3E,SAASC,gBAAgBA,CAACC,EAAU,EAAU;EACnD,IAAI,CAACA,EAAE,EAAE,OAAO,EAAE;EAClB,OAAOA,EAAE,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB;AAEO,SAASC,iBAAiBA,CAACF,EAAU,EAAU;EACpD,MAAMG,IAAI,GAAGJ,gBAAgB,CAACC,EAAE,CAAC;EAEjC,IAAIL,aAAa,CAACS,QAAQ,CAACD,IAAI,CAAC,EAAE,OAAO,CAAC;EAC1C,IAAIN,YAAY,CAACO,QAAQ,CAACD,IAAI,CAAC,EAAE,OAAO,CAAC;EACzC,IAAIL,YAAY,CAACM,QAAQ,CAACD,IAAI,CAAC,EAAE,OAAO,CAAC;EACzC,OAAO,CAAC;AACV;AAEO,SAASE,sBAAsBA,CAACC,IAAc,EAAY;EAC/D,OAAO,CAAC,GAAGA,IAAI,CAAC,CAACC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;IAC9B,MAAMC,EAAE,GAAGR,iBAAiB,CAACM,CAAC,CAAC;IAC/B,MAAMG,EAAE,GAAGT,iBAAiB,CAACO,CAAC,CAAC;IAC/B,IAAIC,EAAE,KAAKC,EAAE,EAAE,OAAOD,EAAE,GAAGC,EAAE;IAC7B,OAAOH,CAAC,CAACI,aAAa,CAACH,CAAC,CAAC;EAC3B,CAAC,CAAC;AACJ;AAEO,SAASI,oBAAoBA,CAACC,KAAsB,EAAmB;EAC5E,OAAO,CAAC,GAAGA,KAAK,CAAC,CAACP,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;IAC/B,MAAMM,EAAE,GAAGP,CAAC,CAACQ,SAAS,CAACC,EAAE,CAACC,SAAS,IAAI,GAAG;IAC1C,MAAMC,EAAE,GAAGV,CAAC,CAACO,SAAS,CAACC,EAAE,CAACC,SAAS,IAAI,GAAG;IAE1C,MAAMR,EAAE,GAAGR,iBAAiB,CAACa,EAAE,CAAC;IAChC,MAAMJ,EAAE,GAAGT,iBAAiB,CAACiB,EAAE,CAAC;IAChC,IAAIT,EAAE,KAAKC,EAAE,EAAE,OAAOD,EAAE,GAAGC,EAAE;IAE7B,OAAOH,CAAC,CAACQ,SAAS,CAACC,EAAE,CAACG,IAAI,CAACR,aAAa,CAACH,CAAC,CAACO,SAAS,CAACC,EAAE,CAACG,IAAI,CAAC;EAC/D,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {"version":3,"names":["PRIORITY_HIGH","exports","PRIORITY_MED","PRIORITY_LOW","getRootNamespace","ns","split","namespacePriority","root","startsWith","includes","sortNamespacesAdvanced","list","sort","a","b","pa","pb","localeCompare","sortItemsByNamespace","items","na","component","id","namespace","nb","name"],"sources":["namespace-sort.ts"],"sourcesContent":["import type { WorkspaceItem } from './workspace-overview.types';\n\nexport const PRIORITY_HIGH = ['ui', 'pages'] as string[];\nexport const PRIORITY_MED = ['design'] as string[];\nexport const PRIORITY_LOW = ['entities', 'provider', 'hooks', 'icons'] as string[];\n\nexport function getRootNamespace(ns: string): string {\n if (!ns) return '';\n return ns.split('/')[0]!;\n}\n\nexport function namespacePriority(ns: string): number {\n const root = getRootNamespace(ns);\n\n // internal namespaces (starting with _) go last\n if (root.startsWith('_')) return 4;\n\n if (PRIORITY_HIGH.includes(root)) return 0;\n if (PRIORITY_MED.includes(root)) return 1;\n if (PRIORITY_LOW.includes(root)) return 3;\n return 2;\n}\n\nexport function sortNamespacesAdvanced(list: string[]): string[] {\n return [...list].sort((a, b) => {\n const pa = namespacePriority(a);\n const pb = namespacePriority(b);\n if (pa !== pb) return pa - pb;\n return a.localeCompare(b);\n });\n}\n\nexport function sortItemsByNamespace(items: WorkspaceItem[]): WorkspaceItem[] {\n return [...items].sort((a, b) => {\n const na = a.component.id.namespace || '/';\n const nb = b.component.id.namespace || '/';\n\n const pa = namespacePriority(na);\n const pb = namespacePriority(nb);\n if (pa !== pb) return pa - pb;\n\n return a.component.id.name.localeCompare(b.component.id.name);\n });\n}\n"],"mappings":";;;;;;;;;;AAEO,MAAMA,aAAa,GAAAC,OAAA,CAAAD,aAAA,GAAG,CAAC,IAAI,EAAE,OAAO,CAAa;AACjD,MAAME,YAAY,GAAAD,OAAA,CAAAC,YAAA,GAAG,CAAC,QAAQ,CAAa;AAC3C,MAAMC,YAAY,GAAAF,OAAA,CAAAE,YAAA,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAa;AAE3E,SAASC,gBAAgBA,CAACC,EAAU,EAAU;EACnD,IAAI,CAACA,EAAE,EAAE,OAAO,EAAE;EAClB,OAAOA,EAAE,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB;AAEO,SAASC,iBAAiBA,CAACF,EAAU,EAAU;EACpD,MAAMG,IAAI,GAAGJ,gBAAgB,CAACC,EAAE,CAAC;;EAEjC;EACA,IAAIG,IAAI,CAACC,UAAU,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;EAElC,IAAIT,aAAa,CAACU,QAAQ,CAACF,IAAI,CAAC,EAAE,OAAO,CAAC;EAC1C,IAAIN,YAAY,CAACQ,QAAQ,CAACF,IAAI,CAAC,EAAE,OAAO,CAAC;EACzC,IAAIL,YAAY,CAACO,QAAQ,CAACF,IAAI,CAAC,EAAE,OAAO,CAAC;EACzC,OAAO,CAAC;AACV;AAEO,SAASG,sBAAsBA,CAACC,IAAc,EAAY;EAC/D,OAAO,CAAC,GAAGA,IAAI,CAAC,CAACC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;IAC9B,MAAMC,EAAE,GAAGT,iBAAiB,CAACO,CAAC,CAAC;IAC/B,MAAMG,EAAE,GAAGV,iBAAiB,CAACQ,CAAC,CAAC;IAC/B,IAAIC,EAAE,KAAKC,EAAE,EAAE,OAAOD,EAAE,GAAGC,EAAE;IAC7B,OAAOH,CAAC,CAACI,aAAa,CAACH,CAAC,CAAC;EAC3B,CAAC,CAAC;AACJ;AAEO,SAASI,oBAAoBA,CAACC,KAAsB,EAAmB;EAC5E,OAAO,CAAC,GAAGA,KAAK,CAAC,CAACP,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAK;IAC/B,MAAMM,EAAE,GAAGP,CAAC,CAACQ,SAAS,CAACC,EAAE,CAACC,SAAS,IAAI,GAAG;IAC1C,MAAMC,EAAE,GAAGV,CAAC,CAACO,SAAS,CAACC,EAAE,CAACC,SAAS,IAAI,GAAG;IAE1C,MAAMR,EAAE,GAAGT,iBAAiB,CAACc,EAAE,CAAC;IAChC,MAAMJ,EAAE,GAAGV,iBAAiB,CAACkB,EAAE,CAAC;IAChC,IAAIT,EAAE,KAAKC,EAAE,EAAE,OAAOD,EAAE,GAAGC,EAAE;IAE7B,OAAOH,CAAC,CAACQ,SAAS,CAACC,EAAE,CAACG,IAAI,CAACR,aAAa,CAACH,CAAC,CAACO,SAAS,CAACC,EAAE,CAACG,IAAI,CAAC;EAC/D,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ export interface QueryParamOptions {
2
+ /** persist value to localStorage across sessions. Default: true */
3
+ persist?: boolean;
4
+ }
5
+ export declare function useQueryParamWithDefault<T extends string>(paramName: string, fallback: T, options?: QueryParamOptions): [T, (value: T | null) => void];
6
+ export declare function useListParamWithDefault(paramName: string, options?: QueryParamOptions): [string[], (values: string[]) => void];
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useListParamWithDefault = useListParamWithDefault;
7
+ exports.useQueryParamWithDefault = useQueryParamWithDefault;
8
+ function _react() {
9
+ const data = require("react");
10
+ _react = function () {
11
+ return data;
12
+ };
13
+ return data;
14
+ }
15
+ function _reactRouterDom() {
16
+ const data = require("react-router-dom");
17
+ _reactRouterDom = function () {
18
+ return data;
19
+ };
20
+ return data;
21
+ }
22
+ const STORAGE_KEY_PREFIX = 'workspace-overview:';
23
+ function useQueryParamWithDefault(paramName, fallback, options = {}) {
24
+ const {
25
+ persist = true
26
+ } = options;
27
+ const [searchParams, setSearchParams] = (0, _reactRouterDom().useSearchParams)();
28
+ const storageKey = STORAGE_KEY_PREFIX + paramName;
29
+ const value = (0, _react().useMemo)(() => {
30
+ const urlValue = searchParams.get(paramName);
31
+ if (urlValue) return urlValue;
32
+ if (persist) {
33
+ const stored = safeGetItem(storageKey);
34
+ if (stored) return stored;
35
+ }
36
+ return fallback;
37
+ }, [searchParams, paramName, storageKey, fallback, persist]);
38
+ const setValue = (0, _react().useCallback)(newValue => {
39
+ const newParams = new URLSearchParams(searchParams);
40
+ if (newValue === null) {
41
+ newParams.delete(paramName);
42
+ if (persist) safeRemoveItem(storageKey);
43
+ } else {
44
+ newParams.set(paramName, newValue);
45
+ if (persist) safeSetItem(storageKey, newValue);
46
+ }
47
+ setSearchParams(newParams);
48
+ }, [searchParams, setSearchParams, paramName, storageKey, persist]);
49
+ return [value, setValue];
50
+ }
51
+ function useListParamWithDefault(paramName, options = {}) {
52
+ const {
53
+ persist = false
54
+ } = options;
55
+ const [searchParams, setSearchParams] = (0, _reactRouterDom().useSearchParams)();
56
+ const storageKey = STORAGE_KEY_PREFIX + paramName;
57
+ const values = (0, _react().useMemo)(() => {
58
+ const urlValue = searchParams.get(paramName);
59
+ if (urlValue) return urlValue.split(',').filter(Boolean);
60
+ if (persist) {
61
+ const stored = safeGetItem(storageKey);
62
+ if (stored) return stored.split(',').filter(Boolean);
63
+ }
64
+ return [];
65
+ }, [searchParams, paramName, storageKey, persist]);
66
+ const setValues = (0, _react().useCallback)(newValues => {
67
+ const newParams = new URLSearchParams(searchParams);
68
+ const joined = newValues.filter(Boolean).join(',');
69
+ if (joined) {
70
+ newParams.set(paramName, joined);
71
+ if (persist) safeSetItem(storageKey, joined);
72
+ } else {
73
+ newParams.delete(paramName);
74
+ if (persist) safeRemoveItem(storageKey);
75
+ }
76
+ setSearchParams(newParams);
77
+ }, [searchParams, setSearchParams, paramName, storageKey, persist]);
78
+ return [values, setValues];
79
+ }
80
+ function safeGetItem(key) {
81
+ try {
82
+ return localStorage.getItem(key);
83
+ } catch {
84
+ return null;
85
+ }
86
+ }
87
+ function safeSetItem(key, value) {
88
+ try {
89
+ localStorage.setItem(key, value);
90
+ } catch {
91
+ // ignore storage errors
92
+ }
93
+ }
94
+ function safeRemoveItem(key) {
95
+ try {
96
+ localStorage.removeItem(key);
97
+ } catch {
98
+ // ignore storage errors
99
+ }
100
+ }
101
+
102
+ //# sourceMappingURL=use-query-param-with-default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","data","require","_reactRouterDom","STORAGE_KEY_PREFIX","useQueryParamWithDefault","paramName","fallback","options","persist","searchParams","setSearchParams","useSearchParams","storageKey","value","useMemo","urlValue","get","stored","safeGetItem","setValue","useCallback","newValue","newParams","URLSearchParams","delete","safeRemoveItem","set","safeSetItem","useListParamWithDefault","values","split","filter","Boolean","setValues","newValues","joined","join","key","localStorage","getItem","setItem","removeItem"],"sources":["use-query-param-with-default.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\n\nconst STORAGE_KEY_PREFIX = 'workspace-overview:';\n\nexport interface QueryParamOptions {\n /** persist value to localStorage across sessions. Default: true */\n persist?: boolean;\n}\n\nexport function useQueryParamWithDefault<T extends string>(\n paramName: string,\n fallback: T,\n options: QueryParamOptions = {}\n): [T, (value: T | null) => void] {\n const { persist = true } = options;\n const [searchParams, setSearchParams] = useSearchParams();\n const storageKey = STORAGE_KEY_PREFIX + paramName;\n\n const value = useMemo((): T => {\n const urlValue = searchParams.get(paramName);\n if (urlValue) return urlValue as T;\n\n if (persist) {\n const stored = safeGetItem(storageKey);\n if (stored) return stored as T;\n }\n\n return fallback;\n }, [searchParams, paramName, storageKey, fallback, persist]);\n\n const setValue = useCallback(\n (newValue: T | null) => {\n const newParams = new URLSearchParams(searchParams);\n\n if (newValue === null) {\n newParams.delete(paramName);\n if (persist) safeRemoveItem(storageKey);\n } else {\n newParams.set(paramName, newValue);\n if (persist) safeSetItem(storageKey, newValue);\n }\n\n setSearchParams(newParams);\n },\n [searchParams, setSearchParams, paramName, storageKey, persist]\n );\n\n return [value, setValue];\n}\n\nexport function useListParamWithDefault(\n paramName: string,\n options: QueryParamOptions = {}\n): [string[], (values: string[]) => void] {\n const { persist = false } = options;\n const [searchParams, setSearchParams] = useSearchParams();\n const storageKey = STORAGE_KEY_PREFIX + paramName;\n\n const values = useMemo((): string[] => {\n const urlValue = searchParams.get(paramName);\n if (urlValue) return urlValue.split(',').filter(Boolean);\n\n if (persist) {\n const stored = safeGetItem(storageKey);\n if (stored) return stored.split(',').filter(Boolean);\n }\n\n return [];\n }, [searchParams, paramName, storageKey, persist]);\n\n const setValues = useCallback(\n (newValues: string[]) => {\n const newParams = new URLSearchParams(searchParams);\n const joined = newValues.filter(Boolean).join(',');\n\n if (joined) {\n newParams.set(paramName, joined);\n if (persist) safeSetItem(storageKey, joined);\n } else {\n newParams.delete(paramName);\n if (persist) safeRemoveItem(storageKey);\n }\n\n setSearchParams(newParams);\n },\n [searchParams, setSearchParams, paramName, storageKey, persist]\n );\n\n return [values, setValues];\n}\n\nfunction safeGetItem(key: string): string | null {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n}\n\nfunction safeSetItem(key: string, value: string): void {\n try {\n localStorage.setItem(key, value);\n } catch {\n // ignore storage errors\n }\n}\n\nfunction safeRemoveItem(key: string): void {\n try {\n localStorage.removeItem(key);\n } catch {\n // ignore storage errors\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,3 @@
1
+ import { type ActiveFilters } from './filter-utils';
1
2
  import type { WorkspaceItem, AggregationType, AggregationResult } from './workspace-overview.types';
2
- export declare function useWorkspaceAggregation(items: WorkspaceItem[], aggregation: AggregationType): AggregationResult;
3
+ export declare function useWorkspaceAggregation(items: WorkspaceItem[], aggregation: AggregationType, filters: ActiveFilters): AggregationResult;
@@ -25,9 +25,7 @@ function _filterUtils() {
25
25
  };
26
26
  return data;
27
27
  }
28
- function useWorkspaceAggregation(items, aggregation) {
29
- const search = new URLSearchParams(window.location.search);
30
- const filters = (0, _filterUtils().parseActiveFilters)(search);
28
+ function useWorkspaceAggregation(items, aggregation, filters) {
31
29
  const filtered = (0, _react().useMemo)(() => (0, _filterUtils().filterItems)(items, filters), [items, filters]);
32
30
  if (aggregation === 'none') {
33
31
  return {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","require","_namespaceSort","_filterUtils","useWorkspaceAggregation","items","aggregation","search","URLSearchParams","window","location","filters","parseActiveFilters","filtered","useMemo","filterItems","groups","name","displayName","sortItemsByNamespace","groupType","availableAggregations","filteredCount","length","map","Map","item","ns","component","id","namespace","has","set","get","push","sortedKeys","sortNamespacesAdvanced","keys","scope","sortedScopes","sort","sc"],"sources":["use-workspace-aggregation.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { sortNamespacesAdvanced, sortItemsByNamespace } from './namespace-sort';\nimport { filterItems, parseActiveFilters } from './filter-utils';\nimport type { WorkspaceItem, AggregationType, AggregationGroup, AggregationResult } from './workspace-overview.types';\n\nexport function useWorkspaceAggregation(items: WorkspaceItem[], aggregation: AggregationType): AggregationResult {\n const search = new URLSearchParams(window.location.search);\n const filters = parseActiveFilters(search);\n\n const filtered = useMemo(() => filterItems(items, filters), [items, filters]);\n\n if (aggregation === 'none') {\n return {\n groups: [\n {\n name: 'all',\n displayName: '',\n items: sortItemsByNamespace(filtered),\n },\n ],\n groupType: 'none',\n availableAggregations: ['namespaces', 'scopes', 'none'],\n filteredCount: filtered.length,\n };\n }\n\n if (aggregation === 'namespaces') {\n const map = new Map<string, WorkspaceItem[]>();\n for (const item of filtered) {\n const ns = item.component.id.namespace || '/';\n if (!map.has(ns)) map.set(ns, []);\n map.get(ns)!.push(item);\n }\n\n const sortedKeys = sortNamespacesAdvanced([...map.keys()]);\n\n const groups: AggregationGroup[] = sortedKeys.map((ns) => ({\n name: ns,\n displayName: ns,\n items: sortItemsByNamespace(map.get(ns)!),\n }));\n\n return {\n groups,\n groupType: 'namespaces',\n availableAggregations: ['namespaces', 'scopes', 'none'],\n filteredCount: filtered.length,\n };\n }\n\n const map = new Map<string, WorkspaceItem[]>();\n for (const item of filtered) {\n const scope = item.component.id.scope;\n if (!map.has(scope)) map.set(scope, []);\n map.get(scope)!.push(item);\n }\n\n const sortedScopes = [...map.keys()].sort();\n\n const groups: AggregationGroup[] = sortedScopes.map((sc) => ({\n name: sc,\n displayName: sc,\n items: sortItemsByNamespace(map.get(sc)!),\n }));\n\n return {\n groups,\n groupType: 'scopes',\n availableAggregations: ['namespaces', 'scopes', 'none'],\n filteredCount: filtered.length,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","require","_namespaceSort","_filterUtils","useWorkspaceAggregation","items","aggregation","filters","filtered","useMemo","filterItems","groups","name","displayName","sortItemsByNamespace","groupType","availableAggregations","filteredCount","length","map","Map","item","ns","component","id","namespace","has","set","get","push","sortedKeys","sortNamespacesAdvanced","keys","scope","sortedScopes","sort","sc"],"sources":["use-workspace-aggregation.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { sortNamespacesAdvanced, sortItemsByNamespace } from './namespace-sort';\nimport { filterItems, type ActiveFilters } from './filter-utils';\nimport type { WorkspaceItem, AggregationType, AggregationGroup, AggregationResult } from './workspace-overview.types';\n\nexport function useWorkspaceAggregation(\n items: WorkspaceItem[],\n aggregation: AggregationType,\n filters: ActiveFilters\n): AggregationResult {\n const filtered = useMemo(() => filterItems(items, filters), [items, filters]);\n\n if (aggregation === 'none') {\n return {\n groups: [\n {\n name: 'all',\n displayName: '',\n items: sortItemsByNamespace(filtered),\n },\n ],\n groupType: 'none',\n availableAggregations: ['namespaces', 'scopes', 'none'],\n filteredCount: filtered.length,\n };\n }\n\n if (aggregation === 'namespaces') {\n const map = new Map<string, WorkspaceItem[]>();\n for (const item of filtered) {\n const ns = item.component.id.namespace || '/';\n if (!map.has(ns)) map.set(ns, []);\n map.get(ns)!.push(item);\n }\n\n const sortedKeys = sortNamespacesAdvanced([...map.keys()]);\n\n const groups: AggregationGroup[] = sortedKeys.map((ns) => ({\n name: ns,\n displayName: ns,\n items: sortItemsByNamespace(map.get(ns)!),\n }));\n\n return {\n groups,\n groupType: 'namespaces',\n availableAggregations: ['namespaces', 'scopes', 'none'],\n filteredCount: filtered.length,\n };\n }\n\n const map = new Map<string, WorkspaceItem[]>();\n for (const item of filtered) {\n const scope = item.component.id.scope;\n if (!map.has(scope)) map.set(scope, []);\n map.get(scope)!.push(item);\n }\n\n const sortedScopes = [...map.keys()].sort();\n\n const groups: AggregationGroup[] = sortedScopes.map((sc) => ({\n name: sc,\n displayName: sc,\n items: sortItemsByNamespace(map.get(sc)!),\n }));\n\n return {\n groups,\n groupType: 'scopes',\n availableAggregations: ['namespaces', 'scopes', 'none'],\n filteredCount: filtered.length,\n };\n}\n"],"mappings":";;;;;;AAAA,SAAAA,OAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,MAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,eAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,cAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,aAAA;EAAA,MAAAH,IAAA,GAAAC,OAAA;EAAAE,YAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAGO,SAASI,uBAAuBA,CACrCC,KAAsB,EACtBC,WAA4B,EAC5BC,OAAsB,EACH;EACnB,MAAMC,QAAQ,GAAG,IAAAC,gBAAO,EAAC,MAAM,IAAAC,0BAAW,EAACL,KAAK,EAAEE,OAAO,CAAC,EAAE,CAACF,KAAK,EAAEE,OAAO,CAAC,CAAC;EAE7E,IAAID,WAAW,KAAK,MAAM,EAAE;IAC1B,OAAO;MACLK,MAAM,EAAE,CACN;QACEC,IAAI,EAAE,KAAK;QACXC,WAAW,EAAE,EAAE;QACfR,KAAK,EAAE,IAAAS,qCAAoB,EAACN,QAAQ;MACtC,CAAC,CACF;MACDO,SAAS,EAAE,MAAM;MACjBC,qBAAqB,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC;MACvDC,aAAa,EAAET,QAAQ,CAACU;IAC1B,CAAC;EACH;EAEA,IAAIZ,WAAW,KAAK,YAAY,EAAE;IAChC,MAAMa,GAAG,GAAG,IAAIC,GAAG,CAA0B,CAAC;IAC9C,KAAK,MAAMC,IAAI,IAAIb,QAAQ,EAAE;MAC3B,MAAMc,EAAE,GAAGD,IAAI,CAACE,SAAS,CAACC,EAAE,CAACC,SAAS,IAAI,GAAG;MAC7C,IAAI,CAACN,GAAG,CAACO,GAAG,CAACJ,EAAE,CAAC,EAAEH,GAAG,CAACQ,GAAG,CAACL,EAAE,EAAE,EAAE,CAAC;MACjCH,GAAG,CAACS,GAAG,CAACN,EAAE,CAAC,CAAEO,IAAI,CAACR,IAAI,CAAC;IACzB;IAEA,MAAMS,UAAU,GAAG,IAAAC,uCAAsB,EAAC,CAAC,GAAGZ,GAAG,CAACa,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAMrB,MAA0B,GAAGmB,UAAU,CAACX,GAAG,CAAEG,EAAE,KAAM;MACzDV,IAAI,EAAEU,EAAE;MACRT,WAAW,EAAES,EAAE;MACfjB,KAAK,EAAE,IAAAS,qCAAoB,EAACK,GAAG,CAACS,GAAG,CAACN,EAAE,CAAE;IAC1C,CAAC,CAAC,CAAC;IAEH,OAAO;MACLX,MAAM;MACNI,SAAS,EAAE,YAAY;MACvBC,qBAAqB,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC;MACvDC,aAAa,EAAET,QAAQ,CAACU;IAC1B,CAAC;EACH;EAEA,MAAMC,GAAG,GAAG,IAAIC,GAAG,CAA0B,CAAC;EAC9C,KAAK,MAAMC,IAAI,IAAIb,QAAQ,EAAE;IAC3B,MAAMyB,KAAK,GAAGZ,IAAI,CAACE,SAAS,CAACC,EAAE,CAACS,KAAK;IACrC,IAAI,CAACd,GAAG,CAACO,GAAG,CAACO,KAAK,CAAC,EAAEd,GAAG,CAACQ,GAAG,CAACM,KAAK,EAAE,EAAE,CAAC;IACvCd,GAAG,CAACS,GAAG,CAACK,KAAK,CAAC,CAAEJ,IAAI,CAACR,IAAI,CAAC;EAC5B;EAEA,MAAMa,YAAY,GAAG,CAAC,GAAGf,GAAG,CAACa,IAAI,CAAC,CAAC,CAAC,CAACG,IAAI,CAAC,CAAC;EAE3C,MAAMxB,MAA0B,GAAGuB,YAAY,CAACf,GAAG,CAAEiB,EAAE,KAAM;IAC3DxB,IAAI,EAAEwB,EAAE;IACRvB,WAAW,EAAEuB,EAAE;IACf/B,KAAK,EAAE,IAAAS,qCAAoB,EAACK,GAAG,CAACS,GAAG,CAACQ,EAAE,CAAE;EAC1C,CAAC,CAAC,CAAC;EAEH,OAAO;IACLzB,MAAM;IACNI,SAAS,EAAE,QAAQ;IACnBC,qBAAqB,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,CAAC;IACvDC,aAAa,EAAET,QAAQ,CAACU;EAC1B,CAAC;AACH","ignoreList":[]}
@@ -1,7 +1,12 @@
1
1
  import type { WorkspaceItem, AggregationType } from './workspace-overview.types';
2
2
  export interface WorkspaceFilterPanelProps {
3
3
  aggregation: AggregationType;
4
+ onAggregationChange: (agg: AggregationType) => void;
4
5
  availableAggregations: AggregationType[];
5
6
  items: WorkspaceItem[];
7
+ activeNamespaces: string[];
8
+ onNamespacesChange: (namespaces: string[]) => void;
9
+ activeScopes: string[];
10
+ onScopesChange: (scopes: string[]) => void;
6
11
  }
7
- export declare function WorkspaceFilterPanel({ aggregation, availableAggregations, items }: WorkspaceFilterPanelProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function WorkspaceFilterPanel({ aggregation, onAggregationChange, availableAggregations, items, activeNamespaces, onNamespacesChange, activeScopes, onScopesChange, }: WorkspaceFilterPanelProps): import("react/jsx-runtime").JSX.Element;
@@ -11,13 +11,6 @@ function _react() {
11
11
  };
12
12
  return data;
13
13
  }
14
- function _reactRouterDom() {
15
- const data = require("react-router-dom");
16
- _reactRouterDom = function () {
17
- return data;
18
- };
19
- return data;
20
- }
21
14
  function _designInputs() {
22
15
  const data = require("@teambit/design.inputs.toggle-button");
23
16
  _designInputs = function () {
@@ -48,37 +41,38 @@ const LABELS = {
48
41
  };
49
42
  function WorkspaceFilterPanel({
50
43
  aggregation,
44
+ onAggregationChange,
51
45
  availableAggregations,
52
- items
46
+ items,
47
+ activeNamespaces,
48
+ onNamespacesChange,
49
+ activeScopes,
50
+ onScopesChange
53
51
  }) {
54
- const [searchParams, setSearchParams] = (0, _reactRouterDom().useSearchParams)();
55
52
  const namespaceOptions = (0, _react().useMemo)(() => [...new Set(items.map(i => i.component.id.namespace || '/'))].map(v => ({
56
53
  value: v
57
54
  })), [items]);
58
55
  const scopeOptions = (0, _react().useMemo)(() => [...new Set(items.map(i => i.component.id.scope))].map(v => ({
59
56
  value: v
60
57
  })), [items]);
61
- const activeNamespaces = (searchParams.get('ns') || '').split(',').filter(Boolean).map(v => ({
58
+ const activeNsOptions = activeNamespaces.map(v => ({
62
59
  value: v
63
60
  }));
64
- const activeScopes = (searchParams.get('scopes') || '').split(',').filter(Boolean).map(v => ({
61
+ const activeScopeOptions = activeScopes.map(v => ({
65
62
  value: v
66
63
  }));
67
64
  const applyNs = opts => {
68
65
  const list = opts.map(o => o.value).filter(v => typeof v === 'string');
69
- if (list.length) searchParams.set('ns', list.join(','));else searchParams.delete('ns');
70
- setSearchParams(searchParams);
66
+ onNamespacesChange(list);
71
67
  };
72
68
  const applyScopes = opts => {
73
69
  const list = opts.map(o => o.value).filter(v => typeof v === 'string');
74
- if (list.length) searchParams.set('scopes', list.join(','));else searchParams.delete('scopes');
75
- setSearchParams(searchParams);
70
+ onScopesChange(list);
76
71
  };
77
72
  const currentIndex = Math.max(0, availableAggregations.findIndex(a => a === aggregation));
78
73
  const applyAgg = i => {
79
74
  const agg = availableAggregations[i];
80
- searchParams.set('aggregation', agg);
81
- setSearchParams(searchParams);
75
+ onAggregationChange(agg);
82
76
  };
83
77
  return /*#__PURE__*/_react().default.createElement("div", {
84
78
  className: _workspaceOverviewModule().default.filterPanel
@@ -88,14 +82,14 @@ function WorkspaceFilterPanel({
88
82
  id: "namespaces",
89
83
  placeholder: "Namespaces",
90
84
  options: namespaceOptions,
91
- activeOptions: activeNamespaces,
85
+ activeOptions: activeNsOptions,
92
86
  onChange: applyNs,
93
87
  isSearchable: true
94
88
  }), /*#__PURE__*/_react().default.createElement(_componentFilters().BaseFilter, {
95
89
  id: "scopes",
96
90
  placeholder: "Scopes",
97
91
  options: scopeOptions,
98
- activeOptions: activeScopes,
92
+ activeOptions: activeScopeOptions,
99
93
  onChange: applyScopes,
100
94
  isSearchable: true
101
95
  })), /*#__PURE__*/_react().default.createElement("div", {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireWildcard","require","_reactRouterDom","_designInputs","_componentFilters","_workspaceOverviewModule","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","LABELS","namespaces","scopes","none","WorkspaceFilterPanel","aggregation","availableAggregations","items","searchParams","setSearchParams","useSearchParams","namespaceOptions","useMemo","Set","map","component","id","namespace","v","value","scopeOptions","scope","activeNamespaces","split","filter","Boolean","activeScopes","applyNs","opts","list","length","join","delete","applyScopes","currentIndex","Math","max","findIndex","a","applyAgg","agg","createElement","className","styles","filterPanel","leftFilters","BaseFilter","placeholder","options","activeOptions","onChange","isSearchable","rightAggToggle","ToggleButton","defaultIndex","onOptionSelect","idx","element"],"sources":["workspace-filter-panel.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ToggleButton } from '@teambit/design.inputs.toggle-button';\nimport { BaseFilter } from '@teambit/component.filters.base-filter';\nimport type { WorkspaceItem, AggregationType } from './workspace-overview.types';\nimport styles from './workspace-overview.module.scss';\n\nexport interface WorkspaceFilterPanelProps {\n aggregation: AggregationType;\n availableAggregations: AggregationType[];\n items: WorkspaceItem[];\n}\n\nconst LABELS: Record<AggregationType, string> = {\n namespaces: 'Namespaces',\n scopes: 'Scopes',\n none: 'None',\n};\n\nexport function WorkspaceFilterPanel({ aggregation, availableAggregations, items }: WorkspaceFilterPanelProps) {\n const [searchParams, setSearchParams] = useSearchParams();\n\n const namespaceOptions = useMemo(\n () =>\n [...new Set(items.map((i) => i.component.id.namespace || '/'))].map((v) => ({\n value: v,\n })),\n [items]\n );\n\n const scopeOptions = useMemo(\n () =>\n [...new Set(items.map((i) => i.component.id.scope))].map((v) => ({\n value: v,\n })),\n [items]\n );\n\n const activeNamespaces = (searchParams.get('ns') || '')\n .split(',')\n .filter(Boolean)\n .map((v) => ({ value: v }));\n\n const activeScopes = (searchParams.get('scopes') || '')\n .split(',')\n .filter(Boolean)\n .map((v) => ({ value: v }));\n\n const applyNs = (opts) => {\n const list = opts.map((o) => o.value).filter((v): v is string => typeof v === 'string');\n\n if (list.length) searchParams.set('ns', list.join(','));\n else searchParams.delete('ns');\n\n setSearchParams(searchParams);\n };\n\n const applyScopes = (opts) => {\n const list = opts.map((o) => o.value).filter((v): v is string => typeof v === 'string');\n\n if (list.length) searchParams.set('scopes', list.join(','));\n else searchParams.delete('scopes');\n\n setSearchParams(searchParams);\n };\n\n const currentIndex = Math.max(\n 0,\n availableAggregations.findIndex((a) => a === aggregation)\n );\n\n const applyAgg = (i: number) => {\n const agg = availableAggregations[i];\n searchParams.set('aggregation', agg);\n setSearchParams(searchParams);\n };\n\n return (\n <div className={styles.filterPanel}>\n <div className={styles.leftFilters}>\n <BaseFilter\n id=\"namespaces\"\n placeholder=\"Namespaces\"\n options={namespaceOptions}\n activeOptions={activeNamespaces}\n onChange={applyNs}\n isSearchable\n />\n\n <BaseFilter\n id=\"scopes\"\n placeholder=\"Scopes\"\n options={scopeOptions}\n activeOptions={activeScopes}\n onChange={applyScopes}\n isSearchable\n />\n </div>\n\n <div className={styles.rightAggToggle}>\n <ToggleButton\n defaultIndex={currentIndex}\n onOptionSelect={(idx) => applyAgg(idx)}\n options={availableAggregations.map((agg) => ({\n value: agg,\n element: LABELS[agg],\n }))}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireWildcard","require","_designInputs","_componentFilters","_workspaceOverviewModule","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","LABELS","namespaces","scopes","none","WorkspaceFilterPanel","aggregation","onAggregationChange","availableAggregations","items","activeNamespaces","onNamespacesChange","activeScopes","onScopesChange","namespaceOptions","useMemo","Set","map","component","id","namespace","v","value","scopeOptions","scope","activeNsOptions","activeScopeOptions","applyNs","opts","list","filter","applyScopes","currentIndex","Math","max","findIndex","a","applyAgg","agg","createElement","className","styles","filterPanel","leftFilters","BaseFilter","placeholder","options","activeOptions","onChange","isSearchable","rightAggToggle","ToggleButton","defaultIndex","onOptionSelect","idx","element"],"sources":["workspace-filter-panel.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { ToggleButton } from '@teambit/design.inputs.toggle-button';\nimport { BaseFilter } from '@teambit/component.filters.base-filter';\nimport type { WorkspaceItem, AggregationType } from './workspace-overview.types';\nimport styles from './workspace-overview.module.scss';\n\nexport interface WorkspaceFilterPanelProps {\n aggregation: AggregationType;\n onAggregationChange: (agg: AggregationType) => void;\n availableAggregations: AggregationType[];\n items: WorkspaceItem[];\n activeNamespaces: string[];\n onNamespacesChange: (namespaces: string[]) => void;\n activeScopes: string[];\n onScopesChange: (scopes: string[]) => void;\n}\n\nconst LABELS: Record<AggregationType, string> = {\n namespaces: 'Namespaces',\n scopes: 'Scopes',\n none: 'None',\n};\n\nexport function WorkspaceFilterPanel({\n aggregation,\n onAggregationChange,\n availableAggregations,\n items,\n activeNamespaces,\n onNamespacesChange,\n activeScopes,\n onScopesChange,\n}: WorkspaceFilterPanelProps) {\n const namespaceOptions = useMemo(\n () =>\n [...new Set(items.map((i) => i.component.id.namespace || '/'))].map((v) => ({\n value: v,\n })),\n [items]\n );\n\n const scopeOptions = useMemo(\n () =>\n [...new Set(items.map((i) => i.component.id.scope))].map((v) => ({\n value: v,\n })),\n [items]\n );\n\n const activeNsOptions = activeNamespaces.map((v) => ({ value: v }));\n const activeScopeOptions = activeScopes.map((v) => ({ value: v }));\n\n const applyNs = (opts) => {\n const list = opts.map((o) => o.value).filter((v): v is string => typeof v === 'string');\n onNamespacesChange(list);\n };\n\n const applyScopes = (opts) => {\n const list = opts.map((o) => o.value).filter((v): v is string => typeof v === 'string');\n onScopesChange(list);\n };\n\n const currentIndex = Math.max(\n 0,\n availableAggregations.findIndex((a) => a === aggregation)\n );\n\n const applyAgg = (i: number) => {\n const agg = availableAggregations[i];\n onAggregationChange(agg);\n };\n\n return (\n <div className={styles.filterPanel}>\n <div className={styles.leftFilters}>\n <BaseFilter\n id=\"namespaces\"\n placeholder=\"Namespaces\"\n options={namespaceOptions}\n activeOptions={activeNsOptions}\n onChange={applyNs}\n isSearchable\n />\n\n <BaseFilter\n id=\"scopes\"\n placeholder=\"Scopes\"\n options={scopeOptions}\n activeOptions={activeScopeOptions}\n onChange={applyScopes}\n isSearchable\n />\n </div>\n\n <div className={styles.rightAggToggle}>\n <ToggleButton\n defaultIndex={currentIndex}\n onOptionSelect={(idx) => applyAgg(idx)}\n options={availableAggregations.map((agg) => ({\n value: agg,\n element: LABELS[agg],\n }))}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -68,13 +68,6 @@ function _cloudHooks() {
68
68
  };
69
69
  return data;
70
70
  }
71
- function _reactRouterDom() {
72
- const data = require("react-router-dom");
73
- _reactRouterDom = function () {
74
- return data;
75
- };
76
- return data;
77
- }
78
71
  function _workspaceUi2() {
79
72
  const data = require("@teambit/workspace.ui.workspace-component-card");
80
73
  _workspaceUi2 = function () {
@@ -117,6 +110,13 @@ function _useWorkspaceAggregation() {
117
110
  };
118
111
  return data;
119
112
  }
113
+ function _useQueryParamWithDefault() {
114
+ const data = require("./use-query-param-with-default");
115
+ _useQueryParamWithDefault = function () {
116
+ return data;
117
+ };
118
+ return data;
119
+ }
120
120
  function _workspaceFilterPanel() {
121
121
  const data = require("./workspace-filter-panel");
122
122
  _workspaceFilterPanel = function () {
@@ -168,14 +168,19 @@ function WorkspaceOverview() {
168
168
  } || undefined
169
169
  };
170
170
  }));
171
- const [searchParams] = (0, _reactRouterDom().useSearchParams)();
172
- const aggregation = searchParams.get('aggregation') || 'namespaces';
171
+ const [aggregation, setAggregation] = (0, _useQueryParamWithDefault().useQueryParamWithDefault)('aggregation', 'namespaces');
172
+ const [activeNamespaces, setActiveNamespaces] = (0, _react().useState)([]);
173
+ const [activeScopes, setActiveScopes] = (0, _react().useState)([]);
174
+ const filters = (0, _react().useMemo)(() => ({
175
+ namespaces: activeNamespaces,
176
+ scopes: activeScopes
177
+ }), [activeNamespaces, activeScopes]);
173
178
  const {
174
179
  groups,
175
180
  groupType,
176
181
  availableAggregations,
177
182
  filteredCount
178
- } = (0, _useWorkspaceAggregation().useWorkspaceAggregation)(items, aggregation);
183
+ } = (0, _useWorkspaceAggregation().useWorkspaceAggregation)(items, aggregation, filters);
179
184
  const plugins = useCardPlugins({
180
185
  compModelsById,
181
186
  showPreview: isMinimal
@@ -184,8 +189,13 @@ function WorkspaceOverview() {
184
189
  className: _workspaceOverviewModule().default.container
185
190
  }, /*#__PURE__*/_react().default.createElement(_workspaceFilterPanel().WorkspaceFilterPanel, {
186
191
  aggregation: aggregation,
192
+ onAggregationChange: setAggregation,
187
193
  availableAggregations: availableAggregations,
188
- items: items
194
+ items: items,
195
+ activeNamespaces: activeNamespaces,
196
+ onNamespacesChange: setActiveNamespaces,
197
+ activeScopes: activeScopes,
198
+ onScopesChange: setActiveScopes
189
199
  }), filteredCount === 0 && /*#__PURE__*/_react().default.createElement(_workspaceUi().EmptyWorkspace, {
190
200
  name: workspace.name
191
201
  }), groups.map(group => /*#__PURE__*/_react().default.createElement("section", {
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireWildcard","require","_explorerUiGallery","_workspaceUi","_previewUi","_designUi","_componentId","_lodash","_interopRequireDefault","_scopes","_cloudHooks","_reactRouterDom","_workspaceUi2","_workspaceUi3","_designUi2","_workspaceContext","_linkPlugin","_useWorkspaceAggregation","_workspaceFilterPanel","_workspaceOverviewModule","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","WorkspaceOverview","workspace","useContext","WorkspaceContext","components","componentDescriptors","length","createElement","EmptyWorkspace","name","isMinimal","useWorkspaceMode","compModelsById","useMemo","Map","map","c","id","toString","uniqueScopes","Set","scope","cloudScopes","useCloudScopes","cloudMap","s","compDescriptorMap","d","items","compact","component","deprecation","isDeprecate","descriptor","cloudScope","ScopeID","isValid","fromString","undefined","componentDescriptor","searchParams","useSearchParams","aggregation","groups","groupType","availableAggregations","filteredCount","useWorkspaceAggregation","plugins","useCardPlugins","showPreview","className","styles","container","WorkspaceFilterPanel","group","key","agg","H3","aggregationTitle","displayName","ComponentGrid","cardGrid","item","WorkspaceComponentCard","shouldShowPreviewState","serverUrlsSignature","React","serversCount","Array","from","values","filter","comp","server","url","join","preview","Preview","shouldShowPreview","compModel","PreviewPlaceholder","previewBottomRight","PreviewBottomRight","env","envComponentId","ComponentID","rightPreviewPlugins","badge","Tooltip","delay","content","src","icon","envIcon","LinkPlugin","size"],"sources":["workspace-overview.tsx"],"sourcesContent":["import React, { useContext, useMemo } from 'react';\nimport { ComponentGrid } from '@teambit/explorer.ui.gallery.component-grid';\nimport { EmptyWorkspace } from '@teambit/workspace.ui.empty-workspace';\nimport { PreviewPlaceholder } from '@teambit/preview.ui.preview-placeholder';\nimport { Tooltip } from '@teambit/design.ui.tooltip';\nimport { ComponentID } from '@teambit/component-id';\nimport type { ComponentModel } from '@teambit/component';\nimport compact from 'lodash.compact';\nimport { ScopeID } from '@teambit/scopes.scope-id';\nimport { useCloudScopes } from '@teambit/cloud.hooks.use-cloud-scopes';\nimport { useSearchParams } from 'react-router-dom';\nimport { WorkspaceComponentCard } from '@teambit/workspace.ui.workspace-component-card';\nimport type { ComponentCardPluginType, PluginProps } from '@teambit/explorer.ui.component-card';\nimport { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';\nimport { H3 } from '@teambit/design.ui.heading';\nimport { WorkspaceContext } from '../workspace-context';\nimport { LinkPlugin } from './link-plugin';\nimport { useWorkspaceAggregation } from './use-workspace-aggregation';\nimport { WorkspaceFilterPanel } from './workspace-filter-panel';\nimport styles from './workspace-overview.module.scss';\n\nexport function WorkspaceOverview() {\n const workspace = useContext(WorkspaceContext);\n const { components, componentDescriptors } = workspace;\n\n if (!components.length) return <EmptyWorkspace name={workspace.name} />;\n\n const { isMinimal } = useWorkspaceMode();\n const compModelsById = useMemo(() => new Map(components.map((c) => [c.id.toString(), c])), [components]);\n\n const uniqueScopes = [...new Set(components.map((c) => c.id.scope))];\n const { cloudScopes } = useCloudScopes(uniqueScopes);\n const cloudMap = new Map((cloudScopes || []).map((s) => [s.id.toString(), s]));\n\n const compDescriptorMap = new Map(componentDescriptors.map((d) => [d.id.toString(), d]));\n\n const items = compact(\n components.map((component) => {\n if (component.deprecation?.isDeprecate) return null;\n\n const descriptor = compDescriptorMap.get(component.id.toString());\n if (!descriptor) return null;\n\n const cloudScope = cloudMap.get(component.id.scope);\n const scope =\n cloudScope ||\n (ScopeID.isValid(component.id.scope) && { id: ScopeID.fromString(component.id.scope) }) ||\n undefined;\n\n return { component, componentDescriptor: descriptor, scope: (scope && { id: scope.id }) || undefined };\n })\n );\n\n const [searchParams] = useSearchParams();\n const aggregation = (searchParams.get('aggregation') as any) || 'namespaces';\n\n const { groups, groupType, availableAggregations, filteredCount } = useWorkspaceAggregation(items, aggregation);\n\n const plugins = useCardPlugins({ compModelsById, showPreview: isMinimal });\n\n return (\n <div className={styles.container}>\n <WorkspaceFilterPanel aggregation={aggregation} availableAggregations={availableAggregations} items={items} />\n\n {filteredCount === 0 && <EmptyWorkspace name={workspace.name} />}\n\n {groups.map((group) => (\n <section key={group.name} className={styles.agg}>\n {groupType !== 'none' && <H3 className={styles.aggregationTitle}>{group.displayName}</H3>}\n\n <ComponentGrid className={styles.cardGrid}>\n {group.items.map((item) => (\n <WorkspaceComponentCard\n key={item.component.id.toString()}\n component={item.component}\n componentDescriptor={item.componentDescriptor}\n scope={item.scope}\n plugins={plugins}\n shouldShowPreviewState={isMinimal}\n />\n ))}\n </ComponentGrid>\n </section>\n ))}\n </div>\n );\n}\n\nexport function useCardPlugins({\n compModelsById,\n showPreview,\n}: {\n compModelsById: Map<string, ComponentModel>;\n showPreview?: boolean;\n}): ComponentCardPluginType<PluginProps>[] {\n const serverUrlsSignature = React.useMemo(() => {\n const serversCount = Array.from(compModelsById.values())\n .filter((comp) => comp.server?.url)\n .map((comp) => comp.server?.url)\n .join(',');\n return serversCount;\n }, [compModelsById]);\n\n const plugins = React.useMemo(\n () => [\n {\n preview: function Preview({ component, shouldShowPreview }) {\n const compModel = compModelsById.get(component.id.toString());\n if (!compModel) return null;\n return (\n <PreviewPlaceholder\n componentDescriptor={component}\n component={compModel}\n shouldShowPreview={showPreview || shouldShowPreview}\n />\n );\n },\n },\n {\n previewBottomRight: function PreviewBottomRight({ component }) {\n const env = component.get('teambit.envs/envs');\n const envComponentId = env?.id ? ComponentID.fromString(env?.id) : undefined;\n\n return (\n <div className={styles.rightPreviewPlugins}>\n <div className={styles.badge}>\n <Tooltip delay={300} content={envComponentId?.name}>\n <img src={env?.icon} className={styles.envIcon} />\n </Tooltip>\n </div>\n </div>\n );\n },\n },\n new LinkPlugin(),\n ],\n [compModelsById.size, serverUrlsSignature, showPreview]\n );\n\n return plugins;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireWildcard","require","_explorerUiGallery","_workspaceUi","_previewUi","_designUi","_componentId","_lodash","_interopRequireDefault","_scopes","_cloudHooks","_workspaceUi2","_workspaceUi3","_designUi2","_workspaceContext","_linkPlugin","_useWorkspaceAggregation","_useQueryParamWithDefault","_workspaceFilterPanel","_workspaceOverviewModule","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","WorkspaceOverview","workspace","useContext","WorkspaceContext","components","componentDescriptors","length","createElement","EmptyWorkspace","name","isMinimal","useWorkspaceMode","compModelsById","useMemo","Map","map","c","id","toString","uniqueScopes","Set","scope","cloudScopes","useCloudScopes","cloudMap","s","compDescriptorMap","d","items","compact","component","deprecation","isDeprecate","descriptor","cloudScope","ScopeID","isValid","fromString","undefined","componentDescriptor","aggregation","setAggregation","useQueryParamWithDefault","activeNamespaces","setActiveNamespaces","useState","activeScopes","setActiveScopes","filters","namespaces","scopes","groups","groupType","availableAggregations","filteredCount","useWorkspaceAggregation","plugins","useCardPlugins","showPreview","className","styles","container","WorkspaceFilterPanel","onAggregationChange","onNamespacesChange","onScopesChange","group","key","agg","H3","aggregationTitle","displayName","ComponentGrid","cardGrid","item","WorkspaceComponentCard","shouldShowPreviewState","serverUrlsSignature","React","serversCount","Array","from","values","filter","comp","server","url","join","preview","Preview","shouldShowPreview","compModel","PreviewPlaceholder","previewBottomRight","PreviewBottomRight","env","envComponentId","ComponentID","rightPreviewPlugins","badge","Tooltip","delay","content","src","icon","envIcon","LinkPlugin","size"],"sources":["workspace-overview.tsx"],"sourcesContent":["import React, { useContext, useMemo, useState } from 'react';\nimport { ComponentGrid } from '@teambit/explorer.ui.gallery.component-grid';\nimport { EmptyWorkspace } from '@teambit/workspace.ui.empty-workspace';\nimport { PreviewPlaceholder } from '@teambit/preview.ui.preview-placeholder';\nimport { Tooltip } from '@teambit/design.ui.tooltip';\nimport { ComponentID } from '@teambit/component-id';\nimport type { ComponentModel } from '@teambit/component';\nimport compact from 'lodash.compact';\nimport { ScopeID } from '@teambit/scopes.scope-id';\nimport { useCloudScopes } from '@teambit/cloud.hooks.use-cloud-scopes';\nimport { WorkspaceComponentCard } from '@teambit/workspace.ui.workspace-component-card';\nimport type { ComponentCardPluginType, PluginProps } from '@teambit/explorer.ui.component-card';\nimport { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';\nimport { H3 } from '@teambit/design.ui.heading';\nimport { WorkspaceContext } from '../workspace-context';\nimport { LinkPlugin } from './link-plugin';\nimport { useWorkspaceAggregation } from './use-workspace-aggregation';\nimport { useQueryParamWithDefault } from './use-query-param-with-default';\nimport type { AggregationType } from './workspace-overview.types';\nimport { WorkspaceFilterPanel } from './workspace-filter-panel';\nimport styles from './workspace-overview.module.scss';\n\nexport function WorkspaceOverview() {\n const workspace = useContext(WorkspaceContext);\n const { components, componentDescriptors } = workspace;\n\n if (!components.length) return <EmptyWorkspace name={workspace.name} />;\n\n const { isMinimal } = useWorkspaceMode();\n const compModelsById = useMemo(() => new Map(components.map((c) => [c.id.toString(), c])), [components]);\n\n const uniqueScopes = [...new Set(components.map((c) => c.id.scope))];\n const { cloudScopes } = useCloudScopes(uniqueScopes);\n const cloudMap = new Map((cloudScopes || []).map((s) => [s.id.toString(), s]));\n\n const compDescriptorMap = new Map(componentDescriptors.map((d) => [d.id.toString(), d]));\n\n const items = compact(\n components.map((component) => {\n if (component.deprecation?.isDeprecate) return null;\n\n const descriptor = compDescriptorMap.get(component.id.toString());\n if (!descriptor) return null;\n\n const cloudScope = cloudMap.get(component.id.scope);\n const scope =\n cloudScope ||\n (ScopeID.isValid(component.id.scope) && { id: ScopeID.fromString(component.id.scope) }) ||\n undefined;\n\n return { component, componentDescriptor: descriptor, scope: (scope && { id: scope.id }) || undefined };\n })\n );\n\n const [aggregation, setAggregation] = useQueryParamWithDefault<AggregationType>('aggregation', 'namespaces');\n const [activeNamespaces, setActiveNamespaces] = useState<string[]>([]);\n const [activeScopes, setActiveScopes] = useState<string[]>([]);\n\n const filters = useMemo(\n () => ({ namespaces: activeNamespaces, scopes: activeScopes }),\n [activeNamespaces, activeScopes]\n );\n\n const { groups, groupType, availableAggregations, filteredCount } = useWorkspaceAggregation(\n items,\n aggregation,\n filters\n );\n\n const plugins = useCardPlugins({ compModelsById, showPreview: isMinimal });\n\n return (\n <div className={styles.container}>\n <WorkspaceFilterPanel\n aggregation={aggregation}\n onAggregationChange={setAggregation}\n availableAggregations={availableAggregations}\n items={items}\n activeNamespaces={activeNamespaces}\n onNamespacesChange={setActiveNamespaces}\n activeScopes={activeScopes}\n onScopesChange={setActiveScopes}\n />\n\n {filteredCount === 0 && <EmptyWorkspace name={workspace.name} />}\n\n {groups.map((group) => (\n <section key={group.name} className={styles.agg}>\n {groupType !== 'none' && <H3 className={styles.aggregationTitle}>{group.displayName}</H3>}\n\n <ComponentGrid className={styles.cardGrid}>\n {group.items.map((item) => (\n <WorkspaceComponentCard\n key={item.component.id.toString()}\n component={item.component}\n componentDescriptor={item.componentDescriptor}\n scope={item.scope}\n plugins={plugins}\n shouldShowPreviewState={isMinimal}\n />\n ))}\n </ComponentGrid>\n </section>\n ))}\n </div>\n );\n}\n\nexport function useCardPlugins({\n compModelsById,\n showPreview,\n}: {\n compModelsById: Map<string, ComponentModel>;\n showPreview?: boolean;\n}): ComponentCardPluginType<PluginProps>[] {\n const serverUrlsSignature = React.useMemo(() => {\n const serversCount = Array.from(compModelsById.values())\n .filter((comp) => comp.server?.url)\n .map((comp) => comp.server?.url)\n .join(',');\n return serversCount;\n }, [compModelsById]);\n\n const plugins = React.useMemo(\n () => [\n {\n preview: function Preview({ component, shouldShowPreview }) {\n const compModel = compModelsById.get(component.id.toString());\n if (!compModel) return null;\n return (\n <PreviewPlaceholder\n componentDescriptor={component}\n component={compModel}\n shouldShowPreview={showPreview || shouldShowPreview}\n />\n );\n },\n },\n {\n previewBottomRight: function PreviewBottomRight({ component }) {\n const env = component.get('teambit.envs/envs');\n const envComponentId = env?.id ? ComponentID.fromString(env?.id) : undefined;\n\n return (\n <div className={styles.rightPreviewPlugins}>\n <div className={styles.badge}>\n <Tooltip delay={300} content={envComponentId?.name}>\n <img src={env?.icon} className={styles.envIcon} />\n </Tooltip>\n </div>\n </div>\n );\n },\n },\n new LinkPlugin(),\n ],\n [compModelsById.size, serverUrlsSignature, showPreview]\n );\n\n return plugins;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,3 +1,5 @@
1
+ @import '@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
+
1
3
  .container {
2
4
  padding: 24px 5% 150px 5%;
3
5
  overflow-y: auto;
@@ -23,7 +25,7 @@
23
25
  padding: 4px;
24
26
  height: 15px;
25
27
  margin-right: 4px;
26
- z-index: 100;
28
+ z-index: $nav-z-index;
27
29
  border-radius: 8px;
28
30
  margin-bottom: 4px;
29
31
  box-shadow: 0px 2px 18px rgb(0 0 0 / 10%);
@@ -44,7 +46,7 @@
44
46
  justify-content: space-between;
45
47
  margin-bottom: 24px;
46
48
  position: relative;
47
- z-index: 100000;
49
+ z-index: $modal-z-index - 1;
48
50
  }
49
51
 
50
52
  .aggButtons {
@@ -129,7 +131,7 @@
129
131
  }
130
132
 
131
133
  .filterPanel :global(.menu) {
132
- z-index: 200000 !important;
134
+ z-index: $modal-z-index - 1 !important;
133
135
  border-radius: 8px !important;
134
136
  padding: 8px 0 !important;
135
137
  }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/workspace",
3
- "version": "1.0.868",
3
+ "version": "1.0.869",
4
4
  "homepage": "https://bit.cloud/teambit/workspace/workspace",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.workspace",
8
8
  "name": "workspace",
9
- "version": "1.0.868"
9
+ "version": "1.0.869"
10
10
  },
11
11
  "dependencies": {
12
12
  "lodash": "4.17.21",
@@ -105,23 +105,23 @@
105
105
  "@teambit/scopes.scope-id": "0.0.9",
106
106
  "@teambit/workspace.ui.empty-workspace": "0.0.509",
107
107
  "@teambit/workspace.ui.workspace-component-card": "0.0.567",
108
- "@teambit/component": "1.0.868",
109
- "@teambit/dependency-resolver": "1.0.868",
110
- "@teambit/envs": "1.0.868",
111
- "@teambit/objects": "0.0.375",
112
- "@teambit/scope": "1.0.868",
113
- "@teambit/graph": "1.0.868",
114
- "@teambit/isolator": "1.0.868",
115
- "@teambit/component-tree": "1.0.868",
116
- "@teambit/watcher": "1.0.868",
117
- "@teambit/aspect-loader": "1.0.868",
118
- "@teambit/graphql": "1.0.868",
119
- "@teambit/bundler": "1.0.868",
120
- "@teambit/ui": "1.0.868",
121
- "@teambit/command-bar": "1.0.868",
122
- "@teambit/sidebar": "1.0.868",
123
- "@teambit/pubsub": "1.0.868",
124
- "@teambit/deprecation": "1.0.868"
108
+ "@teambit/component": "1.0.869",
109
+ "@teambit/dependency-resolver": "1.0.869",
110
+ "@teambit/envs": "1.0.869",
111
+ "@teambit/objects": "0.0.376",
112
+ "@teambit/scope": "1.0.869",
113
+ "@teambit/graph": "1.0.869",
114
+ "@teambit/isolator": "1.0.869",
115
+ "@teambit/component-tree": "1.0.869",
116
+ "@teambit/watcher": "1.0.869",
117
+ "@teambit/aspect-loader": "1.0.869",
118
+ "@teambit/graphql": "1.0.869",
119
+ "@teambit/bundler": "1.0.869",
120
+ "@teambit/ui": "1.0.869",
121
+ "@teambit/command-bar": "1.0.869",
122
+ "@teambit/sidebar": "1.0.869",
123
+ "@teambit/pubsub": "1.0.869",
124
+ "@teambit/deprecation": "1.0.869"
125
125
  },
126
126
  "devDependencies": {
127
127
  "@types/lodash": "4.14.165",
@@ -1 +1,2 @@
1
1
  export { WorkspaceOverview } from './workspace-overview';
2
+ export { useQueryParamWithDefault, useListParamWithDefault } from './use-query-param-with-default';
@@ -12,6 +12,9 @@ export function getRootNamespace(ns: string): string {
12
12
  export function namespacePriority(ns: string): number {
13
13
  const root = getRootNamespace(ns);
14
14
 
15
+ // internal namespaces (starting with _) go last
16
+ if (root.startsWith('_')) return 4;
17
+
15
18
  if (PRIORITY_HIGH.includes(root)) return 0;
16
19
  if (PRIORITY_MED.includes(root)) return 1;
17
20
  if (PRIORITY_LOW.includes(root)) return 3;
@@ -0,0 +1,115 @@
1
+ import { useCallback, useMemo } from 'react';
2
+ import { useSearchParams } from 'react-router-dom';
3
+
4
+ const STORAGE_KEY_PREFIX = 'workspace-overview:';
5
+
6
+ export interface QueryParamOptions {
7
+ /** persist value to localStorage across sessions. Default: true */
8
+ persist?: boolean;
9
+ }
10
+
11
+ export function useQueryParamWithDefault<T extends string>(
12
+ paramName: string,
13
+ fallback: T,
14
+ options: QueryParamOptions = {}
15
+ ): [T, (value: T | null) => void] {
16
+ const { persist = true } = options;
17
+ const [searchParams, setSearchParams] = useSearchParams();
18
+ const storageKey = STORAGE_KEY_PREFIX + paramName;
19
+
20
+ const value = useMemo((): T => {
21
+ const urlValue = searchParams.get(paramName);
22
+ if (urlValue) return urlValue as T;
23
+
24
+ if (persist) {
25
+ const stored = safeGetItem(storageKey);
26
+ if (stored) return stored as T;
27
+ }
28
+
29
+ return fallback;
30
+ }, [searchParams, paramName, storageKey, fallback, persist]);
31
+
32
+ const setValue = useCallback(
33
+ (newValue: T | null) => {
34
+ const newParams = new URLSearchParams(searchParams);
35
+
36
+ if (newValue === null) {
37
+ newParams.delete(paramName);
38
+ if (persist) safeRemoveItem(storageKey);
39
+ } else {
40
+ newParams.set(paramName, newValue);
41
+ if (persist) safeSetItem(storageKey, newValue);
42
+ }
43
+
44
+ setSearchParams(newParams);
45
+ },
46
+ [searchParams, setSearchParams, paramName, storageKey, persist]
47
+ );
48
+
49
+ return [value, setValue];
50
+ }
51
+
52
+ export function useListParamWithDefault(
53
+ paramName: string,
54
+ options: QueryParamOptions = {}
55
+ ): [string[], (values: string[]) => void] {
56
+ const { persist = false } = options;
57
+ const [searchParams, setSearchParams] = useSearchParams();
58
+ const storageKey = STORAGE_KEY_PREFIX + paramName;
59
+
60
+ const values = useMemo((): string[] => {
61
+ const urlValue = searchParams.get(paramName);
62
+ if (urlValue) return urlValue.split(',').filter(Boolean);
63
+
64
+ if (persist) {
65
+ const stored = safeGetItem(storageKey);
66
+ if (stored) return stored.split(',').filter(Boolean);
67
+ }
68
+
69
+ return [];
70
+ }, [searchParams, paramName, storageKey, persist]);
71
+
72
+ const setValues = useCallback(
73
+ (newValues: string[]) => {
74
+ const newParams = new URLSearchParams(searchParams);
75
+ const joined = newValues.filter(Boolean).join(',');
76
+
77
+ if (joined) {
78
+ newParams.set(paramName, joined);
79
+ if (persist) safeSetItem(storageKey, joined);
80
+ } else {
81
+ newParams.delete(paramName);
82
+ if (persist) safeRemoveItem(storageKey);
83
+ }
84
+
85
+ setSearchParams(newParams);
86
+ },
87
+ [searchParams, setSearchParams, paramName, storageKey, persist]
88
+ );
89
+
90
+ return [values, setValues];
91
+ }
92
+
93
+ function safeGetItem(key: string): string | null {
94
+ try {
95
+ return localStorage.getItem(key);
96
+ } catch {
97
+ return null;
98
+ }
99
+ }
100
+
101
+ function safeSetItem(key: string, value: string): void {
102
+ try {
103
+ localStorage.setItem(key, value);
104
+ } catch {
105
+ // ignore storage errors
106
+ }
107
+ }
108
+
109
+ function safeRemoveItem(key: string): void {
110
+ try {
111
+ localStorage.removeItem(key);
112
+ } catch {
113
+ // ignore storage errors
114
+ }
115
+ }
@@ -1,12 +1,13 @@
1
1
  import { useMemo } from 'react';
2
2
  import { sortNamespacesAdvanced, sortItemsByNamespace } from './namespace-sort';
3
- import { filterItems, parseActiveFilters } from './filter-utils';
3
+ import { filterItems, type ActiveFilters } from './filter-utils';
4
4
  import type { WorkspaceItem, AggregationType, AggregationGroup, AggregationResult } from './workspace-overview.types';
5
5
 
6
- export function useWorkspaceAggregation(items: WorkspaceItem[], aggregation: AggregationType): AggregationResult {
7
- const search = new URLSearchParams(window.location.search);
8
- const filters = parseActiveFilters(search);
9
-
6
+ export function useWorkspaceAggregation(
7
+ items: WorkspaceItem[],
8
+ aggregation: AggregationType,
9
+ filters: ActiveFilters
10
+ ): AggregationResult {
10
11
  const filtered = useMemo(() => filterItems(items, filters), [items, filters]);
11
12
 
12
13
  if (aggregation === 'none') {
@@ -1,5 +1,4 @@
1
1
  import React, { useMemo } from 'react';
2
- import { useSearchParams } from 'react-router-dom';
3
2
  import { ToggleButton } from '@teambit/design.inputs.toggle-button';
4
3
  import { BaseFilter } from '@teambit/component.filters.base-filter';
5
4
  import type { WorkspaceItem, AggregationType } from './workspace-overview.types';
@@ -7,8 +6,13 @@ import styles from './workspace-overview.module.scss';
7
6
 
8
7
  export interface WorkspaceFilterPanelProps {
9
8
  aggregation: AggregationType;
9
+ onAggregationChange: (agg: AggregationType) => void;
10
10
  availableAggregations: AggregationType[];
11
11
  items: WorkspaceItem[];
12
+ activeNamespaces: string[];
13
+ onNamespacesChange: (namespaces: string[]) => void;
14
+ activeScopes: string[];
15
+ onScopesChange: (scopes: string[]) => void;
12
16
  }
13
17
 
14
18
  const LABELS: Record<AggregationType, string> = {
@@ -17,9 +21,16 @@ const LABELS: Record<AggregationType, string> = {
17
21
  none: 'None',
18
22
  };
19
23
 
20
- export function WorkspaceFilterPanel({ aggregation, availableAggregations, items }: WorkspaceFilterPanelProps) {
21
- const [searchParams, setSearchParams] = useSearchParams();
22
-
24
+ export function WorkspaceFilterPanel({
25
+ aggregation,
26
+ onAggregationChange,
27
+ availableAggregations,
28
+ items,
29
+ activeNamespaces,
30
+ onNamespacesChange,
31
+ activeScopes,
32
+ onScopesChange,
33
+ }: WorkspaceFilterPanelProps) {
23
34
  const namespaceOptions = useMemo(
24
35
  () =>
25
36
  [...new Set(items.map((i) => i.component.id.namespace || '/'))].map((v) => ({
@@ -36,32 +47,17 @@ export function WorkspaceFilterPanel({ aggregation, availableAggregations, items
36
47
  [items]
37
48
  );
38
49
 
39
- const activeNamespaces = (searchParams.get('ns') || '')
40
- .split(',')
41
- .filter(Boolean)
42
- .map((v) => ({ value: v }));
43
-
44
- const activeScopes = (searchParams.get('scopes') || '')
45
- .split(',')
46
- .filter(Boolean)
47
- .map((v) => ({ value: v }));
50
+ const activeNsOptions = activeNamespaces.map((v) => ({ value: v }));
51
+ const activeScopeOptions = activeScopes.map((v) => ({ value: v }));
48
52
 
49
53
  const applyNs = (opts) => {
50
54
  const list = opts.map((o) => o.value).filter((v): v is string => typeof v === 'string');
51
-
52
- if (list.length) searchParams.set('ns', list.join(','));
53
- else searchParams.delete('ns');
54
-
55
- setSearchParams(searchParams);
55
+ onNamespacesChange(list);
56
56
  };
57
57
 
58
58
  const applyScopes = (opts) => {
59
59
  const list = opts.map((o) => o.value).filter((v): v is string => typeof v === 'string');
60
-
61
- if (list.length) searchParams.set('scopes', list.join(','));
62
- else searchParams.delete('scopes');
63
-
64
- setSearchParams(searchParams);
60
+ onScopesChange(list);
65
61
  };
66
62
 
67
63
  const currentIndex = Math.max(
@@ -71,8 +67,7 @@ export function WorkspaceFilterPanel({ aggregation, availableAggregations, items
71
67
 
72
68
  const applyAgg = (i: number) => {
73
69
  const agg = availableAggregations[i];
74
- searchParams.set('aggregation', agg);
75
- setSearchParams(searchParams);
70
+ onAggregationChange(agg);
76
71
  };
77
72
 
78
73
  return (
@@ -82,7 +77,7 @@ export function WorkspaceFilterPanel({ aggregation, availableAggregations, items
82
77
  id="namespaces"
83
78
  placeholder="Namespaces"
84
79
  options={namespaceOptions}
85
- activeOptions={activeNamespaces}
80
+ activeOptions={activeNsOptions}
86
81
  onChange={applyNs}
87
82
  isSearchable
88
83
  />
@@ -91,7 +86,7 @@ export function WorkspaceFilterPanel({ aggregation, availableAggregations, items
91
86
  id="scopes"
92
87
  placeholder="Scopes"
93
88
  options={scopeOptions}
94
- activeOptions={activeScopes}
89
+ activeOptions={activeScopeOptions}
95
90
  onChange={applyScopes}
96
91
  isSearchable
97
92
  />
@@ -1,3 +1,5 @@
1
+ @import '@teambit/ui-foundation.ui.constants.z-indexes/z-indexes.module.scss';
2
+
1
3
  .container {
2
4
  padding: 24px 5% 150px 5%;
3
5
  overflow-y: auto;
@@ -23,7 +25,7 @@
23
25
  padding: 4px;
24
26
  height: 15px;
25
27
  margin-right: 4px;
26
- z-index: 100;
28
+ z-index: $nav-z-index;
27
29
  border-radius: 8px;
28
30
  margin-bottom: 4px;
29
31
  box-shadow: 0px 2px 18px rgb(0 0 0 / 10%);
@@ -44,7 +46,7 @@
44
46
  justify-content: space-between;
45
47
  margin-bottom: 24px;
46
48
  position: relative;
47
- z-index: 100000;
49
+ z-index: $modal-z-index - 1;
48
50
  }
49
51
 
50
52
  .aggButtons {
@@ -129,7 +131,7 @@
129
131
  }
130
132
 
131
133
  .filterPanel :global(.menu) {
132
- z-index: 200000 !important;
134
+ z-index: $modal-z-index - 1 !important;
133
135
  border-radius: 8px !important;
134
136
  padding: 8px 0 !important;
135
137
  }
@@ -1,4 +1,4 @@
1
- import React, { useContext, useMemo } from 'react';
1
+ import React, { useContext, useMemo, useState } from 'react';
2
2
  import { ComponentGrid } from '@teambit/explorer.ui.gallery.component-grid';
3
3
  import { EmptyWorkspace } from '@teambit/workspace.ui.empty-workspace';
4
4
  import { PreviewPlaceholder } from '@teambit/preview.ui.preview-placeholder';
@@ -8,7 +8,6 @@ import type { ComponentModel } from '@teambit/component';
8
8
  import compact from 'lodash.compact';
9
9
  import { ScopeID } from '@teambit/scopes.scope-id';
10
10
  import { useCloudScopes } from '@teambit/cloud.hooks.use-cloud-scopes';
11
- import { useSearchParams } from 'react-router-dom';
12
11
  import { WorkspaceComponentCard } from '@teambit/workspace.ui.workspace-component-card';
13
12
  import type { ComponentCardPluginType, PluginProps } from '@teambit/explorer.ui.component-card';
14
13
  import { useWorkspaceMode } from '@teambit/workspace.ui.use-workspace-mode';
@@ -16,6 +15,8 @@ import { H3 } from '@teambit/design.ui.heading';
16
15
  import { WorkspaceContext } from '../workspace-context';
17
16
  import { LinkPlugin } from './link-plugin';
18
17
  import { useWorkspaceAggregation } from './use-workspace-aggregation';
18
+ import { useQueryParamWithDefault } from './use-query-param-with-default';
19
+ import type { AggregationType } from './workspace-overview.types';
19
20
  import { WorkspaceFilterPanel } from './workspace-filter-panel';
20
21
  import styles from './workspace-overview.module.scss';
21
22
 
@@ -51,16 +52,35 @@ export function WorkspaceOverview() {
51
52
  })
52
53
  );
53
54
 
54
- const [searchParams] = useSearchParams();
55
- const aggregation = (searchParams.get('aggregation') as any) || 'namespaces';
55
+ const [aggregation, setAggregation] = useQueryParamWithDefault<AggregationType>('aggregation', 'namespaces');
56
+ const [activeNamespaces, setActiveNamespaces] = useState<string[]>([]);
57
+ const [activeScopes, setActiveScopes] = useState<string[]>([]);
56
58
 
57
- const { groups, groupType, availableAggregations, filteredCount } = useWorkspaceAggregation(items, aggregation);
59
+ const filters = useMemo(
60
+ () => ({ namespaces: activeNamespaces, scopes: activeScopes }),
61
+ [activeNamespaces, activeScopes]
62
+ );
63
+
64
+ const { groups, groupType, availableAggregations, filteredCount } = useWorkspaceAggregation(
65
+ items,
66
+ aggregation,
67
+ filters
68
+ );
58
69
 
59
70
  const plugins = useCardPlugins({ compModelsById, showPreview: isMinimal });
60
71
 
61
72
  return (
62
73
  <div className={styles.container}>
63
- <WorkspaceFilterPanel aggregation={aggregation} availableAggregations={availableAggregations} items={items} />
74
+ <WorkspaceFilterPanel
75
+ aggregation={aggregation}
76
+ onAggregationChange={setAggregation}
77
+ availableAggregations={availableAggregations}
78
+ items={items}
79
+ activeNamespaces={activeNamespaces}
80
+ onNamespacesChange={setActiveNamespaces}
81
+ activeScopes={activeScopes}
82
+ onScopesChange={setActiveScopes}
83
+ />
64
84
 
65
85
  {filteredCount === 0 && <EmptyWorkspace name={workspace.name} />}
66
86