@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.
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/tttx-multiselect-box.cjs.entry.js +130 -0
- package/dist/cjs/tttx-select-box.cjs.entry.js +1 -1
- package/dist/cjs/tttx.cjs.js +1 -1
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/molecules/tttx-multiselect-box/tttx-multiselect-box.css +135 -0
- package/dist/collection/components/molecules/tttx-multiselect-box/tttx-multiselect-box.js +339 -0
- package/dist/collection/components/molecules/tttx-multiselect-box/tttx-multiselect-box.stories.js +201 -0
- package/dist/collection/components/molecules/tttx-select-box/tttx-select-box.css +2 -1
- package/dist/collection/components/molecules/tttx-select-box/tttx-select-box.stories.js +10 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/tttx-multiselect-box.d.ts +11 -0
- package/dist/components/tttx-multiselect-box.js +172 -0
- package/dist/components/tttx-select-box.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/tttx-multiselect-box.entry.js +126 -0
- package/dist/esm/tttx-select-box.entry.js +1 -1
- package/dist/esm/tttx.js +1 -1
- package/dist/tttx/p-77fed2a6.entry.js +1 -0
- package/dist/tttx/{p-d9444b12.entry.js → p-887f56cb.entry.js} +1 -1
- package/dist/tttx/tttx.esm.js +1 -1
- package/dist/types/components/molecules/tttx-multiselect-box/interfaces.d.ts +6 -0
- package/dist/types/components/molecules/tttx-multiselect-box/tttx-multiselect-box.d.ts +38 -0
- package/dist/types/components/molecules/tttx-multiselect-box/tttx-multiselect-box.stories.d.ts +15 -0
- package/dist/types/components.d.ts +39 -4
- 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
|
+
}
|
package/dist/collection/components/molecules/tttx-multiselect-box/tttx-multiselect-box.stories.js
ADDED
|
@@ -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: #
|
|
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';
|
package/dist/components/index.js
CHANGED
|
@@ -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;
|