@3t-transform/threeteeui 0.2.73 → 0.2.75

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 (27) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/tttx-multiselect-box.cjs.entry.js +130 -0
  3. package/dist/cjs/tttx-select-box.cjs.entry.js +1 -1
  4. package/dist/cjs/tttx.cjs.js +1 -1
  5. package/dist/collection/collection-manifest.json +1 -0
  6. package/dist/collection/components/molecules/tttx-multiselect-box/tttx-multiselect-box.css +135 -0
  7. package/dist/collection/components/molecules/tttx-multiselect-box/tttx-multiselect-box.js +339 -0
  8. package/dist/collection/components/molecules/tttx-multiselect-box/tttx-multiselect-box.stories.js +201 -0
  9. package/dist/collection/components/molecules/tttx-select-box/tttx-select-box.css +2 -1
  10. package/dist/collection/components/molecules/tttx-select-box/tttx-select-box.stories.js +10 -0
  11. package/dist/components/index.d.ts +1 -0
  12. package/dist/components/index.js +1 -0
  13. package/dist/components/tttx-multiselect-box.d.ts +11 -0
  14. package/dist/components/tttx-multiselect-box.js +172 -0
  15. package/dist/components/tttx-select-box.js +1 -1
  16. package/dist/esm/loader.js +1 -1
  17. package/dist/esm/tttx-multiselect-box.entry.js +126 -0
  18. package/dist/esm/tttx-select-box.entry.js +1 -1
  19. package/dist/esm/tttx.js +1 -1
  20. package/dist/tttx/p-77fed2a6.entry.js +1 -0
  21. package/dist/tttx/{p-d9444b12.entry.js → p-887f56cb.entry.js} +1 -1
  22. package/dist/tttx/tttx.esm.js +1 -1
  23. package/dist/types/components/molecules/tttx-multiselect-box/interfaces.d.ts +6 -0
  24. package/dist/types/components/molecules/tttx-multiselect-box/tttx-multiselect-box.d.ts +38 -0
  25. package/dist/types/components/molecules/tttx-multiselect-box/tttx-multiselect-box.stories.d.ts +15 -0
  26. package/dist/types/components.d.ts +39 -4
  27. package/package.json +1 -1
@@ -0,0 +1,339 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import { h, Host } from '@stencil/core';
3
+ import * as DOMPurify from 'dompurify';
4
+ import domSanitiserOptions from '../../../shared/domsanitiser.options';
5
+ export class TttxMultiselectBox {
6
+ constructor() {
7
+ this.bodyOffset = {};
8
+ this.optionsData = null;
9
+ this.label = undefined;
10
+ this.inline = undefined;
11
+ this.placeholder = '';
12
+ this.searchEnabled = undefined;
13
+ this.htmlVisibleValue = undefined;
14
+ this.visibleValue = undefined;
15
+ this.open = false;
16
+ this.unsavedSelectedItems = undefined;
17
+ this.searchTerm = '';
18
+ }
19
+ handleCloseSelectBox() {
20
+ this.open = false;
21
+ }
22
+ handleBlur() {
23
+ this.open = false;
24
+ this.toggleOpen.emit(false);
25
+ }
26
+ /**
27
+ * We want to generally clone instances of optionsData, _optionsData and unsavedSelectedItems
28
+ * This is because they may be assigned from each other, but have different purposes
29
+ * If we don't clone them, changing one may propagate to the others
30
+ * JSON.parse/stringify will deep clone them, so the references of the array elements will also change
31
+ */
32
+ safelyCloneArray(arr) {
33
+ return JSON.parse(JSON.stringify(arr));
34
+ }
35
+ onDropdownClicked() {
36
+ this.open = !this.open;
37
+ this.searchTerm = '';
38
+ this.calculateDropdownMenuOffset();
39
+ this.toggleOpen.emit(this.open);
40
+ }
41
+ onCancel() {
42
+ this.open = false;
43
+ this.unsavedSelectedItems = this.safelyCloneArray(this._optionsData);
44
+ this.toggleOpen.emit(false);
45
+ }
46
+ applyChanges() {
47
+ this.open = false;
48
+ this.changesApplied.emit(this.safelyCloneArray(this.unsavedSelectedItems));
49
+ }
50
+ onItemSelected(option) {
51
+ const optionIndex = this.unsavedSelectedItems.findIndex((item) => item.value === option.value);
52
+ this.unsavedSelectedItems[optionIndex] = Object.assign(Object.assign({}, option), { selected: !option.selected });
53
+ this.unsavedSelectedItems = [...this.unsavedSelectedItems];
54
+ this.selectItemEvent.emit(option);
55
+ }
56
+ dropdownSelectorContent() {
57
+ if (!this._optionsData.find((item) => item.selected))
58
+ return h("div", { class: "placeholder" }, this.placeholder);
59
+ if (this.htmlVisibleValue) {
60
+ const sanitisedHTML = DOMPurify.sanitize(this.visibleValue, domSanitiserOptions);
61
+ return h("div", { class: "dropdown-selector-html-content", innerHTML: sanitisedHTML });
62
+ }
63
+ return h("div", null, this.visibleValue);
64
+ }
65
+ dropdownOption(option) {
66
+ // This is tested in e2e tests
67
+ /* istanbul ignore next */
68
+ const hideOption = this.searchEnabled && option.label.toLowerCase().indexOf(this.searchTerm.toLowerCase()) === -1;
69
+ const checkboxIcon = option.selected ? 'check_box' : 'check_box_outline_blank';
70
+ const checkboxColor = option.selected ? 'blue' : 'grey';
71
+ if (option.html) {
72
+ const sanitisedHTML = DOMPurify.sanitize(option.html, domSanitiserOptions);
73
+ // This is tested in e2e tests
74
+ /* istanbul ignore next */
75
+ return (h("div", { class: `dropdown-option ${hideOption ? 'hidden' : ''} ${option.selected ? 'selected' : ''}`, onClick: this.onItemSelected.bind(this, option), key: option.label }, h("tttx-icon", { icon: checkboxIcon, color: checkboxColor, class: 'checkbox-icon' }), h("div", { innerHTML: sanitisedHTML })));
76
+ }
77
+ // This is tested in e2e tests
78
+ /* istanbul ignore next */
79
+ return (h("div", { class: `dropdown-option ${hideOption ? 'hidden' : ''} ${option.selected ? 'selected' : ''}`, onClick: this.onItemSelected.bind(this, option), key: option.label }, h("tttx-icon", { icon: checkboxIcon, color: checkboxColor, class: 'checkbox-icon' }), h("div", { class: "plaintext-option" }, option.label)));
80
+ }
81
+ // This is tested in e2e tests
82
+ /* istanbul ignore next */
83
+ handleSearchInput(event) {
84
+ const target = event.target;
85
+ this.searchTerm = target.value;
86
+ }
87
+ calculateDropdownMenuOffset() {
88
+ const dropdownSelector = this.el.shadowRoot.querySelector('.dropdown-selector');
89
+ const bottomPosY = dropdownSelector.getBoundingClientRect().bottom;
90
+ // (Max list height OR 36px * number of items) + 52px for search bar + 45px for footer + 8px padding at bottom
91
+ let dropdownMenuMaxHeight = Math.min((288), 36 * this._optionsData.length) + 45 + 8;
92
+ if (this.searchEnabled)
93
+ dropdownMenuMaxHeight += 52;
94
+ if (bottomPosY + dropdownMenuMaxHeight > window.innerHeight) {
95
+ this.bodyOffset = { bottom: '16px', position: 'fixed', width: `${dropdownSelector.offsetWidth}px` };
96
+ }
97
+ else {
98
+ this.bodyOffset = {};
99
+ }
100
+ }
101
+ render() {
102
+ if (!this.optionsData)
103
+ return;
104
+ this._optionsData = typeof this.optionsData === 'string' ? JSON.parse(this.optionsData) : this.optionsData;
105
+ // initialise, if not already. After initialisation, this will be managed by internal state
106
+ // Check is performed in render in case initial render did not include optionsData
107
+ if (!this.unsavedSelectedItems)
108
+ this.unsavedSelectedItems = this.safelyCloneArray(this._optionsData);
109
+ const chevronIcon = this.open ? 'expand_less' : 'expand_more';
110
+ return (h(Host, { class: this.inline ? 'inline' : 'block' }, this.label && h("div", { class: "label" }, this.label), h("div", { tabindex: "0", class: "dropdown-container" }, h("div", { class: "dropdown-selector", onClick: this.onDropdownClicked.bind(this) }, this.dropdownSelectorContent(), h("div", { class: "dropdown-selector-chevron" }, h("tttx-icon", { icon: chevronIcon, color: "black" }))), this.open && (h("div", { class: "dropdown-body-container" }, h("div", { class: "dropdown-body", style: Object.assign({}, this.bodyOffset) }, this.searchEnabled &&
111
+ /* istanbul ignore next */
112
+ h("div", { class: "searchbox" }, h("tttx-standalone-input", { type: "text", label: "", required: true, showerrorbubble: false, iconleft: 'search', onInput: this.handleSearchInput.bind(this), inline: true })), h("div", { class: "dropdown-options-list" }, this.unsavedSelectedItems.map((option) => {
113
+ return this.dropdownOption(option);
114
+ })), h("div", { class: 'footer' }, h("tttx-button", { design: "primary", onClick: this.applyChanges.bind(this) }, "Apply"), h("tttx-button", { onClick: this.onCancel.bind(this) }, "Cancel"))))))));
115
+ }
116
+ static get is() { return "tttx-multiselect-box"; }
117
+ static get encapsulation() { return "shadow"; }
118
+ static get originalStyleUrls() {
119
+ return {
120
+ "$": ["tttx-multiselect-box.scss"]
121
+ };
122
+ }
123
+ static get styleUrls() {
124
+ return {
125
+ "$": ["tttx-multiselect-box.css"]
126
+ };
127
+ }
128
+ static get properties() {
129
+ return {
130
+ "optionsData": {
131
+ "type": "string",
132
+ "mutable": false,
133
+ "complexType": {
134
+ "original": "string | SelectItem[]",
135
+ "resolved": "SelectItem[] | string",
136
+ "references": {
137
+ "SelectItem": {
138
+ "location": "import",
139
+ "path": "./interfaces"
140
+ }
141
+ }
142
+ },
143
+ "required": false,
144
+ "optional": false,
145
+ "docs": {
146
+ "tags": [],
147
+ "text": ""
148
+ },
149
+ "attribute": "options-data",
150
+ "reflect": false,
151
+ "defaultValue": "null"
152
+ },
153
+ "label": {
154
+ "type": "string",
155
+ "mutable": false,
156
+ "complexType": {
157
+ "original": "string",
158
+ "resolved": "string",
159
+ "references": {}
160
+ },
161
+ "required": false,
162
+ "optional": false,
163
+ "docs": {
164
+ "tags": [],
165
+ "text": ""
166
+ },
167
+ "attribute": "label",
168
+ "reflect": false
169
+ },
170
+ "inline": {
171
+ "type": "boolean",
172
+ "mutable": false,
173
+ "complexType": {
174
+ "original": "boolean",
175
+ "resolved": "boolean",
176
+ "references": {}
177
+ },
178
+ "required": false,
179
+ "optional": false,
180
+ "docs": {
181
+ "tags": [],
182
+ "text": ""
183
+ },
184
+ "attribute": "inline",
185
+ "reflect": false
186
+ },
187
+ "placeholder": {
188
+ "type": "string",
189
+ "mutable": false,
190
+ "complexType": {
191
+ "original": "string",
192
+ "resolved": "string",
193
+ "references": {}
194
+ },
195
+ "required": false,
196
+ "optional": false,
197
+ "docs": {
198
+ "tags": [],
199
+ "text": ""
200
+ },
201
+ "attribute": "placeholder",
202
+ "reflect": false,
203
+ "defaultValue": "''"
204
+ },
205
+ "searchEnabled": {
206
+ "type": "boolean",
207
+ "mutable": false,
208
+ "complexType": {
209
+ "original": "boolean",
210
+ "resolved": "boolean",
211
+ "references": {}
212
+ },
213
+ "required": false,
214
+ "optional": false,
215
+ "docs": {
216
+ "tags": [],
217
+ "text": ""
218
+ },
219
+ "attribute": "search-enabled",
220
+ "reflect": false
221
+ },
222
+ "htmlVisibleValue": {
223
+ "type": "boolean",
224
+ "mutable": false,
225
+ "complexType": {
226
+ "original": "boolean",
227
+ "resolved": "boolean",
228
+ "references": {}
229
+ },
230
+ "required": false,
231
+ "optional": false,
232
+ "docs": {
233
+ "tags": [],
234
+ "text": ""
235
+ },
236
+ "attribute": "html-visible-value",
237
+ "reflect": false
238
+ },
239
+ "visibleValue": {
240
+ "type": "string",
241
+ "mutable": false,
242
+ "complexType": {
243
+ "original": "string",
244
+ "resolved": "string",
245
+ "references": {}
246
+ },
247
+ "required": false,
248
+ "optional": false,
249
+ "docs": {
250
+ "tags": [],
251
+ "text": ""
252
+ },
253
+ "attribute": "visible-value",
254
+ "reflect": false
255
+ }
256
+ };
257
+ }
258
+ static get states() {
259
+ return {
260
+ "open": {},
261
+ "unsavedSelectedItems": {},
262
+ "searchTerm": {}
263
+ };
264
+ }
265
+ static get events() {
266
+ return [{
267
+ "method": "selectItemEvent",
268
+ "name": "selectItemEvent",
269
+ "bubbles": true,
270
+ "cancelable": true,
271
+ "composed": true,
272
+ "docs": {
273
+ "tags": [],
274
+ "text": ""
275
+ },
276
+ "complexType": {
277
+ "original": "SelectItem",
278
+ "resolved": "SelectItem",
279
+ "references": {
280
+ "SelectItem": {
281
+ "location": "import",
282
+ "path": "./interfaces"
283
+ }
284
+ }
285
+ }
286
+ }, {
287
+ "method": "toggleOpen",
288
+ "name": "toggleOpen",
289
+ "bubbles": true,
290
+ "cancelable": true,
291
+ "composed": true,
292
+ "docs": {
293
+ "tags": [],
294
+ "text": ""
295
+ },
296
+ "complexType": {
297
+ "original": "boolean",
298
+ "resolved": "boolean",
299
+ "references": {}
300
+ }
301
+ }, {
302
+ "method": "changesApplied",
303
+ "name": "changesApplied",
304
+ "bubbles": true,
305
+ "cancelable": true,
306
+ "composed": true,
307
+ "docs": {
308
+ "tags": [],
309
+ "text": ""
310
+ },
311
+ "complexType": {
312
+ "original": "SelectItem[]",
313
+ "resolved": "SelectItem[]",
314
+ "references": {
315
+ "SelectItem": {
316
+ "location": "import",
317
+ "path": "./interfaces"
318
+ }
319
+ }
320
+ }
321
+ }];
322
+ }
323
+ static get elementRef() { return "el"; }
324
+ static get listeners() {
325
+ return [{
326
+ "name": "closeSelectBox",
327
+ "method": "handleCloseSelectBox",
328
+ "target": undefined,
329
+ "capture": false,
330
+ "passive": false
331
+ }, {
332
+ "name": "blur",
333
+ "method": "handleBlur",
334
+ "target": undefined,
335
+ "capture": false,
336
+ "passive": false
337
+ }];
338
+ }
339
+ }
@@ -0,0 +1,201 @@
1
+ import { withActions } from '@storybook/addon-actions/decorator';
2
+ export default {
3
+ title: 'molecules/Multiselect Box',
4
+ component: 'tttx-multiselect-box',
5
+ parameters: {
6
+ actions: {
7
+ handles: ['toggleOpen', 'changesApplied'],
8
+ },
9
+ },
10
+ decorators: [withActions],
11
+ };
12
+ const options = [
13
+ { value: 'Bonnie', label: 'Steuber' },
14
+ { value: 'Priscilla', label: 'Lowe' },
15
+ { value: 'Andy', label: 'Thompson-Keebler', html: '<span style="color: red">Thompson-Keebler</span>' },
16
+ { value: 'egg', label: 'egg', html: '<tttx-icon icon="egg" />' },
17
+ { value: 'Terence', label: 'Hyatt' },
18
+ { value: 'Ruben', label: 'Toy' },
19
+ { value: 'Rhiannon', label: 'Hills' },
20
+ { value: 'Trent', label: 'Mueller' },
21
+ { value: 'Penelope', label: 'Mann' },
22
+ { value: 'Oswaldo', label: 'Klocko' },
23
+ { value: 'Jorge', label: 'Lockman' },
24
+ { value: 'Conner', label: 'Feeney' },
25
+ { value: 'Dorian', label: 'Fay' },
26
+ { value: 'Estrella', label: 'Predovic' },
27
+ { value: 'Heidi', label: 'McClure' },
28
+ { value: 'Ronaldo', label: 'Mann' },
29
+ ];
30
+ const TemplateMultiselectBox = args => `
31
+ <tttx-multiselect-box
32
+ id="multiselectBox"
33
+ options-data='${JSON.stringify(args.optionsData)}'
34
+ label='${args.label}'
35
+ placeholder='${args.placeholder}'
36
+ search-enabled='${args.searchEnabled}'
37
+ inline='${args.inline}'
38
+ html-visible-value: true,
39
+ ></tttx-multiselect-box>
40
+
41
+ <script>
42
+ // Handle case where storybook renders this story twice
43
+ if(!multiselectBox.length) {
44
+ multiselectBox.addEventListener('changesApplied', (event) => {
45
+ multiselectBox.optionsData = event.detail;
46
+ multiselectBox.visibleValue = event.detail.filter((option) => option.selected).map((option) => option.label).join(', ')
47
+ })
48
+ }
49
+ </script>
50
+ `;
51
+ export const BasicMultiselectBox = TemplateMultiselectBox.bind({});
52
+ BasicMultiselectBox.args = {
53
+ optionsData: options,
54
+ label: 'Label',
55
+ placeholder: 'Placeholder',
56
+ searchEnabled: true,
57
+ inline: false,
58
+ };
59
+ const htmlOptions = [
60
+ { value: '1', label: 'Client', html: '<tttx-tag text="Client" color="#f2bebe"></tttx-tag>', selected: true },
61
+ { value: '2', label: 'Job Role', html: '<tttx-tag text="Job Role" color="#f9e1be"></tttx-tag>' },
62
+ { value: '3', label: 'Foo', html: '<tttx-tag text="Foo" color="#e4ebc9"></tttx-tag>', selected: true },
63
+ { value: '4', label: 'Bar', html: '<tttx-tag text="Bar" color="#f2bebe"></tttx-tag>', selected: true },
64
+ { value: '5', label: 'Baz', html: '<tttx-tag text="Baz" color="#f9e1be"></tttx-tag>' },
65
+ { value: '6', label: 'Mill', html: '<tttx-tag text="Mill" color="#e4ebc9"></tttx-tag>', selected: true },
66
+ { value: '7', label: 'Hill', html: '<tttx-tag text="Hill" color="#f2bebe"></tttx-tag>', selected: true },
67
+ { value: '8', label: 'Fill', html: '<tttx-tag text="Fill" color="#f9e1be"></tttx-tag>' },
68
+ { value: '9', label: 'Supercalifragilisticexpialidocious', html: '<tttx-tag text="Supercalifragilisticexpialidocious" color="#e4ebc9"></tttx-tag>', selected: true },
69
+ ];
70
+ const TemplateHtmlVisibleValueWrap = args => `
71
+ <div style="height: 400px; width: 50px"></div>
72
+ <div style="width: 300px">
73
+ <tttx-multiselect-box
74
+ id="multiselectBoxVisibleValueWrap"
75
+ options-data='${JSON.stringify(args.optionsData)}'
76
+ label='${args.label}'
77
+ placeholder='${args.placeholder}'
78
+ search-enabled='${args.searchEnabled}'
79
+ inline='${args.inline}'
80
+ html-visible-value='true'
81
+ visible-value='<tttx-tag text="Client" color="#f2bebe"></tttx-tag><tttx-tag text="Foo" color="#e4ebc9"></tttx-tag><tttx-tag text="Bar" color="#f2bebe"></tttx-tag><tttx-tag text="Mill" color="#e4ebc9"></tttx-tag><tttx-tag text="Hill" color="#f2bebe"></tttx-tag><tttx-tag text="Supercalifragilisticexpialidocious" color="#e4ebc9"></tttx-tag>'
82
+ ></tttx-multiselect-box>
83
+ </div>
84
+
85
+ <script>
86
+ // Handle case where storybook renders this story twice
87
+ if(!multiselectBoxVisibleValueWrap.length) {
88
+ multiselectBoxVisibleValueWrap.addEventListener('changesApplied', (event) => {
89
+ multiselectBoxVisibleValueWrap.optionsData = event.detail;
90
+ multiselectBoxVisibleValueWrap.visibleValue = event.detail.filter((option) => option.selected).map((option) => option.html).join('')
91
+ })
92
+ }
93
+ </script>
94
+ `;
95
+ export const HtmlVisibleValueWrap = TemplateHtmlVisibleValueWrap.bind({});
96
+ HtmlVisibleValueWrap.args = {
97
+ optionsData: htmlOptions,
98
+ label: 'Label',
99
+ placeholder: 'Placeholder',
100
+ searchEnabled: true,
101
+ inline: false,
102
+ };
103
+ const htmlOptionsShort = [
104
+ { value: '1', label: 'Client', html: '<tttx-tag text="Client" color="#f2bebe"></tttx-tag>', selected: true },
105
+ { value: '2', label: 'Job Role', html: '<tttx-tag text="Job Role" color="#f9e1be"></tttx-tag>' },
106
+ { value: '3', label: 'Foo', html: '<tttx-tag text="Foo" color="#e4ebc9"></tttx-tag>', selected: true },
107
+ ];
108
+ const TemplateHtmlVisibleValue = args => `
109
+ <tttx-multiselect-box
110
+ id="multiselectBox"
111
+ options-data='${JSON.stringify(args.optionsData)}'
112
+ label='${args.label}'
113
+ placeholder='${args.placeholder}'
114
+ search-enabled='${args.searchEnabled}'
115
+ inline='${args.inline}'
116
+ html-visible-value='true'
117
+ ></tttx-multiselect-box>
118
+
119
+ <script>
120
+ // Handle case where storybook renders this story twice
121
+ if(!multiselectBox.length) {
122
+ multiselectBox.addEventListener('changesApplied', (event) => {
123
+ multiselectBox.optionsData = event.detail;
124
+ multiselectBox.visibleValue = '<span>' + event.detail.filter((option) => option.selected).map((option) => option.html).join(', ') + '</span>'
125
+ })
126
+ }
127
+ </script>
128
+ `;
129
+ export const HtmlVisibleValue = TemplateHtmlVisibleValue.bind({});
130
+ HtmlVisibleValue.args = {
131
+ optionsData: htmlOptionsShort,
132
+ label: 'Label',
133
+ placeholder: 'Placeholder',
134
+ searchEnabled: true,
135
+ inline: false,
136
+ };
137
+ const tagOptions = [
138
+ { value: '1', label: 'Client', html: '<tttx-tag text="Client" color="#f2bebe"></tttx-tag>', selected: true },
139
+ { value: '2', label: 'Job Role', html: '<tttx-tag text="Job Role" color="#f9e1be"></tttx-tag>' },
140
+ { value: '3', label: 'Foo', html: '<tttx-tag text="Foo" color="#e4ebc9"></tttx-tag>', selected: true },
141
+ { value: '4', label: 'Bar', html: '<tttx-tag text="Bar" color="#f2bebe"></tttx-tag>', selected: true },
142
+ { value: '5', label: 'Baz', html: '<tttx-tag text="Baz" color="#f9e1be"></tttx-tag>' },
143
+ { value: '6', label: 'Mill', html: '<tttx-tag text="Mill" color="#e4ebc9"></tttx-tag>', selected: true },
144
+ { value: '7', label: 'Hill', html: '<tttx-tag text="Hill" color="#f2bebe"></tttx-tag>', selected: true },
145
+ { value: '8', label: 'Fill', html: '<tttx-tag text="Fill" color="#f9e1be"></tttx-tag>' },
146
+ { value: '9', label: 'Supercalifragilisticexpialidocious', html: '<tttx-tag text="Supercalifragilisticexpialidocious" color="#e4ebc9"></tttx-tag>', selected: true },
147
+ ];
148
+ const TttxDialogBoxStory = ({ data }) => `
149
+ <button onclick="openDialog()">Open</button>
150
+ <tttx-dialog-box
151
+ id='dialogBox'
152
+ allow-overflow='true'
153
+ ></tttx-dialog-box>
154
+ <script>
155
+ if(!dialogBox) {
156
+ const dialogBox = document.getElementById('dialogBox');
157
+ }
158
+ if(!openDialog) {
159
+ function openDialog() {
160
+ const dialogBox = document.getElementById('dialogBox');
161
+ dialogBox.open = true;
162
+ }
163
+ }
164
+
165
+ dialogBox.data = ${JSON.stringify(data)};
166
+ </script>
167
+ `;
168
+ export const DialogBoxWithDropdown = TttxDialogBoxStory.bind({});
169
+ DialogBoxWithDropdown.args = {
170
+ data: {
171
+ header: {
172
+ title: 'Dialog Title',
173
+ hasIcon: false,
174
+ hasClose: true,
175
+ },
176
+ body: {
177
+ isCustomHtml: true,
178
+ customHtml: `
179
+ <div style="padding: 5px;">
180
+ <tttx-multiselect-box
181
+ id="dropdownSelectBox"
182
+ options-data='${JSON.stringify(tagOptions)}'
183
+ label='Label'
184
+ placeholder='Placeholder'
185
+ search-enabled='${true}'
186
+ inline='${false}'
187
+ visible-value='${tagOptions[0].html} ${tagOptions[2].html}'
188
+ html-visible-value='true'
189
+ ></tttx-multiselect-box>
190
+ </div>
191
+ `,
192
+ },
193
+ footer: {
194
+ buttons: [
195
+ { name: 'primary', type: 'primary' },
196
+ { name: 'default', type: 'default' },
197
+ { name: 'No border', type: 'borderless' },
198
+ ],
199
+ },
200
+ },
201
+ };
@@ -67,6 +67,7 @@
67
67
  box-shadow: 0px 1px 5px #1111114D;
68
68
  padding-bottom: 8px;
69
69
  border: 1px solid #d5d5d5;
70
+ z-index: 1000;
70
71
  }
71
72
  .dropdown-body.search {
72
73
  max-height: 410px;
@@ -91,7 +92,7 @@
91
92
  }
92
93
 
93
94
  .placeholder {
94
- color: #9e9e9e;
95
+ color: #757575;
95
96
  }
96
97
 
97
98
  .searchbox {
@@ -112,6 +112,16 @@ DialogBoxWithDropdown.args = {
112
112
  inline='${false}'
113
113
  selected-value='${tagOptions[1].value}'
114
114
  ></tttx-select-box>
115
+ <tttx-standalone-input
116
+ label='Name'
117
+ placeholder='Enter name'
118
+ />
119
+ <tttx-select-box
120
+ id="htmlSelectBox2"
121
+ options-data='${JSON.stringify(options)}'
122
+ label='Label 2'
123
+ placeholder='Placeholder 2'
124
+ ></tttx-select-box>
115
125
  </div>
116
126
  `,
117
127
  },
@@ -7,6 +7,7 @@ export { TttxIcon as TttxIcon } from '../types/components/atoms/tttx-icon/tttx-i
7
7
  export { TttxKeyvalueBlock as TttxKeyvalueBlock } from '../types/components/atoms/tttx-keyvalue-block/tttx-keyvalue-block';
8
8
  export { TttxList as TttxList } from '../types/components/molecules/tttx-list/tttx-list';
9
9
  export { TttxLoadingSpinner as TttxLoadingSpinner } from '../types/components/atoms/tttx-loading-spinner/tttx-loading-spinner';
10
+ export { TttxMultiselectBox as TttxMultiselectBox } from '../types/components/molecules/tttx-multiselect-box/tttx-multiselect-box';
10
11
  export { TttxQrCode as TttxQrcode } from '../types/components/atoms/tttx-qrcode/tttx-qrcode';
11
12
  export { TttxSelectBox as TttxSelectBox } from '../types/components/molecules/tttx-select-box/tttx-select-box';
12
13
  export { TttxSorter as TttxSorter } from '../types/components/molecules/tttx-sorter/tttx-sorter';
@@ -7,6 +7,7 @@ export { TttxIcon, defineCustomElement as defineCustomElementTttxIcon } from './
7
7
  export { TttxKeyvalueBlock, defineCustomElement as defineCustomElementTttxKeyvalueBlock } from './tttx-keyvalue-block.js';
8
8
  export { TttxList, defineCustomElement as defineCustomElementTttxList } from './tttx-list.js';
9
9
  export { TttxLoadingSpinner, defineCustomElement as defineCustomElementTttxLoadingSpinner } from './tttx-loading-spinner.js';
10
+ export { TttxMultiselectBox, defineCustomElement as defineCustomElementTttxMultiselectBox } from './tttx-multiselect-box.js';
10
11
  export { TttxQrcode, defineCustomElement as defineCustomElementTttxQrcode } from './tttx-qrcode.js';
11
12
  export { TttxSelectBox, defineCustomElement as defineCustomElementTttxSelectBox } from './tttx-select-box.js';
12
13
  export { TttxSorter, defineCustomElement as defineCustomElementTttxSorter } from './tttx-sorter.js';
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface TttxMultiselectBox extends Components.TttxMultiselectBox, HTMLElement {}
4
+ export const TttxMultiselectBox: {
5
+ prototype: TttxMultiselectBox;
6
+ new (): TttxMultiselectBox;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;