@synerise/ds-sidebar-object 1.0.43 → 1.1.1

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,25 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [1.1.1](https://github.com/Synerise/synerise-design/compare/@synerise/ds-sidebar-object@1.1.0...@synerise/ds-sidebar-object@1.1.1) (2025-11-13)
7
+
8
+ **Note:** Version bump only for package @synerise/ds-sidebar-object
9
+
10
+
11
+
12
+
13
+
14
+ # [1.1.0](https://github.com/Synerise/synerise-design/compare/@synerise/ds-sidebar-object@1.0.43...@synerise/ds-sidebar-object@1.1.0) (2025-11-06)
15
+
16
+
17
+ ### Features
18
+
19
+ * **dropdown:** dropdownMenu component ([f0ec827](https://github.com/Synerise/synerise-design/commit/f0ec82792cdcb021fa9a454912f6e7a892e53895))
20
+
21
+
22
+
23
+
24
+
6
25
  ## [1.0.43](https://github.com/Synerise/synerise-design/compare/@synerise/ds-sidebar-object@1.0.42...@synerise/ds-sidebar-object@1.0.43) (2025-10-31)
7
26
 
8
27
  **Note:** Version bump only for package @synerise/ds-sidebar-object
@@ -1,12 +1,10 @@
1
1
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
- import React, { useMemo, useRef, useState } from 'react';
2
+ import React, { useMemo } from 'react';
3
3
  import Button from '@synerise/ds-button';
4
4
  import Drawer from '@synerise/ds-drawer';
5
- import Dropdown from '@synerise/ds-dropdown';
6
- import Icon, { AngleDownM, AngleUpM, CloseM, CopyClipboardM, DuplicateM, EditM, FolderM, OptionHorizontalM, TrashM } from '@synerise/ds-icon';
7
- import Menu from '@synerise/ds-menu';
5
+ import { DropdownMenu } from '@synerise/ds-dropdown';
6
+ import Icon, { AngleDownM, AngleUpM, CloseM, DuplicateM, EditM, FolderM, OptionHorizontalM, TrashM } from '@synerise/ds-icon';
8
7
  import Typography from '@synerise/ds-typography';
9
- import { useOnClickOutside } from '@synerise/ds-utils';
10
8
  import * as S from './Header.style';
11
9
  import { ButtonVariant, HeaderType } from './Header.types';
12
10
  var Header = function Header(_ref) {
@@ -36,13 +34,6 @@ var Header = function Header(_ref) {
36
34
  typeButtons = _ref.typeButtons,
37
35
  onCancelClick = _ref.onCancelClick,
38
36
  onApplyClick = _ref.onApplyClick;
39
- var _useState = useState(false),
40
- dropdownVisible = _useState[0],
41
- setDropdownVisible = _useState[1];
42
- var ref = useRef(null);
43
- useOnClickOutside(ref, function () {
44
- setDropdownVisible(false);
45
- });
46
37
  var renderBackTitle = function renderBackTitle(titleType) {
47
38
  if (titleType === HeaderType.EDITABLE) {
48
39
  return /*#__PURE__*/React.createElement(S.StyledInlineEdit, {
@@ -66,7 +57,6 @@ var Header = function Header(_ref) {
66
57
  var menuItems = [];
67
58
  onEdit && menuItems.push({
68
59
  onClick: function onClick() {
69
- setDropdownVisible(!dropdownVisible);
70
60
  onEdit(inputObject);
71
61
  },
72
62
  prefixel: /*#__PURE__*/React.createElement(Icon, {
@@ -76,7 +66,6 @@ var Header = function Header(_ref) {
76
66
  });
77
67
  onDuplicate && menuItems.push({
78
68
  onClick: function onClick() {
79
- setDropdownVisible(!dropdownVisible);
80
69
  onDuplicate(inputObject);
81
70
  },
82
71
  prefixel: /*#__PURE__*/React.createElement(Icon, {
@@ -86,7 +75,6 @@ var Header = function Header(_ref) {
86
75
  });
87
76
  onMove && menuItems.push({
88
77
  onClick: function onClick() {
89
- setDropdownVisible(!dropdownVisible);
90
78
  onMove(inputObject);
91
79
  },
92
80
  prefixel: /*#__PURE__*/React.createElement(Icon, {
@@ -96,7 +84,6 @@ var Header = function Header(_ref) {
96
84
  });
97
85
  onDelete && menuItems.push({
98
86
  onClick: function onClick() {
99
- setDropdownVisible(!dropdownVisible);
100
87
  onDelete(inputObject);
101
88
  },
102
89
  type: 'danger',
@@ -110,19 +97,16 @@ var Header = function Header(_ref) {
110
97
  });
111
98
  onId && menuItems.push({
112
99
  onClick: function onClick() {
113
- setDropdownVisible(!dropdownVisible);
114
100
  onId(inputObject);
115
101
  },
116
- style: {
117
- padding: '0 12px'
102
+ copyable: {
103
+ copiedLabel: 'Copied!',
104
+ copyValue: "" + inputObject[inputObjectIdKey]
118
105
  },
119
- prefixel: /*#__PURE__*/React.createElement(Icon, {
120
- component: /*#__PURE__*/React.createElement(CopyClipboardM, null)
121
- }),
122
- text: "ID: " + inputObject[inputObjectIdKey]
106
+ text: "Copy ID"
123
107
  });
124
108
  return menuItems;
125
- }, [dropdownVisible, inputObject, inputObjectIdKey, onDelete, onDuplicate, onEdit, onId, onMove, renderMenuDivider, texts.deleteIcon, texts.duplicateIcon, texts.editIcon, texts.moveIcon]);
109
+ }, [inputObject, inputObjectIdKey, onDelete, onDuplicate, onEdit, onId, onMove, renderMenuDivider, texts.deleteIcon, texts.duplicateIcon, texts.editIcon, texts.moveIcon]);
126
110
  var renderActionButtons = function renderActionButtons(typesOfButtons) {
127
111
  if (typesOfButtons === ButtonVariant.WITH_NAVIGATION) {
128
112
  return /*#__PURE__*/React.createElement(React.Fragment, null, onArrowUp && /*#__PURE__*/React.createElement(S.ButtonWrapper, null, /*#__PURE__*/React.createElement(Button, {
@@ -139,24 +123,16 @@ var Header = function Header(_ref) {
139
123
  }, /*#__PURE__*/React.createElement(Icon, {
140
124
  size: 20,
141
125
  component: /*#__PURE__*/React.createElement(AngleDownM, null)
142
- }))), renderMenu && /*#__PURE__*/React.createElement(Dropdown, {
143
- visible: dropdownVisible,
126
+ }))), renderMenu && /*#__PURE__*/React.createElement(DropdownMenu, {
127
+ dataSource: menuDataSource,
144
128
  placement: "bottomLeft",
145
- overlay: /*#__PURE__*/React.createElement(S.DropdownWrapper, {
146
- ref: ref
147
- }, /*#__PURE__*/React.createElement(Menu, {
148
- asDropdownMenu: true,
149
- style: {
150
- width: '100%'
151
- },
152
- dataSource: menuDataSource
153
- }))
129
+ popoverProps: {
130
+ testId: 'sidebar-object-menu'
131
+ },
132
+ asChild: true
154
133
  }, /*#__PURE__*/React.createElement(S.ButtonWrapper, {
155
134
  "data-testid": "sidebar-object-dropdown-menu-trigger"
156
135
  }, /*#__PURE__*/React.createElement(Button, {
157
- onClick: function onClick() {
158
- return setDropdownVisible(!dropdownVisible);
159
- },
160
136
  type: "ghost",
161
137
  mode: "single-icon"
162
138
  }, /*#__PURE__*/React.createElement(Icon, {
@@ -29,7 +29,7 @@ export var ButtonsWrapper = styled.div.withConfig({
29
29
  export var DropdownWrapper = styled.div.withConfig({
30
30
  displayName: "Headerstyle__DropdownWrapper",
31
31
  componentId: "sc-16ox3vk-5"
32
- })(["background:", ";width:216px;"], function (props) {
32
+ })(["background:", ";"], function (props) {
33
33
  return props.theme.palette.white;
34
34
  });
35
35
  export var OverviewWrapper = styled.div.withConfig({
@@ -1,9 +1,10 @@
1
- import React, { useState } from 'react';
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import React, { useMemo, useState } from 'react';
2
3
  import Button from '@synerise/ds-button';
3
- import Dropdown from '@synerise/ds-dropdown';
4
- import Icon, { AngleDownS } from '@synerise/ds-icon';
4
+ import { useTheme } from '@synerise/ds-core';
5
+ import { DropdownMenu } from '@synerise/ds-dropdown';
6
+ import Icon, { Add3M, AngleDownS, FolderM } from '@synerise/ds-icon';
5
7
  import Content from '../Content/Content';
6
- import DropdownOverlay from '../DropdownOverlay/DropdownOverlay';
7
8
  import * as S from '../Header/Header.style';
8
9
  import ObjectSummary from '../ObjectSummary/ObjectSummary';
9
10
  var Overview = function Overview(_ref) {
@@ -19,54 +20,70 @@ var Overview = function Overview(_ref) {
19
20
  parentFolder = _ref.parentFolder,
20
21
  texts = _ref.texts,
21
22
  textDescription = _ref.textDescription,
22
- _onFolderSelect = _ref.onFolderSelect,
23
+ onFolderSelect = _ref.onFolderSelect,
23
24
  onDescriptionChange = _ref.onDescriptionChange,
24
25
  _ref$descriptionProps = _ref.descriptionProps,
25
26
  descriptionProps = _ref$descriptionProps === void 0 ? {} : _ref$descriptionProps,
26
27
  onAddFolderClick = _ref.onAddFolderClick;
27
- var _useState = useState(false),
28
- dropdownVisible = _useState[0],
29
- setDropdownVisible = _useState[1];
30
- var _useState2 = useState(''),
31
- value = _useState2[0],
32
- setValue = _useState2[1];
33
- var onClearInput = function onClearInput() {
34
- setValue('');
35
- };
28
+ var theme = useTheme();
29
+ var _useState = useState(''),
30
+ searchQuery = _useState[0],
31
+ setSearchQuery = _useState[1];
32
+ var filteredData = useMemo(function () {
33
+ return folders.filter(function (item) {
34
+ return typeof item[foldersFilterKey] === 'string' && item[foldersFilterKey].toLowerCase().includes(searchQuery.toLowerCase());
35
+ });
36
+ }, [folders, foldersFilterKey, searchQuery]);
37
+ var menuDataSource = useMemo(function () {
38
+ return filteredData.map(function (item) {
39
+ return _extends({
40
+ key: item[foldersIdKey] + "-" + item.id,
41
+ onClick: function onClick() {
42
+ return onFolderSelect(item);
43
+ },
44
+ checked: parentFolder[foldersIdKey] === item[foldersIdKey],
45
+ prefixel: /*#__PURE__*/React.createElement(Icon, {
46
+ component: /*#__PURE__*/React.createElement(FolderM, null)
47
+ }),
48
+ // highlight: value,
49
+ text: item[foldersDisplayKey]
50
+ }, item);
51
+ });
52
+ }, [filteredData, foldersDisplayKey, foldersIdKey, onFolderSelect, parentFolder]);
36
53
  return /*#__PURE__*/React.createElement(S.OverviewWrapper, null, /*#__PURE__*/React.createElement(S.HeaderWrapper, {
37
- dashed: !!_onFolderSelect
38
- }, _onFolderSelect && /*#__PURE__*/React.createElement(React.Fragment, null, texts == null ? void 0 : texts.folder, ":", ' ', /*#__PURE__*/React.createElement(Dropdown, {
39
- visible: dropdownVisible,
40
- overlay: /*#__PURE__*/React.createElement(DropdownOverlay, {
41
- texts: texts,
42
- parentFolder: parentFolder,
43
- data: folders,
44
- onDropdownOutsideClick: function onDropdownOutsideClick() {
45
- return setDropdownVisible(false);
46
- },
47
- onClearInput: onClearInput,
48
- searchValue: value,
49
- onSearchChange: setValue,
50
- onFolderSelect: function onFolderSelect(folder) {
51
- _onFolderSelect && _onFolderSelect(folder);
52
- setDropdownVisible(false);
53
- },
54
- foldersDisplayKey: foldersDisplayKey,
55
- foldersFilterKey: foldersFilterKey,
56
- foldersIdKey: foldersIdKey,
57
- onAddFolderClick: onAddFolderClick
58
- })
59
- }, /*#__PURE__*/React.createElement(Button, {
60
- onClick: function onClick() {
61
- return setDropdownVisible(!dropdownVisible);
54
+ dashed: !!onFolderSelect
55
+ }, onFolderSelect && /*#__PURE__*/React.createElement(React.Fragment, null, texts == null ? void 0 : texts.folder, ":", ' ', /*#__PURE__*/React.createElement(DropdownMenu, {
56
+ withSearch: true,
57
+ popoverProps: {
58
+ testId: 'sidebar-object-folders'
59
+ },
60
+ asChild: true,
61
+ dataSource: menuDataSource,
62
+ itemMatchesSearchQuery: function itemMatchesSearchQuery() {
63
+ return true;
62
64
  },
65
+ onSearchQueryChange: setSearchQuery,
66
+ footer: onAddFolderClick ? {
67
+ left: /*#__PURE__*/React.createElement(Button, {
68
+ type: "ghost",
69
+ mode: "icon-label",
70
+ onClick: function onClick() {
71
+ return onAddFolderClick(searchQuery);
72
+ }
73
+ }, /*#__PURE__*/React.createElement(Icon, {
74
+ component: /*#__PURE__*/React.createElement(Add3M, null),
75
+ size: 24,
76
+ color: theme.palette['grey-500']
77
+ }), /*#__PURE__*/React.createElement("div", null, texts.addFolder))
78
+ } : undefined
79
+ }, /*#__PURE__*/React.createElement(Button, {
63
80
  mode: "label-icon",
64
81
  type: "ghost"
65
82
  }, parentFolder == null ? void 0 : parentFolder.name, /*#__PURE__*/React.createElement(Icon, {
66
83
  component: /*#__PURE__*/React.createElement(AngleDownS, null)
67
84
  }))))), /*#__PURE__*/React.createElement(Content, {
68
85
  descriptionProps: descriptionProps,
69
- onFolderSelect: _onFolderSelect,
86
+ onFolderSelect: onFolderSelect,
70
87
  texts: texts,
71
88
  onDescriptionChange: onDescriptionChange,
72
89
  textDescription: textDescription,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synerise/ds-sidebar-object",
3
- "version": "1.0.43",
3
+ "version": "1.1.1",
4
4
  "description": "SidebarObject UI Component for the Synerise Design System",
5
5
  "license": "ISC",
6
6
  "repository": "Synerise/synerise-design",
@@ -35,18 +35,18 @@
35
35
  ],
36
36
  "types": "dist/index.d.ts",
37
37
  "dependencies": {
38
- "@synerise/ds-button": "^1.4.16",
39
- "@synerise/ds-description": "^1.1.12",
38
+ "@synerise/ds-button": "^1.5.0",
39
+ "@synerise/ds-description": "^1.1.13",
40
40
  "@synerise/ds-drawer": "^1.0.10",
41
- "@synerise/ds-dropdown": "^1.0.34",
42
- "@synerise/ds-icon": "^1.7.3",
43
- "@synerise/ds-inline-edit": "^1.0.38",
44
- "@synerise/ds-menu": "^1.1.2",
45
- "@synerise/ds-result": "^1.0.29",
46
- "@synerise/ds-scrollbar": "^1.1.9",
47
- "@synerise/ds-subtle-form": "^1.1.34",
48
- "@synerise/ds-tabs": "^1.0.36",
49
- "@synerise/ds-typography": "^1.0.22",
41
+ "@synerise/ds-dropdown": "^1.1.1",
42
+ "@synerise/ds-icon": "^1.8.0",
43
+ "@synerise/ds-inline-edit": "^1.1.1",
44
+ "@synerise/ds-menu": "^1.2.0",
45
+ "@synerise/ds-result": "^1.0.30",
46
+ "@synerise/ds-scrollbar": "^1.2.0",
47
+ "@synerise/ds-subtle-form": "^1.1.36",
48
+ "@synerise/ds-tabs": "^1.1.1",
49
+ "@synerise/ds-typography": "^1.0.23",
50
50
  "@synerise/ds-utils": "^1.5.0"
51
51
  },
52
52
  "peerDependencies": {
@@ -55,5 +55,5 @@
55
55
  "react": ">=16.9.0 <= 18.3.1",
56
56
  "styled-components": "^5.3.3"
57
57
  },
58
- "gitHead": "73989f3707121812fcd54f3e89e80f6228298689"
58
+ "gitHead": "085189e79075b23a8fb86ce9b7d930f6ac7b3d23"
59
59
  }
@@ -1,4 +0,0 @@
1
- import React from 'react';
2
- import { type Props } from './DropdownOverlay.types';
3
- declare const DropdownOverlay: ({ texts, onClearInput, data, onAddFolderClick, parentFolder, onDropdownOutsideClick, onSearchChange, searchValue, onFolderSelect, foldersIdKey, foldersFilterKey, foldersDisplayKey, }: Props) => React.JSX.Element;
4
- export default DropdownOverlay;
@@ -1,80 +0,0 @@
1
- import React, { useMemo, useRef } from 'react';
2
- import Button from '@synerise/ds-button';
3
- import { theme } from '@synerise/ds-core';
4
- import Dropdown from '@synerise/ds-dropdown';
5
- import Icon, { Add3M, FolderM, SearchM } from '@synerise/ds-icon';
6
- import Menu from '@synerise/ds-menu';
7
- import Result from '@synerise/ds-result';
8
- import { useOnClickOutside } from '@synerise/ds-utils';
9
- import { DropdownWrapper, MenuWrapper } from './DropdownOverlay.styles';
10
- var DropdownOverlay = function DropdownOverlay(_ref) {
11
- var texts = _ref.texts,
12
- onClearInput = _ref.onClearInput,
13
- data = _ref.data,
14
- onAddFolderClick = _ref.onAddFolderClick,
15
- parentFolder = _ref.parentFolder,
16
- onDropdownOutsideClick = _ref.onDropdownOutsideClick,
17
- onSearchChange = _ref.onSearchChange,
18
- searchValue = _ref.searchValue,
19
- onFolderSelect = _ref.onFolderSelect,
20
- foldersIdKey = _ref.foldersIdKey,
21
- foldersFilterKey = _ref.foldersFilterKey,
22
- foldersDisplayKey = _ref.foldersDisplayKey;
23
- var ref = useRef(null);
24
- var filteredData = data.filter(function (item) {
25
- return typeof item[foldersFilterKey] === 'string' && item[foldersFilterKey].toLowerCase().includes(searchValue.toLowerCase());
26
- });
27
- useOnClickOutside(ref, function () {
28
- onDropdownOutsideClick && onDropdownOutsideClick();
29
- });
30
- var menuDataSource = useMemo(function () {
31
- return filteredData == null ? void 0 : filteredData.map(function (item) {
32
- return {
33
- key: item[foldersIdKey] + "-" + item.id,
34
- onClick: function onClick() {
35
- return onFolderSelect(item);
36
- },
37
- checked: parentFolder[foldersIdKey] === item[foldersIdKey],
38
- prefixel: /*#__PURE__*/React.createElement(Icon, {
39
- component: /*#__PURE__*/React.createElement(FolderM, null)
40
- }),
41
- highlight: searchValue,
42
- text: item[foldersDisplayKey]
43
- };
44
- });
45
- }, [filteredData, foldersDisplayKey, foldersIdKey, onFolderSelect, parentFolder, searchValue]);
46
- return /*#__PURE__*/React.createElement(DropdownWrapper, {
47
- ref: ref
48
- }, /*#__PURE__*/React.createElement(Dropdown.SearchInput, {
49
- onSearchChange: onSearchChange,
50
- onClearInput: onClearInput,
51
- placeholder: (texts == null ? void 0 : texts.search) || '',
52
- value: searchValue,
53
- iconLeft: /*#__PURE__*/React.createElement(Icon, {
54
- component: /*#__PURE__*/React.createElement(SearchM, null),
55
- color: theme.palette['grey-600']
56
- }),
57
- autofocus: true
58
- }), /*#__PURE__*/React.createElement(MenuWrapper, {
59
- withBottomAction: !!onAddFolderClick
60
- }, (filteredData == null ? void 0 : filteredData.length) > 0 ? /*#__PURE__*/React.createElement(Menu, {
61
- dataSource: menuDataSource
62
- }) : /*#__PURE__*/React.createElement(Result, {
63
- type: "no-results"
64
- })), onAddFolderClick && /*#__PURE__*/React.createElement(Dropdown.BottomAction, {
65
- onClickAction: function onClickAction() {
66
- return onAddFolderClick(searchValue);
67
- },
68
- style: {
69
- padding: '8px'
70
- }
71
- }, /*#__PURE__*/React.createElement(Button, {
72
- type: "ghost",
73
- mode: "icon-label"
74
- }, /*#__PURE__*/React.createElement(Icon, {
75
- component: /*#__PURE__*/React.createElement(Add3M, null),
76
- size: 24,
77
- color: theme.palette['grey-500']
78
- }), /*#__PURE__*/React.createElement("div", null, texts.addFolder))));
79
- };
80
- export default DropdownOverlay;
@@ -1,4 +0,0 @@
1
- export declare const DropdownWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
2
- export declare const MenuWrapper: import("styled-components").StyledComponent<"div", any, {
3
- withBottomAction: boolean;
4
- }, never>;
@@ -1,13 +0,0 @@
1
- import styled from 'styled-components';
2
- export var DropdownWrapper = styled.div.withConfig({
3
- displayName: "DropdownOverlaystyles__DropdownWrapper",
4
- componentId: "sc-7p7t3l-0"
5
- })(["background:", ";width:220px;border-radius:3px;"], function (props) {
6
- return props.theme.palette.white;
7
- });
8
- export var MenuWrapper = styled.div.withConfig({
9
- displayName: "DropdownOverlaystyles__MenuWrapper",
10
- componentId: "sc-7p7t3l-1"
11
- })(["padding:8px;", ""], function (props) {
12
- return props.withBottomAction && "padding-bottom: 0;";
13
- });
@@ -1,17 +0,0 @@
1
- import { type FolderItem } from '../../SidebarObject.types';
2
- import { type HeaderTexts } from '../Header/Header.types';
3
- import { type OverviewTexts } from '../Overview/Overview.types';
4
- export interface Props {
5
- data: FolderItem[];
6
- onAddFolderClick?: (folderName: string) => void;
7
- onClearInput?: () => void;
8
- parentFolder: FolderItem;
9
- texts: OverviewTexts & HeaderTexts;
10
- onDropdownOutsideClick: () => void;
11
- onSearchChange: (value: string) => void;
12
- searchValue: string;
13
- onFolderSelect: (item: FolderItem) => void;
14
- foldersFilterKey: keyof FolderItem;
15
- foldersDisplayKey: keyof FolderItem;
16
- foldersIdKey: keyof FolderItem;
17
- }