@synerise/ds-operators 0.10.60 → 0.10.62

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
+ ## [0.10.62](https://github.com/Synerise/synerise-design/compare/@synerise/ds-operators@0.10.61...@synerise/ds-operators@0.10.62) (2024-03-29)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **operators:** lock dropdown height to longest tab ([6c6ba6f](https://github.com/Synerise/synerise-design/commit/6c6ba6fbf7517f9754730427b9520c2aacaad6ea))
12
+
13
+
14
+
15
+
16
+
17
+ ## [0.10.61](https://github.com/Synerise/synerise-design/compare/@synerise/ds-operators@0.10.60...@synerise/ds-operators@0.10.61) (2024-03-20)
18
+
19
+ **Note:** Version bump only for package @synerise/ds-operators
20
+
21
+
22
+
23
+
24
+
6
25
  ## [0.10.60](https://github.com/Synerise/synerise-design/compare/@synerise/ds-operators@0.10.59...@synerise/ds-operators@0.10.60) (2024-03-18)
7
26
 
8
27
  **Note:** Version bump only for package @synerise/ds-operators
@@ -1,7 +1,9 @@
1
1
  import Menu from '@synerise/ds-menu';
2
2
  export declare const TabsWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
3
3
  export declare const ContentPlaceholder: import("styled-components").StyledComponent<"div", any, {}, never>;
4
- export declare const ItemsList: import("styled-components").StyledComponent<typeof Menu, any, {}, never>;
4
+ export declare const ItemsList: import("styled-components").StyledComponent<typeof Menu, any, {
5
+ contentHeight?: number | undefined;
6
+ }, never>;
5
7
  export declare const SearchResult: import("styled-components").StyledComponent<"span", any, {}, never>;
6
8
  export declare const SearchResultHighlight: import("styled-components").StyledComponent<"span", any, {}, never>;
7
9
  export declare const Title: import("styled-components").StyledComponent<"div", any, {}, never>;
@@ -11,7 +11,9 @@ export var ContentPlaceholder = styled.div.withConfig({
11
11
  export var ItemsList = styled(Menu).withConfig({
12
12
  displayName: "Operatorsstyle__ItemsList",
13
13
  componentId: "vzf1ol-2"
14
- })(["width:100%;"]);
14
+ })(["width:100%;", ""], function (props) {
15
+ return props.contentHeight !== undefined && "height: " + props.contentHeight + "px;";
16
+ });
15
17
  export var SearchResult = styled.span.withConfig({
16
18
  displayName: "Operatorsstyle__SearchResult",
17
19
  componentId: "vzf1ol-3"
@@ -1,4 +1,3 @@
1
- import * as React from 'react';
2
1
  import { OperatorsDropdownProps } from '../Operator.types';
3
- declare const OperatorsDropdown: React.FC<OperatorsDropdownProps>;
2
+ declare const OperatorsDropdown: ({ texts, setSelected, groups, items, setDropdownVisible, value, }: OperatorsDropdownProps) => JSX.Element;
4
3
  export default OperatorsDropdown;
@@ -1,4 +1,4 @@
1
- import * as React from 'react';
1
+ import React, { useEffect, useCallback, useRef, useState, useMemo } from 'react';
2
2
  import { v4 as uuid } from 'uuid';
3
3
  import Dropdown from '@synerise/ds-dropdown';
4
4
  import Icon, { SearchM } from '@synerise/ds-icon';
@@ -8,8 +8,10 @@ import Result from '@synerise/ds-result';
8
8
  import Scrollbar from '@synerise/ds-scrollbar';
9
9
  import { theme } from '@synerise/ds-core';
10
10
  import OperatorsDropdownItem from './OperatorsDropdownItem';
11
+ import OperatorsDropdownGroupName from './OperatorsDropdownGroupName';
11
12
  import * as S from '../Operators.style';
12
- var NO_GROUP_NAME = 'NO_GROUP_NAME';
13
+ import { calculateGroupHeight, groupByGroupName } from '../utils';
14
+ import { NO_GROUP_NAME, SCROLLABLE_HEIGHT, TABS_HEIGHT, PADDING, DEFAULT_TAB_INDEX } from '../constants';
13
15
 
14
16
  var OperatorsDropdown = function OperatorsDropdown(_ref) {
15
17
  var texts = _ref.texts,
@@ -18,56 +20,49 @@ var OperatorsDropdown = function OperatorsDropdown(_ref) {
18
20
  items = _ref.items,
19
21
  setDropdownVisible = _ref.setDropdownVisible,
20
22
  value = _ref.value;
21
- var overlayRef = React.useRef(null);
23
+ var overlayRef = useRef(null);
22
24
 
23
- var _React$useState = React.useState(''),
24
- searchQuery = _React$useState[0],
25
- setSearchQuery = _React$useState[1];
25
+ var _useState = useState(''),
26
+ searchQuery = _useState[0],
27
+ setSearchQuery = _useState[1];
26
28
 
27
- var _React$useState2 = React.useState(0),
28
- activeTab = _React$useState2[0],
29
- setActiveTab = _React$useState2[1];
29
+ var _useState2 = useState(DEFAULT_TAB_INDEX),
30
+ activeTab = _useState2[0],
31
+ setActiveTab = _useState2[1];
30
32
 
31
- var _React$useState3 = React.useState(undefined),
32
- activeGroup = _React$useState3[0],
33
- setActiveGroup = _React$useState3[1];
33
+ var _useState3 = useState(undefined),
34
+ activeGroup = _useState3[0],
35
+ setActiveGroup = _useState3[1];
34
36
 
35
- var _React$useState4 = React.useState(true),
36
- searchInputCanBeFocused = _React$useState4[0],
37
- setSearchInputFocus = _React$useState4[1];
37
+ var _useState4 = useState(true),
38
+ searchInputCanBeFocused = _useState4[0],
39
+ setSearchInputFocus = _useState4[1];
38
40
 
39
- React.useEffect(function () {
41
+ useEffect(function () {
40
42
  var defaultIndex = groups == null ? void 0 : groups.findIndex(function (group) {
41
43
  return group.defaultGroup || value && group.id === value.groupId;
42
44
  });
43
- setActiveTab(defaultIndex === -1 ? 0 : defaultIndex);
45
+ setActiveTab(defaultIndex === -1 ? DEFAULT_TAB_INDEX : defaultIndex);
44
46
  }, [groups, value]);
45
- var classNames = React.useMemo(function () {
47
+ var classNames = useMemo(function () {
46
48
  return "ds-operator-item ds-operator-item-" + uuid();
47
49
  }, []);
48
50
  useOnClickOutside(overlayRef, function () {
49
51
  setDropdownVisible(false);
50
52
  });
51
- var groupByGroupName = React.useCallback(function (activeItems) {
52
- var itemsNumber = activeItems.length;
53
- var groupedItems = {};
54
-
55
- for (var i = 0; i < itemsNumber; i += 1) {
56
- var item = activeItems[i];
57
- var groupName = item.groupName || NO_GROUP_NAME;
58
- var group = groupedItems[groupName] || [];
59
- group.push(item);
60
- groupedItems[groupName] = group;
61
- }
62
-
63
- var resultItems = [];
53
+ var renderGroupedItems = useCallback(function (activeItems) {
54
+ var groupedItems = groupByGroupName(activeItems);
55
+ var renderedItems = [];
64
56
  Object.keys(groupedItems).forEach(function (key) {
65
57
  if (key !== NO_GROUP_NAME) {
66
- resultItems.push( /*#__PURE__*/React.createElement(S.Title, null, key));
58
+ renderedItems.push( /*#__PURE__*/React.createElement(OperatorsDropdownGroupName, {
59
+ "data-testid": "operator-group-title",
60
+ name: key
61
+ }));
67
62
  }
68
63
 
69
64
  groupedItems[key].forEach(function (item) {
70
- resultItems.push( /*#__PURE__*/React.createElement(OperatorsDropdownItem, {
65
+ return renderedItems.push( /*#__PURE__*/React.createElement(OperatorsDropdownItem, {
71
66
  className: classNames,
72
67
  key: uuid(),
73
68
  item: item,
@@ -80,14 +75,14 @@ var OperatorsDropdown = function OperatorsDropdown(_ref) {
80
75
  }));
81
76
  });
82
77
  });
83
- return resultItems;
78
+ return renderedItems;
84
79
  }, [searchQuery, setDropdownVisible, setSelected, value, classNames]);
85
- var currentTabItems = React.useMemo(function () {
80
+ var currentTabItems = useMemo(function () {
86
81
  return groups == null ? void 0 : groups.find(function (group, index) {
87
82
  return activeTab === index;
88
83
  });
89
84
  }, [groups, activeTab]);
90
- var filteredItems = React.useMemo(function () {
85
+ var filteredItems = useMemo(function () {
91
86
  return items.filter(function (item) {
92
87
  return item.name.toLowerCase().includes(searchQuery.toLowerCase());
93
88
  }).map(function (item) {
@@ -107,7 +102,13 @@ var OperatorsDropdown = function OperatorsDropdown(_ref) {
107
102
  });
108
103
  });
109
104
  }, [items, searchQuery, setDropdownVisible, setSelected, value, classNames]);
110
- var currentItems = React.useMemo(function () {
105
+ var maxHeight = useMemo(function () {
106
+ return (groups == null ? void 0 : groups.reduce(function (currentMax, group) {
107
+ var groupHeight = calculateGroupHeight(group, items);
108
+ return Math.max(currentMax, groupHeight);
109
+ }, 0)) + 2 * PADDING;
110
+ }, [items, groups]);
111
+ var currentItems = useMemo(function () {
111
112
  if (searchQuery) {
112
113
  return filteredItems;
113
114
  }
@@ -129,27 +130,34 @@ var OperatorsDropdown = function OperatorsDropdown(_ref) {
129
130
  }
130
131
 
131
132
  if (activeGroup != null && activeGroup.id) {
132
- return groupByGroupName(items == null ? void 0 : items.filter(function (item) {
133
+ return renderGroupedItems(items == null ? void 0 : items.filter(function (item) {
133
134
  return item.groupId === activeGroup.id;
134
135
  }));
135
136
  }
136
137
 
137
- return groupByGroupName(items == null ? void 0 : items.filter(function (item) {
138
+ return renderGroupedItems(items == null ? void 0 : items.filter(function (item) {
138
139
  var _groups$activeTab;
139
140
 
140
141
  return item.groupId === ((_groups$activeTab = groups[activeTab]) == null ? void 0 : _groups$activeTab.id);
141
142
  }));
142
- }, [currentTabItems, items, groups, searchQuery, activeTab, filteredItems, activeGroup, groupByGroupName, classNames]);
143
- var handleSearch = React.useCallback(function (val) {
143
+ }, [currentTabItems, items, groups, searchQuery, activeTab, filteredItems, activeGroup, renderGroupedItems, classNames]);
144
+ var handleSearch = useCallback(function (val) {
144
145
  setSearchQuery(val);
145
146
  }, [setSearchQuery]);
146
- var getTabs = React.useMemo(function () {
147
+ var getTabs = useMemo(function () {
147
148
  return (groups == null ? void 0 : groups.map(function (group) {
148
149
  return {
149
150
  icon: group.icon
150
151
  };
151
152
  })) || [];
152
153
  }, [groups]);
154
+ var hasTabs = getTabs.length > 1;
155
+ var lockedTabContentHeight;
156
+
157
+ if (hasTabs && maxHeight > 0) {
158
+ lockedTabContentHeight = Math.min(maxHeight, SCROLLABLE_HEIGHT) + (searchQuery ? TABS_HEIGHT : 0);
159
+ }
160
+
153
161
  return /*#__PURE__*/React.createElement(Dropdown.Wrapper, {
154
162
  style: {
155
163
  width: '300px',
@@ -176,7 +184,7 @@ var OperatorsDropdown = function OperatorsDropdown(_ref) {
176
184
  component: /*#__PURE__*/React.createElement(SearchM, null),
177
185
  color: theme.palette['grey-600']
178
186
  })
179
- }), searchQuery === '' && getTabs.length > 1 && /*#__PURE__*/React.createElement(S.TabsWrapper, null, /*#__PURE__*/React.createElement(Tabs, {
187
+ }), searchQuery === '' && hasTabs && /*#__PURE__*/React.createElement(S.TabsWrapper, null, /*#__PURE__*/React.createElement(Tabs, {
180
188
  block: true,
181
189
  tabs: getTabs,
182
190
  activeTab: activeTab,
@@ -184,14 +192,15 @@ var OperatorsDropdown = function OperatorsDropdown(_ref) {
184
192
  setActiveTab(index);
185
193
  setActiveGroup(undefined);
186
194
  }
187
- })), /*#__PURE__*/React.createElement(S.ItemsList, null, /*#__PURE__*/React.createElement(Scrollbar, {
195
+ })), /*#__PURE__*/React.createElement(S.ItemsList, {
196
+ contentHeight: lockedTabContentHeight
197
+ }, /*#__PURE__*/React.createElement(Scrollbar, {
188
198
  absolute: true,
189
- maxHeight: 300,
199
+ maxHeight: lockedTabContentHeight,
190
200
  style: {
191
- padding: 8
201
+ padding: PADDING
192
202
  }
193
- }, // @ts-ignore
194
- currentItems.length ? currentItems : /*#__PURE__*/React.createElement(Result, {
203
+ }, currentItems != null && currentItems.length ? currentItems : /*#__PURE__*/React.createElement(Result, {
195
204
  noSearchResults: true,
196
205
  type: "no-results",
197
206
  description: texts.noResults
@@ -0,0 +1,4 @@
1
+ declare const OperatorsDropdownGroupName: ({ name }: {
2
+ name: string;
3
+ }) => JSX.Element;
4
+ export default OperatorsDropdownGroupName;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import * as S from '../Operators.style';
3
+
4
+ var OperatorsDropdownGroupName = function OperatorsDropdownGroupName(_ref) {
5
+ var name = _ref.name;
6
+ return /*#__PURE__*/React.createElement(S.Title, {
7
+ "data-testid": "operator-group-title"
8
+ }, name);
9
+ };
10
+
11
+ export default OperatorsDropdownGroupName;
@@ -1,6 +1,5 @@
1
- import * as React from 'react';
2
1
  import { OperatorsGroup, OperatorsItem } from '../Operator.types';
3
- interface Props {
2
+ type OperatorsDropdownItemProps = {
4
3
  item: OperatorsItem | OperatorsGroup;
5
4
  searchQuery: string;
6
5
  clearSearch?: () => void;
@@ -8,6 +7,6 @@ interface Props {
8
7
  select: (item: OperatorsItem | OperatorsGroup) => void;
9
8
  selected?: boolean;
10
9
  className: string;
11
- }
12
- declare const OperatorsDropdownItem: React.FC<Props>;
10
+ };
11
+ declare const OperatorsDropdownItem: ({ item, clearSearch, searchQuery, hideDropdown, select, selected, className, }: OperatorsDropdownItemProps) => JSX.Element;
13
12
  export default OperatorsDropdownItem;
@@ -1,4 +1,4 @@
1
- import * as React from 'react';
1
+ import React from 'react';
2
2
  import Icon, { CheckS } from '@synerise/ds-icon';
3
3
  import Menu from '@synerise/ds-menu';
4
4
  import { theme } from '@synerise/ds-core';
@@ -12,6 +12,7 @@ var OperatorsDropdownItem = function OperatorsDropdownItem(_ref) {
12
12
  selected = _ref.selected,
13
13
  className = _ref.className;
14
14
  return /*#__PURE__*/React.createElement(Menu.Item, {
15
+ // TODO change into listitem
15
16
  className: className,
16
17
  key: item.name + item.id,
17
18
  prefixel: searchQuery && /*#__PURE__*/React.createElement(Icon, {
@@ -0,0 +1,41 @@
1
+ export declare const OPERATORS_TEXTS: {
2
+ buttonLabel: string;
3
+ searchPlaceholder: string;
4
+ noResults: string;
5
+ };
6
+ export declare const OPERATORS_GROUPS: ({
7
+ id: string;
8
+ name: string;
9
+ temsType: null;
10
+ tooltip: string;
11
+ icon: JSX.Element;
12
+ defaultGroup: boolean;
13
+ itemsType?: undefined;
14
+ } | {
15
+ id: string;
16
+ name: string;
17
+ itemsType: null;
18
+ tooltip: string;
19
+ icon: JSX.Element;
20
+ defaultGroup: boolean;
21
+ temsType?: undefined;
22
+ })[];
23
+ export declare const OPERATORS_ITEMS: ({
24
+ id: string;
25
+ value: string;
26
+ logic: string;
27
+ name: string;
28
+ groupId: string;
29
+ group: string;
30
+ icon: JSX.Element;
31
+ groupName?: undefined;
32
+ } | {
33
+ id: string;
34
+ value: string;
35
+ logic: string;
36
+ name: string;
37
+ groupId: string;
38
+ group: string;
39
+ icon: JSX.Element;
40
+ groupName: string;
41
+ })[];
@@ -0,0 +1,6 @@
1
+ export declare const NO_GROUP_NAME = "NO_GROUP_NAME";
2
+ export declare const SCROLLABLE_HEIGHT = 304;
3
+ export declare const ITEM_HEIGHT = 32;
4
+ export declare const TABS_HEIGHT = 50;
5
+ export declare const PADDING = 8;
6
+ export declare const DEFAULT_TAB_INDEX = 0;
@@ -0,0 +1,6 @@
1
+ export var NO_GROUP_NAME = 'NO_GROUP_NAME';
2
+ export var SCROLLABLE_HEIGHT = 304;
3
+ export var ITEM_HEIGHT = 32;
4
+ export var TABS_HEIGHT = 50;
5
+ export var PADDING = 8;
6
+ export var DEFAULT_TAB_INDEX = 0;
@@ -0,0 +1,2 @@
1
+ import { OperatorsGroup, OperatorsItem } from '../Operator.types';
2
+ export declare const calculateGroupHeight: (group: OperatorsGroup, allItems: OperatorsItem[]) => number;
@@ -0,0 +1,16 @@
1
+ import { ITEM_HEIGHT } from '../constants';
2
+ export var calculateGroupHeight = function calculateGroupHeight(group, allItems) {
3
+ if (group.subGroups) {
4
+ var _group$subGroups;
5
+
6
+ return ((_group$subGroups = group.subGroups) == null ? void 0 : _group$subGroups.length) * ITEM_HEIGHT;
7
+ }
8
+
9
+ var groupItems = allItems.filter(function (item) {
10
+ return item.groupId === group.id;
11
+ });
12
+ var groupNames = new Set(groupItems.map(function (item) {
13
+ return item.groupName;
14
+ }).filter(Boolean));
15
+ return (groupItems.length + groupNames.size) * ITEM_HEIGHT;
16
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import { OperatorsItem } from '../Operator.types';
2
+ export declare const groupByGroupName: (activeItems: OperatorsItem[]) => {};
@@ -0,0 +1,8 @@
1
+ import { NO_GROUP_NAME } from '../constants';
2
+ export var groupByGroupName = function groupByGroupName(activeItems) {
3
+ return activeItems.reduce(function (acc, item) {
4
+ var groupName = item.groupName || NO_GROUP_NAME;
5
+ acc[groupName] = [].concat(acc[groupName] || [], [item]);
6
+ return acc;
7
+ }, {});
8
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './calculateGroupHeight';
2
+ export * from './groupByGroupName';
@@ -0,0 +1,2 @@
1
+ export * from './calculateGroupHeight';
2
+ export * from './groupByGroupName';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synerise/ds-operators",
3
- "version": "0.10.60",
3
+ "version": "0.10.62",
4
4
  "description": "Operators UI Component for the Synerise Design System",
5
5
  "license": "ISC",
6
6
  "repository": "Synerise/synerise-design",
@@ -33,15 +33,15 @@
33
33
  ],
34
34
  "types": "dist/index.d.ts",
35
35
  "dependencies": {
36
- "@synerise/ds-button": "^0.19.3",
37
- "@synerise/ds-dropdown": "^0.17.100",
38
- "@synerise/ds-icon": "^0.60.3",
39
- "@synerise/ds-menu": "^0.18.15",
40
- "@synerise/ds-result": "^0.6.47",
41
- "@synerise/ds-scrollbar": "^0.8.3",
42
- "@synerise/ds-tabs": "^0.13.99",
43
- "@synerise/ds-tooltip": "^0.14.20",
44
- "@synerise/ds-utils": "^0.25.0",
36
+ "@synerise/ds-button": "^0.19.5",
37
+ "@synerise/ds-dropdown": "^0.17.102",
38
+ "@synerise/ds-icon": "^0.60.5",
39
+ "@synerise/ds-menu": "^0.18.17",
40
+ "@synerise/ds-result": "^0.6.49",
41
+ "@synerise/ds-scrollbar": "^0.10.0",
42
+ "@synerise/ds-tabs": "^0.13.101",
43
+ "@synerise/ds-tooltip": "^0.14.22",
44
+ "@synerise/ds-utils": "^0.26.1",
45
45
  "react-intl": "3.12.0",
46
46
  "uuid": "^8.3.2"
47
47
  },
@@ -55,5 +55,5 @@
55
55
  "@testing-library/react": "10.0.1",
56
56
  "@testing-library/user-event": "^10.3.1"
57
57
  },
58
- "gitHead": "914ce4be2e0e1fe145edeca838ab04eaa1aec1bf"
58
+ "gitHead": "07304b7bf03826701df904c7be058d93588a9611"
59
59
  }