@teambit/scope 0.0.670 → 0.0.673

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.
@@ -6,3 +6,36 @@
6
6
  .collapseIcon {
7
7
  width: 16px;
8
8
  }
9
+
10
+ .deprecateFilter {
11
+ display: flex;
12
+ flex-direction: row;
13
+ font-size: 14px;
14
+ justify-content: space-between;
15
+ padding: 8px;
16
+ margin: 4px 8px;
17
+
18
+ .filterIcon {
19
+ line-height: 16px;
20
+ display: flex;
21
+
22
+ .filterIconLabel {
23
+ margin: 0px 8px;
24
+ font-size: 12px;
25
+ }
26
+ }
27
+ }
28
+
29
+ .filterWidgetIcon {
30
+ margin-right: 12px;
31
+ padding: 4px;
32
+
33
+ &:hover {
34
+ background: white;
35
+ }
36
+
37
+ &.open {
38
+ color: var(--bit-accent-color, #6c5ce7);
39
+ background-color: var(--bit-bg-heavy, #f6f6f6);
40
+ }
41
+ }
@@ -6,7 +6,8 @@ export declare class ComponentsDrawer implements DrawerType {
6
6
  constructor(treeNodeSlot: ComponentTreeSlot);
7
7
  id: string;
8
8
  name: string;
9
- widget: JSX.Element;
9
+ widgets: JSX.Element[];
10
+ Filters: JSX.Element[];
10
11
  Context: ({ children }: {
11
12
  children: any;
12
13
  }) => JSX.Element;
@@ -59,6 +59,16 @@ function _uiFoundationUi() {
59
59
  return data;
60
60
  }
61
61
 
62
+ function _evangelistElements() {
63
+ const data = require("@teambit/evangelist.elements.icon");
64
+
65
+ _evangelistElements = function () {
66
+ return data;
67
+ };
68
+
69
+ return data;
70
+ }
71
+
62
72
  function _uiFoundationUi2() {
63
73
  const data = require("@teambit/ui-foundation.ui.full-loader");
64
74
 
@@ -89,6 +99,16 @@ function _designUiStyles2() {
89
99
  return data;
90
100
  }
91
101
 
102
+ function _designUiInput() {
103
+ const data = require("@teambit/design.ui.input.toggle");
104
+
105
+ _designUiInput = function () {
106
+ return data;
107
+ };
108
+
109
+ return data;
110
+ }
111
+
92
112
  function _scopeUiHooks() {
93
113
  const data = require("@teambit/scope.ui.hooks.use-scope");
94
114
 
@@ -115,7 +135,11 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
115
135
 
116
136
  const ScopeTreeContext = /*#__PURE__*/(0, _react().createContext)({
117
137
  collapsed: true,
118
- setCollapsed: () => {}
138
+ setCollapsed: () => {},
139
+ activeFilters: [],
140
+ setActiveFilter: () => {},
141
+ filterOpen: false,
142
+ setFilterOpen: () => {}
119
143
  });
120
144
 
121
145
  class ComponentsDrawer {
@@ -123,15 +147,40 @@ class ComponentsDrawer {
123
147
  this.treeNodeSlot = treeNodeSlot;
124
148
  (0, _defineProperty2().default)(this, "id", 'components-drawer');
125
149
  (0, _defineProperty2().default)(this, "name", 'COMPONENTS');
126
- (0, _defineProperty2().default)(this, "widget", /*#__PURE__*/_react().default.createElement(Widget, null));
150
+ (0, _defineProperty2().default)(this, "widgets", [/*#__PURE__*/_react().default.createElement(FilterWidget, {
151
+ key: 'filter-widget'
152
+ }), /*#__PURE__*/_react().default.createElement(TreeToggleWidget, {
153
+ key: 'tree-toggle-widget'
154
+ })]);
155
+ (0, _defineProperty2().default)(this, "Filters", [/*#__PURE__*/_react().default.createElement(DeprecateFilter, {
156
+ key: 'deprecate-filter'
157
+ })]);
127
158
  (0, _defineProperty2().default)(this, "Context", ({
128
159
  children
129
160
  }) => {
130
161
  const [collapsed, setCollapsed] = (0, _react().useState)(true);
162
+ const [activeFilters, setActiveFilters] = (0, _react().useState)([]);
163
+ const [filterOpen, setFilterOpen] = (0, _react().useState)(false);
164
+
165
+ const handleActiveFilterToggle = filterId => {
166
+ const isFilterActive = activeFilters.includes(filterId);
167
+
168
+ if (isFilterActive) {
169
+ setActiveFilters(list => list.filter(id => id !== filterId));
170
+ return;
171
+ }
172
+
173
+ setActiveFilters(list => list.concat(filterId));
174
+ };
175
+
131
176
  return /*#__PURE__*/_react().default.createElement(ScopeTreeContext.Provider, {
132
177
  value: {
133
178
  collapsed,
134
- setCollapsed
179
+ setCollapsed,
180
+ activeFilters,
181
+ setActiveFilter: handleActiveFilterToggle,
182
+ filterOpen,
183
+ setFilterOpen
135
184
  }
136
185
  }, children);
137
186
  });
@@ -140,11 +189,13 @@ class ComponentsDrawer {
140
189
  scope
141
190
  } = (0, _scopeUiHooks().useScopeQuery)();
142
191
  const {
143
- collapsed
192
+ collapsed,
193
+ activeFilters
144
194
  } = (0, _react().useContext)(ScopeTreeContext);
145
195
  const {
146
196
  treeNodeSlot
147
197
  } = this;
198
+ const showDeprecatedComponents = activeFilters.find(activeFilter => activeFilter === 'deprecate');
148
199
  const TreeNodeRenderer = (0, _react().useCallback)(function TreeNode(props) {
149
200
  const children = props.node.children;
150
201
  if (!children) return /*#__PURE__*/_react().default.createElement(_uiFoundationUi().ComponentView, (0, _extends2().default)({}, props, {
@@ -162,11 +213,16 @@ class ComponentsDrawer {
162
213
  return /*#__PURE__*/_react().default.createElement(_uiFoundationUi().NamespaceTreeNode, props);
163
214
  }, [treeNodeSlot]);
164
215
  if (!scope) return /*#__PURE__*/_react().default.createElement(_uiFoundationUi2().FullLoader, null);
165
- if (scope.components.length === 0) return /*#__PURE__*/_react().default.createElement("span", {
216
+ const components = showDeprecatedComponents ? scope.components : scope.components.filter(component => {
217
+ var _component$deprecatio;
218
+
219
+ return !((_component$deprecatio = component.deprecation) !== null && _component$deprecatio !== void 0 && _component$deprecatio.isDeprecate);
220
+ });
221
+ if (components.length === 0) return /*#__PURE__*/_react().default.createElement("span", {
166
222
  className: (0, _classnames().default)(_designUiStyles().mutedItalic, _designUiStyles2().ellipsis, _componentsDrawerModule().default.emptyScope)
167
223
  }, "Scope is empty");
168
224
  return /*#__PURE__*/_react().default.createElement(_uiFoundationUi().ComponentTree, {
169
- components: scope.components,
225
+ components: components,
170
226
  isCollapsed: collapsed,
171
227
  TreeNode: TreeNodeRenderer
172
228
  });
@@ -177,7 +233,7 @@ class ComponentsDrawer {
177
233
 
178
234
  exports.ComponentsDrawer = ComponentsDrawer;
179
235
 
180
- function Widget() {
236
+ function TreeToggleWidget() {
181
237
  const {
182
238
  collapsed,
183
239
  setCollapsed
@@ -190,4 +246,38 @@ function Widget() {
190
246
  });
191
247
  }
192
248
 
249
+ function FilterWidget() {
250
+ const {
251
+ filterOpen,
252
+ setFilterOpen
253
+ } = (0, _react().useContext)(ScopeTreeContext);
254
+ return /*#__PURE__*/_react().default.createElement(_evangelistElements().Icon, {
255
+ className: (0, _classnames().default)(_componentsDrawerModule().default.filterWidgetIcon, filterOpen && _componentsDrawerModule().default.open),
256
+ of: "Ripple_filters",
257
+ onClick: () => setFilterOpen(!filterOpen)
258
+ });
259
+ }
260
+
261
+ function DeprecateFilter() {
262
+ const {
263
+ activeFilters,
264
+ setActiveFilter,
265
+ filterOpen
266
+ } = (0, _react().useContext)(ScopeTreeContext);
267
+ const isActive = activeFilters.includes('deprecate');
268
+ if (!filterOpen) return null;
269
+ return /*#__PURE__*/_react().default.createElement("div", {
270
+ className: (0, _classnames().default)(_componentsDrawerModule().default.deprecateFilter, isActive && _componentsDrawerModule().default.active)
271
+ }, /*#__PURE__*/_react().default.createElement("div", {
272
+ className: _componentsDrawerModule().default.filterIcon
273
+ }, /*#__PURE__*/_react().default.createElement(_evangelistElements().Icon, {
274
+ of: "note-deprecated"
275
+ }), /*#__PURE__*/_react().default.createElement("span", {
276
+ className: _componentsDrawerModule().default.filterIconLabel
277
+ }, "Deprecated")), /*#__PURE__*/_react().default.createElement("div", null, /*#__PURE__*/_react().default.createElement(_designUiInput().Toggle, {
278
+ checked: isActive,
279
+ onInputChanged: () => setActiveFilter('deprecate')
280
+ })));
281
+ }
282
+
193
283
  //# sourceMappingURL=components.drawer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["components.drawer.tsx"],"names":["ScopeTreeContext","collapsed","setCollapsed","ComponentsDrawer","constructor","treeNodeSlot","children","scope","TreeNodeRenderer","TreeNode","props","node","payload","ScopePayload","map","childNode","id","components","length","mutedItalic","ellipsis","styles","emptyScope","Widget","icon","collapseIcon"],"mappings":"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","sourcesContent":["import React, { useCallback, useState, useContext, createContext } from 'react';\nimport classNames from 'classnames';\nimport {\n ComponentTree,\n ComponentView,\n NamespaceTreeNode,\n PayloadType,\n ScopePayload,\n} from '@teambit/ui-foundation.ui.side-bar';\nimport { TreeNodeProps } from '@teambit/base-ui.graph.tree.recursive-tree';\n\nimport { FullLoader } from '@teambit/ui-foundation.ui.full-loader';\nimport { ComponentTreeSlot } from '@teambit/component-tree';\nimport type { DrawerType } from '@teambit/ui-foundation.ui.tree.drawer';\nimport { mutedItalic } from '@teambit/design.ui.styles.muted-italic';\nimport { ellipsis } from '@teambit/design.ui.styles.ellipsis';\nimport { useScopeQuery } from '@teambit/scope.ui.hooks.use-scope';\nimport styles from './components-drawer.module.scss';\n\nconst ScopeTreeContext = createContext<{ collapsed: boolean; setCollapsed: (x: boolean) => void }>({\n collapsed: true,\n setCollapsed: () => {},\n});\n\nexport class ComponentsDrawer implements DrawerType {\n constructor(private treeNodeSlot: ComponentTreeSlot) {}\n\n id = 'components-drawer';\n\n name = 'COMPONENTS';\n\n widget = (<Widget />);\n\n Context = ({ children }) => {\n const [collapsed, setCollapsed] = useState(true);\n return <ScopeTreeContext.Provider value={{ collapsed, setCollapsed }}>{children}</ScopeTreeContext.Provider>;\n };\n\n render = () => {\n const { scope } = useScopeQuery();\n const { collapsed } = useContext(ScopeTreeContext);\n const { treeNodeSlot } = this;\n\n const TreeNodeRenderer = useCallback(\n function TreeNode(props: TreeNodeProps<PayloadType>) {\n const children = props.node.children;\n\n if (!children) return <ComponentView {...props} treeNodeSlot={treeNodeSlot} />;\n\n // skip over scope node and render only children\n if (props.node.payload instanceof ScopePayload) {\n return (\n <>\n {children.map((childNode) => (\n <TreeNodeRenderer key={childNode.id} {...props} node={childNode}></TreeNodeRenderer>\n ))}\n </>\n );\n }\n\n return <NamespaceTreeNode {...props} />;\n },\n [treeNodeSlot]\n );\n\n if (!scope) return <FullLoader />;\n if (scope.components.length === 0)\n return <span className={classNames(mutedItalic, ellipsis, styles.emptyScope)}>Scope is empty</span>;\n return <ComponentTree components={scope.components} isCollapsed={collapsed} TreeNode={TreeNodeRenderer} />;\n };\n}\n\nfunction Widget() {\n const { collapsed, setCollapsed } = useContext(ScopeTreeContext);\n const icon = collapsed\n ? 'https://static.bit.dev/bit-icons/expand.svg'\n : 'https://static.bit.dev/bit-icons/collapse.svg';\n return <img src={icon} className={styles.collapseIcon} onClick={() => setCollapsed(!collapsed)} />;\n}\n"]}
1
+ {"version":3,"sources":["components.drawer.tsx"],"names":["ScopeTreeContext","collapsed","setCollapsed","activeFilters","setActiveFilter","filterOpen","setFilterOpen","ComponentsDrawer","constructor","treeNodeSlot","children","setActiveFilters","handleActiveFilterToggle","filterId","isFilterActive","includes","list","filter","id","concat","scope","showDeprecatedComponents","find","activeFilter","TreeNodeRenderer","TreeNode","props","node","payload","ScopePayload","map","childNode","components","component","deprecation","isDeprecate","length","mutedItalic","ellipsis","styles","emptyScope","TreeToggleWidget","icon","collapseIcon","FilterWidget","filterWidgetIcon","open","DeprecateFilter","isActive","deprecateFilter","active","filterIcon","filterIconLabel"],"mappings":"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","sourcesContent":["import React, { useCallback, useState, useContext, createContext } from 'react';\nimport classNames from 'classnames';\nimport {\n ComponentTree,\n ComponentView,\n NamespaceTreeNode,\n PayloadType,\n ScopePayload,\n} from '@teambit/ui-foundation.ui.side-bar';\nimport { TreeNodeProps } from '@teambit/base-ui.graph.tree.recursive-tree';\nimport { Icon } from '@teambit/evangelist.elements.icon';\nimport { FullLoader } from '@teambit/ui-foundation.ui.full-loader';\nimport { ComponentTreeSlot } from '@teambit/component-tree';\nimport type { DrawerType } from '@teambit/ui-foundation.ui.tree.drawer';\nimport { mutedItalic } from '@teambit/design.ui.styles.muted-italic';\nimport { ellipsis } from '@teambit/design.ui.styles.ellipsis';\nimport { Toggle } from '@teambit/design.ui.input.toggle';\nimport { useScopeQuery } from '@teambit/scope.ui.hooks.use-scope';\nimport styles from './components-drawer.module.scss';\n\ntype ScopeTreeContextType = {\n collapsed: boolean;\n setCollapsed: (x: boolean) => void;\n filterOpen: boolean;\n setFilterOpen: (open: boolean) => void;\n activeFilters: string[];\n setActiveFilter: (filterId: string) => void;\n};\n\nconst ScopeTreeContext = createContext<ScopeTreeContextType>({\n collapsed: true,\n setCollapsed: () => {},\n activeFilters: [],\n setActiveFilter: () => {},\n filterOpen: false,\n setFilterOpen: () => {},\n});\n\nexport class ComponentsDrawer implements DrawerType {\n constructor(private treeNodeSlot: ComponentTreeSlot) {}\n\n id = 'components-drawer';\n\n name = 'COMPONENTS';\n\n widgets = [<FilterWidget key={'filter-widget'} />, <TreeToggleWidget key={'tree-toggle-widget'} />];\n Filters = [<DeprecateFilter key={'deprecate-filter'} />];\n\n Context = ({ children }) => {\n const [collapsed, setCollapsed] = useState(true);\n const [activeFilters, setActiveFilters] = useState<string[]>([]);\n const [filterOpen, setFilterOpen] = useState<boolean>(false);\n\n const handleActiveFilterToggle = (filterId: string) => {\n const isFilterActive = activeFilters.includes(filterId);\n if (isFilterActive) {\n setActiveFilters((list) => list.filter((id) => id !== filterId));\n return;\n }\n setActiveFilters((list) => list.concat(filterId));\n };\n return (\n <ScopeTreeContext.Provider\n value={{\n collapsed,\n setCollapsed,\n activeFilters,\n setActiveFilter: handleActiveFilterToggle,\n filterOpen,\n setFilterOpen,\n }}\n >\n {children}\n </ScopeTreeContext.Provider>\n );\n };\n\n render = () => {\n const { scope } = useScopeQuery();\n const { collapsed, activeFilters } = useContext(ScopeTreeContext);\n const { treeNodeSlot } = this;\n const showDeprecatedComponents = activeFilters.find((activeFilter) => activeFilter === 'deprecate');\n\n const TreeNodeRenderer = useCallback(\n function TreeNode(props: TreeNodeProps<PayloadType>) {\n const children = props.node.children;\n\n if (!children) return <ComponentView {...props} treeNodeSlot={treeNodeSlot} />;\n\n // skip over scope node and render only children\n if (props.node.payload instanceof ScopePayload) {\n return (\n <>\n {children.map((childNode) => (\n <TreeNodeRenderer key={childNode.id} {...props} node={childNode}></TreeNodeRenderer>\n ))}\n </>\n );\n }\n\n return <NamespaceTreeNode {...props} />;\n },\n [treeNodeSlot]\n );\n\n if (!scope) return <FullLoader />;\n\n const components = showDeprecatedComponents\n ? scope.components\n : scope.components.filter((component) => !component.deprecation?.isDeprecate);\n\n if (components.length === 0)\n return <span className={classNames(mutedItalic, ellipsis, styles.emptyScope)}>Scope is empty</span>;\n\n return <ComponentTree components={components} isCollapsed={collapsed} TreeNode={TreeNodeRenderer} />;\n };\n}\n\nfunction TreeToggleWidget() {\n const { collapsed, setCollapsed } = useContext(ScopeTreeContext);\n const icon = collapsed\n ? 'https://static.bit.dev/bit-icons/expand.svg'\n : 'https://static.bit.dev/bit-icons/collapse.svg';\n return <img src={icon} className={styles.collapseIcon} onClick={() => setCollapsed(!collapsed)} />;\n}\n\nfunction FilterWidget() {\n const { filterOpen, setFilterOpen } = useContext(ScopeTreeContext);\n return (\n <Icon\n className={classNames(styles.filterWidgetIcon, filterOpen && styles.open)}\n of=\"Ripple_filters\"\n onClick={() => setFilterOpen(!filterOpen)}\n />\n );\n}\n\nfunction DeprecateFilter() {\n const { activeFilters, setActiveFilter, filterOpen } = useContext(ScopeTreeContext);\n const isActive = activeFilters.includes('deprecate');\n\n if (!filterOpen) return null;\n\n return (\n <div className={classNames(styles.deprecateFilter, isActive && styles.active)}>\n <div className={styles.filterIcon}>\n <Icon of=\"note-deprecated\" />\n <span className={styles.filterIconLabel}>Deprecated</span>\n </div>\n <div>\n <Toggle checked={isActive} onInputChanged={() => setActiveFilter('deprecate')} />\n </div>\n </div>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/scope",
3
- "version": "0.0.670",
3
+ "version": "0.0.673",
4
4
  "homepage": "https://bit.dev/teambit/scope/scope",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.scope",
8
8
  "name": "scope",
9
- "version": "0.0.670"
9
+ "version": "0.0.673"
10
10
  },
11
11
  "dependencies": {
12
12
  "semver": "7.3.4",
@@ -25,32 +25,34 @@
25
25
  "@teambit/base-ui.surfaces.split-pane.split-pane": "1.0.0",
26
26
  "@teambit/base-ui.utils.composer": "1.0.0",
27
27
  "@teambit/base-ui.graph.tree.recursive-tree": "1.0.0",
28
+ "@teambit/design.ui.input.toggle": "1.0.12",
29
+ "@teambit/evangelist.elements.icon": "1.0.2",
28
30
  "@teambit/scope.models.scope-model": "0.0.104",
29
31
  "@teambit/scope.ui.hooks.scope-context": "0.0.104",
30
- "@teambit/component": "0.0.670",
32
+ "@teambit/component": "0.0.673",
31
33
  "@teambit/logger": "0.0.542",
32
- "@teambit/aspect-loader": "0.0.670",
33
- "@teambit/builder": "0.0.670",
34
+ "@teambit/aspect-loader": "0.0.673",
35
+ "@teambit/builder": "0.0.673",
34
36
  "@teambit/cli": "0.0.452",
35
- "@teambit/compiler": "0.0.670",
37
+ "@teambit/compiler": "0.0.673",
36
38
  "@teambit/config": "0.0.465",
37
- "@teambit/envs": "0.0.670",
39
+ "@teambit/envs": "0.0.673",
38
40
  "@teambit/express": "0.0.546",
39
- "@teambit/graphql": "0.0.670",
41
+ "@teambit/graphql": "0.0.673",
40
42
  "@teambit/harmony.modules.requireable-component": "0.0.484",
41
- "@teambit/isolator": "0.0.670",
43
+ "@teambit/isolator": "0.0.673",
42
44
  "@teambit/legacy-bit-id": "0.0.398",
43
- "@teambit/ui": "0.0.670",
45
+ "@teambit/ui": "0.0.673",
44
46
  "@teambit/workspace.modules.match-pattern": "0.0.489",
45
- "@teambit/command-bar": "0.0.670",
46
- "@teambit/component-tree": "0.0.458",
47
+ "@teambit/command-bar": "0.0.673",
48
+ "@teambit/component-tree": "0.0.461",
47
49
  "@teambit/design.ui.surfaces.menu.link-item": "0.0.379",
48
- "@teambit/react-router": "0.0.670",
49
- "@teambit/sidebar": "0.0.670",
50
+ "@teambit/react-router": "0.0.673",
51
+ "@teambit/sidebar": "0.0.673",
50
52
  "@teambit/ui-foundation.ui.main-dropdown": "0.0.486",
51
53
  "@teambit/ui-foundation.ui.menu": "0.0.486",
52
54
  "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.488",
53
- "@teambit/ui-foundation.ui.tree.drawer": "0.0.494",
55
+ "@teambit/ui-foundation.ui.tree.drawer": "0.0.495",
54
56
  "@teambit/bit-error": "0.0.394",
55
57
  "@teambit/ui-foundation.ui.constants.z-indexes": "0.0.487",
56
58
  "@teambit/scope.ui.hooks.use-scope": "0.0.107",
@@ -61,14 +63,14 @@
61
63
  "@teambit/ui-foundation.ui.top-bar": "0.0.489",
62
64
  "@teambit/design.ui.styles.ellipsis": "0.0.347",
63
65
  "@teambit/design.ui.styles.muted-italic": "0.0.35",
64
- "@teambit/ui-foundation.ui.side-bar": "0.0.509",
65
- "@teambit/ui-foundation.ui.use-box.dropdown": "0.0.111",
66
- "@teambit/ui-foundation.ui.use-box.scope-menu": "0.0.111",
66
+ "@teambit/ui-foundation.ui.side-bar": "0.0.510",
67
67
  "@teambit/explorer.ui.gallery.component-card": "0.0.494",
68
68
  "@teambit/explorer.ui.gallery.component-grid": "0.0.486",
69
69
  "@teambit/preview.ui.preview-placeholder": "0.0.487",
70
70
  "@teambit/scope.ui.empty-scope": "0.0.490",
71
- "@teambit/scope.ui.scope-details": "0.0.496"
71
+ "@teambit/scope.ui.scope-details": "0.0.496",
72
+ "@teambit/ui-foundation.ui.use-box.dropdown": "0.0.111",
73
+ "@teambit/ui-foundation.ui.use-box.scope-menu": "0.0.111"
72
74
  },
73
75
  "devDependencies": {
74
76
  "@types/semver": "7.3.4",
@@ -6,3 +6,36 @@
6
6
  .collapseIcon {
7
7
  width: 16px;
8
8
  }
9
+
10
+ .deprecateFilter {
11
+ display: flex;
12
+ flex-direction: row;
13
+ font-size: 14px;
14
+ justify-content: space-between;
15
+ padding: 8px;
16
+ margin: 4px 8px;
17
+
18
+ .filterIcon {
19
+ line-height: 16px;
20
+ display: flex;
21
+
22
+ .filterIconLabel {
23
+ margin: 0px 8px;
24
+ font-size: 12px;
25
+ }
26
+ }
27
+ }
28
+
29
+ .filterWidgetIcon {
30
+ margin-right: 12px;
31
+ padding: 4px;
32
+
33
+ &:hover {
34
+ background: white;
35
+ }
36
+
37
+ &.open {
38
+ color: var(--bit-accent-color, #6c5ce7);
39
+ background-color: var(--bit-bg-heavy, #f6f6f6);
40
+ }
41
+ }
@@ -8,18 +8,32 @@ import {
8
8
  ScopePayload,
9
9
  } from '@teambit/ui-foundation.ui.side-bar';
10
10
  import { TreeNodeProps } from '@teambit/base-ui.graph.tree.recursive-tree';
11
-
11
+ import { Icon } from '@teambit/evangelist.elements.icon';
12
12
  import { FullLoader } from '@teambit/ui-foundation.ui.full-loader';
13
13
  import { ComponentTreeSlot } from '@teambit/component-tree';
14
14
  import type { DrawerType } from '@teambit/ui-foundation.ui.tree.drawer';
15
15
  import { mutedItalic } from '@teambit/design.ui.styles.muted-italic';
16
16
  import { ellipsis } from '@teambit/design.ui.styles.ellipsis';
17
+ import { Toggle } from '@teambit/design.ui.input.toggle';
17
18
  import { useScopeQuery } from '@teambit/scope.ui.hooks.use-scope';
18
19
  import styles from './components-drawer.module.scss';
19
20
 
20
- const ScopeTreeContext = createContext<{ collapsed: boolean; setCollapsed: (x: boolean) => void }>({
21
+ type ScopeTreeContextType = {
22
+ collapsed: boolean;
23
+ setCollapsed: (x: boolean) => void;
24
+ filterOpen: boolean;
25
+ setFilterOpen: (open: boolean) => void;
26
+ activeFilters: string[];
27
+ setActiveFilter: (filterId: string) => void;
28
+ };
29
+
30
+ const ScopeTreeContext = createContext<ScopeTreeContextType>({
21
31
  collapsed: true,
22
32
  setCollapsed: () => {},
33
+ activeFilters: [],
34
+ setActiveFilter: () => {},
35
+ filterOpen: false,
36
+ setFilterOpen: () => {},
23
37
  });
24
38
 
25
39
  export class ComponentsDrawer implements DrawerType {
@@ -29,17 +43,43 @@ export class ComponentsDrawer implements DrawerType {
29
43
 
30
44
  name = 'COMPONENTS';
31
45
 
32
- widget = (<Widget />);
46
+ widgets = [<FilterWidget key={'filter-widget'} />, <TreeToggleWidget key={'tree-toggle-widget'} />];
47
+ Filters = [<DeprecateFilter key={'deprecate-filter'} />];
33
48
 
34
49
  Context = ({ children }) => {
35
50
  const [collapsed, setCollapsed] = useState(true);
36
- return <ScopeTreeContext.Provider value={{ collapsed, setCollapsed }}>{children}</ScopeTreeContext.Provider>;
51
+ const [activeFilters, setActiveFilters] = useState<string[]>([]);
52
+ const [filterOpen, setFilterOpen] = useState<boolean>(false);
53
+
54
+ const handleActiveFilterToggle = (filterId: string) => {
55
+ const isFilterActive = activeFilters.includes(filterId);
56
+ if (isFilterActive) {
57
+ setActiveFilters((list) => list.filter((id) => id !== filterId));
58
+ return;
59
+ }
60
+ setActiveFilters((list) => list.concat(filterId));
61
+ };
62
+ return (
63
+ <ScopeTreeContext.Provider
64
+ value={{
65
+ collapsed,
66
+ setCollapsed,
67
+ activeFilters,
68
+ setActiveFilter: handleActiveFilterToggle,
69
+ filterOpen,
70
+ setFilterOpen,
71
+ }}
72
+ >
73
+ {children}
74
+ </ScopeTreeContext.Provider>
75
+ );
37
76
  };
38
77
 
39
78
  render = () => {
40
79
  const { scope } = useScopeQuery();
41
- const { collapsed } = useContext(ScopeTreeContext);
80
+ const { collapsed, activeFilters } = useContext(ScopeTreeContext);
42
81
  const { treeNodeSlot } = this;
82
+ const showDeprecatedComponents = activeFilters.find((activeFilter) => activeFilter === 'deprecate');
43
83
 
44
84
  const TreeNodeRenderer = useCallback(
45
85
  function TreeNode(props: TreeNodeProps<PayloadType>) {
@@ -64,16 +104,52 @@ export class ComponentsDrawer implements DrawerType {
64
104
  );
65
105
 
66
106
  if (!scope) return <FullLoader />;
67
- if (scope.components.length === 0)
107
+
108
+ const components = showDeprecatedComponents
109
+ ? scope.components
110
+ : scope.components.filter((component) => !component.deprecation?.isDeprecate);
111
+
112
+ if (components.length === 0)
68
113
  return <span className={classNames(mutedItalic, ellipsis, styles.emptyScope)}>Scope is empty</span>;
69
- return <ComponentTree components={scope.components} isCollapsed={collapsed} TreeNode={TreeNodeRenderer} />;
114
+
115
+ return <ComponentTree components={components} isCollapsed={collapsed} TreeNode={TreeNodeRenderer} />;
70
116
  };
71
117
  }
72
118
 
73
- function Widget() {
119
+ function TreeToggleWidget() {
74
120
  const { collapsed, setCollapsed } = useContext(ScopeTreeContext);
75
121
  const icon = collapsed
76
122
  ? 'https://static.bit.dev/bit-icons/expand.svg'
77
123
  : 'https://static.bit.dev/bit-icons/collapse.svg';
78
124
  return <img src={icon} className={styles.collapseIcon} onClick={() => setCollapsed(!collapsed)} />;
79
125
  }
126
+
127
+ function FilterWidget() {
128
+ const { filterOpen, setFilterOpen } = useContext(ScopeTreeContext);
129
+ return (
130
+ <Icon
131
+ className={classNames(styles.filterWidgetIcon, filterOpen && styles.open)}
132
+ of="Ripple_filters"
133
+ onClick={() => setFilterOpen(!filterOpen)}
134
+ />
135
+ );
136
+ }
137
+
138
+ function DeprecateFilter() {
139
+ const { activeFilters, setActiveFilter, filterOpen } = useContext(ScopeTreeContext);
140
+ const isActive = activeFilters.includes('deprecate');
141
+
142
+ if (!filterOpen) return null;
143
+
144
+ return (
145
+ <div className={classNames(styles.deprecateFilter, isActive && styles.active)}>
146
+ <div className={styles.filterIcon}>
147
+ <Icon of="note-deprecated" />
148
+ <span className={styles.filterIconLabel}>Deprecated</span>
149
+ </div>
150
+ <div>
151
+ <Toggle checked={isActive} onInputChanged={() => setActiveFilter('deprecate')} />
152
+ </div>
153
+ </div>
154
+ );
155
+ }