@3t-transform/threeteeui 0.2.115 → 0.2.117

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.
@@ -1,5 +1,8 @@
1
1
  import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
2
2
  import { p as purify, d as domSanitiserOptions } from './domsanitiser.options.js';
3
+ import { d as defineCustomElement$4 } from './tttx-icon2.js';
4
+ import { d as defineCustomElement$3 } from './tttx-select-box2.js';
5
+ import { d as defineCustomElement$2 } from './tttx-standalone-input2.js';
3
6
 
4
7
  /**
5
8
  * Validates the input field on focusout event by checking its validity state,
@@ -191,7 +194,7 @@ const TttxForm$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
191
194
  */
192
195
  async setSelectOptions(fieldname, options) {
193
196
  const select = this.fieldset.querySelector(`[name=${fieldname}]`);
194
- select.innerHTML = '';
197
+ const tttxSelect = this.fieldset.querySelector(`[name=overlay-${fieldname}]`);
195
198
  const fragment = new DocumentFragment();
196
199
  for (const option of options) {
197
200
  const o = document.createElement('option');
@@ -199,7 +202,10 @@ const TttxForm$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
199
202
  o.value = option.value;
200
203
  fragment.appendChild(o);
201
204
  }
202
- select.appendChild(fragment);
205
+ select.replaceChildren(fragment);
206
+ tttxSelect.optionsData = options;
207
+ //await tttxSelect.setOptionsData(options);
208
+ await tttxSelect.setSelectedItem(options[0].value);
203
209
  }
204
210
  /**
205
211
  * Submits the form data to the server.
@@ -256,7 +262,7 @@ const TttxForm$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
256
262
  * @param {boolean} [formProperties.options[].placeholder]
257
263
  */
258
264
  createSelect(formKey, formProperties) {
259
- var _a;
265
+ var _a, _b, _c, _d;
260
266
  const select = document.createElement('select');
261
267
  select.setAttribute('name', formKey);
262
268
  formProperties.options.forEach(optionProperties => {
@@ -264,7 +270,23 @@ const TttxForm$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
264
270
  });
265
271
  if ((_a = this._data) === null || _a === void 0 ? void 0 : _a[formKey])
266
272
  select.classList.remove('placeholder');
267
- return select;
273
+ const tttxSelect = document.createElement('tttx-select-box');
274
+ tttxSelect.optionsData = (_b = formProperties.options) === null || _b === void 0 ? void 0 : _b.filter(o => !o.placeholder);
275
+ tttxSelect.placeholder = (_d = (_c = formProperties.options) === null || _c === void 0 ? void 0 : _c.filter(o => o.placeholder)[0]) === null || _d === void 0 ? void 0 : _d.label;
276
+ tttxSelect.inline = false;
277
+ tttxSelect.searchEnabled = true;
278
+ tttxSelect.style.width = '100%';
279
+ tttxSelect.style.marginTop = '6px';
280
+ tttxSelect.setAttribute('name', 'overlay-' + formKey);
281
+ const fragment = document.createDocumentFragment();
282
+ fragment.append(tttxSelect);
283
+ select.style.display = 'none';
284
+ tttxSelect.addEventListener('selectItemEvent', function (ev) {
285
+ select.value = ev.detail.value;
286
+ select.onblur({ target: select }); // triggers validator
287
+ select.onchange({ target: select }); // triggers dataChanged event
288
+ });
289
+ return { input: select, overlay: fragment };
268
290
  }
269
291
  /**
270
292
  * Appends an option to a select element
@@ -492,10 +514,11 @@ const TttxForm$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
492
514
  *
493
515
  * @param {Record<string, any>} formProperties - An object containing properties for the form field, including its label text and validation rules.
494
516
  * @param {HTMLInputElement | HTMLSelectElement} input - The input element to associate with the label.
517
+ * @param {never} overlay - The Child Element which will be rendered atop the standard HTML5 element
495
518
  * @param {HTMLDivElement} errorBubble - The error bubble element to display error messages in.
496
519
  * @return {HTMLLabelElement} - The new label element.
497
520
  */
498
- createLabel(formProperties, input, errorBubble) {
521
+ createLabel(formProperties, input, overlay, errorBubble) {
499
522
  var _a;
500
523
  const outerContainer = document.createElement('div');
501
524
  let outerContainerClassName = 'outer-container inputBlock';
@@ -521,6 +544,9 @@ const TttxForm$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
521
544
  }
522
545
  else {
523
546
  // Append the input element and error bubble element to the outerContainer
547
+ if (overlay) {
548
+ outerContainer.appendChild(overlay);
549
+ }
524
550
  outerContainer.appendChild(input);
525
551
  }
526
552
  if (formProperties.type !== 'checkbox') {
@@ -590,33 +616,33 @@ const TttxForm$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
590
616
  this.template.content.append(end);
591
617
  continue;
592
618
  }
593
- let input;
619
+ let fragments = {};
594
620
  switch (formProperties.type) {
595
621
  case 'select':
596
- input = this.createSelect(formKey, formProperties);
622
+ fragments = this.createSelect(formKey, formProperties);
597
623
  break;
598
624
  case 'radio':
599
- input = this.createRadio(formKey, formProperties);
625
+ fragments.input = this.createRadio(formKey, formProperties);
600
626
  break;
601
627
  case 'textarea':
602
- input = this.createTextArea(formKey, formProperties);
628
+ fragments.input = this.createTextArea(formKey, formProperties);
603
629
  break;
604
630
  default:
605
- input = this.createInput(formKey, formProperties);
631
+ fragments.input = this.createInput(formKey, formProperties);
606
632
  }
607
633
  // If the form property has validation, apply it to the input
608
634
  if (formProperties.validation &&
609
635
  formProperties.type !== 'radio') {
610
- this.applyValidation(input, formProperties.validation);
636
+ this.applyValidation(fragments.input, formProperties.validation);
611
637
  }
612
638
  // Create an error bubble and label element for the input
613
639
  const errorBubble = this.createErrorBubble();
614
- const label = this.createLabel(formProperties, input, errorBubble);
640
+ const label = this.createLabel(formProperties, fragments.input, fragments.overlay, errorBubble);
615
641
  // If explicitly setting input as invalid, set invalid state and error message on render
616
642
  if ((_a = formProperties.validation) === null || _a === void 0 ? void 0 : _a.invalid) {
617
643
  const errorMessage = formProperties.validation.invalid.message;
618
- input.setCustomValidity(errorMessage); // Prevents the invalid styling from resetting on blur
619
- setErrorState(input, true, errorMessage);
644
+ fragments.input.setCustomValidity(errorMessage); // Prevents the invalid styling from resetting on blur
645
+ setErrorState(fragments.input, true, errorMessage);
620
646
  }
621
647
  // Append the label element to the form template
622
648
  this.template.content.append(label);
@@ -637,7 +663,7 @@ const TttxForm$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
637
663
  return;
638
664
  }
639
665
  // Clone the template's content and store it in a variable
640
- const formItems = this.template.content.cloneNode(true);
666
+ const formItems = this.template.content;
641
667
  // Bind event listeners to form elements
642
668
  const properties = this._formSchema.properties;
643
669
  const propertyKeys = Object.keys(properties);
@@ -685,6 +711,11 @@ const TttxForm$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
685
711
  formItem.checked = true;
686
712
  }
687
713
  break;
714
+ case 'select':
715
+ case 'select-one':
716
+ formItems.querySelector(`[name=overlay-${key}]`).selectedValue = this._data[key];
717
+ formItem.value = this._data[key];
718
+ break;
688
719
  default:
689
720
  formItem.value = this._data[key];
690
721
  }
@@ -785,13 +816,28 @@ function defineCustomElement$1() {
785
816
  if (typeof customElements === "undefined") {
786
817
  return;
787
818
  }
788
- const components = ["tttx-form"];
819
+ const components = ["tttx-form", "tttx-icon", "tttx-select-box", "tttx-standalone-input"];
789
820
  components.forEach(tagName => { switch (tagName) {
790
821
  case "tttx-form":
791
822
  if (!customElements.get(tagName)) {
792
823
  customElements.define(tagName, TttxForm$1);
793
824
  }
794
825
  break;
826
+ case "tttx-icon":
827
+ if (!customElements.get(tagName)) {
828
+ defineCustomElement$4();
829
+ }
830
+ break;
831
+ case "tttx-select-box":
832
+ if (!customElements.get(tagName)) {
833
+ defineCustomElement$3();
834
+ }
835
+ break;
836
+ case "tttx-standalone-input":
837
+ if (!customElements.get(tagName)) {
838
+ defineCustomElement$2();
839
+ }
840
+ break;
795
841
  } });
796
842
  }
797
843
 
@@ -1,158 +1,4 @@
1
- import { proxyCustomElement, HTMLElement, createEvent, h, Fragment, Host } from '@stencil/core/internal/client';
2
- import { p as purify, d as domSanitiserOptions } from './domsanitiser.options.js';
3
- import { d as defineCustomElement$3 } from './tttx-icon2.js';
4
- import { d as defineCustomElement$2 } from './tttx-standalone-input2.js';
5
-
6
- const tttxSelectBoxCss = ".material-symbols-rounded{font-variation-settings:\"FILL\" 1, \"wght\" 400, \"GRAD\" 0, \"opsz\" 24}:host{display:flex;gap:4px}.label{font-size:16px;font-weight:500;line-height:18.752px;color:#212121}:host(.inline) .label{padding-top:8px}:host(.block){flex-direction:column}.dropdown-container{position:relative;display:flex;flex-direction:column;width:100%}.dropdown-container:focus-visible{outline:none}.dropdown-container:focus .dropdown-selector{border:1px solid #1479c6}.dropdown-selector,.dropdown-body{display:flex;border-radius:4px;background-color:white}.dropdown-selector{min-height:36px;box-sizing:border-box;align-items:center;gap:8px;padding:4px 8px 4px 16px;cursor:pointer;justify-content:space-between;border:1px solid #d5d5d5;display:flex;flex-direction:row}.dropdown-selector>.left-wrapper{flex:1;min-width:0}.description{color:#757575;font-size:14px;line-height:16.408px}.description>p{margin:0}.description-dd{color:#757575;font-size:14px;line-height:16.408px}.description-dd>p{margin:0}.truncated-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#212121;font-size:16px;line-height:18.752px}.dropdown-selector-chevron{height:24px}.dropdown-selector-chevron-offset{height:24px}.dropdown-selector-chevron>tttx-icon{cursor:pointer}.dropdown-body-container{position:relative;z-index:2}.dropdown-body{position:absolute;flex-direction:column;box-shadow:0px 1px 5px #1111114D;padding-bottom:8px;border:1px solid #d5d5d5}.dropdown-options-list{display:flex;flex-direction:column;overflow-y:auto;max-height:368px}.dropdown-option{padding:6px 8px 6px 16px;cursor:pointer}.dropdown-option:hover{background-color:#1111110d}.dropdown-option:active,.dropdown-option.selected{background-color:#ebfbfc}.placeholder{color:#9e9e9e;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.searchbox{padding:8px 16px}.searchbox tttx-standalone-input{margin-top:-4px}.hidden{display:none}";
7
-
8
- const TttxSelectBox$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
9
- constructor() {
10
- super();
11
- this.__registerHost();
12
- this.__attachShadow();
13
- this.selectItemEvent = createEvent(this, "selectItemEvent", 3);
14
- this.toggleOpen = createEvent(this, "toggleOpen", 3);
15
- this.bodyOffset = {};
16
- this.optionsData = null;
17
- this.label = undefined;
18
- this.inline = undefined;
19
- this.placeholder = '';
20
- this.searchEnabled = undefined;
21
- this.selectedValue = undefined;
22
- this.open = false;
23
- this.selectedItem = undefined;
24
- this.searchTerm = '';
25
- }
26
- async componentWillLoad() {
27
- if (this.optionsData) {
28
- // attempt to preselect an item if specified
29
- const parsedOptionsData = (typeof this.optionsData === 'string') ? JSON.parse(this.optionsData) : this.optionsData;
30
- const matchingItems = parsedOptionsData.filter((item) => { return item.value == this.selectedValue; });
31
- this.selectedItem = (matchingItems.length > 0) ? matchingItems[0] : undefined;
32
- }
33
- }
34
- handleCloseSelectBox() {
35
- this.open = false;
36
- }
37
- handleBlur() {
38
- this.open = false;
39
- this.toggleOpen.emit(false);
40
- }
41
- onDropdownClicked() {
42
- this.open = !this.open;
43
- this.searchTerm = '';
44
- this.calculateDropdownMenuOffset();
45
- this.toggleOpen.emit(this.open);
46
- }
47
- onItemSelected(option) {
48
- this.selectedItem = option;
49
- this.selectItemEvent.emit(this.selectedItem);
50
- this.handleBlur();
51
- }
52
- dropdownSelectorContent() {
53
- let title;
54
- let subtitle;
55
- const chevronIcon = this.open ? 'expand_less' : 'expand_more';
56
- const icon = h("tttx-icon", { icon: chevronIcon, color: "black" });
57
- let chevron = h("div", { class: 'dropdown-selector-chevron' }, icon);
58
- if (!this.selectedItem) {
59
- title = h("div", { class: "placeholder" }, this.placeholder);
60
- return h(Fragment, null, title, chevron);
61
- }
62
- else if (this.selectedItem.html) {
63
- title = h("div", { title: this.selectedItem.label, class: "truncated-text", innerHTML: this.selectedItem.html });
64
- return h(Fragment, null, title, chevron);
65
- }
66
- else {
67
- title = h("div", { title: this.selectedItem.label, class: "truncated-text" }, this.selectedItem.label);
68
- if (this.selectedItem.description) {
69
- subtitle = h("div", { class: "description" }, h("p", null, this.selectedItem.description));
70
- chevron = h("div", { class: 'dropdown-selector-chevron-offset' }, icon);
71
- }
72
- return h(Fragment, null, h("div", { class: "left-wrapper" }, title, subtitle), chevron);
73
- }
74
- }
75
- dropdownOption(option) {
76
- /* istanbul ignore next */
77
- const hideOption = this.searchEnabled && option.label.toLowerCase().indexOf(this.searchTerm.toLowerCase()) === -1;
78
- const selected = this.selectedItem && option.value === this.selectedItem.value;
79
- if (option.html) {
80
- const sanitisedHTML = purify.sanitize(option.html, domSanitiserOptions);
81
- /* istanbul ignore next */
82
- return (h("div", { class: `dropdown-option ${hideOption ? 'hidden' : ''} ${selected ? 'selected' : ''}`, onClick: this.onItemSelected.bind(this, option), key: option.label, innerHTML: sanitisedHTML }));
83
- }
84
- else if (option.description) {
85
- return (h("div", { class: `dropdown-option ${hideOption ? 'hidden' : ''} ${selected ? 'selected' : ''}`, onClick: this.onItemSelected.bind(this, option), key: option.label }, option.label, h("div", { class: "description-dd" }, h("p", null, option.description))));
86
- }
87
- /* istanbul ignore next */
88
- return (h("div", { class: `dropdown-option ${hideOption ? 'hidden' : ''} ${selected ? 'selected' : ''}`, onClick: this.onItemSelected.bind(this, option), key: option.label }, option.label));
89
- }
90
- /* istanbul ignore next */
91
- handleSearchInput(event) {
92
- const target = event.target;
93
- this.searchTerm = target.value;
94
- }
95
- calculateDropdownMenuOffset() {
96
- const dropdownSelector = this.el.shadowRoot.querySelector('.dropdown-selector');
97
- const bottomPosY = this.dropdownSelector.getBoundingClientRect().bottom;
98
- // (Max list height OR 31px * number of items) + 52px for search bar + 8px padding at bottom
99
- let dropdownMenuMaxHeight = Math.min((368), 36 * this._optionsData.length) + 8;
100
- if (this.searchEnabled)
101
- dropdownMenuMaxHeight += 52;
102
- const clientRectangle = dropdownSelector.getBoundingClientRect();
103
- if (bottomPosY + dropdownMenuMaxHeight > window.innerHeight) {
104
- this.bodyOffset = { top: `${window.innerHeight - (dropdownMenuMaxHeight + 16)}px`, position: 'fixed', width: `${dropdownSelector.offsetWidth}px`, zIndex: '10' };
105
- }
106
- else {
107
- this.bodyOffset = { position: 'fixed', left: clientRectangle.left, top: clientRectangle.top, width: (clientRectangle.width - 2) + 'px', zIndex: '10' };
108
- }
109
- }
110
- render() {
111
- if (!this.optionsData)
112
- return;
113
- this._optionsData = typeof this.optionsData === 'string' ? JSON.parse(this.optionsData) : this.optionsData;
114
- 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", ref: (el) => this.dropdownSelector = el, onClick: this.onDropdownClicked.bind(this) }, this.dropdownSelectorContent()), this.open && (h("div", { class: "dropdown-body-container" }, h("div", { class: "dropdown-body", style: Object.assign({ width: `${this.dropdownSelector.offsetWidth}px` }, this.bodyOffset) }, this.searchEnabled &&
115
- /* istanbul ignore next */
116
- h("div", { class: "searchbox" }, h("tttx-standalone-input", { type: "text", label: "", required: true, showerrorbubble: false, iconleft: 'search', onInput: this.handleSearchInput.bind(this) })), h("div", { class: "dropdown-options-list" }, this._optionsData.map((option) => {
117
- return this.dropdownOption(option);
118
- }))))))));
119
- }
120
- get el() { return this; }
121
- static get style() { return tttxSelectBoxCss; }
122
- }, [1, "tttx-select-box", {
123
- "optionsData": [1, "options-data"],
124
- "label": [1],
125
- "inline": [4],
126
- "placeholder": [1],
127
- "searchEnabled": [4, "search-enabled"],
128
- "selectedValue": [1, "selected-value"],
129
- "open": [32],
130
- "selectedItem": [32],
131
- "searchTerm": [32]
132
- }, [[0, "closeSelectBox", "handleCloseSelectBox"], [0, "blur", "handleBlur"]]]);
133
- function defineCustomElement$1() {
134
- if (typeof customElements === "undefined") {
135
- return;
136
- }
137
- const components = ["tttx-select-box", "tttx-icon", "tttx-standalone-input"];
138
- components.forEach(tagName => { switch (tagName) {
139
- case "tttx-select-box":
140
- if (!customElements.get(tagName)) {
141
- customElements.define(tagName, TttxSelectBox$1);
142
- }
143
- break;
144
- case "tttx-icon":
145
- if (!customElements.get(tagName)) {
146
- defineCustomElement$3();
147
- }
148
- break;
149
- case "tttx-standalone-input":
150
- if (!customElements.get(tagName)) {
151
- defineCustomElement$2();
152
- }
153
- break;
154
- } });
155
- }
1
+ import { T as TttxSelectBox$1, d as defineCustomElement$1 } from './tttx-select-box2.js';
156
2
 
157
3
  const TttxSelectBox = TttxSelectBox$1;
158
4
  const defineCustomElement = defineCustomElement$1;
@@ -0,0 +1,171 @@
1
+ import { proxyCustomElement, HTMLElement, createEvent, h, Fragment, Host } from '@stencil/core/internal/client';
2
+ import { p as purify, d as domSanitiserOptions } from './domsanitiser.options.js';
3
+ import { d as defineCustomElement$2 } from './tttx-icon2.js';
4
+ import { d as defineCustomElement$1 } from './tttx-standalone-input2.js';
5
+
6
+ const tttxSelectBoxCss = ".material-symbols-rounded{font-variation-settings:\"FILL\" 1, \"wght\" 400, \"GRAD\" 0, \"opsz\" 24}:host{display:flex;gap:4px}.label{font-size:16px;font-weight:500;line-height:18.752px;color:#212121}:host(.inline) .label{padding-top:8px}:host(.block){flex-direction:column}.dropdown-container{position:relative;display:flex;flex-direction:column;width:100%}.dropdown-container:focus-visible{outline:none}.dropdown-container:focus .dropdown-selector{border:1px solid #1479c6}.dropdown-selector,.dropdown-body{display:flex;border-radius:4px;background-color:white}.dropdown-selector{min-height:36px;box-sizing:border-box;align-items:center;gap:8px;padding:4px 8px 4px 16px;cursor:pointer;justify-content:space-between;border:1px solid #d5d5d5;display:flex;flex-direction:row}.dropdown-selector>.left-wrapper{flex:1;min-width:0}.description{color:#757575;font-size:14px;line-height:16.408px}.description>p{margin:0}.description-dd{color:#757575;font-size:14px;line-height:16.408px}.description-dd>p{margin:0}.truncated-text{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#212121;font-size:16px;line-height:18.752px}.dropdown-selector-chevron{height:24px}.dropdown-selector-chevron-offset{height:24px}.dropdown-selector-chevron>tttx-icon{cursor:pointer}.dropdown-body-container{position:relative;z-index:2}.dropdown-body{position:absolute;flex-direction:column;box-shadow:0px 1px 5px #1111114D;padding-bottom:8px;border:1px solid #d5d5d5}.dropdown-options-list{display:flex;flex-direction:column;overflow-y:auto;max-height:368px}.dropdown-option{padding:6px 8px 6px 16px;cursor:pointer}.dropdown-option:hover{background-color:#1111110d}.dropdown-option:active,.dropdown-option.selected{background-color:#ebfbfc}.placeholder{color:#9e9e9e;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}.searchbox{padding:8px 16px}.searchbox tttx-standalone-input{margin-top:-4px}.hidden{display:none}";
7
+
8
+ const TttxSelectBox = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
9
+ constructor() {
10
+ super();
11
+ this.__registerHost();
12
+ this.__attachShadow();
13
+ this.selectItemEvent = createEvent(this, "selectItemEvent", 3);
14
+ this.toggleOpen = createEvent(this, "toggleOpen", 3);
15
+ this.bodyOffset = {};
16
+ this.optionsData = null;
17
+ this.label = undefined;
18
+ this.inline = undefined;
19
+ this.placeholder = '';
20
+ this.searchEnabled = undefined;
21
+ this.selectedValue = undefined;
22
+ this.open = false;
23
+ this.selectedItem = undefined;
24
+ this.searchTerm = '';
25
+ }
26
+ async componentWillLoad() {
27
+ if (this.optionsData) {
28
+ this.setOptionsData();
29
+ const matchingItems = this._optionsData.filter((item) => { return item.value == this.selectedValue; });
30
+ this.selectedItem = (matchingItems.length > 0) ? matchingItems[0] : undefined;
31
+ }
32
+ }
33
+ async setOptionsData() {
34
+ this._optionsData = typeof this.optionsData === 'string' ? JSON.parse(this.optionsData) : this.optionsData;
35
+ }
36
+ async setSelectedItem(value) {
37
+ if (!value)
38
+ return;
39
+ const item = this._optionsData.find(x => x.value.toLowerCase() === value.toLowerCase());
40
+ if (!item)
41
+ return;
42
+ this.selectedValue = item.value;
43
+ this.selectedItem = item;
44
+ }
45
+ handleCloseSelectBox() {
46
+ this.open = false;
47
+ }
48
+ handleBlur() {
49
+ this.open = false;
50
+ this.toggleOpen.emit(false);
51
+ }
52
+ onDropdownClicked() {
53
+ this.open = !this.open;
54
+ this.searchTerm = '';
55
+ this.calculateDropdownMenuOffset();
56
+ this.toggleOpen.emit(this.open);
57
+ }
58
+ onItemSelected(option) {
59
+ this.selectedItem = option;
60
+ this.selectItemEvent.emit(this.selectedItem);
61
+ this.handleBlur();
62
+ }
63
+ dropdownSelectorContent() {
64
+ let title;
65
+ let subtitle;
66
+ const chevronIcon = this.open ? 'expand_less' : 'expand_more';
67
+ const icon = h("tttx-icon", { icon: chevronIcon, color: "black" });
68
+ let chevron = h("div", { class: 'dropdown-selector-chevron' }, icon);
69
+ if (!this.selectedItem) {
70
+ title = h("div", { class: "placeholder" }, this.placeholder);
71
+ return h(Fragment, null, title, chevron);
72
+ }
73
+ else if (this.selectedItem.html) {
74
+ title = h("div", { title: this.selectedItem.label, class: "truncated-text", innerHTML: this.selectedItem.html });
75
+ return h(Fragment, null, title, chevron);
76
+ }
77
+ else {
78
+ title = h("div", { title: this.selectedItem.label, class: "truncated-text" }, this.selectedItem.label);
79
+ if (this.selectedItem.description) {
80
+ subtitle = h("div", { class: "description" }, h("p", null, this.selectedItem.description));
81
+ chevron = h("div", { class: 'dropdown-selector-chevron-offset' }, icon);
82
+ }
83
+ return h(Fragment, null, h("div", { class: "left-wrapper" }, title, subtitle), chevron);
84
+ }
85
+ }
86
+ dropdownOption(option) {
87
+ /* istanbul ignore next */
88
+ const hideOption = this.searchEnabled && option.label.toLowerCase().indexOf(this.searchTerm.toLowerCase()) === -1;
89
+ const selected = this.selectedItem && option.value === this.selectedItem.value;
90
+ if (option.html) {
91
+ const sanitisedHTML = purify.sanitize(option.html, domSanitiserOptions);
92
+ /* istanbul ignore next */
93
+ return (h("div", { class: `dropdown-option ${hideOption ? 'hidden' : ''} ${selected ? 'selected' : ''}`, onClick: this.onItemSelected.bind(this, option), key: option.label, innerHTML: sanitisedHTML }));
94
+ }
95
+ else if (option.description) {
96
+ return (h("div", { class: `dropdown-option ${hideOption ? 'hidden' : ''} ${selected ? 'selected' : ''}`, onClick: this.onItemSelected.bind(this, option), key: option.label }, option.label, h("div", { class: "description-dd" }, h("p", null, option.description))));
97
+ }
98
+ /* istanbul ignore next */
99
+ return (h("div", { class: `dropdown-option ${hideOption ? 'hidden' : ''} ${selected ? 'selected' : ''}`, onClick: this.onItemSelected.bind(this, option), key: option.label }, option.label));
100
+ }
101
+ /* istanbul ignore next */
102
+ handleSearchInput(event) {
103
+ const target = event.target;
104
+ this.searchTerm = target.value;
105
+ }
106
+ calculateDropdownMenuOffset() {
107
+ const dropdownSelector = this.el.shadowRoot.querySelector('.dropdown-selector');
108
+ const bottomPosY = this.dropdownSelector.getBoundingClientRect().bottom;
109
+ // (Max list height OR 31px * number of items) + 52px for search bar + 8px padding at bottom
110
+ let dropdownMenuMaxHeight = Math.min((368), 36 * this._optionsData.length) + 8;
111
+ if (this.searchEnabled)
112
+ dropdownMenuMaxHeight += 52;
113
+ const clientRectangle = dropdownSelector.getBoundingClientRect();
114
+ if (bottomPosY + dropdownMenuMaxHeight > window.innerHeight) {
115
+ this.bodyOffset = { top: `${window.innerHeight - (dropdownMenuMaxHeight + 16)}px`, position: 'fixed', width: `${dropdownSelector.offsetWidth}px`, zIndex: '10' };
116
+ }
117
+ else {
118
+ this.bodyOffset = { position: 'fixed', left: clientRectangle.left, top: clientRectangle.top, width: (clientRectangle.width - 2) + 'px', zIndex: '10' };
119
+ }
120
+ }
121
+ render() {
122
+ if (!this.optionsData)
123
+ return;
124
+ 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", ref: (el) => this.dropdownSelector = el, onClick: this.onDropdownClicked.bind(this) }, this.dropdownSelectorContent()), this.open && (h("div", { class: "dropdown-body-container" }, h("div", { class: "dropdown-body", style: Object.assign({ width: `${this.dropdownSelector.offsetWidth}px` }, this.bodyOffset) }, this.searchEnabled &&
125
+ /* istanbul ignore next */
126
+ h("div", { class: "searchbox" }, h("tttx-standalone-input", { type: "text", label: "", required: true, showerrorbubble: false, iconleft: 'search', onInput: this.handleSearchInput.bind(this) })), h("div", { class: "dropdown-options-list" }, this._optionsData.map((option) => {
127
+ return this.dropdownOption(option);
128
+ }))))))));
129
+ }
130
+ get el() { return this; }
131
+ static get watchers() { return {
132
+ "optionsData": ["setOptionsData"]
133
+ }; }
134
+ static get style() { return tttxSelectBoxCss; }
135
+ }, [1, "tttx-select-box", {
136
+ "optionsData": [1, "options-data"],
137
+ "label": [1],
138
+ "inline": [4],
139
+ "placeholder": [1],
140
+ "searchEnabled": [4, "search-enabled"],
141
+ "selectedValue": [1, "selected-value"],
142
+ "open": [32],
143
+ "selectedItem": [32],
144
+ "searchTerm": [32],
145
+ "setSelectedItem": [64]
146
+ }, [[0, "closeSelectBox", "handleCloseSelectBox"], [0, "blur", "handleBlur"]]]);
147
+ function defineCustomElement() {
148
+ if (typeof customElements === "undefined") {
149
+ return;
150
+ }
151
+ const components = ["tttx-select-box", "tttx-icon", "tttx-standalone-input"];
152
+ components.forEach(tagName => { switch (tagName) {
153
+ case "tttx-select-box":
154
+ if (!customElements.get(tagName)) {
155
+ customElements.define(tagName, TttxSelectBox);
156
+ }
157
+ break;
158
+ case "tttx-icon":
159
+ if (!customElements.get(tagName)) {
160
+ defineCustomElement$2();
161
+ }
162
+ break;
163
+ case "tttx-standalone-input":
164
+ if (!customElements.get(tagName)) {
165
+ defineCustomElement$1();
166
+ }
167
+ break;
168
+ } });
169
+ }
170
+
171
+ export { TttxSelectBox as T, defineCustomElement as d };
@@ -11,7 +11,7 @@ const patchEsm = () => {
11
11
  const defineCustomElements = (win, options) => {
12
12
  if (typeof window === 'undefined') return Promise.resolve();
13
13
  return patchEsm().then(() => {
14
- return bootstrapLazy([["tttx-data-pattern",[[1,"tttx-data-pattern",{"data":[1],"sorteroptions":[1],"filteroptions":[1],"filterheader":[1]}]]],["tttx-multiselect-box",[[1,"tttx-multiselect-box",{"optionsData":[1,"options-data"],"label":[1],"inline":[4],"placeholder":[1],"searchEnabled":[4,"search-enabled"],"htmlVisibleValue":[4,"html-visible-value"],"visibleValue":[1,"visible-value"],"open":[32],"unsavedSelectedItems":[32],"searchTerm":[32]},[[0,"closeSelectBox","handleCloseSelectBox"],[0,"blur","handleBlur"]]]]],["tttx-dialog-box",[[1,"tttx-dialog-box",{"data":[1025],"size":[1],"open":[1028],"allowOverflow":[4,"allow-overflow"],"elementSize":[32]},[[9,"resize","handleResize"]]]]],["tttx-select-box",[[1,"tttx-select-box",{"optionsData":[1,"options-data"],"label":[1],"inline":[4],"placeholder":[1],"searchEnabled":[4,"search-enabled"],"selectedValue":[1,"selected-value"],"open":[32],"selectedItem":[32],"searchTerm":[32]},[[0,"closeSelectBox","handleCloseSelectBox"],[0,"blur","handleBlur"]]]]],["tttx-tree-view",[[1,"tttx-tree-view",{"data":[1040],"firstSelected":[1028,"first-selected"],"treeData":[32],"selectedId":[32]}]]],["tttx-checkbox",[[0,"tttx-checkbox",{"checkboxId":[1,"checkbox-id"],"label":[1],"inline":[4],"indeterminate":[4],"checked":[4]}]]],["tttx-dialog",[[1,"tttx-dialog",{"header":[1],"type":[1],"size":[1],"open":[4],"allowOverflow":[4,"allow-overflow"],"closeEnabled":[4,"close-enabled"],"elementSize":[32]},[[9,"resize","handleResize"]]]]],["tttx-expander",[[1,"tttx-expander",{"name":[1],"open":[4],"lefticon":[1],"lefticoncolor":[1],"isExpanded":[32]}]]],["tttx-tabs",[[2,"tttx-tabs",{"tabsName":[1,"tabs-name"],"navigation":[4],"wide":[4],"tabs":[1],"_tabs":[32]},[[0,"keydown","handleKeyDown"]]]]],["tttx-checkbox-group",[[1,"tttx-checkbox-group"]]],["tttx-checkbox-group-caption",[[4,"tttx-checkbox-group-caption"]]],["tttx-checkbox-group-heading",[[4,"tttx-checkbox-group-heading"]]],["tttx-form",[[1,"tttx-form",{"formschema":[1025],"data":[1032],"submit":[64],"setSelectOptions":[64]}]]],["tttx-keyvalue-block",[[1,"tttx-keyvalue-block",{"keyvalues":[1],"horizontal":[4],"spacedout":[4],"_elements":[32]}]]],["tttx-loading-spinner",[[1,"tttx-loading-spinner",{"loadingMessage":[1028,"loading-message"],"size":[1025]}]]],["tttx-percentage-bar",[[2,"tttx-percentage-bar",{"percentage":[8],"thresholds":[1],"color":[1],"min":[1],"labelid":[1],"_percentage":[32],"_ranges":[32],"_min":[32]}]]],["tttx-qrcode",[[1,"tttx-qrcode",{"link":[1025],"size":[1026]}]]],["tttx-tag",[[1,"tttx-tag",{"text":[1],"color":[1],"textColor":[1,"text-color"]}]]],["tttx-textarea",[[2,"tttx-textarea",{"label":[1],"secondarylabel":[1],"showerrormsg":[4],"showerrorbubble":[4],"errormsg":[1],"rows":[2],"textareaautofocus":[4],"inputkeyhint":[1],"inputindex":[8],"inputtitle":[1],"disabled":[4],"maxlength":[8],"name":[1],"placeholder":[1],"readonly":[8],"required":[4],"value":[1032]}]]],["tttx-icon",[[1,"tttx-icon",{"icon":[1],"color":[1]}]]],["tttx-standalone-input",[[2,"tttx-standalone-input",{"label":[1],"secondarylabel":[1],"showerrormsg":[4],"showerrorbubble":[4],"errormsg":[1],"iconleft":[1],"iconleftcolor":[1],"iconright":[1],"iconrightcolor":[1],"inputicon":[1],"inputiconcolor":[1],"inline":[4],"inputautocapitalize":[1],"inputautofocus":[4],"inputkeyhint":[1],"inputindex":[8],"inputtitle":[1],"autocomplete":[1],"checked":[4],"disabled":[4],"max":[8],"maxlength":[8],"min":[8],"minlength":[8],"name":[1],"pattern":[1],"placeholder":[1],"readonly":[8],"required":[4],"step":[8],"type":[1],"value":[1032]}]]],["tttx-filter_4",[[1,"tttx-filter",{"filterKey":[1,"filter-key"],"filterOptions":[1,"filter-options"],"showSelectAll":[4,"show-select-all"],"showSearchField":[4,"show-search-field"],"showOptionIcons":[4,"show-option-icons"],"filterButtonStyle":[1,"filter-button-style"],"filterHeader":[1,"filter-header"],"defaultFilterOptions":[1,"default-filter-options"],"popoverWidth":[1,"popover-width"],"showPopover":[32],"displayedFilterSettings":[32],"selectedFilters":[32],"filterSearchTerm":[32],"allSelected":[32]},[[0,"closeFilter","handleCloseFilter"]]],[1,"tttx-list",{"data":[1025],"name":[1],"_data":[32]}],[1,"tttx-sorter",{"sorterKey":[1,"sorter-key"],"defaultSortDirection":[1,"default-sort-direction"],"fieldOptionsData":[1,"field-options-data"],"defaultOption":[1,"default-option"],"selectedField":[32],"sortDirection":[32],"dropdownExpand":[32],"dropdownOptions":[32]},[[0,"closeSorter","handleCloseSorter"]]],[1,"tttx-toolbar",{"border":[4],"viewSize":[32]},[[9,"resize","handleResize"]]]]],["tttx-button",[[1,"tttx-button",{"notext":[4],"icon":[1],"iconposition":[1],"iconcolor":[1025],"design":[1]}]]]], options);
14
+ return bootstrapLazy([["tttx-data-pattern",[[1,"tttx-data-pattern",{"data":[1],"sorteroptions":[1],"filteroptions":[1],"filterheader":[1]}]]],["tttx-form",[[1,"tttx-form",{"formschema":[1025],"data":[1032],"submit":[64],"setSelectOptions":[64]}]]],["tttx-multiselect-box",[[1,"tttx-multiselect-box",{"optionsData":[1,"options-data"],"label":[1],"inline":[4],"placeholder":[1],"searchEnabled":[4,"search-enabled"],"htmlVisibleValue":[4,"html-visible-value"],"visibleValue":[1,"visible-value"],"open":[32],"unsavedSelectedItems":[32],"searchTerm":[32]},[[0,"closeSelectBox","handleCloseSelectBox"],[0,"blur","handleBlur"]]]]],["tttx-dialog-box",[[1,"tttx-dialog-box",{"data":[1025],"size":[1],"open":[1028],"allowOverflow":[4,"allow-overflow"],"elementSize":[32]},[[9,"resize","handleResize"]]]]],["tttx-tree-view",[[1,"tttx-tree-view",{"data":[1040],"firstSelected":[1028,"first-selected"],"treeData":[32],"selectedId":[32]}]]],["tttx-checkbox",[[0,"tttx-checkbox",{"checkboxId":[1,"checkbox-id"],"label":[1],"inline":[4],"indeterminate":[4],"checked":[4]}]]],["tttx-dialog",[[1,"tttx-dialog",{"header":[1],"type":[1],"size":[1],"open":[4],"allowOverflow":[4,"allow-overflow"],"closeEnabled":[4,"close-enabled"],"elementSize":[32]},[[9,"resize","handleResize"]]]]],["tttx-expander",[[1,"tttx-expander",{"name":[1],"open":[4],"lefticon":[1],"lefticoncolor":[1],"isExpanded":[32]}]]],["tttx-tabs",[[2,"tttx-tabs",{"tabsName":[1,"tabs-name"],"navigation":[4],"wide":[4],"tabs":[1],"_tabs":[32]},[[0,"keydown","handleKeyDown"]]]]],["tttx-checkbox-group",[[1,"tttx-checkbox-group"]]],["tttx-checkbox-group-caption",[[4,"tttx-checkbox-group-caption"]]],["tttx-checkbox-group-heading",[[4,"tttx-checkbox-group-heading"]]],["tttx-keyvalue-block",[[1,"tttx-keyvalue-block",{"keyvalues":[1],"horizontal":[4],"spacedout":[4],"_elements":[32]}]]],["tttx-loading-spinner",[[1,"tttx-loading-spinner",{"loadingMessage":[1028,"loading-message"],"size":[1025]}]]],["tttx-percentage-bar",[[2,"tttx-percentage-bar",{"percentage":[8],"thresholds":[1],"color":[1],"min":[1],"labelid":[1],"_percentage":[32],"_ranges":[32],"_min":[32]}]]],["tttx-qrcode",[[1,"tttx-qrcode",{"link":[1025],"size":[1026]}]]],["tttx-tag",[[1,"tttx-tag",{"text":[1],"color":[1],"textColor":[1,"text-color"]}]]],["tttx-textarea",[[2,"tttx-textarea",{"label":[1],"secondarylabel":[1],"showerrormsg":[4],"showerrorbubble":[4],"errormsg":[1],"rows":[2],"textareaautofocus":[4],"inputkeyhint":[1],"inputindex":[8],"inputtitle":[1],"disabled":[4],"maxlength":[8],"name":[1],"placeholder":[1],"readonly":[8],"required":[4],"value":[1032]}]]],["tttx-icon",[[1,"tttx-icon",{"icon":[1],"color":[1]}]]],["tttx-select-box",[[1,"tttx-select-box",{"optionsData":[1,"options-data"],"label":[1],"inline":[4],"placeholder":[1],"searchEnabled":[4,"search-enabled"],"selectedValue":[1,"selected-value"],"open":[32],"selectedItem":[32],"searchTerm":[32],"setSelectedItem":[64]},[[0,"closeSelectBox","handleCloseSelectBox"],[0,"blur","handleBlur"]]]]],["tttx-filter_4",[[1,"tttx-filter",{"filterKey":[1,"filter-key"],"filterOptions":[1,"filter-options"],"showSelectAll":[4,"show-select-all"],"showSearchField":[4,"show-search-field"],"showOptionIcons":[4,"show-option-icons"],"filterButtonStyle":[1,"filter-button-style"],"filterHeader":[1,"filter-header"],"defaultFilterOptions":[1,"default-filter-options"],"popoverWidth":[1,"popover-width"],"showPopover":[32],"displayedFilterSettings":[32],"selectedFilters":[32],"filterSearchTerm":[32],"allSelected":[32]},[[0,"closeFilter","handleCloseFilter"]]],[1,"tttx-list",{"data":[1025],"name":[1],"_data":[32]}],[1,"tttx-sorter",{"sorterKey":[1,"sorter-key"],"defaultSortDirection":[1,"default-sort-direction"],"fieldOptionsData":[1,"field-options-data"],"defaultOption":[1,"default-option"],"selectedField":[32],"sortDirection":[32],"dropdownExpand":[32],"dropdownOptions":[32]},[[0,"closeSorter","handleCloseSorter"]]],[1,"tttx-toolbar",{"border":[4],"viewSize":[32]},[[9,"resize","handleResize"]]]]],["tttx-button",[[1,"tttx-button",{"notext":[4],"icon":[1],"iconposition":[1],"iconcolor":[1025],"design":[1]}]]],["tttx-standalone-input",[[2,"tttx-standalone-input",{"label":[1],"secondarylabel":[1],"showerrormsg":[4],"showerrorbubble":[4],"errormsg":[1],"iconleft":[1],"iconleftcolor":[1],"iconright":[1],"iconrightcolor":[1],"inputicon":[1],"inputiconcolor":[1],"inline":[4],"inputautocapitalize":[1],"inputautofocus":[4],"inputkeyhint":[1],"inputindex":[8],"inputtitle":[1],"autocomplete":[1],"checked":[4],"disabled":[4],"max":[8],"maxlength":[8],"min":[8],"minlength":[8],"name":[1],"pattern":[1],"placeholder":[1],"readonly":[8],"required":[4],"step":[8],"type":[1],"value":[1032]}]]]], options);
15
15
  });
16
16
  };
17
17