jb-select 4.8.8 → 4.9.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.
@@ -1,553 +0,0 @@
1
- (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
3
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.JBSelect = {}));
5
- })(this, (function (exports) { 'use strict';
6
-
7
- /******************************************************************************
8
- Copyright (c) Microsoft Corporation.
9
-
10
- Permission to use, copy, modify, and/or distribute this software for any
11
- purpose with or without fee is hereby granted.
12
-
13
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
14
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
15
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
16
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
17
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
18
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19
- PERFORMANCE OF THIS SOFTWARE.
20
- ***************************************************************************** */
21
-
22
- function __classPrivateFieldGet(receiver, state, kind, f) {
23
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
24
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
25
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
26
- }
27
-
28
- function __classPrivateFieldSet(receiver, state, value, kind, f) {
29
- if (kind === "m") throw new TypeError("Private method is not writable");
30
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
31
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
32
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
33
- }
34
-
35
- var HTML = "<div class=\"jb-select-web-component\">\r\n <div class=\"label-wrapper\">\r\n <label class=\"--hide\"><span class=\"label-value\"></span></label>\r\n <!-- close button will be visible on mobile modal -->\r\n <div class=\"close-button\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path class=\"close-btn-svg-bg\" opacity=\"0.4\" d=\"M16.3399 1.9998H7.66988C4.27988 1.9998 1.99988 4.3798 1.99988 7.9198V16.0898C1.99988 19.6198 4.27988 21.9998 7.66988 21.9998H16.3399C19.7299 21.9998 21.9999 19.6198 21.9999 16.0898V7.9198C21.9999 4.3798 19.7299 1.9998 16.3399 1.9998Z\"/>\r\n <path class=\"close-btn-svg-path\" d=\"M15.0156 13.7703L13.2366 11.9923L15.0146 10.2143C15.3566 9.8733 15.3566 9.3183 15.0146 8.9773C14.6726 8.6333 14.1196 8.6343 13.7776 8.9763L11.9986 10.7543L10.2196 8.9743C9.87758 8.6323 9.32358 8.6343 8.98158 8.9743C8.64058 9.3163 8.64058 9.8713 8.98158 10.2123L10.7616 11.9923L8.98558 13.7673C8.64358 14.1093 8.64358 14.6643 8.98558 15.0043C9.15658 15.1763 9.37958 15.2613 9.60358 15.2613C9.82858 15.2613 10.0516 15.1763 10.2226 15.0053L11.9986 13.2293L13.7786 15.0083C13.9496 15.1793 14.1726 15.2643 14.3966 15.2643C14.6206 15.2643 14.8446 15.1783 15.0156 15.0083C15.3576 14.6663 15.3576 14.1123 15.0156 13.7703Z\" fill=\"#200E32\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"select-box\">\r\n <div class=\"start-section\">\r\n <slot name=\"start-section\"></slot>\r\n </div>\r\n <div class=\"middle-section\">\r\n <div class=\"selected-value-wrapper\"></div>\r\n <div class=\"front-box\">\r\n <input class=\"input\">\r\n\r\n </div>\r\n </div>\r\n <div class=\"end-section\">\r\n <div class=\"arrow-icon\" tabindex=\"-1\">\r\n <slot name=\"select-arrow-icon\">\r\n <svg width=\"8\" height=\"8\" id=\"Layer_1\" x=\"0px\" y=\"0px\" viewBox=\"0 0 494.1 371.1\" style=\"enable-background:new 0 0 494.1 371.1;\" xml:space=\"preserve\">\r\n <path d=\"M293,343.8L480.9,69.3c8.7-12.7,13.3-25.4,13.3-36.1c0-20.5-16.5-33.2-44-33.2H44C16.4,0,0,12.7,0,33.2 c0,10.6,4.6,23.2,13.3,35.9l187.9,274.6c12.1,17.7,28.4,27.4,45.9,27.4C264.6,371.1,280.9,361.4,293,343.8z\"/>\r\n </svg>\r\n </slot>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"middle-divider\">\r\n <!-- middle line between input box and list (hidden by default but user may need it sometimes) -->\r\n </div>\r\n <div class=\"select-list-wrapper\">\r\n <div class=\"select-list\" tabindex=\"-1\">\r\n\r\n </div>\r\n <div class=\"empty-list-placeholder\">\r\n <slot name=\"empty-list-message\">no item available</slot>\r\n </div>\r\n </div>\r\n <div class=\"message-box\"></div>\r\n</div>";
36
-
37
- var css_248z = ":host {\n --p-middle-div-height: var(--jb-select-middle-div-height, 0px);\n --p-p-color: #1e2832;\n --p-border-bottom-width: var(--jb-select-border-bottom-width, var(--jb-select-border-width, 3px));\n --p-base-z-index: 1;\n --p-mobile-modal-z-index: 900;\n --p-mobile-modal-height:var(--jb-select-mobile-modal-height, 100vh); }\n\n.jb-select-web-component {\n width: var(--jb-select-width, 100%);\n margin: var(--jb-select-margin, 0 0);\n position: relative;\n box-sizing: border-box; }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--focused {\n position: fixed;\n bottom: 0;\n top: initial;\n left: 0;\n background-color: var(--jb-select-overlay-bgcolor, #0008);\n width: 100vw;\n height: var(--p-mobile-modal-height);\n border-radius: var(--jb-select-mobile-modal-border-radius, 0) var(--jb-select-mobile-modal-border-radius, 0) 0 0;\n margin: 0;\n padding: 16px 8px;\n z-index: var(--p-mobile-modal-z-index); } }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--focused .select-box {\n height: var(--jb-select-mobile-search-input-height, var(--jb-select-height, 40px));\n background-color: var(--jb-select-mobile-input-bgcolor, #f7f6f6);\n border-width: var(--jb-select-mobile-search-border-width, var(--jb-select-border-width, 1px));\n border-color: var(--jb-select-mobile-search-border-color, var(--jb-select-border-color, #f7f6f6));\n border-bottom-width: var(--jb-select-mobile-search-border-bottom-width, var(--p-border-bottom-width));\n border-bottom-color: var(--jb-select-mobile-search-border-bottom-color, var(--jb-select-border-bottom-color, var(--jb-select-border-color, #f7f6f6)));\n border-radius: var(--jb-select-mobile-search-border-radius, var(--jb-select-border-radius, 16px)); } }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--focused .select-box .front-box .arrow-icon {\n display: none; } }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--focused .select-box .selected-value-wrapper {\n opacity: 0;\n transition: none; } }\n .jb-select-web-component.--focused .middle-divider {\n display: block; }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--focused .middle-divider {\n margin: var(--jb-select-middle-div-mobile-margin, 16px 0 0 0); } }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--focused .select-list-wrapper {\n position: initial;\n margin: var(--jb-select-mobile-item-list-margin, 16px 0);\n border-radius: var(--jb-select-mobile-item-list-border-radius, var(--jb-select-border-radius, 16px)); } }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--focused .label-wrapper {\n display: flex; } }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--focused .label-wrapper label {\n color: #fff;\n font-size: 1.5em;\n display: flex;\n align-items: center; } }\n .jb-select-web-component.--focused .label-wrapper .close-button {\n display: none; }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--focused .label-wrapper .close-button {\n display: flex;\n width: 48px;\n height: 48px;\n justify-content: center;\n align-items: center;\n color: #fff; }\n .jb-select-web-component.--focused .label-wrapper .close-button .close-btn-svg-bg {\n opacity: var(--jb-select-close-bg-opacity, 0.4);\n fill: var(--jb-select-close-bg-color, #1f1735); }\n .jb-select-web-component.--focused .label-wrapper .close-button .close-btn-svg-path {\n fill: var(--jb-select-close-x-color, #fff); } }\n .jb-select-web-component.--has-value .select-box {\n border-color: var(--jb-select-border-color-selected, #c3ff14);\n background-color: var(--jb-select-bgcolor-selected, #f7f6f6); }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component.--has-value .select-box:focus-within {\n background-color: var(--jb-select-mobile-input-bgcolor, #f7f6f6); } }\n .jb-select-web-component .label-wrapper label {\n width: 100%;\n margin: 4px 0px;\n display: block;\n font-size: var(--jb-select-label-font-size, 0.8em);\n font-weight: var(--jb-select-label-font-weight, normal);\n color: var(--jb-select-label-color, #1f1735); }\n .jb-select-web-component .label-wrapper label.--hide {\n display: none; }\n .jb-select-web-component .label-wrapper .close-button {\n display: none; }\n .jb-select-web-component .select-box {\n width: 100%;\n box-sizing: border-box;\n height: var(--jb-select-height, 2.5rem);\n border: solid var(--jb-select-border-width, 1px) var(--jb-select-border-color, #f7f6f6);\n border-bottom: solid var(--p-border-bottom-width) var(--jb-select-border-color, #f7f6f6);\n border-radius: var(--jb-select-border-radius, 1rem);\n background-color: var(--jb-select-bgcolor, #f7f6f6);\n margin: var(--jb-select-select-box-margin, 4px 0px 0px 0px);\n overflow: hidden;\n display: flex;\n padding-inline-end: var(--jb-select-box-padding-end, 1rem);\n gap: 0.5rem;\n align-items: center; }\n .jb-select-web-component .select-box:focus-within {\n border-color: var(--jb-select-border-color, var(--p-p-color));\n border-bottom-color: var(--jb-select-border-color, var(--p-p-color));\n border-radius: var(--jb-select-border-radius, 1rem) var(--jb-select-border-radius, 1rem) 0 0; }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component .select-box:focus-within {\n border-radius: var(--jb-select-mobile-search-border-radius, var(--jb-select-border-radius, 1rem)); } }\n .jb-select-web-component .select-box .start-section {\n height: 100%;\n width: auto;\n display: flex;\n justify-content: center;\n align-items: center; }\n .jb-select-web-component .select-box .middle-section {\n position: relative;\n width: 100%;\n height: 100%;\n flex: 1; }\n .jb-select-web-component .select-box .middle-section .selected-value-wrapper {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border-radius: inherit;\n overflow: hidden;\n z-index: 1; }\n .jb-select-web-component .select-box .middle-section .selected-value-wrapper.--search-typed {\n opacity: 0; }\n .jb-select-web-component .select-box .middle-section .selected-value-wrapper .selected-value {\n width: 100%;\n box-sizing: border-box;\n height: 100%;\n background-color: transparent;\n padding: 2px 12px 0 12px;\n display: block;\n font-family: inherit;\n font-size: var(--jb-select-selected-value-font-size, 1.1em);\n color: var(--jb-select-selected-value-color, #1f1735);\n margin: 0;\n border-radius: 0;\n display: flex;\n align-items: center; }\n .jb-select-web-component .select-box .middle-section .front-box {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border-radius: inherit;\n overflow: hidden;\n z-index: 2; }\n .jb-select-web-component .select-box .middle-section .front-box input {\n border: none;\n width: 100%;\n box-sizing: border-box;\n height: 100%;\n background-color: transparent;\n padding: 2px 12px 0 12px;\n display: block;\n font-family: inherit;\n font-size: var(--jb-select-value-font-size, 1.1rem);\n color: var(--jb-select-input-color, #1f1735);\n margin: 0;\n border-radius: 0; }\n .jb-select-web-component .select-box .middle-section .front-box input:focus {\n outline: none; }\n .jb-select-web-component .select-box .middle-section .front-box input::placeholder {\n color: var(--jb-select-placeholder-color, initial);\n font-size: var(--jb-select-placeholder-font-size, 1.1em); }\n .jb-select-web-component .select-box .end-section .arrow-icon {\n margin: var(--jb-select-arrow-icon-margin, 0 0 0 0); }\n .jb-select-web-component .select-box:focus-within .selected-value {\n opacity: 0.7;\n transition: all 0.3s ease; }\n .jb-select-web-component .middle-divider {\n display: none;\n position: relative;\n z-index: calc(var(--p-base-z-index) + 3);\n width: 100%;\n height: var(--p-middle-div-height);\n background-color: var(--jb-select-middle-div-color, var(--p-p-color));\n margin: var(--jb-select-middle-div-margin, calc(-1 * var(--p-border-bottom-width)) 0);\n border-radius: var(--jb-select-middle-div-radius, 0px); }\n .jb-select-web-component .message-box {\n font-size: var(--jb-select-message-font-size, 0.7em);\n font-weight: var(--jb-select-message-font-weight, normal);\n padding: 4px 8px;\n color: var(--jb-select-message-color, #929292); }\n .jb-select-web-component .message-box:empty {\n padding: 0; }\n .jb-select-web-component .message-box.--error {\n color: red; }\n .jb-select-web-component .select-list-wrapper {\n display: none;\n position: absolute;\n margin: calc(-1 * var(--p-border-bottom-width)) 0;\n height: auto;\n overflow: hidden;\n width: 100%;\n background-color: var(--jb-select-bgcolor, #f7f6f6);\n border-radius: 0 0 var(--jb-select-border-radius, 16px) var(--jb-select-border-radius, 16px);\n border: solid var(--jb-select-list-border-width, 1px) var(--jb-select-border-color, var(--p-p-color));\n border-top: none;\n border-bottom: solid var(--p-border-bottom-width) var(--jb-select-border-color, var(--p-p-color));\n box-shadow: var(--jb-select-list-box-shadow);\n box-sizing: border-box;\n z-index: calc(var(--p-base-z-index) + 2); }\n .jb-select-web-component .select-list-wrapper.--show {\n display: block; }\n .jb-select-web-component .select-list-wrapper .select-list {\n width: 100%;\n max-height: var(--jb-select-list-max-height, 400px);\n overflow-y: auto;\n padding: var(--jb-select-list-padding, 16px 0); }\n .jb-select-web-component .select-list-wrapper .select-list:empty {\n padding: 0; }\n @media (min-width: 320px) and (max-width: 767px) {\n .jb-select-web-component .select-list-wrapper .select-list {\n max-height: calc(var(--p-mobile-modal-height) - 240px); } }\n .jb-select-web-component .select-list-wrapper .select-list .select-option {\n min-height: 36px;\n padding: 4px 16px;\n display: flex;\n align-items: center;\n font-size: 0.9em;\n color: var(--jb-select-option-color, inherit);\n background-color: var(--jb-select-option-background-color, transparent); }\n .jb-select-web-component .select-list-wrapper .select-list .select-option:hover {\n background-color: var(--jb-select-option-background-color-hover, #1073db);\n color: var(--jb-select-option-color-hover, #fff);\n cursor: pointer; }\n .jb-select-web-component .select-list-wrapper .select-list .select-option.--selected-option {\n font-weight: 900; }\n .jb-select-web-component .select-list-wrapper .select-list::-webkit-scrollbar {\n width: 9px;\n background-color: transparent; }\n .jb-select-web-component .select-list-wrapper .select-list::-webkit-scrollbar-thumb {\n background-color: var(--jb-select-list-scroll-color, #c3c3c3);\n border-radius: var(--jb-select-list-scroll-border-radius, 4px); }\n .jb-select-web-component .select-list-wrapper .empty-list-placeholder {\n display: none;\n text-align: center;\n color: #838383;\n font-style: italic;\n padding: 8px 0; }\n .jb-select-web-component .select-list-wrapper .empty-list-placeholder.--show {\n display: block; }\n";
38
-
39
- var _JBSelectWebComponent_instances, _JBSelectWebComponent_value, _JBSelectWebComponent_textValue, _JBSelectWebComponent_notFoundedValue, _JBSelectWebComponent_optionList, _JBSelectWebComponent_displayOptionList, _JBSelectWebComponent_placeholder, _JBSelectWebComponent_searchPlaceholder, _JBSelectWebComponent_setValueFromOutside, _JBSelectWebComponent_setValue, _JBSelectWebComponent_dispatchInputEvent, _JBSelectWebComponent_createSelectedValueDom, _JBSelectWebComponent_getOptionValue, _JBSelectWebComponent_getOptionTitle;
40
- class JBSelectWebComponent extends HTMLElement {
41
- get value() {
42
- if (__classPrivateFieldGet(this, _JBSelectWebComponent_value, "f")) {
43
- return __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_getOptionValue).call(this, __classPrivateFieldGet(this, _JBSelectWebComponent_value, "f"));
44
- }
45
- else {
46
- return null;
47
- }
48
- }
49
- set value(value) {
50
- __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_setValueFromOutside).call(this, value);
51
- }
52
- get textValue() {
53
- return __classPrivateFieldGet(this, _JBSelectWebComponent_textValue, "f");
54
- }
55
- set textValue(value) {
56
- __classPrivateFieldSet(this, _JBSelectWebComponent_textValue, value, "f");
57
- this.elements.input.value = value;
58
- this.updateOptionList(value);
59
- }
60
- get selectedOptionTitle() {
61
- if (this.value) {
62
- return __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_getOptionTitle).call(this, __classPrivateFieldGet(this, _JBSelectWebComponent_value, "f"));
63
- }
64
- else {
65
- return "";
66
- }
67
- }
68
- get optionList() {
69
- return __classPrivateFieldGet(this, _JBSelectWebComponent_optionList, "f") || [];
70
- }
71
- set optionList(value) {
72
- if (!Array.isArray(value)) {
73
- console.error('your provided option list to jb-select is not a array. you must provide array value', { value });
74
- return;
75
- }
76
- __classPrivateFieldSet(this, _JBSelectWebComponent_optionList, value, "f");
77
- //every time optionList get updated we set our value base on current option list we use _notFindedValue in case of value provided to component before optionList
78
- this.displayOptionList = this.filterOptionList(this.textValue);
79
- this._setValueOnOptionListChanged();
80
- }
81
- get placeholder() {
82
- return __classPrivateFieldGet(this, _JBSelectWebComponent_placeholder, "f");
83
- }
84
- set placeholder(value) {
85
- __classPrivateFieldSet(this, _JBSelectWebComponent_placeholder, value, "f");
86
- if (this.value !== null && this.value !== undefined) {
87
- this.elements.input.placeholder = "";
88
- }
89
- else {
90
- this.elements.input.placeholder = value;
91
- }
92
- }
93
- get searchPlaceholder() {
94
- return __classPrivateFieldGet(this, _JBSelectWebComponent_searchPlaceholder, "f");
95
- }
96
- set searchPlaceholder(value) {
97
- __classPrivateFieldSet(this, _JBSelectWebComponent_searchPlaceholder, value, "f");
98
- }
99
- get displayOptionList() {
100
- return __classPrivateFieldGet(this, _JBSelectWebComponent_displayOptionList, "f");
101
- }
102
- set displayOptionList(value) {
103
- if (Array.isArray(value) && value.length == 0) {
104
- this.elements.emptyListPlaceholder.classList.add('--show');
105
- }
106
- else if (Array.isArray(value)) {
107
- this.elements.emptyListPlaceholder.classList.remove('--show');
108
- }
109
- __classPrivateFieldSet(this, _JBSelectWebComponent_displayOptionList, value, "f");
110
- this.updateOptionListDOM();
111
- }
112
- get isMobileDevice() { return /Mobi/i.test(window.navigator.userAgent); }
113
- get isOpen() { return this.elements.componentWrapper.classList.contains('--focused'); }
114
- constructor() {
115
- super();
116
- _JBSelectWebComponent_instances.add(this);
117
- _JBSelectWebComponent_value.set(this, void 0);
118
- _JBSelectWebComponent_textValue.set(this, "");
119
- // if user set value and current option list is not contain the option.
120
- // we hold it in _notFindedValue and select value when option value get updated
121
- _JBSelectWebComponent_notFoundedValue.set(this, null);
122
- this.required = false;
123
- this.callbacks = {
124
- getOptionTitle: (option) => { return option; },
125
- getOptionValue: (option) => { return option; },
126
- getOptionDOM: null,
127
- getSelectedValueDOM: null,
128
- };
129
- _JBSelectWebComponent_optionList.set(this, []);
130
- _JBSelectWebComponent_displayOptionList.set(this, []);
131
- _JBSelectWebComponent_placeholder.set(this, "");
132
- //on mobile device when search modla open this will appear on searchbox
133
- _JBSelectWebComponent_searchPlaceholder.set(this, "search");
134
- this.initWebComponent();
135
- this.initProp();
136
- }
137
- connectedCallback() {
138
- // standard web component event that called when all of dom is binded
139
- this.callOnLoadEvent();
140
- this.callOnInitEvent();
141
- }
142
- callOnInitEvent() {
143
- const event = new CustomEvent('init', { bubbles: true, composed: true });
144
- this.dispatchEvent(event);
145
- }
146
- callOnLoadEvent() {
147
- const event = new CustomEvent('load', { bubbles: true, composed: true });
148
- this.dispatchEvent(event);
149
- }
150
- initWebComponent() {
151
- const shadowRoot = this.attachShadow({
152
- mode: 'open'
153
- });
154
- const html = `<style>${css_248z}</style>` + '\n' + HTML;
155
- const element = document.createElement('template');
156
- element.innerHTML = html;
157
- shadowRoot.appendChild(element.content.cloneNode(true));
158
- this.elements = {
159
- input: shadowRoot.querySelector('.select-box input'),
160
- componentWrapper: shadowRoot.querySelector('.jb-select-web-component'),
161
- selectedValueWrapper: shadowRoot.querySelector('.selected-value-wrapper'),
162
- messageBox: shadowRoot.querySelector('.message-box'),
163
- optionList: shadowRoot.querySelector('.select-list'),
164
- optionListWrapper: shadowRoot.querySelector('.select-list-wrapper'),
165
- arrowIcon: shadowRoot.querySelector('.arrow-icon'),
166
- label: {
167
- wrapper: shadowRoot.querySelector('label'),
168
- text: shadowRoot.querySelector('label .label-value'),
169
- },
170
- emptyListPlaceholder: shadowRoot.querySelector('.empty-list-placeholder'),
171
- };
172
- this.registerEventListener();
173
- }
174
- registerEventListener() {
175
- this.elements.input.addEventListener('change', (e) => { this.onInputChange(e); });
176
- this.elements.input.addEventListener('keypress', this.onInputKeyPress.bind(this));
177
- this.elements.input.addEventListener('keyup', this.onInputKeyup.bind(this));
178
- this.elements.input.addEventListener('beforeinput', this.onInputBeforeInput.bind(this));
179
- this.elements.input.addEventListener('input', (e) => { this.onInputInput(e); });
180
- this.elements.input.addEventListener('focus', this.onInputFocus.bind(this));
181
- this.elements.input.addEventListener('blur', this.onInputBlur.bind(this));
182
- this.elements.arrowIcon.addEventListener('click', this.onArrowKeyClick.bind(this));
183
- }
184
- initProp() {
185
- this.textValue = '';
186
- this.value = this.getAttribute('value') || null;
187
- }
188
- static get observedAttributes() {
189
- return ['label', 'message', 'value', 'required', 'placeholder', 'search-placeholder'];
190
- }
191
- attributeChangedCallback(name, oldValue, newValue) {
192
- // do something when an attribute has changed
193
- this.onAttributeChange(name, newValue);
194
- }
195
- onAttributeChange(name, value) {
196
- switch (name) {
197
- case 'label':
198
- this.elements.label.text.innerHTML = value;
199
- if (value == null || value == undefined || value == "") {
200
- this.elements.label.wrapper.classList.add('--hide');
201
- }
202
- else {
203
- this.elements.label.wrapper.classList.remove('--hide');
204
- }
205
- break;
206
- case 'message':
207
- this.elements.messageBox.innerHTML = value;
208
- break;
209
- case 'value':
210
- __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_setValueFromOutside).call(this, value);
211
- break;
212
- case 'required':
213
- if (value === "" || value == "true" || value == "True") {
214
- this.required = true;
215
- }
216
- else {
217
- this.required = false;
218
- }
219
- break;
220
- case 'placeholder':
221
- this.placeholder = value;
222
- break;
223
- case 'search-placeholder':
224
- this.searchPlaceholder = value;
225
- break;
226
- }
227
- }
228
- _setValueOnOptionListChanged() {
229
- //when option list changed we see if current value is valid for new optionlist we set it if not we reset value to null.
230
- //in some scenario value is setted before optionList attached so we store it on this.#notFoundedValue and after option list setted we set value from this.#notFoundedValue
231
- if (__classPrivateFieldGet(this, _JBSelectWebComponent_notFoundedValue, "f")) {
232
- //if select has no prev value or pending not found value we don't set it because user may input some search terms in input box and developer-user update list base on that value
233
- //if we set it to null the search term and this.textvalue will become null and empty too and it make impossible for user to search in dynamic back-end provided searchable list so we put this condition to prevent it
234
- const isSetted = __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_setValueFromOutside).call(this, __classPrivateFieldGet(this, _JBSelectWebComponent_notFoundedValue, "f"));
235
- if (isSetted) {
236
- //after list update and when not founded value is found in new option list we clear old not founded value
237
- __classPrivateFieldSet(this, _JBSelectWebComponent_notFoundedValue, null, "f");
238
- }
239
- }
240
- else if (this.value) {
241
- __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_setValueFromOutside).call(this, this.value);
242
- }
243
- }
244
- onArrowKeyClick() {
245
- if (this.isOpen) {
246
- this.blur();
247
- }
248
- else {
249
- this.focus();
250
- }
251
- }
252
- onInputKeyPress() {
253
- //TODO: add event detail to keypress
254
- const event = new KeyboardEvent('keypress');
255
- this.dispatchEvent(event);
256
- }
257
- onInputBeforeInput(e) {
258
- e.data || '';
259
- }
260
- onInputInput(e) {
261
- const inputedText = e.target.value;
262
- this.textValue = inputedText;
263
- this.handleSelectedValueDisplay(inputedText);
264
- __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_dispatchInputEvent).call(this, e);
265
- }
266
- onInputKeyup(e) {
267
- const inputText = e.target.value;
268
- //here is the rare time we update #value directly becuase we want trigger event that may read value directly from dom
269
- if (e.key === "Backspace" || e.key === "Delete") {
270
- //becuase on keyprees dont recieve backspace key press
271
- this.handleSelectedValueDisplay(inputText);
272
- }
273
- this.triggerOnInputKeyup(e);
274
- }
275
- handleSelectedValueDisplay(inputValue) {
276
- if (inputValue !== "") {
277
- this.elements.selectedValueWrapper.classList.add('--search-typed');
278
- }
279
- else {
280
- this.elements.selectedValueWrapper.classList.remove('--search-typed');
281
- }
282
- }
283
- triggerOnInputKeyup(e) {
284
- const event = new KeyboardEvent('keyup', {
285
- altKey: e.altKey,
286
- bubbles: e.bubbles,
287
- cancelable: e.cancelable,
288
- code: e.code,
289
- ctrlKey: e.ctrlKey,
290
- detail: e.detail,
291
- key: e.key,
292
- shiftKey: e.shiftKey,
293
- charCode: e.charCode,
294
- location: e.location,
295
- composed: e.composed,
296
- isComposing: e.isComposing,
297
- metaKey: e.metaKey,
298
- repeat: e.repeat,
299
- keyCode: e.keyCode,
300
- view: e.view
301
- });
302
- this.dispatchEvent(event);
303
- }
304
- onInputChange(e) {
305
- const inputText = e.target.value;
306
- //here is the rare time we update _text_value directly becuase we want trigger event that may read value directly from dom
307
- __classPrivateFieldSet(this, _JBSelectWebComponent_textValue, inputText, "f");
308
- }
309
- onInputFocus() {
310
- this.focus();
311
- }
312
- onInputBlur(e) {
313
- const focusedElement = (e.relatedTarget);
314
- if (this.elements.optionListWrapper.contains(focusedElement) || this.elements.arrowIcon.contains(focusedElement)) ;
315
- else {
316
- this.blur();
317
- }
318
- }
319
- focus() {
320
- this.elements.input.focus();
321
- this.showOptionList();
322
- this.elements.componentWrapper.classList.add('--focused');
323
- if (this.isMobileDevice) {
324
- this.elements.input.placeholder = __classPrivateFieldGet(this, _JBSelectWebComponent_searchPlaceholder, "f");
325
- }
326
- }
327
- blur() {
328
- this.elements.componentWrapper.classList.remove('--focused');
329
- this.textValue = "";
330
- this.handleSelectedValueDisplay('');
331
- this.hideOptionList();
332
- this.triggerInputValidation();
333
- if (this.isMobileDevice) {
334
- if (this.value) {
335
- this.elements.input.placeholder = "";
336
- }
337
- else {
338
- this.elements.input.placeholder = this.placeholder;
339
- }
340
- }
341
- this.elements.input.blur();
342
- }
343
- showOptionList() {
344
- this.elements.optionListWrapper.classList.add('--show');
345
- }
346
- hideOptionList() {
347
- this.elements.optionListWrapper.classList.remove('--show');
348
- }
349
- updateOptionList(filterText) {
350
- this.displayOptionList = this.filterOptionList(filterText);
351
- }
352
- updateOptionListDOM() {
353
- const optionDomList = [];
354
- this.displayOptionList.forEach((item) => {
355
- const optionDOM = this.createOptionDOM(item);
356
- optionDomList.push(optionDOM);
357
- });
358
- this.elements.optionList.innerHTML = '';
359
- optionDomList.forEach(optionElement => { this.elements.optionList.appendChild(optionElement); });
360
- }
361
- createOptionDOM(item) {
362
- let optionDOM = null;
363
- const isSelected = __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_getOptionValue).call(this, this.value) == __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_getOptionValue).call(this, item);
364
- if (typeof this.callbacks.getOptionDOM == 'function') {
365
- optionDOM = this.callbacks.getOptionDOM(item, this.onOptionClicked.bind(this), isSelected);
366
- }
367
- else {
368
- optionDOM = this._createOptionDom(item, isSelected);
369
- }
370
- optionDOM.value = item;
371
- return optionDOM;
372
- }
373
- _createOptionDom(item, isSelected) {
374
- const optionElement = document.createElement('div');
375
- optionElement.classList.add('select-option');
376
- if (isSelected) {
377
- optionElement.classList.add('--selected-option');
378
- }
379
- //it has defualt function who return wxact same input
380
- optionElement.innerHTML = __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_getOptionTitle).call(this, item);
381
- optionElement.addEventListener('click', this.onOptionClicked.bind(this));
382
- return optionElement;
383
- }
384
- onOptionClicked(e) {
385
- const value = e.currentTarget.value;
386
- this.selectOption(value);
387
- this.blur();
388
- this._triggerOnChangeEvent();
389
- }
390
- selectOption(value) {
391
- __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_setValue).call(this, value);
392
- this.triggerInputValidation();
393
- }
394
- filterOptionList(filterString) {
395
- const displayOptionList = [];
396
- this.optionList.filter((option) => {
397
- const optionTitle = __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_getOptionTitle).call(this, option);
398
- const isString = typeof optionTitle == 'string';
399
- if (isString && optionTitle.includes(filterString)) {
400
- displayOptionList.push(option);
401
- }
402
- if (!isString) {
403
- console.warn("the provided values for optionsList is not of type string.", { option, title: optionTitle });
404
- }
405
- });
406
- return displayOptionList;
407
- }
408
- triggerInputValidation(showError = true) {
409
- // this method is public and used outside of component to check if field validity param are met
410
- let errorType = '';
411
- let requiredValid = true;
412
- if (this.required) {
413
- requiredValid = this.value != null;
414
- if (!requiredValid) {
415
- errorType = 'REQUIRED';
416
- }
417
- }
418
- const isAllValid = requiredValid; //& other validation if they added
419
- if (isAllValid) {
420
- this.clearValidationError();
421
- }
422
- else if (showError) {
423
- this.showValidationError(errorType);
424
- }
425
- return {
426
- isAllValid
427
- };
428
- }
429
- showValidationError(errorType) {
430
- if (errorType == 'REQUIRED') {
431
- const label = this.getAttribute('label') || "";
432
- this.elements.messageBox.innerHTML = `${label} حتما باید انتخاب شود`;
433
- this.elements.messageBox.classList.add('--error');
434
- }
435
- }
436
- clearValidationError() {
437
- this.elements.messageBox.innerHTML = this.getAttribute('message') || '';
438
- this.elements.messageBox.classList.remove('--error');
439
- }
440
- _triggerOnChangeEvent() {
441
- const event = new Event("change");
442
- this.dispatchEvent(event);
443
- }
444
- setSelectedOptionDom(value) {
445
- //when user select option or value changed in any condition we set selected option DOM
446
- this.elements.selectedValueWrapper.innerHTML = '';
447
- //if value was null or undifined it remain empty
448
- if (value !== null && value !== undefined) {
449
- const selectedOptionDom = this.createSelectedValueDom(value);
450
- this.elements.selectedValueWrapper.appendChild(selectedOptionDom);
451
- }
452
- }
453
- createSelectedValueDom(value) {
454
- if (typeof this.callbacks.getSelectedValueDOM == 'function') {
455
- return this.callbacks.getSelectedValueDOM(value);
456
- }
457
- else {
458
- return __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_createSelectedValueDom).call(this, value);
459
- }
460
- }
461
- }
462
- _JBSelectWebComponent_value = new WeakMap(), _JBSelectWebComponent_textValue = new WeakMap(), _JBSelectWebComponent_notFoundedValue = new WeakMap(), _JBSelectWebComponent_optionList = new WeakMap(), _JBSelectWebComponent_displayOptionList = new WeakMap(), _JBSelectWebComponent_placeholder = new WeakMap(), _JBSelectWebComponent_searchPlaceholder = new WeakMap(), _JBSelectWebComponent_instances = new WeakSet(), _JBSelectWebComponent_setValueFromOutside = function _JBSelectWebComponent_setValueFromOutside(value) {
463
- //when user set value by attribute or value prop directly we call this function
464
- const matchedOption = this.optionList.find((option) => {
465
- if (__classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_getOptionValue).call(this, option) == value) {
466
- return option;
467
- }
468
- });
469
- if (matchedOption || value == null) {
470
- __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_setValue).call(this, matchedOption);
471
- return true;
472
- }
473
- else {
474
- __classPrivateFieldSet(this, _JBSelectWebComponent_notFoundedValue, value, "f");
475
- return false;
476
- }
477
- }, _JBSelectWebComponent_setValue = function _JBSelectWebComponent_setValue(value) {
478
- __classPrivateFieldSet(this, _JBSelectWebComponent_notFoundedValue, null, "f");
479
- __classPrivateFieldSet(this, _JBSelectWebComponent_value, value, "f");
480
- if ((value == null || value == undefined)) {
481
- this.textValue = '';
482
- this.setSelectedOptionDom(null);
483
- this.elements.componentWrapper.classList.remove('--has-value');
484
- //show placeholder when user empty data
485
- if (!(this.isMobileDevice && this.isOpen)) {
486
- this.elements.input.placeholder = this.placeholder;
487
- }
488
- }
489
- else {
490
- this.textValue = '';
491
- this.setSelectedOptionDom(value);
492
- this.elements.componentWrapper.classList.add('--has-value');
493
- //hide placeholder when user select data
494
- if (!(this.isMobileDevice && this.isOpen)) {
495
- this.elements.input.placeholder = "";
496
- }
497
- }
498
- //if user select an option we rest filter so user see all option again when open a select
499
- this.updateOptionList('');
500
- }, _JBSelectWebComponent_dispatchInputEvent = function _JBSelectWebComponent_dispatchInputEvent(e) {
501
- const event = new InputEvent('input', {
502
- bubbles: e.bubbles,
503
- cancelable: e.cancelable,
504
- composed: e.composed,
505
- data: e.data,
506
- dataTransfer: e.dataTransfer,
507
- detail: e.detail,
508
- inputType: e.inputType,
509
- isComposing: e.isComposing,
510
- targetRanges: e.getTargetRanges(),
511
- view: e.view,
512
- });
513
- this.dispatchEvent(event);
514
- }, _JBSelectWebComponent_createSelectedValueDom = function _JBSelectWebComponent_createSelectedValueDom(value) {
515
- const valueText = __classPrivateFieldGet(this, _JBSelectWebComponent_instances, "m", _JBSelectWebComponent_getOptionTitle).call(this, value);
516
- const selectedOptionDom = document.createElement('div');
517
- selectedOptionDom.classList.add('selected-value');
518
- selectedOptionDom.innerHTML = valueText;
519
- return selectedOptionDom;
520
- }, _JBSelectWebComponent_getOptionValue = function _JBSelectWebComponent_getOptionValue(option) {
521
- if (typeof this.callbacks.getOptionValue !== "function") {
522
- console.error("getOptionValue callback is not a function");
523
- }
524
- try {
525
- return this.callbacks.getOptionValue(option);
526
- }
527
- catch (e) {
528
- console.error(`Invalid getOptionValue callback Result, must be a function that returns the value of an option`, option);
529
- }
530
- }, _JBSelectWebComponent_getOptionTitle = function _JBSelectWebComponent_getOptionTitle(option) {
531
- if (typeof this.callbacks.getOptionTitle !== "function") {
532
- console.error("getOptionTitle callback is not a function");
533
- }
534
- try {
535
- return this.callbacks.getOptionTitle(option);
536
- }
537
- catch (e) {
538
- console.error(`Invalid getOptionTitle callback Result, must be a function that returns the value of an option`, option);
539
- }
540
- return "";
541
- };
542
- const myElementNotExists = !customElements.get('jb-select');
543
- if (myElementNotExists) {
544
- //prevent duplicate registering
545
- window.customElements.define('jb-select', JBSelectWebComponent);
546
- }
547
-
548
- exports.JBSelectWebComponent = JBSelectWebComponent;
549
-
550
- Object.defineProperty(exports, '__esModule', { value: true });
551
-
552
- }));
553
- //# sourceMappingURL=JBSelect.umd.js.map