@teambit/workspace 0.0.669 → 0.0.672

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,9 +6,10 @@ export declare class WorkspaceComponentsDrawer implements DrawerType {
6
6
  constructor(treeNodeSlot: ComponentTreeSlot);
7
7
  id: string;
8
8
  name: string;
9
- widget: JSX.Element;
9
+ widgets: JSX.Element[];
10
10
  Context: ({ children }: {
11
11
  children: any;
12
12
  }) => JSX.Element;
13
+ Filters: JSX.Element[];
13
14
  render: () => JSX.Element;
14
15
  }
@@ -49,6 +49,16 @@ function _uiFoundationUi2() {
49
49
  return data;
50
50
  }
51
51
 
52
+ function _evangelistElements() {
53
+ const data = require("@teambit/evangelist.elements.icon");
54
+
55
+ _evangelistElements = function () {
56
+ return data;
57
+ };
58
+
59
+ return data;
60
+ }
61
+
52
62
  function _react() {
53
63
  const data = _interopRequireWildcard(require("react"));
54
64
 
@@ -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 _workspaceContext() {
93
113
  const data = require("../workspace/workspace-context");
94
114
 
@@ -115,7 +135,11 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
115
135
 
116
136
  const WorkspaceTreeContext = /*#__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 WorkspaceComponentsDrawer {
@@ -123,26 +147,53 @@ class WorkspaceComponentsDrawer {
123
147
  this.treeNodeSlot = treeNodeSlot;
124
148
  (0, _defineProperty2().default)(this, "id", 'workspace-components');
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
+ })]);
127
155
  (0, _defineProperty2().default)(this, "Context", ({
128
156
  children
129
157
  }) => {
130
158
  const [collapsed, setCollapsed] = (0, _react().useState)(true);
159
+ const [activeFilters, setActiveFilters] = (0, _react().useState)([]);
160
+ const [filterOpen, setFilterOpen] = (0, _react().useState)(false);
161
+
162
+ const handleActiveFilterToggle = filterId => {
163
+ const isFilterActive = activeFilters.includes(filterId);
164
+
165
+ if (isFilterActive) {
166
+ setActiveFilters(list => list.filter(id => id !== filterId));
167
+ return;
168
+ }
169
+
170
+ setActiveFilters(list => list.concat(filterId));
171
+ };
172
+
131
173
  return /*#__PURE__*/_react().default.createElement(WorkspaceTreeContext.Provider, {
132
174
  value: {
133
175
  collapsed,
134
- setCollapsed
176
+ setCollapsed,
177
+ activeFilters,
178
+ setActiveFilter: handleActiveFilterToggle,
179
+ filterOpen,
180
+ setFilterOpen
135
181
  }
136
182
  }, children);
137
183
  });
184
+ (0, _defineProperty2().default)(this, "Filters", [/*#__PURE__*/_react().default.createElement(DeprecateFilter, {
185
+ key: 'deprecate-filter'
186
+ })]);
138
187
  (0, _defineProperty2().default)(this, "render", () => {
139
188
  const workspace = (0, _react().useContext)(_workspaceContext().WorkspaceContext);
140
189
  const {
141
- collapsed
190
+ collapsed,
191
+ activeFilters
142
192
  } = (0, _react().useContext)(WorkspaceTreeContext);
143
193
  const {
144
194
  treeNodeSlot
145
195
  } = this;
196
+ const showDeprecatedComponents = activeFilters.find(activeFilter => activeFilter === 'deprecate');
146
197
  const TreeNodeRenderer = (0, _react().useCallback)(function TreeNode(props) {
147
198
  const children = props.node.children;
148
199
  if (!children) return /*#__PURE__*/_react().default.createElement(_uiFoundationUi2().ComponentView, (0, _extends2().default)({}, props, {
@@ -153,15 +204,20 @@ class WorkspaceComponentsDrawer {
153
204
  return /*#__PURE__*/_react().default.createElement(_uiFoundationUi2().NamespaceTreeNode, props);
154
205
  }, [treeNodeSlot]);
155
206
  if (!workspace) return /*#__PURE__*/_react().default.createElement(_uiFoundationUi().FullLoader, null);
207
+ const components = showDeprecatedComponents ? workspace.components : workspace.components.filter(component => {
208
+ var _component$deprecatio;
156
209
 
157
- if (workspace.components.length === 0) {
210
+ return !((_component$deprecatio = component.deprecation) !== null && _component$deprecatio !== void 0 && _component$deprecatio.isDeprecate);
211
+ });
212
+
213
+ if (components.length === 0) {
158
214
  return /*#__PURE__*/_react().default.createElement("span", {
159
215
  className: (0, _classnames().default)(_designUiStyles().mutedItalic, _designUiStyles2().ellipsis, _workspaceComponentsDrawerModule().default.emptyWorkspace)
160
216
  }, "Workspace is empty");
161
217
  }
162
218
 
163
219
  return /*#__PURE__*/_react().default.createElement(_uiFoundationUi2().ComponentTree, {
164
- components: workspace.components,
220
+ components: components,
165
221
  isCollapsed: collapsed,
166
222
  TreeNode: TreeNodeRenderer
167
223
  });
@@ -172,7 +228,7 @@ class WorkspaceComponentsDrawer {
172
228
 
173
229
  exports.WorkspaceComponentsDrawer = WorkspaceComponentsDrawer;
174
230
 
175
- function Widget() {
231
+ function TreeToggleWidget() {
176
232
  const {
177
233
  collapsed,
178
234
  setCollapsed
@@ -185,4 +241,38 @@ function Widget() {
185
241
  });
186
242
  }
187
243
 
244
+ function FilterWidget() {
245
+ const {
246
+ filterOpen,
247
+ setFilterOpen
248
+ } = (0, _react().useContext)(WorkspaceTreeContext);
249
+ return /*#__PURE__*/_react().default.createElement(_evangelistElements().Icon, {
250
+ className: (0, _classnames().default)(_workspaceComponentsDrawerModule().default.filterWidgetIcon, filterOpen && _workspaceComponentsDrawerModule().default.open),
251
+ of: "Ripple_filters",
252
+ onClick: () => setFilterOpen(!filterOpen)
253
+ });
254
+ }
255
+
256
+ function DeprecateFilter() {
257
+ const {
258
+ activeFilters,
259
+ setActiveFilter,
260
+ filterOpen
261
+ } = (0, _react().useContext)(WorkspaceTreeContext);
262
+ const isActive = activeFilters.includes('deprecate');
263
+ if (!filterOpen) return null;
264
+ return /*#__PURE__*/_react().default.createElement("div", {
265
+ className: (0, _classnames().default)(_workspaceComponentsDrawerModule().default.deprecateFilter, isActive && _workspaceComponentsDrawerModule().default.active)
266
+ }, /*#__PURE__*/_react().default.createElement("div", {
267
+ className: _workspaceComponentsDrawerModule().default.filterIcon
268
+ }, /*#__PURE__*/_react().default.createElement(_evangelistElements().Icon, {
269
+ of: "note-deprecated"
270
+ }), /*#__PURE__*/_react().default.createElement("span", {
271
+ className: _workspaceComponentsDrawerModule().default.filterIconLabel
272
+ }, "Deprecated")), /*#__PURE__*/_react().default.createElement("div", null, /*#__PURE__*/_react().default.createElement(_designUiInput().Toggle, {
273
+ checked: isActive,
274
+ onInputChanged: () => setActiveFilter('deprecate')
275
+ })));
276
+ }
277
+
188
278
  //# sourceMappingURL=workspace-components.drawer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["workspace-components.drawer.tsx"],"names":["WorkspaceTreeContext","collapsed","setCollapsed","WorkspaceComponentsDrawer","constructor","treeNodeSlot","children","workspace","WorkspaceContext","TreeNodeRenderer","TreeNode","props","node","payload","ScopePayload","components","length","mutedItalic","ellipsis","styles","emptyWorkspace","Widget","icon","collapseIcon"],"mappings":"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","sourcesContent":["import type { DrawerType } from '@teambit/ui-foundation.ui.tree.drawer';\nimport { FullLoader } from '@teambit/ui-foundation.ui.full-loader';\nimport {\n ComponentTree,\n PayloadType,\n ComponentView,\n ScopeTreeNode,\n NamespaceTreeNode,\n ScopePayload,\n} from '@teambit/ui-foundation.ui.side-bar';\nimport { TreeNodeProps } from '@teambit/design.ui.tree';\nimport React, { useCallback, useContext, useState, createContext } from 'react';\nimport classNames from 'classnames';\nimport { ComponentTreeSlot } from '@teambit/component-tree';\nimport { mutedItalic } from '@teambit/design.ui.styles.muted-italic';\nimport { ellipsis } from '@teambit/design.ui.styles.ellipsis';\nimport { WorkspaceContext } from '../workspace/workspace-context';\nimport styles from './workspace-components-drawer.module.scss';\n\nconst WorkspaceTreeContext = createContext<{ collapsed: boolean; setCollapsed: (x: boolean) => void }>({\n collapsed: true,\n setCollapsed: () => {},\n});\n\nexport class WorkspaceComponentsDrawer implements DrawerType {\n constructor(private treeNodeSlot: ComponentTreeSlot) {}\n\n id = 'workspace-components';\n name = 'COMPONENTS';\n\n widget = (<Widget />);\n\n Context = ({ children }) => {\n const [collapsed, setCollapsed] = useState(true);\n return (\n <WorkspaceTreeContext.Provider value={{ collapsed, setCollapsed }}>{children}</WorkspaceTreeContext.Provider>\n );\n };\n\n render = () => {\n const workspace = useContext(WorkspaceContext);\n const { collapsed } = useContext(WorkspaceTreeContext);\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} />; // non collapse\n\n if (props.node.payload instanceof ScopePayload) return <ScopeTreeNode {...props} />;\n\n return <NamespaceTreeNode {...props} />;\n },\n [treeNodeSlot]\n );\n\n if (!workspace) return <FullLoader />;\n if (workspace.components.length === 0) {\n return <span className={classNames(mutedItalic, ellipsis, styles.emptyWorkspace)}>Workspace is empty</span>;\n }\n\n return <ComponentTree components={workspace.components} isCollapsed={collapsed} TreeNode={TreeNodeRenderer} />;\n };\n}\n\nfunction Widget() {\n const { collapsed, setCollapsed } = useContext(WorkspaceTreeContext);\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":["workspace-components.drawer.tsx"],"names":["WorkspaceTreeContext","collapsed","setCollapsed","activeFilters","setActiveFilter","filterOpen","setFilterOpen","WorkspaceComponentsDrawer","constructor","treeNodeSlot","children","setActiveFilters","handleActiveFilterToggle","filterId","isFilterActive","includes","list","filter","id","concat","workspace","WorkspaceContext","showDeprecatedComponents","find","activeFilter","TreeNodeRenderer","TreeNode","props","node","payload","ScopePayload","components","component","deprecation","isDeprecate","length","mutedItalic","ellipsis","styles","emptyWorkspace","TreeToggleWidget","icon","collapseIcon","FilterWidget","filterWidgetIcon","open","DeprecateFilter","isActive","deprecateFilter","active","filterIcon","filterIconLabel"],"mappings":"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","sourcesContent":["import type { DrawerType } from '@teambit/ui-foundation.ui.tree.drawer';\nimport { FullLoader } from '@teambit/ui-foundation.ui.full-loader';\nimport {\n ComponentTree,\n PayloadType,\n ComponentView,\n ScopeTreeNode,\n NamespaceTreeNode,\n ScopePayload,\n} from '@teambit/ui-foundation.ui.side-bar';\nimport { Icon } from '@teambit/evangelist.elements.icon';\nimport { TreeNodeProps } from '@teambit/design.ui.tree';\nimport React, { useCallback, useContext, useState, createContext } from 'react';\nimport classNames from 'classnames';\nimport { ComponentTreeSlot } from '@teambit/component-tree';\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 { WorkspaceContext } from '../workspace/workspace-context';\nimport styles from './workspace-components-drawer.module.scss';\n\ntype WorkspaceTreeContextType = {\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};\nconst WorkspaceTreeContext = createContext<WorkspaceTreeContextType>({\n collapsed: true,\n setCollapsed: () => {},\n activeFilters: [],\n setActiveFilter: () => {},\n filterOpen: false,\n setFilterOpen: () => {},\n});\n\nexport class WorkspaceComponentsDrawer implements DrawerType {\n constructor(private treeNodeSlot: ComponentTreeSlot) {}\n\n id = 'workspace-components';\n name = 'COMPONENTS';\n\n widgets = [<FilterWidget key={'filter-widget'} />, <TreeToggleWidget key={'tree-toggle-widget'} />];\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\n return (\n <WorkspaceTreeContext.Provider\n value={{\n collapsed,\n setCollapsed,\n activeFilters,\n setActiveFilter: handleActiveFilterToggle,\n filterOpen,\n setFilterOpen,\n }}\n >\n {children}\n </WorkspaceTreeContext.Provider>\n );\n };\n\n Filters = [<DeprecateFilter key={'deprecate-filter'} />];\n\n render = () => {\n const workspace = useContext(WorkspaceContext);\n const { collapsed, activeFilters } = useContext(WorkspaceTreeContext);\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} />; // non collapse\n\n if (props.node.payload instanceof ScopePayload) return <ScopeTreeNode {...props} />;\n\n return <NamespaceTreeNode {...props} />;\n },\n [treeNodeSlot]\n );\n\n if (!workspace) return <FullLoader />;\n\n const components = showDeprecatedComponents\n ? workspace.components\n : workspace.components.filter((component) => !component.deprecation?.isDeprecate);\n\n if (components.length === 0) {\n return <span className={classNames(mutedItalic, ellipsis, styles.emptyWorkspace)}>Workspace is empty</span>;\n }\n\n return <ComponentTree components={components} isCollapsed={collapsed} TreeNode={TreeNodeRenderer} />;\n };\n}\n\nfunction TreeToggleWidget() {\n const { collapsed, setCollapsed } = useContext(WorkspaceTreeContext);\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(WorkspaceTreeContext);\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(WorkspaceTreeContext);\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/workspace",
3
- "version": "0.0.669",
3
+ "version": "0.0.672",
4
4
  "homepage": "https://bit.dev/teambit/workspace/workspace",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.workspace",
8
8
  "name": "workspace",
9
- "version": "0.0.669"
9
+ "version": "0.0.672"
10
10
  },
11
11
  "dependencies": {
12
12
  "lodash": "4.17.21",
@@ -38,45 +38,47 @@
38
38
  "core-js": "^3.0.0",
39
39
  "@teambit/base-ui.surfaces.split-pane.hover-splitter": "1.0.0",
40
40
  "@teambit/base-ui.surfaces.split-pane.split-pane": "1.0.0",
41
+ "@teambit/design.ui.input.toggle": "1.0.12",
42
+ "@teambit/evangelist.elements.icon": "1.0.2",
41
43
  "@teambit/component-id": "0.0.401",
42
44
  "@teambit/bit-error": "0.0.394",
43
45
  "@teambit/legacy-bit-id": "0.0.398",
44
- "@teambit/logger": "0.0.541",
45
- "@teambit/scope": "0.0.669",
46
- "@teambit/cli": "0.0.451",
47
- "@teambit/isolator": "0.0.669",
48
- "@teambit/component-tree": "0.0.457",
46
+ "@teambit/logger": "0.0.542",
47
+ "@teambit/scope": "0.0.672",
48
+ "@teambit/cli": "0.0.452",
49
+ "@teambit/isolator": "0.0.672",
50
+ "@teambit/component-tree": "0.0.460",
49
51
  "@teambit/component.ui.component-status-resolver": "0.0.492",
50
- "@teambit/lanes.ui.lanes": "0.0.11",
52
+ "@teambit/lanes.ui.lanes": "0.0.13",
51
53
  "@teambit/harmony.modules.resolved-component": "0.0.484",
52
- "@teambit/dependency-resolver": "0.0.669",
53
- "@teambit/compiler": "0.0.669",
54
- "@teambit/component": "0.0.669",
55
- "@teambit/graphql": "0.0.669",
56
- "@teambit/aspect-loader": "0.0.669",
57
- "@teambit/bundler": "0.0.669",
58
- "@teambit/envs": "0.0.669",
59
- "@teambit/pubsub": "0.0.669",
60
- "@teambit/ui": "0.0.669",
61
- "@teambit/variants": "0.0.544",
54
+ "@teambit/dependency-resolver": "0.0.672",
55
+ "@teambit/compiler": "0.0.672",
56
+ "@teambit/component": "0.0.672",
57
+ "@teambit/graphql": "0.0.672",
58
+ "@teambit/aspect-loader": "0.0.672",
59
+ "@teambit/bundler": "0.0.672",
60
+ "@teambit/envs": "0.0.672",
61
+ "@teambit/pubsub": "0.0.672",
62
+ "@teambit/ui": "0.0.672",
63
+ "@teambit/variants": "0.0.545",
62
64
  "@teambit/component-issues": "0.0.46",
63
- "@teambit/config": "0.0.464",
65
+ "@teambit/config": "0.0.465",
64
66
  "@teambit/harmony.modules.requireable-component": "0.0.484",
65
- "@teambit/importer": "0.0.98",
67
+ "@teambit/importer": "0.0.101",
66
68
  "@teambit/workspace.modules.match-pattern": "0.0.489",
67
- "@teambit/command-bar": "0.0.669",
69
+ "@teambit/command-bar": "0.0.672",
68
70
  "@teambit/design.ui.surfaces.menu.link-item": "0.0.379",
69
- "@teambit/graph": "0.0.669",
70
- "@teambit/react-router": "0.0.669",
71
- "@teambit/sidebar": "0.0.669",
71
+ "@teambit/graph": "0.0.672",
72
+ "@teambit/react-router": "0.0.672",
73
+ "@teambit/sidebar": "0.0.672",
72
74
  "@teambit/ui-foundation.ui.main-dropdown": "0.0.486",
73
75
  "@teambit/ui-foundation.ui.menu": "0.0.486",
74
76
  "@teambit/ui-foundation.ui.react-router.slot-router": "0.0.488",
75
- "@teambit/ui-foundation.ui.tree.drawer": "0.0.493",
77
+ "@teambit/ui-foundation.ui.tree.drawer": "0.0.495",
76
78
  "@teambit/toolbox.time.time-format": "0.0.483",
77
79
  "@teambit/ui-foundation.ui.hooks.use-data-query": "0.0.487",
78
- "@teambit/component-descriptor": "0.0.12",
79
- "@teambit/deprecation": "0.0.669",
80
+ "@teambit/component-descriptor": "0.0.13",
81
+ "@teambit/deprecation": "0.0.672",
80
82
  "@teambit/ui-foundation.ui.constants.z-indexes": "0.0.487",
81
83
  "@teambit/ui-foundation.ui.buttons.collapser": "0.0.193",
82
84
  "@teambit/ui-foundation.ui.corner": "0.0.494",
@@ -86,7 +88,7 @@
86
88
  "@teambit/design.ui.styles.muted-italic": "0.0.35",
87
89
  "@teambit/design.ui.tree": "0.0.5",
88
90
  "@teambit/ui-foundation.ui.full-loader": "0.0.486",
89
- "@teambit/ui-foundation.ui.side-bar": "0.0.508",
91
+ "@teambit/ui-foundation.ui.side-bar": "0.0.510",
90
92
  "@teambit/explorer.ui.gallery.component-grid": "0.0.486",
91
93
  "@teambit/workspace.ui.empty-workspace": "0.0.489",
92
94
  "@teambit/workspace.ui.workspace-component-card": "0.0.495"
@@ -109,7 +111,7 @@
109
111
  },
110
112
  "peerDependencies": {
111
113
  "@apollo/client": "^3.0.0",
112
- "@teambit/legacy": "1.0.230",
114
+ "@teambit/legacy": "1.0.231",
113
115
  "react-dom": "^16.8.0 || ^17.0.0",
114
116
  "react": "^16.8.0 || ^17.0.0"
115
117
  },
@@ -137,7 +139,7 @@
137
139
  "react": "-"
138
140
  },
139
141
  "peerDependencies": {
140
- "@teambit/legacy": "1.0.230",
142
+ "@teambit/legacy": "1.0.231",
141
143
  "react-dom": "^16.8.0 || ^17.0.0",
142
144
  "react": "^16.8.0 || ^17.0.0"
143
145
  }
@@ -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
  NamespaceTreeNode,
9
9
  ScopePayload,
10
10
  } from '@teambit/ui-foundation.ui.side-bar';
11
+ import { Icon } from '@teambit/evangelist.elements.icon';
11
12
  import { TreeNodeProps } from '@teambit/design.ui.tree';
12
13
  import React, { useCallback, useContext, useState, createContext } from 'react';
13
14
  import classNames from 'classnames';
14
15
  import { ComponentTreeSlot } from '@teambit/component-tree';
15
16
  import { mutedItalic } from '@teambit/design.ui.styles.muted-italic';
16
17
  import { ellipsis } from '@teambit/design.ui.styles.ellipsis';
18
+ import { Toggle } from '@teambit/design.ui.input.toggle';
17
19
  import { WorkspaceContext } from '../workspace/workspace-context';
18
20
  import styles from './workspace-components-drawer.module.scss';
19
21
 
20
- const WorkspaceTreeContext = createContext<{ collapsed: boolean; setCollapsed: (x: boolean) => void }>({
22
+ type WorkspaceTreeContextType = {
23
+ collapsed: boolean;
24
+ setCollapsed: (x: boolean) => void;
25
+ filterOpen: boolean;
26
+ setFilterOpen: (open: boolean) => void;
27
+ activeFilters: string[];
28
+ setActiveFilter: (filterId: string) => void;
29
+ };
30
+ const WorkspaceTreeContext = createContext<WorkspaceTreeContextType>({
21
31
  collapsed: true,
22
32
  setCollapsed: () => {},
33
+ activeFilters: [],
34
+ setActiveFilter: () => {},
35
+ filterOpen: false,
36
+ setFilterOpen: () => {},
23
37
  });
24
38
 
25
39
  export class WorkspaceComponentsDrawer implements DrawerType {
@@ -28,19 +42,45 @@ export class WorkspaceComponentsDrawer implements DrawerType {
28
42
  id = 'workspace-components';
29
43
  name = 'COMPONENTS';
30
44
 
31
- widget = (<Widget />);
45
+ widgets = [<FilterWidget key={'filter-widget'} />, <TreeToggleWidget key={'tree-toggle-widget'} />];
32
46
 
33
47
  Context = ({ children }) => {
34
48
  const [collapsed, setCollapsed] = useState(true);
49
+ const [activeFilters, setActiveFilters] = useState<string[]>([]);
50
+ const [filterOpen, setFilterOpen] = useState<boolean>(false);
51
+
52
+ const handleActiveFilterToggle = (filterId: string) => {
53
+ const isFilterActive = activeFilters.includes(filterId);
54
+ if (isFilterActive) {
55
+ setActiveFilters((list) => list.filter((id) => id !== filterId));
56
+ return;
57
+ }
58
+ setActiveFilters((list) => list.concat(filterId));
59
+ };
60
+
35
61
  return (
36
- <WorkspaceTreeContext.Provider value={{ collapsed, setCollapsed }}>{children}</WorkspaceTreeContext.Provider>
62
+ <WorkspaceTreeContext.Provider
63
+ value={{
64
+ collapsed,
65
+ setCollapsed,
66
+ activeFilters,
67
+ setActiveFilter: handleActiveFilterToggle,
68
+ filterOpen,
69
+ setFilterOpen,
70
+ }}
71
+ >
72
+ {children}
73
+ </WorkspaceTreeContext.Provider>
37
74
  );
38
75
  };
39
76
 
77
+ Filters = [<DeprecateFilter key={'deprecate-filter'} />];
78
+
40
79
  render = () => {
41
80
  const workspace = useContext(WorkspaceContext);
42
- const { collapsed } = useContext(WorkspaceTreeContext);
81
+ const { collapsed, activeFilters } = useContext(WorkspaceTreeContext);
43
82
  const { treeNodeSlot } = this;
83
+ const showDeprecatedComponents = activeFilters.find((activeFilter) => activeFilter === 'deprecate');
44
84
 
45
85
  const TreeNodeRenderer = useCallback(
46
86
  function TreeNode(props: TreeNodeProps<PayloadType>) {
@@ -56,18 +96,53 @@ export class WorkspaceComponentsDrawer implements DrawerType {
56
96
  );
57
97
 
58
98
  if (!workspace) return <FullLoader />;
59
- if (workspace.components.length === 0) {
99
+
100
+ const components = showDeprecatedComponents
101
+ ? workspace.components
102
+ : workspace.components.filter((component) => !component.deprecation?.isDeprecate);
103
+
104
+ if (components.length === 0) {
60
105
  return <span className={classNames(mutedItalic, ellipsis, styles.emptyWorkspace)}>Workspace is empty</span>;
61
106
  }
62
107
 
63
- return <ComponentTree components={workspace.components} isCollapsed={collapsed} TreeNode={TreeNodeRenderer} />;
108
+ return <ComponentTree components={components} isCollapsed={collapsed} TreeNode={TreeNodeRenderer} />;
64
109
  };
65
110
  }
66
111
 
67
- function Widget() {
112
+ function TreeToggleWidget() {
68
113
  const { collapsed, setCollapsed } = useContext(WorkspaceTreeContext);
69
114
  const icon = collapsed
70
115
  ? 'https://static.bit.dev/bit-icons/expand.svg'
71
116
  : 'https://static.bit.dev/bit-icons/collapse.svg';
72
117
  return <img src={icon} className={styles.collapseIcon} onClick={() => setCollapsed(!collapsed)} />;
73
118
  }
119
+
120
+ function FilterWidget() {
121
+ const { filterOpen, setFilterOpen } = useContext(WorkspaceTreeContext);
122
+ return (
123
+ <Icon
124
+ className={classNames(styles.filterWidgetIcon, filterOpen && styles.open)}
125
+ of="Ripple_filters"
126
+ onClick={() => setFilterOpen(!filterOpen)}
127
+ />
128
+ );
129
+ }
130
+
131
+ function DeprecateFilter() {
132
+ const { activeFilters, setActiveFilter, filterOpen } = useContext(WorkspaceTreeContext);
133
+ const isActive = activeFilters.includes('deprecate');
134
+
135
+ if (!filterOpen) return null;
136
+
137
+ return (
138
+ <div className={classNames(styles.deprecateFilter, isActive && styles.active)}>
139
+ <div className={styles.filterIcon}>
140
+ <Icon of="note-deprecated" />
141
+ <span className={styles.filterIconLabel}>Deprecated</span>
142
+ </div>
143
+ <div>
144
+ <Toggle checked={isActive} onInputChanged={() => setActiveFilter('deprecate')} />
145
+ </div>
146
+ </div>
147
+ );
148
+ }