@zohodesk/components 1.4.8 → 1.4.10-exp-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/.cli/propValidation_report.html +1 -1
  2. package/README.md +22 -0
  3. package/es/MultiSelect/AdvancedGroupMultiSelect.js +16 -8
  4. package/es/MultiSelect/AdvancedMultiSelect.js +13 -6
  5. package/es/MultiSelect/EmptyState.js +2 -1
  6. package/es/MultiSelect/MultiSelect.js +36 -15
  7. package/es/MultiSelect/MultiSelectWithAvatar.js +9 -2
  8. package/es/MultiSelect/SelectedOptions.js +4 -2
  9. package/es/MultiSelect/Suggestions.js +174 -97
  10. package/es/MultiSelect/__tests__/MultiSelect.spec.js +25 -0
  11. package/es/MultiSelect/__tests__/Suggestions.spec.js +58 -0
  12. package/es/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +253 -0
  13. package/es/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +343 -0
  14. package/es/MultiSelect/constants.js +6 -0
  15. package/es/MultiSelect/props/defaultProps.js +2 -0
  16. package/es/MultiSelect/props/propTypes.js +18 -55
  17. package/es/Select/Select.js +13 -3
  18. package/es/Select/SelectWithIcon.js +1 -1
  19. package/es/Select/__tests__/Select.spec.js +16 -8
  20. package/es/Select/__tests__/__snapshots__/Select.spec.js.snap +281 -0
  21. package/es/Select/props/defaultProps.js +1 -0
  22. package/es/Select/props/propTypes.js +1 -0
  23. package/es/utils/Common.js +3 -2
  24. package/es/utils/dropDownUtils.js +28 -7
  25. package/lib/MultiSelect/AdvancedGroupMultiSelect.js +94 -83
  26. package/lib/MultiSelect/AdvancedMultiSelect.js +16 -7
  27. package/lib/MultiSelect/EmptyState.js +3 -1
  28. package/lib/MultiSelect/MultiSelect.js +39 -15
  29. package/lib/MultiSelect/MultiSelectWithAvatar.js +11 -3
  30. package/lib/MultiSelect/SelectedOptions.js +4 -2
  31. package/lib/MultiSelect/Suggestions.js +176 -100
  32. package/lib/MultiSelect/__tests__/MultiSelect.spec.js +25 -0
  33. package/lib/MultiSelect/__tests__/Suggestions.spec.js +58 -0
  34. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +253 -0
  35. package/lib/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +343 -0
  36. package/lib/MultiSelect/constants.js +13 -0
  37. package/lib/MultiSelect/props/defaultProps.js +2 -0
  38. package/lib/MultiSelect/props/propTypes.js +17 -55
  39. package/lib/Select/Select.js +13 -2
  40. package/lib/Select/SelectWithIcon.js +1 -1
  41. package/lib/Select/__tests__/Select.spec.js +165 -155
  42. package/lib/Select/__tests__/__snapshots__/Select.spec.js.snap +281 -0
  43. package/lib/Select/props/defaultProps.js +1 -0
  44. package/lib/Select/props/propTypes.js +1 -0
  45. package/lib/utils/Common.js +5 -3
  46. package/lib/utils/dropDownUtils.js +27 -4
  47. package/package.json +9 -8
@@ -1,142 +1,219 @@
1
1
  /**** Libraries ****/
2
- import React from 'react';
2
+ import React, { useMemo } from 'react';
3
3
  import { Suggestions_propTypes } from "./props/propTypes";
4
4
  import { Suggestions_defaultProps } from "./props/defaultProps";
5
+ import { Virtualizer } from '@zohodesk/virtualizer';
5
6
  /**** Components ****/
6
7
 
7
8
  import ListItem from "../ListItem/ListItem";
8
9
  import ListItemWithAvatar from "../ListItem/ListItemWithAvatar";
9
10
  import ListItemWithIcon from "../ListItem/ListItemWithIcon";
10
11
  import { Container, Box } from "../Layout";
12
+ import { DUMMY_OBJECT, DUMMY_ARRAY } from "../utils/Common";
13
+
14
+ function SuggestionsVirtualizerContainer(_ref) {
15
+ let {
16
+ eleRef,
17
+ children,
18
+ setVirtualizerContainerRefFunction
19
+ } = _ref;
20
+ useMemo(() => {
21
+ typeof setVirtualizerContainerRefFunction === 'function' && setVirtualizerContainerRefFunction(eleRef);
22
+ }, [eleRef, setVirtualizerContainerRefFunction]);
23
+ return /*#__PURE__*/React.createElement(React.Fragment, null, children);
24
+ }
25
+
11
26
  export default class Suggestions extends React.PureComponent {
12
- render() {
27
+ constructor(props) {
28
+ super(props);
29
+ this.renderSuggestionList = this.renderSuggestionList.bind(this);
30
+ this.renderVirtualizerSuggestionListItem = this.renderVirtualizerSuggestionListItem.bind(this);
31
+ }
32
+
33
+ renderSuggestionList(_ref2) {
34
+ let {
35
+ suggestion,
36
+ index,
37
+ ref
38
+ } = _ref2;
13
39
  const {
14
- suggestions,
15
40
  getRef,
16
41
  hoverOption,
17
42
  onClick,
18
43
  onMouseEnter,
19
44
  needTick,
20
45
  needBorder,
21
- selectedOptions = [],
46
+ selectedOptions = DUMMY_ARRAY,
22
47
  activeId,
23
48
  hoverId,
24
- dataId,
25
49
  listItemSize,
26
- className,
27
50
  avatarPalette,
28
51
  palette,
29
- htmlId,
30
52
  a11y,
31
- needMultiLineText
53
+ needMultiLineText,
54
+ limit,
55
+ limitReachedMessage
32
56
  } = this.props;
33
57
  const {
34
- ariaParentRole,
35
- ariaMultiselectable
36
- } = a11y;
37
- return /*#__PURE__*/React.createElement(Container, {
38
- isCover: false,
39
- role: ariaParentRole,
40
- id: htmlId,
41
- tabindex: "0",
42
- "aria-multiselectable": ariaMultiselectable
43
- }, /*#__PURE__*/React.createElement(Box, {
44
- dataId: `${dataId}`,
45
- className: className ? className : ''
46
- }, suggestions.map((suggestion, index) => {
47
- const {
48
- id,
49
- value,
50
- secondaryValue,
51
- photoURL,
52
- icon,
53
- optionType,
54
- iconSize,
55
- isDisabled,
56
- listItemProps,
57
- listItemCustomProps = {}
58
- } = suggestion;
59
- const isActive = activeId === id || selectedOptions.indexOf(id) >= 0;
60
- const isHighlight = hoverOption === index || id === hoverId ? true : false;
61
- const list_a11y = Object.assign({}, a11y, {
62
- ariaSelected: isActive,
63
- ariaLabel: value,
64
- 'data-a11y-list-active': isHighlight
65
- });
66
- const commonProps = {
67
- isDisabled,
68
- needMultiLineText,
69
- ...listItemCustomProps
58
+ id,
59
+ value,
60
+ secondaryValue,
61
+ photoURL,
62
+ icon,
63
+ optionType,
64
+ iconSize,
65
+ isDisabled,
66
+ listItemProps,
67
+ listItemCustomProps = DUMMY_OBJECT
68
+ } = suggestion;
69
+ const isActive = activeId === id || selectedOptions.indexOf(id) >= 0;
70
+ const isHighlight = hoverOption === index || id === hoverId ? true : false;
71
+ const selectedOptionsLength = selectedOptions.length;
72
+ const isLimitReached = selectedOptionsLength >= limit && !isActive;
73
+ const list_a11y = Object.assign({}, a11y, {
74
+ ariaSelected: isActive,
75
+ ariaLabel: value,
76
+ 'data-a11y-list-active': isHighlight
77
+ });
78
+ const commonProps = {
79
+ isDisabled: isDisabled ? isDisabled : isLimitReached,
80
+ needMultiLineText,
81
+ ...listItemCustomProps
82
+ };
83
+
84
+ if (listItemProps) {
85
+ commonProps.customProps = {
86
+ ListItemProps: { ...listItemProps
87
+ }
70
88
  };
89
+ }
71
90
 
72
- if (listItemProps) {
73
- commonProps.customProps = {
74
- ListItemProps: { ...listItemProps
75
- }
76
- };
77
- }
91
+ if (isLimitReached) {
92
+ commonProps.disableTitle = limitReachedMessage;
93
+ }
94
+
95
+ function getListItemRef(ele, index, id) {
96
+ ref && ref(ele);
78
97
 
79
- if (optionType === 'avatar') {
80
- return /*#__PURE__*/React.createElement(ListItemWithAvatar, { ...commonProps,
81
- autoHover: false,
82
- getRef: getRef,
83
- highlight: isHighlight,
84
- id: id,
85
- imgSrc: photoURL,
86
- key: `${id}avatarListItem`,
87
- name: value,
88
- onClick: onClick,
89
- onMouseEnter: onMouseEnter,
90
- value: value,
91
- title: value,
92
- needTick: needTick,
93
- needBorder: needBorder,
94
- active: isActive,
95
- size: listItemSize,
96
- avatarPalette: avatarPalette,
97
- palette: palette,
98
- a11y: list_a11y,
99
- secondaryValue: secondaryValue
100
- });
101
- } else if (optionType === 'icon') {
102
- return /*#__PURE__*/React.createElement(ListItemWithIcon, { ...commonProps,
103
- autoHover: false,
104
- getRef: getRef,
105
- highlight: isHighlight,
106
- id: id,
107
- key: `${id}iconListItem`,
108
- onClick: onClick,
109
- onMouseEnter: onMouseEnter,
110
- value: value,
111
- title: value,
112
- iconName: icon,
113
- needTick: needTick,
114
- needBorder: needBorder,
115
- active: isActive,
116
- iconSize: iconSize,
117
- size: listItemSize,
118
- palette: palette,
119
- a11y: list_a11y,
120
- secondaryValue: secondaryValue
121
- });
98
+ if (typeof getRef === 'function') {
99
+ getRef(ele, index, id);
122
100
  }
101
+ }
123
102
 
124
- return /*#__PURE__*/React.createElement(ListItem, { ...commonProps,
103
+ if (optionType === 'avatar') {
104
+ return /*#__PURE__*/React.createElement(ListItemWithAvatar, { ...commonProps,
105
+ autoHover: false,
106
+ getRef: getListItemRef,
107
+ highlight: isHighlight,
108
+ id: id,
109
+ imgSrc: photoURL,
110
+ key: `${id}avatarListItem`,
111
+ name: value,
112
+ onClick: onClick,
113
+ onMouseEnter: onMouseEnter,
114
+ value: value,
115
+ title: value,
116
+ needTick: needTick,
117
+ needBorder: needBorder,
118
+ active: isActive,
119
+ size: listItemSize,
120
+ avatarPalette: avatarPalette,
121
+ palette: palette,
122
+ a11y: list_a11y,
123
+ secondaryValue: secondaryValue
124
+ });
125
+ } else if (optionType === 'icon') {
126
+ return /*#__PURE__*/React.createElement(ListItemWithIcon, { ...commonProps,
125
127
  autoHover: false,
126
- getRef: getRef,
128
+ getRef: getListItemRef,
127
129
  highlight: isHighlight,
128
130
  id: id,
129
- key: `${id}listItem`,
131
+ key: `${id}iconListItem`,
130
132
  onClick: onClick,
131
133
  onMouseEnter: onMouseEnter,
132
134
  value: value,
133
135
  title: value,
136
+ iconName: icon,
134
137
  needTick: needTick,
135
138
  needBorder: needBorder,
136
139
  active: isActive,
140
+ iconSize: iconSize,
137
141
  size: listItemSize,
138
142
  palette: palette,
139
- a11y: list_a11y
143
+ a11y: list_a11y,
144
+ secondaryValue: secondaryValue
145
+ });
146
+ }
147
+
148
+ return /*#__PURE__*/React.createElement(ListItem, { ...commonProps,
149
+ autoHover: false,
150
+ getRef: getListItemRef,
151
+ highlight: isHighlight,
152
+ id: id,
153
+ key: `${id}listItem`,
154
+ onClick: onClick,
155
+ onMouseEnter: onMouseEnter,
156
+ value: value,
157
+ title: value,
158
+ needTick: needTick,
159
+ needBorder: needBorder,
160
+ active: isActive,
161
+ size: listItemSize,
162
+ palette: palette,
163
+ a11y: list_a11y
164
+ });
165
+ }
166
+
167
+ renderVirtualizerSuggestionListItem(_ref3) {
168
+ let {
169
+ index,
170
+ ref
171
+ } = _ref3;
172
+ const {
173
+ suggestions
174
+ } = this.props;
175
+ const suggestion = suggestions[index];
176
+ return this.renderSuggestionList({
177
+ suggestion,
178
+ index,
179
+ ref
180
+ });
181
+ }
182
+
183
+ render() {
184
+ const {
185
+ suggestions,
186
+ dataId,
187
+ className,
188
+ isVirtualizerEnabled,
189
+ htmlId,
190
+ a11y,
191
+ setVirtualizerContainerRefFunction
192
+ } = this.props;
193
+ const {
194
+ ariaParentRole,
195
+ ariaMultiselectable
196
+ } = a11y;
197
+ return /*#__PURE__*/React.createElement(Container, {
198
+ isCover: false,
199
+ role: ariaParentRole,
200
+ id: htmlId,
201
+ tabindex: "0",
202
+ "aria-multiselectable": ariaMultiselectable
203
+ }, /*#__PURE__*/React.createElement(Box, {
204
+ dataId: `${dataId}`,
205
+ className: className ? className : ''
206
+ }, isVirtualizerEnabled ? /*#__PURE__*/React.createElement(Virtualizer, {
207
+ containerType: SuggestionsVirtualizerContainer,
208
+ elementRenderer: this.renderVirtualizerSuggestionListItem,
209
+ elementsCount: suggestions.length,
210
+ isElementsFixedHeight: false,
211
+ dataId: `${dataId}_virtualizer`,
212
+ setVirtualizerContainerRefFunction: setVirtualizerContainerRefFunction
213
+ }) : suggestions.map((suggestion, index) => {
214
+ return this.renderSuggestionList({
215
+ suggestion,
216
+ index
140
217
  });
141
218
  })));
142
219
  }
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
2
  import { render } from '@testing-library/react';
3
3
  import MultiSelect from "../MultiSelect";
4
+ const testData = ['text1', 'text2', 'text3', 'text4', 'text5', 'text6', 'text7', 'text8', 'text9', 'text10'];
5
+ const testSelectedData = ['text1', 'text2', 'text3'];
4
6
  describe('MultiSelect', () => {
5
7
  test('rendering the defult props', () => {
6
8
  const {
@@ -8,4 +10,27 @@ describe('MultiSelect', () => {
8
10
  } = render( /*#__PURE__*/React.createElement(MultiSelect, null));
9
11
  expect(asFragment()).toMatchSnapshot();
10
12
  });
13
+ test('rendering with limit feature', () => {
14
+ const {
15
+ asFragment
16
+ } = render( /*#__PURE__*/React.createElement(MultiSelect, {
17
+ valueField: "id",
18
+ textField: "text",
19
+ options: testData,
20
+ selectedOptions: testSelectedData,
21
+ needSelectAll: true,
22
+ selectAllText: "Select All",
23
+ placeHolder: "Select Text",
24
+ i18nKeys: {
25
+ clearText: 'Clear Selected Items',
26
+ loadingText: 'Fetching...',
27
+ emptyText: 'No Options .',
28
+ noMoreText: 'No More Options .',
29
+ searchEmptyText: 'No Matches Found .'
30
+ },
31
+ needResponsive: true,
32
+ limit: 3
33
+ }));
34
+ expect(asFragment()).toMatchSnapshot();
35
+ });
11
36
  });
@@ -1,6 +1,53 @@
1
1
  import React from 'react';
2
2
  import { render } from '@testing-library/react';
3
3
  import Suggestions from "../Suggestions";
4
+ const sampleData = [{
5
+ "id": 2,
6
+ "value": "text2",
7
+ "optionType": "default",
8
+ "listItemProps": {
9
+ "style": {
10
+ "color": "red"
11
+ }
12
+ }
13
+ }, {
14
+ "id": 3,
15
+ "value": "text3",
16
+ "optionType": "default",
17
+ "listItemProps": {
18
+ "style": {
19
+ "color": "blue"
20
+ }
21
+ }
22
+ }, {
23
+ "id": 4,
24
+ "value": "text4",
25
+ "optionType": "default"
26
+ }, {
27
+ "id": 5,
28
+ "value": "text5",
29
+ "optionType": "default"
30
+ }, {
31
+ "id": 6,
32
+ "value": "text6",
33
+ "optionType": "default"
34
+ }, {
35
+ "id": 7,
36
+ "value": "text7",
37
+ "optionType": "default"
38
+ }, {
39
+ "id": 8,
40
+ "value": "text8",
41
+ "optionType": "default"
42
+ }, {
43
+ "id": 9,
44
+ "value": "text9",
45
+ "optionType": "default"
46
+ }, {
47
+ "id": 10,
48
+ "value": "text10",
49
+ "optionType": "default"
50
+ }];
4
51
  describe('Suggestions', () => {
5
52
  test('rendering the defult props', () => {
6
53
  const {
@@ -10,4 +57,15 @@ describe('Suggestions', () => {
10
57
  }));
11
58
  expect(asFragment()).toMatchSnapshot();
12
59
  });
60
+ test('rendering with limit props', () => {
61
+ const {
62
+ asFragment
63
+ } = render( /*#__PURE__*/React.createElement(Suggestions, {
64
+ selectedOptions: [1, 2, 3, 4],
65
+ suggestions: sampleData,
66
+ limit: 3,
67
+ limitReachedMessage: "Limit Reached"
68
+ }));
69
+ expect(asFragment()).toMatchSnapshot();
70
+ });
13
71
  });
@@ -84,3 +84,256 @@ exports[`MultiSelect rendering the defult props 1`] = `
84
84
  </div>
85
85
  </DocumentFragment>
86
86
  `;
87
+
88
+ exports[`MultiSelect rendering with limit feature 1`] = `
89
+ <DocumentFragment>
90
+ <div
91
+ class="wrapper effect"
92
+ data-id="multiSelect"
93
+ data-selector-id="multiSelect"
94
+ data-test-id="multiSelect"
95
+ >
96
+ <div
97
+ class="container medium borderColor_default hasBorder flex cover rowdir wrap vCenter"
98
+ data-id="containerComponent"
99
+ data-selector-id="container"
100
+ data-test-id="containerComponent"
101
+ >
102
+ <div
103
+ class="tag medium shrinkOff"
104
+ data-id="multiSelect_selectedOptions"
105
+ data-selector-id="box"
106
+ data-test-id="multiSelect_selectedOptions"
107
+ >
108
+ <div
109
+ aria-labelledby="5"
110
+ class="container effect medium lgRadius danger pointer "
111
+ data-id="tag_Tag"
112
+ data-selector-id="tag"
113
+ data-test-id="tag_Tag"
114
+ data-title="text1"
115
+ tabindex="0"
116
+ >
117
+ <div
118
+ aria-hidden="true"
119
+ class="text mediumtext"
120
+ id="5"
121
+ >
122
+ text1
123
+ </div>
124
+ <button
125
+ aria-label="Delete"
126
+ class="buttonReset close
127
+ lgRadiusClose
128
+ closedanger"
129
+ data-id="tag_RemoveTag"
130
+ data-test-id="tag_RemoveTag"
131
+ type="button"
132
+ value="text"
133
+ >
134
+ <div
135
+ class="flex cover coldir both"
136
+ data-id="containerComponent"
137
+ data-selector-id="container"
138
+ data-test-id="containerComponent"
139
+ >
140
+ <i
141
+ aria-hidden="true"
142
+ class="zd_font_icons basic icon-close2 fbold "
143
+ data-id="fontIcon"
144
+ data-selector-id="fontIcon"
145
+ data-test-id="fontIcon"
146
+ style="--zd-iconfont-size: var(--zd_font_size8);"
147
+ />
148
+ </div>
149
+ </button>
150
+ </div>
151
+ </div>
152
+ <div
153
+ class="tag medium shrinkOff"
154
+ data-id="multiSelect_selectedOptions"
155
+ data-selector-id="box"
156
+ data-test-id="multiSelect_selectedOptions"
157
+ >
158
+ <div
159
+ aria-labelledby="6"
160
+ class="container effect medium lgRadius danger pointer "
161
+ data-id="tag_Tag"
162
+ data-selector-id="tag"
163
+ data-test-id="tag_Tag"
164
+ data-title="text2"
165
+ tabindex="0"
166
+ >
167
+ <div
168
+ aria-hidden="true"
169
+ class="text mediumtext"
170
+ id="6"
171
+ >
172
+ text2
173
+ </div>
174
+ <button
175
+ aria-label="Delete"
176
+ class="buttonReset close
177
+ lgRadiusClose
178
+ closedanger"
179
+ data-id="tag_RemoveTag"
180
+ data-test-id="tag_RemoveTag"
181
+ type="button"
182
+ value="text"
183
+ >
184
+ <div
185
+ class="flex cover coldir both"
186
+ data-id="containerComponent"
187
+ data-selector-id="container"
188
+ data-test-id="containerComponent"
189
+ >
190
+ <i
191
+ aria-hidden="true"
192
+ class="zd_font_icons basic icon-close2 fbold "
193
+ data-id="fontIcon"
194
+ data-selector-id="fontIcon"
195
+ data-test-id="fontIcon"
196
+ style="--zd-iconfont-size: var(--zd_font_size8);"
197
+ />
198
+ </div>
199
+ </button>
200
+ </div>
201
+ </div>
202
+ <div
203
+ class="tag medium shrinkOff"
204
+ data-id="multiSelect_selectedOptions"
205
+ data-selector-id="box"
206
+ data-test-id="multiSelect_selectedOptions"
207
+ >
208
+ <div
209
+ aria-labelledby="7"
210
+ class="container effect medium lgRadius danger pointer "
211
+ data-id="tag_Tag"
212
+ data-selector-id="tag"
213
+ data-test-id="tag_Tag"
214
+ data-title="text3"
215
+ tabindex="0"
216
+ >
217
+ <div
218
+ aria-hidden="true"
219
+ class="text mediumtext"
220
+ id="7"
221
+ >
222
+ text3
223
+ </div>
224
+ <button
225
+ aria-label="Delete"
226
+ class="buttonReset close
227
+ lgRadiusClose
228
+ closedanger"
229
+ data-id="tag_RemoveTag"
230
+ data-test-id="tag_RemoveTag"
231
+ type="button"
232
+ value="text"
233
+ >
234
+ <div
235
+ class="flex cover coldir both"
236
+ data-id="containerComponent"
237
+ data-selector-id="container"
238
+ data-test-id="containerComponent"
239
+ >
240
+ <i
241
+ aria-hidden="true"
242
+ class="zd_font_icons basic icon-close2 fbold "
243
+ data-id="fontIcon"
244
+ data-selector-id="fontIcon"
245
+ data-test-id="fontIcon"
246
+ style="--zd-iconfont-size: var(--zd_font_size8);"
247
+ />
248
+ </div>
249
+ </button>
250
+ </div>
251
+ </div>
252
+ <div
253
+ class="wrapper grow basisAuto shrinkOn"
254
+ data-id="boxComponent"
255
+ data-selector-id="box"
256
+ data-test-id="boxComponent"
257
+ >
258
+ <span
259
+ class=" custmSpan custmSpanMedium clearIconSpace
260
+ "
261
+ />
262
+ <div
263
+ class="container effect custmInputWrapper flex rowdir"
264
+ data-id="containerComponent"
265
+ data-selector-id="textBoxIcon"
266
+ data-test-id="containerComponent"
267
+ >
268
+ <div
269
+ class="grow basis shrinkOff"
270
+ data-id="boxComponent"
271
+ data-selector-id="box"
272
+ data-test-id="boxComponent"
273
+ >
274
+ <input
275
+ aria-expanded="false"
276
+ aria-haspopup="true"
277
+ aria-required="true"
278
+ autocomplete="off"
279
+ class=" container medium default effect borderColor_default "
280
+ data-id="multiSelect_textBox"
281
+ data-selector-id="textBoxIcon"
282
+ data-test-id="multiSelect_textBox"
283
+ maxlength="250"
284
+ placeholder=""
285
+ role="combobox"
286
+ type="text"
287
+ value=""
288
+ />
289
+ </div>
290
+ <div
291
+ class="iconContainer shrinkOff"
292
+ data-id="boxComponent"
293
+ data-selector-id="box"
294
+ data-test-id="boxComponent"
295
+ >
296
+ <div
297
+ class="flex cover rowdir"
298
+ data-id="containerComponent"
299
+ data-selector-id="container"
300
+ data-test-id="containerComponent"
301
+ >
302
+ <div
303
+ class="icon shrinkOff"
304
+ data-id="boxComponent"
305
+ data-selector-id="box"
306
+ data-test-id="boxComponent"
307
+ >
308
+ <div
309
+ class="rightPlaceholder inflex rowdir vCenter"
310
+ data-id="containerComponent"
311
+ data-selector-id="container"
312
+ data-test-id="containerComponent"
313
+ >
314
+ <button
315
+ class="delete defaultDelete shrinkOff"
316
+ data-id="multiSelect_clearIcon"
317
+ data-selector-id="box"
318
+ data-test-id="multiSelect_clearIcon"
319
+ data-title="Clear Selected Items"
320
+ >
321
+ <i
322
+ aria-hidden="true"
323
+ class="zd_font_icons basic icon-delete rtl "
324
+ data-id="fontIcon"
325
+ data-selector-id="fontIcon"
326
+ data-test-id="fontIcon"
327
+ style="--zd-iconfont-size: var(--zd_font_size15);"
328
+ />
329
+ </button>
330
+ </div>
331
+ </div>
332
+ </div>
333
+ </div>
334
+ </div>
335
+ </div>
336
+ </div>
337
+ </div>
338
+ </DocumentFragment>
339
+ `;