jb-select 5.0.0 → 5.0.1

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 +1 @@
1
- {"version":3,"file":"jb-select.umd.js","sources":["../../../node_modules/tslib/tslib.es6.js","../lib/jb-select.ts","../../../common/scripts/device-detection.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n 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\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n 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\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n function next() {\r\n while (env.stack.length) {\r\n var rec = env.stack.pop();\r\n try {\r\n var result = rec.dispose && rec.dispose.call(rec.value);\r\n if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n};\r\n","import HTML from \"./jb-select.html\";\r\nimport CSS from \"./jb-select.scss\";\r\nimport {\r\n JBSelectCallbacks,\r\n JBSelectElements,\r\n JBSelectOptionElement,\r\n ValidationValue,\r\n} from \"./types\";\r\nimport {ValidationHelper} from \"jb-validation\";\r\nimport { ValidationItem, ValidationResult, WithValidation } from \"jb-validation/types\";\r\nimport { isMobile } from \"../../../common/scripts/device-detection\";\r\nimport {JBFormInputStandards} from 'jb-form/types';\r\n//TOption is the type of option, TValue is the type of value we extract from option\r\nexport class JBSelectWebComponent<TOption = any, TValue = TOption> extends HTMLElement implements WithValidation<ValidationValue<TOption,TValue>>, JBFormInputStandards<TValue> {\r\n static get formAssociated() {\r\n return true;\r\n }\r\n // we keep selected option here by option but we return TValue when user demand\r\n #value: TOption;\r\n #textValue = \"\";\r\n // if user set value and current option list is not contain the option.\r\n // we hold it in _notFoundedValue and select value when option value get updated\r\n #notFoundedValue: TValue = null;\r\n callbacks: JBSelectCallbacks<TOption,TValue> = {\r\n getOptionTitle: (option) => {\r\n if(typeof option == \"string\" || typeof option == \"number\"){\r\n return option.toString();\r\n }else{\r\n console.error(\"title must be string please provide a valid getOptionTitle\",\"provided title:\",option);\r\n return \"NOT SUPPORTED TITLE TYPE\";\r\n }\r\n },\r\n getOptionValue: null,\r\n getOptionDOM: null,\r\n getSelectedValueDOM: null,\r\n };\r\n elements!: JBSelectElements;\r\n get value():TValue{\r\n if (this.#value) {\r\n return this.#getOptionValue(this.#value);\r\n } else {\r\n return null;\r\n }\r\n }\r\n set value(value:TValue) {\r\n this.#setValueFromOutside(value);\r\n }\r\n get textValue() {\r\n return this.#textValue;\r\n }\r\n set textValue(value) {\r\n this.#textValue = value;\r\n this.elements.input.value = value;\r\n this.#updateOptionList(value);\r\n }\r\n get selectedOptionTitle() {\r\n if (this.value) {\r\n return this.#getOptionTitle(this.#value);\r\n } else {\r\n return \"\";\r\n }\r\n }\r\n #optionList: TOption[] = [];\r\n #displayOptionList: TOption[] = [];\r\n get optionList() {\r\n return this.#optionList || [];\r\n }\r\n set optionList(value) {\r\n if (!Array.isArray(value)) {\r\n console.error(\r\n \"your provided option list to jb-select is not a array. you must provide array value\",\r\n { value }\r\n );\r\n return;\r\n }\r\n this.#optionList = value;\r\n //every time optionList get updated we set our value base on current option list we use _notFoundedValue in case of value provided to component before optionList\r\n this.displayOptionList = this.#filterOptionList(this.textValue);\r\n this.#setValueOnOptionListChanged();\r\n }\r\n #placeholder = \"\";\r\n get placeholder() {\r\n return this.#placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this.#placeholder = value;\r\n if (this.value !== null && this.value !== undefined) {\r\n this.elements.input.placeholder = \"\";\r\n } else {\r\n this.elements.input.placeholder = value;\r\n }\r\n }\r\n //on mobile device when search modal open this will appear on search box\r\n #searchPlaceholder = \"search\";\r\n get searchPlaceholder() {\r\n return this.#searchPlaceholder;\r\n }\r\n set searchPlaceholder(value) {\r\n this.#searchPlaceholder = value;\r\n }\r\n get displayOptionList() {\r\n return this.#displayOptionList;\r\n }\r\n set displayOptionList(value: TOption[]) {\r\n if (Array.isArray(value) && value.length == 0) {\r\n this.elements.emptyListPlaceholder.classList.add(\"--show\");\r\n } else if (Array.isArray(value)) {\r\n this.elements.emptyListPlaceholder.classList.remove(\"--show\");\r\n }\r\n this.#displayOptionList = value;\r\n this.#updateOptionListDOM();\r\n }\r\n get isMobileDevice() {\r\n return isMobile();\r\n }\r\n get isOpen() {\r\n return this.elements.componentWrapper.classList.contains(\"--focused\");\r\n }\r\n // this value used by validation module to send to validation callbacks\r\n get #ValidationValue():ValidationValue<TOption,TValue>{\r\n return {\r\n inputtedText:this.#textValue,\r\n selectedOption:this.#value,\r\n value:this.value\r\n };\r\n }\r\n #validation = new ValidationHelper<ValidationValue<TOption,TValue>>(this.showValidationError.bind(this),this.clearValidationError.bind(this),()=>this.#ValidationValue,()=>this.textValue,this.#getInsideValidation.bind(this),this.#setValidationResult.bind(this));\r\n get validation(){\r\n return this.#validation;\r\n }\r\n #disabled = false;\r\n get disabled(){\r\n return this.#disabled;\r\n }\r\n set disabled(value:boolean){\r\n this.#disabled = value;\r\n this.elements.input.disabled = value;\r\n if(value){\r\n //TODO: remove as any when typescript support\r\n (this.#internals as any).states?.add(\"disabled\");\r\n }else{\r\n (this.#internals as any).states?.delete(\"disabled\");\r\n }\r\n }\r\n #required = false;\r\n set required(value:boolean){\r\n this.#required = value;\r\n this.#validation.checkValidity(false);\r\n }\r\n get required() {\r\n return this.#required;\r\n }\r\n #internals?: ElementInternals;\r\n /**\r\n * @description will determine if component trigger jb-validation mechanism automatically on user event or it just let user-developer handle validation mechanism by himself\r\n */\r\n get isAutoValidationDisabled(): boolean {\r\n //currently we only support disable-validation in attribute and only in initiate time but later we can add support for change of this \r\n return this.getAttribute('disable-auto-validation') === '' || this.getAttribute('disable-auto-validation') === 'true' ? true : false;\r\n }\r\n get name(){\r\n return this.getAttribute('name') || '';\r\n }\r\n initialValue: TValue | null = null;\r\n get isDirty(): boolean{\r\n return this.value !== this.initialValue;\r\n }\r\n constructor() {\r\n super();\r\n if (typeof this.attachInternals == \"function\") {\r\n //some browser dont support attachInternals\r\n this.#internals = this.attachInternals();\r\n }\r\n this.#initWebComponent();\r\n this.#initProp();\r\n }\r\n connectedCallback() {\r\n // standard web component event that called when all of dom is binded\r\n this.#callOnLoadEvent();\r\n this.#callOnInitEvent();\r\n }\r\n #callOnInitEvent() {\r\n const event = new CustomEvent(\"init\", { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n #callOnLoadEvent() {\r\n const event = new CustomEvent(\"load\", { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n #initWebComponent() {\r\n const shadowRoot = this.attachShadow({\r\n mode: \"open\",\r\n delegatesFocus:true,\r\n });\r\n const html = `<style>${CSS}</style>` + \"\\n\" + HTML;\r\n const element = document.createElement(\"template\");\r\n element.innerHTML = html;\r\n shadowRoot.appendChild(element.content.cloneNode(true));\r\n this.elements = {\r\n input: shadowRoot.querySelector(\".select-box input\")!,\r\n componentWrapper: shadowRoot.querySelector(\".jb-select-web-component\")!,\r\n selectedValueWrapper: shadowRoot.querySelector(\r\n \".selected-value-wrapper\"\r\n )!,\r\n messageBox: shadowRoot.querySelector(\".message-box\")!,\r\n optionList: shadowRoot.querySelector(\".select-list\")!,\r\n optionListWrapper: shadowRoot.querySelector(\".select-list-wrapper\")!,\r\n arrowIcon: shadowRoot.querySelector(\".arrow-icon\")!,\r\n label: {\r\n wrapper: shadowRoot.querySelector(\"label\")!,\r\n text: shadowRoot.querySelector(\"label .label-value\")!,\r\n },\r\n emptyListPlaceholder: shadowRoot.querySelector(\r\n \".empty-list-placeholder\"\r\n )!,\r\n };\r\n this.#registerEventListener();\r\n }\r\n #registerEventListener() {\r\n this.elements.input.addEventListener(\"change\", (e:Event) => {\r\n this.#onInputChange(e);\r\n });\r\n this.elements.input.addEventListener(\r\n \"keypress\",\r\n this.#onInputKeyPress.bind(this)\r\n );\r\n this.elements.input.addEventListener(\"keyup\", this.#onInputKeyup.bind(this));\r\n this.elements.input.addEventListener(\r\n \"beforeinput\",\r\n this.#onInputBeforeInput.bind(this)\r\n );\r\n this.elements.input.addEventListener(\"input\", (e) => {\r\n this.#onInputInput(e as unknown as InputEvent);\r\n });\r\n this.elements.input.addEventListener(\"focus\", this.#onInputFocus.bind(this));\r\n this.elements.input.addEventListener(\"blur\", this.#onInputBlur.bind(this));\r\n this.elements.arrowIcon.addEventListener(\r\n \"click\",\r\n this.#onArrowKeyClick.bind(this)\r\n );\r\n }\r\n #initProp() {\r\n this.textValue = \"\";\r\n this.value = this.getAttribute(\"value\") as TValue || null ;\r\n }\r\n static get observedAttributes() {\r\n return [\r\n \"label\",\r\n \"message\",\r\n \"value\",\r\n \"required\",\r\n \"placeholder\",\r\n \"search-placeholder\",\r\n ];\r\n }\r\n attributeChangedCallback(name:string, oldValue:string, newValue:string) {\r\n // do something when an attribute has changed\r\n this.#onAttributeChange(name, newValue);\r\n }\r\n #onAttributeChange(name: string, value: string) {\r\n switch (name) {\r\n case \"label\":\r\n this.elements.label.text.innerHTML = value;\r\n if (value == null || value == undefined || value == \"\") {\r\n this.elements.label.wrapper.classList.add(\"--hide\");\r\n } else {\r\n this.elements.label.wrapper.classList.remove(\"--hide\");\r\n }\r\n break;\r\n case \"message\":\r\n this.elements.messageBox.innerHTML = value;\r\n break;\r\n case \"value\":\r\n this.#setValueFromOutside(value as TValue);\r\n break;\r\n case \"required\":\r\n if (value === \"\" || value == \"true\" || value == \"True\") {\r\n this.required = true;\r\n } else {\r\n this.required = false;\r\n }\r\n break;\r\n case \"placeholder\":\r\n this.placeholder = value;\r\n break;\r\n case \"search-placeholder\":\r\n this.searchPlaceholder = value;\r\n break;\r\n }\r\n }\r\n #setValueOnOptionListChanged() {\r\n //when option list changed we see if current value is valid for new optionlist we set it if not we reset value to null.\r\n //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\r\n if (this.#notFoundedValue) {\r\n //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\r\n //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\r\n const isSetted = this.#setValueFromOutside(this.#notFoundedValue);\r\n if (isSetted) {\r\n //after list update and when not founded value is found in new option list we clear old not founded value\r\n this.#notFoundedValue = null;\r\n }\r\n } else if (this.value) {\r\n this.#setValueFromOutside(this.value);\r\n }\r\n }\r\n #setValueFromOutside(value: TValue): boolean {\r\n //when user set value by attribute or value prop directly we call this function\r\n const matchedOption = this.optionList.find((option) => {\r\n // if we have value mapper we set selected value by object that match mapper\r\n if (this.#getOptionValue(option) == value) {\r\n return option;\r\n }\r\n });\r\n if (matchedOption || value === null || value === undefined) {\r\n this.#setValue(matchedOption);\r\n return true;\r\n } else {\r\n this.#notFoundedValue = value;\r\n return false;\r\n }\r\n }\r\n #setValue(value: TOption) {\r\n this.#notFoundedValue = null;\r\n this.#value = value;\r\n if (value === null || value === undefined) {\r\n this.textValue = \"\";\r\n this.#setSelectedOptionDom(null);\r\n this.elements.componentWrapper.classList.remove(\"--has-value\");\r\n //show placeholder when user empty data\r\n if (!(this.isMobileDevice && this.isOpen)) {\r\n this.elements.input.placeholder = this.placeholder;\r\n }\r\n } else {\r\n this.textValue = \"\";\r\n this.#setSelectedOptionDom(value);\r\n this.elements.componentWrapper.classList.add(\"--has-value\");\r\n //hide placeholder when user select data\r\n if (!(this.isMobileDevice && this.isOpen)) {\r\n this.elements.input.placeholder = \"\";\r\n }\r\n }\r\n //if user select an option we rest filter so user see all option again when open a select\r\n this.#updateOptionList(\"\");\r\n }\r\n #onArrowKeyClick() {\r\n if (this.isOpen) {\r\n this.blur();\r\n } else {\r\n this.focus();\r\n }\r\n }\r\n #onInputKeyPress(e:KeyboardEvent) {\r\n const eventOptions:KeyboardEventInit = {\r\n altKey:e.altKey,\r\n bubbles:e.bubbles,\r\n cancelable:e.cancelable,\r\n code:e.code,\r\n composed:e.composed,\r\n ctrlKey:e.ctrlKey,\r\n detail:e.detail,\r\n isComposing:e.isComposing,\r\n key:e.key,\r\n location:e.location,\r\n metaKey:e.metaKey,\r\n view:e.view,\r\n repeat:e.repeat,\r\n shiftKey:e.shiftKey \r\n };\r\n const event = new KeyboardEvent(\"keypress\",eventOptions);\r\n this.dispatchEvent(event);\r\n }\r\n #onInputBeforeInput(e: InputEvent) {\r\n // const inputtedText = e.data || \"\";\r\n //TODO: add cancelable event dispatch here\r\n }\r\n #onInputInput(e: InputEvent) {\r\n const inputtedText = (e.target as HTMLInputElement).value;\r\n this.textValue = inputtedText;\r\n this.#handleSelectedValueDisplay(inputtedText);\r\n this.#validation.checkValidity(false);\r\n this.#dispatchInputEvent(e);\r\n }\r\n #dispatchInputEvent(e: InputEvent) {\r\n const event = new InputEvent(\"input\", {\r\n bubbles: e.bubbles,\r\n cancelable: e.cancelable,\r\n composed: e.composed,\r\n data: e.data,\r\n dataTransfer: e.dataTransfer,\r\n detail: e.detail,\r\n inputType: e.inputType,\r\n isComposing: e.isComposing,\r\n targetRanges: e.getTargetRanges(),\r\n view: e.view,\r\n });\r\n this.dispatchEvent(event);\r\n }\r\n #onInputKeyup(e: KeyboardEvent) {\r\n const inputText = (e.target as HTMLInputElement).value;\r\n //here is the rare time we update #value directly because we want trigger event that may read value directly from dom\r\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\r\n //because on keypress dont receive backspace key press\r\n this.#handleSelectedValueDisplay(inputText);\r\n }\r\n\r\n this.#triggerOnInputKeyup(e);\r\n }\r\n #handleSelectedValueDisplay(inputValue: string) {\r\n if (inputValue !== \"\") {\r\n this.elements.selectedValueWrapper.classList.add(\"--search-typed\");\r\n } else {\r\n this.elements.selectedValueWrapper.classList.remove(\"--search-typed\");\r\n }\r\n }\r\n #triggerOnInputKeyup(e: KeyboardEvent) {\r\n const event = new KeyboardEvent(\"keyup\", {\r\n altKey: e.altKey,\r\n bubbles: e.bubbles,\r\n cancelable: e.cancelable,\r\n code: e.code,\r\n ctrlKey: e.ctrlKey,\r\n detail: e.detail,\r\n key: e.key,\r\n shiftKey: e.shiftKey,\r\n charCode: e.charCode,\r\n location: e.location,\r\n composed: e.composed,\r\n isComposing: e.isComposing,\r\n metaKey: e.metaKey,\r\n repeat: e.repeat,\r\n keyCode: e.keyCode,\r\n view: e.view,\r\n });\r\n this.dispatchEvent(event);\r\n }\r\n #onInputChange(e: Event) {\r\n const inputText = (e.target as HTMLInputElement).value;\r\n //here is the rare time we update _text_value directly because we want trigger event that may read value directly from dom\r\n this.#textValue = inputText;\r\n }\r\n #onInputFocus() {\r\n this.focus();\r\n }\r\n #onInputBlur(e: FocusEvent) {\r\n const focusedElement = <Node>e.relatedTarget;\r\n if (\r\n this.elements.optionListWrapper.contains(focusedElement) ||\r\n this.elements.arrowIcon.contains(focusedElement)\r\n ) {\r\n //user click on a menu item\r\n } else {\r\n this.blur();\r\n }\r\n }\r\n focus() {\r\n this.elements.input.focus();\r\n this.#showOptionList();\r\n this.elements.componentWrapper.classList.add(\"--focused\");\r\n if (this.isMobileDevice) {\r\n this.elements.input.placeholder = this.#searchPlaceholder;\r\n }\r\n }\r\n blur() {\r\n this.elements.componentWrapper.classList.remove(\"--focused\");\r\n this.textValue = \"\";\r\n this.#handleSelectedValueDisplay(\"\");\r\n this.#hideOptionList();\r\n this.#validation.checkValidity(true);\r\n if (this.isMobileDevice) {\r\n if (this.value) {\r\n this.elements.input.placeholder = \"\";\r\n } else {\r\n this.elements.input.placeholder = this.placeholder;\r\n }\r\n }\r\n this.elements.input.blur();\r\n }\r\n #showOptionList() {\r\n this.elements.optionListWrapper.classList.add(\"--show\");\r\n }\r\n #hideOptionList() {\r\n this.elements.optionListWrapper.classList.remove(\"--show\");\r\n }\r\n #updateOptionList(filterText: string) {\r\n this.displayOptionList = this.#filterOptionList(filterText);\r\n }\r\n #updateOptionListDOM() {\r\n const optionDomList: HTMLElement[] = [];\r\n this.displayOptionList.forEach((item) => {\r\n const optionDOM = this.#createOptionDOM(item);\r\n optionDomList.push(optionDOM);\r\n });\r\n this.elements.optionList.innerHTML = \"\";\r\n optionDomList.forEach((optionElement) => {\r\n this.elements.optionList.appendChild(optionElement);\r\n });\r\n }\r\n #createOptionDOM(item: TOption): JBSelectOptionElement<TOption> {\r\n let optionDOM: JBSelectOptionElement<TOption> | null = null;\r\n const isSelected =\r\n this.#getOptionValue(this.#value) == this.#getOptionValue(item);\r\n if (typeof this.callbacks.getOptionDOM == \"function\") {\r\n optionDOM = this.callbacks.getOptionDOM(\r\n item,\r\n this.#onOptionClicked.bind(this),\r\n isSelected\r\n );\r\n } else {\r\n optionDOM = this.#createDefaultOptionDom(item, isSelected);\r\n }\r\n optionDOM.value = item;\r\n return optionDOM;\r\n }\r\n\r\n #createDefaultOptionDom(item: TOption, isSelected: boolean): JBSelectOptionElement<TOption> {\r\n const optionElement = document.createElement(\"div\");\r\n optionElement.classList.add(\"select-option\");\r\n if (isSelected) {\r\n optionElement.classList.add(\"--selected-option\");\r\n }\r\n //it has default function who return exact same input\r\n optionElement.innerHTML = this.#getOptionTitle(item);\r\n optionElement.addEventListener(\"click\", this.#onOptionClicked.bind(this));\r\n return optionElement;\r\n }\r\n #onOptionClicked(e: MouseEvent) {\r\n const value = (e.currentTarget as JBSelectOptionElement<TOption>).value;\r\n this.#selectOption(value);\r\n this.blur();\r\n this.#triggerOnChangeEvent();\r\n }\r\n #selectOption(value: TOption) {\r\n this.#setValue(value);\r\n this.#checkValidity(true);\r\n }\r\n #filterOptionList(filterString: string): TOption[] {\r\n const displayOptionList: TOption[] = [];\r\n this.optionList.filter((option) => {\r\n const optionTitle = this.#getOptionTitle(option);\r\n const isString = typeof optionTitle == \"string\";\r\n if (isString && optionTitle.includes(filterString)) {\r\n displayOptionList.push(option);\r\n }\r\n if (!isString) {\r\n console.warn(\r\n \"the provided values for optionsList is not of type string.\",\r\n { option, title: optionTitle }\r\n );\r\n }\r\n });\r\n return displayOptionList;\r\n }\r\n /**\r\n * @description show given string as a error in message place\r\n * @public\r\n */\r\n showValidationError(message:string) {\r\n // if (errorType == \"REQUIRED\") {\r\n // const label = this.getAttribute(\"label\") || \"\";\r\n // this.elements.messageBox.innerHTML = `${label} حتما باید انتخاب شود`;\r\n // }\r\n this.elements.messageBox.innerHTML = message;\r\n this.elements.messageBox.classList.add(\"--error\");\r\n }\r\n clearValidationError() {\r\n this.elements.messageBox.innerHTML = this.getAttribute(\"message\") || \"\";\r\n this.elements.messageBox.classList.remove(\"--error\");\r\n }\r\n #triggerOnChangeEvent() {\r\n const event = new Event(\"change\");\r\n this.dispatchEvent(event);\r\n }\r\n #setSelectedOptionDom(value: TOption) {\r\n //when user select option or value changed in any condition we set selected option DOM\r\n this.elements.selectedValueWrapper.innerHTML = \"\";\r\n //if value was null or undefined it remain empty\r\n if (value !== null && value !== undefined) {\r\n const selectedOptionDom = this.#createSelectedValueDom(value);\r\n this.elements.selectedValueWrapper.appendChild(selectedOptionDom);\r\n }\r\n }\r\n #createSelectedValueDom(value: TOption) {\r\n if (typeof this.callbacks.getSelectedValueDOM == \"function\") {\r\n return this.callbacks.getSelectedValueDOM(value);\r\n } else {\r\n return this.#createDefaultSelectedValueDom(value);\r\n }\r\n }\r\n #createDefaultSelectedValueDom(value: TOption) {\r\n const valueText = this.#getOptionTitle(value);\r\n const selectedOptionDom = document.createElement(\"div\");\r\n selectedOptionDom.classList.add(\"selected-value\");\r\n selectedOptionDom.innerHTML = valueText;\r\n return selectedOptionDom;\r\n }\r\n #getOptionValue(option: TOption):TValue{\r\n if (this.callbacks.getOptionValue && typeof this.callbacks.getOptionValue !== \"function\") {\r\n console.error(\"getOptionValue callback is not a function\");\r\n }\r\n try {\r\n if(typeof this.callbacks.getOptionValue == \"function\"){\r\n return this.callbacks.getOptionValue(option);\r\n }else{\r\n return option as unknown as TValue;\r\n }\r\n } catch (e) {\r\n console.error(\r\n `Invalid getOptionValue callback Result, must be a function that returns the value of an option`,\r\n option\r\n );\r\n }\r\n }\r\n #getOptionTitle(option: TOption): string {\r\n if (typeof this.callbacks.getOptionTitle !== \"function\") {\r\n console.error(\"getOptionTitle callback is not a function\");\r\n }\r\n try {\r\n return this.callbacks.getOptionTitle(option);\r\n } catch (e) {\r\n console.error(\r\n `Invalid getOptionTitle callback Result, must be a function that returns the value of an option`,\r\n option\r\n );\r\n }\r\n return \"\";\r\n }\r\n #getInsideValidation(){\r\n const ValidationList:ValidationItem<ValidationValue<TOption,TValue>>[] = [];\r\n if(this.required){\r\n const label = this.getAttribute(\"label\") || \"\";\r\n const message = `${label} حتما باید انتخاب شود`;\r\n ValidationList.push({\r\n validator:({selectedOption})=>{\r\n return selectedOption !== null && selectedOption !== undefined;\r\n },\r\n message:message,\r\n stateType:\"valueMissing\"\r\n });\r\n }\r\n return ValidationList;\r\n }\r\n //\r\n #checkValidity(showError: boolean) {\r\n if (!this.isAutoValidationDisabled) {\r\n return this.#validation.checkValidity(showError);\r\n }\r\n }\r\n /**\r\n * @public\r\n * @description this method used to check for validity but doesn't show error to user and just return the result\r\n * this method used by #internal of component\r\n */\r\n checkValidity(): boolean {\r\n const validationResult = this.#validation.checkValidity(false);\r\n if (!validationResult.isAllValid) {\r\n const event = new CustomEvent('invalid');\r\n this.dispatchEvent(event);\r\n }\r\n return validationResult.isAllValid;\r\n }\r\n /**\r\n * @public\r\n * @description this method used to check for validity and show error to user\r\n */\r\n reportValidity(): boolean {\r\n const validationResult = this.#validation.checkValidity(true);\r\n if (!validationResult.isAllValid) {\r\n const event = new CustomEvent('invalid');\r\n this.dispatchEvent(event);\r\n }\r\n return validationResult.isAllValid;\r\n }\r\n /**\r\n * @description this method called on every checkValidity calls and update validation result of #internal\r\n */\r\n #setValidationResult(result: ValidationResult<ValidationValue<TOption,TValue>>) {\r\n if (result.isAllValid) {\r\n this.#internals?.setValidity({}, '');\r\n } else {\r\n const states: ValidityStateFlags = {};\r\n let message = \"\";\r\n result.validationList.forEach((res) => {\r\n if (!res.isValid) {\r\n if (res.validation.stateType) {\r\n states[res.validation.stateType] = true;\r\n }else{\r\n states[\"customError\"] = true;\r\n }\r\n if (message == '') { message = res.message; }\r\n\r\n }\r\n });\r\n this.#internals?.setValidity(states, message);\r\n }\r\n }\r\n get validationMessage(){\r\n return this.#internals?.validationMessage || this.#validation.resultSummary.message;\r\n }\r\n}\r\nconst myElementNotExists = !customElements.get(\"jb-select\");\r\nif (myElementNotExists) {\r\n //prevent duplicate registering\r\n window.customElements.define(\"jb-select\", JBSelectWebComponent);\r\n}\r\n","export const isMobile = ()=>{\r\n return /Mobi/i.test(window.navigator.userAgent);\r\n};"],"names":["__classPrivateFieldGet","receiver","state","kind","f","TypeError","has","call","value","get","__classPrivateFieldSet","set","SuppressedError","JBSelectWebComponent","HTMLElement","formAssociated","this","_JBSelectWebComponent_value","_JBSelectWebComponent_instances","_JBSelectWebComponent_getOptionValue","_JBSelectWebComponent_setValueFromOutside","textValue","_JBSelectWebComponent_textValue","elements","input","_JBSelectWebComponent_updateOptionList","selectedOptionTitle","_JBSelectWebComponent_getOptionTitle","optionList","_JBSelectWebComponent_optionList","Array","isArray","displayOptionList","_JBSelectWebComponent_filterOptionList","_JBSelectWebComponent_setValueOnOptionListChanged","console","error","placeholder","_JBSelectWebComponent_placeholder","undefined","searchPlaceholder","_JBSelectWebComponent_searchPlaceholder","_JBSelectWebComponent_displayOptionList","length","emptyListPlaceholder","classList","add","remove","_JBSelectWebComponent_updateOptionListDOM","isMobileDevice","test","window","navigator","userAgent","isOpen","componentWrapper","contains","validation","_JBSelectWebComponent_validation","disabled","_JBSelectWebComponent_disabled","states","delete","required","_JBSelectWebComponent_required","checkValidity","isAutoValidationDisabled","getAttribute","name","isDirty","initialValue","constructor","super","_JBSelectWebComponent_notFoundedValue","callbacks","getOptionTitle","option","toString","getOptionValue","getOptionDOM","getSelectedValueDOM","ValidationHelper","showValidationError","bind","clearValidationError","_JBSelectWebComponent_getInsideValidation","_JBSelectWebComponent_setValidationResult","_JBSelectWebComponent_internals","attachInternals","_JBSelectWebComponent_initWebComponent","_JBSelectWebComponent_initProp","connectedCallback","_JBSelectWebComponent_callOnLoadEvent","_JBSelectWebComponent_callOnInitEvent","observedAttributes","attributeChangedCallback","oldValue","newValue","focus","_JBSelectWebComponent_showOptionList","blur","_JBSelectWebComponent_handleSelectedValueDisplay","_JBSelectWebComponent_hideOptionList","message","messageBox","innerHTML","validationResult","isAllValid","event","CustomEvent","dispatchEvent","reportValidity","validationMessage","resultSummary","inputtedText","selectedOption","bubbles","composed","shadowRoot","attachShadow","mode","delegatesFocus","element","document","createElement","appendChild","content","cloneNode","querySelector","selectedValueWrapper","optionListWrapper","arrowIcon","label","wrapper","text","_JBSelectWebComponent_registerEventListener","addEventListener","e","_JBSelectWebComponent_onInputChange","_JBSelectWebComponent_onInputInput","_JBSelectWebComponent_onAttributeChange","matchedOption","find","_JBSelectWebComponent_setValue","_JBSelectWebComponent_setSelectedOptionDom","_JBSelectWebComponent_onArrowKeyClick","eventOptions","altKey","cancelable","code","ctrlKey","detail","isComposing","key","location","metaKey","view","repeat","shiftKey","KeyboardEvent","target","_JBSelectWebComponent_dispatchInputEvent","InputEvent","data","dataTransfer","inputType","targetRanges","getTargetRanges","inputText","_JBSelectWebComponent_triggerOnInputKeyup","inputValue","charCode","keyCode","_JBSelectWebComponent_onInputFocus","focusedElement","relatedTarget","filterText","optionDomList","forEach","item","optionDOM","_JBSelectWebComponent_createOptionDOM","push","optionElement","isSelected","_JBSelectWebComponent_onOptionClicked","_JBSelectWebComponent_createDefaultOptionDom","currentTarget","_JBSelectWebComponent_selectOption","_JBSelectWebComponent_triggerOnChangeEvent","_JBSelectWebComponent_checkValidity","filterString","filter","optionTitle","isString","includes","warn","title","Event","selectedOptionDom","_JBSelectWebComponent_createSelectedValueDom","_JBSelectWebComponent_createDefaultSelectedValueDom","valueText","ValidationList","validator","stateType","showError","result","setValidity","validationList","res","isValid","customElements","define"],"mappings":"0SAqRO,SAASA,EAAuBC,EAAUC,EAAOC,EAAMC,GAC1D,GAAa,MAATD,IAAiBC,EAAG,MAAM,IAAIC,UAAU,iDAC5C,GAAqB,mBAAVH,EAAuBD,IAAaC,IAAUE,GAAKF,EAAMI,IAAIL,GAAW,MAAM,IAAII,UAAU,4EACvG,MAAgB,MAATF,EAAeC,EAAa,MAATD,EAAeC,EAAEG,KAAKN,GAAYG,EAAIA,EAAEI,MAAQN,EAAMO,IAAIR,EACxF,CAEO,SAASS,EAAuBT,EAAUC,EAAOM,EAAOL,EAAMC,GACjE,GAAa,MAATD,EAAc,MAAM,IAAIE,UAAU,kCACtC,GAAa,MAATF,IAAiBC,EAAG,MAAM,IAAIC,UAAU,iDAC5C,GAAqB,mBAAVH,EAAuBD,IAAaC,IAAUE,GAAKF,EAAMI,IAAIL,GAAW,MAAM,IAAII,UAAU,2EACvG,MAAiB,MAATF,EAAeC,EAAEG,KAAKN,EAAUO,GAASJ,EAAIA,EAAEI,MAAQA,EAAQN,EAAMS,IAAIV,EAAUO,GAASA,CACxG,CA+BkD,mBAApBI,iBAAiCA,2HClTzD,MAAOC,WAA8DC,YACzE,yBAAWC,GACT,OAAO,CACR,CAqBD,SAAIP,GACF,OAAIR,EAAAgB,KAAIC,EAAA,KACCjB,EAAAgB,KAAIE,EAAA,IAAAC,GAAJZ,KAAAS,KAAqBhB,EAAAgB,KAAWC,EAAA,MAEhC,IAEV,CACD,SAAIT,CAAMA,GACRR,EAAAgB,KAAyBE,EAAA,IAAAE,GAAAb,KAAzBS,KAA0BR,EAC3B,CACD,aAAIa,GACF,OAAOrB,EAAAgB,KAAIM,EAAA,IACZ,CACD,aAAID,CAAUb,GACZE,EAAAM,KAAIM,EAAcd,EAAK,KACvBQ,KAAKO,SAASC,MAAMhB,MAAQA,EAC5BR,EAAAgB,KAAsBE,EAAA,IAAAO,GAAAlB,KAAtBS,KAAuBR,EACxB,CACD,uBAAIkB,GACF,OAAIV,KAAKR,MACAR,EAAAgB,KAAIE,EAAA,IAAAS,GAAJpB,KAAAS,KAAqBhB,EAAAgB,KAAWC,EAAA,MAEhC,EAEV,CAGD,cAAIW,GACF,OAAO5B,EAAAgB,KAAgBa,EAAA,MAAI,EAC5B,CACD,cAAID,CAAWpB,GACRsB,MAAMC,QAAQvB,IAOnBE,EAAAM,KAAIa,EAAerB,EAAK,KAExBQ,KAAKgB,kBAAoBhC,EAAAgB,KAAIE,EAAA,IAAAe,GAAJ1B,KAAAS,KAAuBA,KAAKK,WACrDrB,EAAAgB,KAAIE,EAAA,IAAAgB,GAAJ3B,KAAAS,OATEmB,QAAQC,MACN,sFACA,CAAE5B,SAQP,CAED,eAAI6B,GACF,OAAOrC,EAAAgB,KAAIsB,EAAA,IACZ,CACD,eAAID,CAAY7B,GACdE,EAAAM,KAAIsB,EAAgB9B,EAAK,KACN,OAAfQ,KAAKR,YAAiC+B,IAAfvB,KAAKR,MAC9BQ,KAAKO,SAASC,MAAMa,YAAc,GAElCrB,KAAKO,SAASC,MAAMa,YAAc7B,CAErC,CAGD,qBAAIgC,GACF,OAAOxC,EAAAgB,KAAIyB,EAAA,IACZ,CACD,qBAAID,CAAkBhC,GACpBE,EAAAM,KAAIyB,EAAsBjC,EAAK,IAChC,CACD,qBAAIwB,GACF,OAAOhC,EAAAgB,KAAI0B,EAAA,IACZ,CACD,qBAAIV,CAAkBxB,GAChBsB,MAAMC,QAAQvB,IAA0B,GAAhBA,EAAMmC,OAChC3B,KAAKO,SAASqB,qBAAqBC,UAAUC,IAAI,UACxChB,MAAMC,QAAQvB,IACvBQ,KAAKO,SAASqB,qBAAqBC,UAAUE,OAAO,UAEtDrC,EAAAM,KAAI0B,EAAsBlC,EAAK,KAC/BR,EAAAgB,KAAIE,EAAA,IAAA8B,GAAJzC,KAAAS,KACD,CACD,kBAAIiC,GACF,MChHK,QAAQC,KAAKC,OAAOC,UAAUC,UDiHpC,CACD,UAAIC,GACF,OAAOtC,KAAKO,SAASgC,iBAAiBV,UAAUW,SAAS,YAC1D,CAUD,cAAIC,GACF,OAAOzD,EAAAgB,KAAI0C,EAAA,IACZ,CAED,YAAIC,GACF,OAAO3D,EAAAgB,KAAI4C,EAAA,IACZ,CACD,YAAID,CAASnD,GACXE,EAAAM,KAAI4C,EAAapD,EAAK,KACtBQ,KAAKO,SAASC,MAAMmC,SAAWnD,EAC5BA,EAEAR,EAAAgB,YAAwB6C,QAAQf,IAAI,YAEpC9C,EAAAgB,YAAwB6C,QAAQC,OAAO,WAE3C,CAED,YAAIC,CAASvD,GACXE,EAAAM,KAAIgD,EAAaxD,EAAK,KACtBR,EAAAgB,KAAgB0C,EAAA,KAACO,eAAc,EAChC,CACD,YAAIF,GACF,OAAO/D,EAAAgB,KAAIgD,EAAA,IACZ,CAKD,4BAAIE,GAEF,MAAwD,KAAjDlD,KAAKmD,aAAa,4BAAsF,SAAjDnD,KAAKmD,aAAa,0BACjF,CACD,QAAIC,GACF,OAAOpD,KAAKmD,aAAa,SAAW,EACrC,CAED,WAAIE,GACF,OAAOrD,KAAKR,QAAUQ,KAAKsD,YAC5B,CACD,WAAAC,GACEC,oBAtJFvD,EAAgBN,IAAAK,UAAA,GAChBM,EAAAX,IAAAK,KAAa,IAGbyD,EAAA9D,IAAAK,KAA2B,MAC3BA,KAAA0D,UAA+C,CAC7CC,eAAiBC,GACK,iBAAVA,GAAuC,iBAAVA,EAC9BA,EAAOC,YAEd1C,QAAQC,MAAM,6DAA6D,kBAAkBwC,GACtF,4BAGXE,eAAgB,KAChBC,aAAc,KACdC,oBAAqB,MA4BvBnD,EAAAlB,IAAAK,KAAyB,IACzB0B,EAAA/B,IAAAK,KAAgC,IAiBhCsB,EAAA3B,IAAAK,KAAe,IAafyB,EAAA9B,IAAAK,KAAqB,UAiCrB0C,EAAc/C,IAAAK,KAAA,IAAIiE,EAAAA,iBAAkDjE,KAAKkE,oBAAoBC,KAAKnE,MAAMA,KAAKoE,qBAAqBD,KAAKnE,OAAM,IAAIhB,EAAAgB,gBAAsB,IAAIA,KAAKK,WAAUrB,EAAAgB,KAAIE,EAAA,IAAAmE,GAAsBF,KAAKnE,MAAMhB,EAAAgB,KAAIE,EAAA,IAAAoE,IAAsBH,KAAKnE,QAI9P4C,EAAAjD,IAAAK,MAAY,GAcZgD,EAAArD,IAAAK,MAAY,GAQZuE,EAA8B5E,IAAAK,UAAA,GAW9BA,KAAYsD,aAAkB,KAMO,mBAAxBtD,KAAKwE,iBAEd9E,EAAAM,KAAkBuE,EAAAvE,KAAKwE,uBAEzBxF,EAAAgB,KAAIE,EAAA,IAAAuE,GAAJlF,KAAAS,MACAhB,EAAAgB,KAAIE,EAAA,IAAAwE,GAAJnF,KAAAS,KACD,CACD,iBAAA2E,GAEE3F,EAAAgB,KAAIE,EAAA,IAAA0E,GAAJrF,KAAAS,MACAhB,EAAAgB,KAAIE,EAAA,IAAA2E,GAAJtF,KAAAS,KACD,CAiED,6BAAW8E,GACT,MAAO,CACL,QACA,UACA,QACA,WACA,cACA,qBAEH,CACD,wBAAAC,CAAyB3B,EAAa4B,EAAiBC,GAErDjG,EAAAgB,cAAAT,KAAAS,KAAwBoD,EAAM6B,EAC/B,CAoMD,KAAAC,GACElF,KAAKO,SAASC,MAAM0E,QACpBlG,EAAAgB,KAAIE,EAAA,IAAAiF,GAAJ5F,KAAAS,MACAA,KAAKO,SAASgC,iBAAiBV,UAAUC,IAAI,aACzC9B,KAAKiC,iBACPjC,KAAKO,SAASC,MAAMa,YAAcrC,EAAAgB,KAAIyB,EAAA,KAEzC,CACD,IAAA2D,GACEpF,KAAKO,SAASgC,iBAAiBV,UAAUE,OAAO,aAChD/B,KAAKK,UAAY,GACjBrB,EAAAgB,KAAgCE,EAAA,IAAAmF,GAAA9F,KAAhCS,KAAiC,IACjChB,EAAAgB,KAAIE,EAAA,IAAAoF,GAAJ/F,KAAAS,MACAhB,EAAAgB,KAAgB0C,EAAA,KAACO,eAAc,GAC3BjD,KAAKiC,iBACHjC,KAAKR,MACPQ,KAAKO,SAASC,MAAMa,YAAc,GAElCrB,KAAKO,SAASC,MAAMa,YAAcrB,KAAKqB,aAG3CrB,KAAKO,SAASC,MAAM4E,MACrB,CAgFD,mBAAAlB,CAAoBqB,GAKlBvF,KAAKO,SAASiF,WAAWC,UAAYF,EACrCvF,KAAKO,SAASiF,WAAW3D,UAAUC,IAAI,UACxC,CACD,oBAAAsC,GACEpE,KAAKO,SAASiF,WAAWC,UAAYzF,KAAKmD,aAAa,YAAc,GACrEnD,KAAKO,SAASiF,WAAW3D,UAAUE,OAAO,UAC3C,CAqFD,aAAAkB,GACE,MAAMyC,EAAmB1G,EAAAgB,KAAI0C,EAAA,KAAaO,eAAc,GACxD,IAAKyC,EAAiBC,WAAY,CAChC,MAAMC,EAAQ,IAAIC,YAAY,WAC9B7F,KAAK8F,cAAcF,EACpB,CACD,OAAOF,EAAiBC,UACzB,CAKD,cAAAI,GACE,MAAML,EAAmB1G,EAAAgB,KAAI0C,EAAA,KAAaO,eAAc,GACxD,IAAKyC,EAAiBC,WAAY,CAChC,MAAMC,EAAQ,IAAIC,YAAY,WAC9B7F,KAAK8F,cAAcF,EACpB,CACD,OAAOF,EAAiBC,UACzB,CAwBD,qBAAIK,GACF,OAAOhH,EAAAgB,KAAeuE,EAAA,MAAEyB,mBAAqBhH,EAAAgB,KAAgB0C,EAAA,KAACuD,cAAcV,OAC7E,uLAjkBC,MAAO,CACLW,aAAalH,EAAAgB,KAAeM,EAAA,KAC5B6F,eAAenH,EAAAgB,KAAWC,EAAA,KAC1BT,MAAMQ,KAAKR,MAEf,EAACqF,EAAA,WAyDC,MAAMe,EAAQ,IAAIC,YAAY,OAAQ,CAAEO,SAAS,EAAMC,UAAU,IACjErG,KAAK8F,cAAcF,EACrB,EAAChB,EAAA,WAEC,MAAMgB,EAAQ,IAAIC,YAAY,OAAQ,CAAEO,SAAS,EAAMC,UAAU,IACjErG,KAAK8F,cAAcF,EACrB,EAACnB,EAAA,WAEC,MAAM6B,EAAatG,KAAKuG,aAAa,CACnCC,KAAM,OACNC,gBAAe,IAGXC,EAAUC,SAASC,cAAc,YACvCF,EAAQjB,UAFK,k8bAGba,EAAWO,YAAYH,EAAQI,QAAQC,WAAU,IACjD/G,KAAKO,SAAW,CACdC,MAAO8F,EAAWU,cAAc,qBAChCzE,iBAAkB+D,EAAWU,cAAc,4BAC3CC,qBAAsBX,EAAWU,cAC/B,2BAEFxB,WAAYc,EAAWU,cAAc,gBACrCpG,WAAY0F,EAAWU,cAAc,gBACrCE,kBAAmBZ,EAAWU,cAAc,wBAC5CG,UAAWb,EAAWU,cAAc,eACpCI,MAAO,CACLC,QAASf,EAAWU,cAAc,SAClCM,KAAMhB,EAAWU,cAAc,uBAEjCpF,qBAAsB0E,EAAWU,cAC/B,4BAGJhI,EAAAgB,KAAIE,EAAA,IAAAqH,GAAJhI,KAAAS,KACF,EAACuH,EAAA,WAECvH,KAAKO,SAASC,MAAMgH,iBAAiB,UAAWC,IAC9CzI,EAAAgB,KAAmBE,EAAA,IAAAwH,GAAAnI,KAAnBS,KAAoByH,EAAE,IAExBzH,KAAKO,SAASC,MAAMgH,iBAClB,WACAxI,EAAAgB,cAAsBmE,KAAKnE,OAE7BA,KAAKO,SAASC,MAAMgH,iBAAiB,QAASxI,EAAAgB,cAAmBmE,KAAKnE,OACtEA,KAAKO,SAASC,MAAMgH,iBAClB,cACAxI,EAAAgB,cAAyBmE,KAAKnE,OAEhCA,KAAKO,SAASC,MAAMgH,iBAAiB,SAAUC,IAC7CzI,EAAAgB,KAAkBE,EAAA,IAAAyH,GAAApI,KAAlBS,KAAmByH,EAA2B,IAEhDzH,KAAKO,SAASC,MAAMgH,iBAAiB,QAASxI,EAAAgB,cAAmBmE,KAAKnE,OACtEA,KAAKO,SAASC,MAAMgH,iBAAiB,OAAQxI,EAAAgB,cAAkBmE,KAAKnE,OACpEA,KAAKO,SAAS4G,UAAUK,iBACtB,QACAxI,EAAAgB,cAAsBmE,KAAKnE,MAE/B,EAAC0E,EAAA,WAEC1E,KAAKK,UAAY,GACjBL,KAAKR,MAAQQ,KAAKmD,aAAa,UAAsB,IACvD,EAACyE,EAAA,SAekBxE,EAAc5D,GAC/B,OAAQ4D,GACN,IAAK,QACHpD,KAAKO,SAAS6G,MAAME,KAAK7B,UAAYjG,EACxB,MAATA,GAA0B+B,MAAT/B,GAA+B,IAATA,EACzCQ,KAAKO,SAAS6G,MAAMC,QAAQxF,UAAUC,IAAI,UAE1C9B,KAAKO,SAAS6G,MAAMC,QAAQxF,UAAUE,OAAO,UAE/C,MACF,IAAK,UACH/B,KAAKO,SAASiF,WAAWC,UAAYjG,EACrC,MACF,IAAK,QACHR,EAAAgB,KAAyBE,EAAA,IAAAE,GAAAb,KAAzBS,KAA0BR,GAC1B,MACF,IAAK,WAEDQ,KAAK+C,SADO,KAAVvD,GAAyB,QAATA,GAA4B,QAATA,EAKvC,MACF,IAAK,cACHQ,KAAKqB,YAAc7B,EACnB,MACF,IAAK,qBACHQ,KAAKwB,kBAAoBhC,EAG/B,EAAC0B,EAAA,WAIC,GAAIlC,EAAAgB,KAAIyD,EAAA,KAAmB,CAGRzE,EAAAgB,KAAyBE,EAAA,IAAAE,GAAAb,KAAzBS,KAA0BhB,EAAAgB,KAAqByD,EAAA,OAG9D/D,EAAAM,KAAIyD,EAAoB,KAAI,IAE/B,MAAUzD,KAAKR,OACdR,EAAAgB,cAAAT,KAAAS,KAA0BA,KAAKR,MAEnC,aACqBA,GAEnB,MAAMqI,EAAgB7H,KAAKY,WAAWkH,MAAMlE,IAE1C,GAAI5E,EAAAgB,KAAIE,EAAA,IAAAC,GAAJZ,KAAAS,KAAqB4D,IAAWpE,EAClC,OAAOoE,CACR,IAEH,OAAIiE,SAAiBrI,GACnBR,EAAAgB,KAAcE,EAAA,IAAA6H,GAAAxI,KAAdS,KAAe6H,IACR,IAEPnI,EAAAM,KAAIyD,EAAoBjE,EAAK,MACtB,EAEX,aACUA,GACRE,EAAAM,KAAIyD,EAAoB,KAAI,KAC5B/D,EAAAM,KAAIC,EAAUT,EAAK,KACfA,SACFQ,KAAKK,UAAY,GACjBrB,EAAAgB,KAA0BE,EAAA,IAAA8H,GAAAzI,KAA1BS,KAA2B,MAC3BA,KAAKO,SAASgC,iBAAiBV,UAAUE,OAAO,eAE1C/B,KAAKiC,gBAAkBjC,KAAKsC,SAChCtC,KAAKO,SAASC,MAAMa,YAAcrB,KAAKqB,eAGzCrB,KAAKK,UAAY,GACjBrB,EAAAgB,KAA0BE,EAAA,IAAA8H,GAAAzI,KAA1BS,KAA2BR,GAC3BQ,KAAKO,SAASgC,iBAAiBV,UAAUC,IAAI,eAEvC9B,KAAKiC,gBAAkBjC,KAAKsC,SAChCtC,KAAKO,SAASC,MAAMa,YAAc,KAItCrC,EAAAgB,KAAsBE,EAAA,IAAAO,GAAAlB,KAAtBS,KAAuB,GACzB,EAACiI,EAAA,WAEKjI,KAAKsC,OACPtC,KAAKoF,OAELpF,KAAKkF,OAET,aACiBuC,GACf,MAAMS,EAAiC,CACrCC,OAAOV,EAAEU,OACT/B,QAAQqB,EAAErB,QACVgC,WAAWX,EAAEW,WACbC,KAAKZ,EAAEY,KACPhC,SAASoB,EAAEpB,SACXiC,QAAQb,EAAEa,QACVC,OAAOd,EAAEc,OACTC,YAAYf,EAAEe,YACdC,IAAIhB,EAAEgB,IACNC,SAASjB,EAAEiB,SACXC,QAAQlB,EAAEkB,QACVC,KAAKnB,EAAEmB,KACPC,OAAOpB,EAAEoB,OACTC,SAASrB,EAAEqB,UAEPlD,EAAQ,IAAImD,cAAc,WAAWb,GAC3ClI,KAAK8F,cAAcF,EACrB,aACoB6B,GAGpB,aACcA,GACZ,MAAMvB,EAAgBuB,EAAEuB,OAA4BxJ,MACpDQ,KAAKK,UAAY6F,EACjBlH,EAAAgB,KAAgCE,EAAA,IAAAmF,GAAA9F,KAAhCS,KAAiCkG,GACjClH,EAAAgB,KAAgB0C,EAAA,KAACO,eAAc,GAC/BjE,EAAAgB,KAAwBE,EAAA,IAAA+I,GAAA1J,KAAxBS,KAAyByH,EAC3B,aACoBA,GAClB,MAAM7B,EAAQ,IAAIsD,WAAW,QAAS,CACpC9C,QAASqB,EAAErB,QACXgC,WAAYX,EAAEW,WACd/B,SAAUoB,EAAEpB,SACZ8C,KAAM1B,EAAE0B,KACRC,aAAc3B,EAAE2B,aAChBb,OAAQd,EAAEc,OACVc,UAAW5B,EAAE4B,UACbb,YAAaf,EAAEe,YACfc,aAAc7B,EAAE8B,kBAChBX,KAAMnB,EAAEmB,OAEV5I,KAAK8F,cAAcF,EACrB,aACc6B,GACZ,MAAM+B,EAAa/B,EAAEuB,OAA4BxJ,MAEnC,cAAViI,EAAEgB,KAAiC,WAAVhB,EAAEgB,KAE7BzJ,EAAAgB,KAAgCE,EAAA,IAAAmF,GAAA9F,KAAhCS,KAAiCwJ,GAGnCxK,EAAAgB,KAAyBE,EAAA,IAAAuJ,GAAAlK,KAAzBS,KAA0ByH,EAC5B,aAC4BiC,GACP,KAAfA,EACF1J,KAAKO,SAAS0G,qBAAqBpF,UAAUC,IAAI,kBAEjD9B,KAAKO,SAAS0G,qBAAqBpF,UAAUE,OAAO,iBAExD,aACqB0F,GACnB,MAAM7B,EAAQ,IAAImD,cAAc,QAAS,CACvCZ,OAAQV,EAAEU,OACV/B,QAASqB,EAAErB,QACXgC,WAAYX,EAAEW,WACdC,KAAMZ,EAAEY,KACRC,QAASb,EAAEa,QACXC,OAAQd,EAAEc,OACVE,IAAKhB,EAAEgB,IACPK,SAAUrB,EAAEqB,SACZa,SAAUlC,EAAEkC,SACZjB,SAAUjB,EAAEiB,SACZrC,SAAUoB,EAAEpB,SACZmC,YAAaf,EAAEe,YACfG,QAASlB,EAAEkB,QACXE,OAAQpB,EAAEoB,OACVe,QAASnC,EAAEmC,QACXhB,KAAMnB,EAAEmB,OAEV5I,KAAK8F,cAAcF,EACrB,aACe6B,GACb,MAAM+B,EAAa/B,EAAEuB,OAA4BxJ,MAEjDE,EAAAM,KAAIM,EAAckJ,EAAS,IAC7B,EAACK,EAAA,WAEC7J,KAAKkF,OACP,aACauC,GACX,MAAMqC,EAAuBrC,EAAEsC,cAE7B/J,KAAKO,SAAS2G,kBAAkB1E,SAASsH,IACzC9J,KAAKO,SAAS4G,UAAU3E,SAASsH,IAIjC9J,KAAKoF,MAET,EAACD,EAAA,WAyBCnF,KAAKO,SAAS2G,kBAAkBrF,UAAUC,IAAI,SAChD,EAACwD,EAAA,WAECtF,KAAKO,SAAS2G,kBAAkBrF,UAAUE,OAAO,SACnD,aACkBiI,GAChBhK,KAAKgB,kBAAoBhC,EAAAgB,KAAsBE,EAAA,IAAAe,GAAA1B,KAAtBS,KAAuBgK,EAClD,EAAChI,EAAA,WAEC,MAAMiI,EAA+B,GACrCjK,KAAKgB,kBAAkBkJ,SAASC,IAC9B,MAAMC,EAAYpL,EAAAgB,KAAIE,EAAA,IAAAmK,QAAJrK,KAAsBmK,GACxCF,EAAcK,KAAKF,EAAU,IAE/BpK,KAAKO,SAASK,WAAW6E,UAAY,GACrCwE,EAAcC,SAASK,IACrBvK,KAAKO,SAASK,WAAWiG,YAAY0D,EAAc,GAEvD,aACiBJ,GACf,IAAIC,EAAmD,KACvD,MAAMI,EACJxL,EAAAgB,cAAAT,KAAAS,KAAqBhB,EAAAgB,cAAgBhB,EAAAgB,KAAIE,EAAA,IAAAC,QAAJH,KAAqBmK,GAW5D,OATEC,EADwC,mBAA/BpK,KAAK0D,UAAUK,aACZ/D,KAAK0D,UAAUK,aACzBoG,EACAnL,EAAAgB,KAAqBE,EAAA,IAAAuK,GAACtG,KAAKnE,MAC3BwK,GAGUxL,EAAAgB,KAA4BE,EAAA,IAAAwK,GAAAnL,KAA5BS,KAA6BmK,EAAMK,GAEjDJ,EAAU5K,MAAQ2K,EACXC,CACT,EAACM,EAAA,SAEuBP,EAAeK,GACrC,MAAMD,EAAgB5D,SAASC,cAAc,OAQ7C,OAPA2D,EAAc1I,UAAUC,IAAI,iBACxB0I,GACFD,EAAc1I,UAAUC,IAAI,qBAG9ByI,EAAc9E,UAAYzG,EAAAgB,KAAoBE,EAAA,IAAAS,GAAApB,KAApBS,KAAqBmK,GAC/CI,EAAc/C,iBAAiB,QAASxI,EAAAgB,KAAqBE,EAAA,IAAAuK,GAACtG,KAAKnE,OAC5DuK,CACT,aACiB9C,GACf,MAAMjI,EAASiI,EAAEkD,cAAiDnL,MAClER,EAAAgB,KAAkBE,EAAA,IAAA0K,GAAArL,KAAlBS,KAAmBR,GACnBQ,KAAKoF,OACLpG,EAAAgB,KAAIE,EAAA,IAAA2K,GAAJtL,KAAAS,KACF,aACcR,GACZR,EAAAgB,KAAcE,EAAA,IAAA6H,GAAAxI,KAAdS,KAAeR,GACfR,EAAAgB,KAAmBE,EAAA,IAAA4K,GAAAvL,KAAnBS,MAAoB,EACtB,aACkB+K,GAChB,MAAM/J,EAA+B,GAcrC,OAbAhB,KAAKY,WAAWoK,QAAQpH,IACtB,MAAMqH,EAAcjM,EAAAgB,KAAIE,EAAA,IAAAS,QAAJX,KAAqB4D,GACnCsH,EAAiC,iBAAfD,EACpBC,GAAYD,EAAYE,SAASJ,IACnC/J,EAAkBsJ,KAAK1G,GAEpBsH,GACH/J,QAAQiK,KACN,6DACA,CAAExH,SAAQyH,MAAOJ,GAEpB,IAEIjK,CACT,EAAC6J,EAAA,WAkBC,MAAMjF,EAAQ,IAAI0F,MAAM,UACxBtL,KAAK8F,cAAcF,EACrB,aACsBpG,GAIpB,GAFAQ,KAAKO,SAAS0G,qBAAqBxB,UAAY,GAE3CjG,QAAuC,CACzC,MAAM+L,EAAoBvM,EAAAgB,KAAIE,EAAA,IAAAsL,QAAJxL,KAA6BR,GACvDQ,KAAKO,SAAS0G,qBAAqBJ,YAAY0E,EAChD,CACH,aACwB/L,GACtB,MAAiD,mBAAtCQ,KAAK0D,UAAUM,oBACjBhE,KAAK0D,UAAUM,oBAAoBxE,GAEnCR,EAAAgB,KAAmCE,EAAA,IAAAuL,GAAAlM,KAAnCS,KAAoCR,EAE/C,aAC+BA,GAC7B,MAAMkM,EAAY1M,EAAAgB,KAAIE,EAAA,IAAAS,QAAJX,KAAqBR,GACjC+L,EAAoB5E,SAASC,cAAc,OAGjD,OAFA2E,EAAkB1J,UAAUC,IAAI,kBAChCyJ,EAAkB9F,UAAYiG,EACvBH,CACT,aACgB3H,GACV5D,KAAK0D,UAAUI,gBAA2D,mBAAlC9D,KAAK0D,UAAUI,gBACzD3C,QAAQC,MAAM,6CAEhB,IACE,MAA2C,mBAAjCpB,KAAK0D,UAAUI,eAChB9D,KAAK0D,UAAUI,eAAeF,GAE9BA,CAEV,CAAC,MAAO6D,GACPtG,QAAQC,MACN,iGACAwC,EAEH,CACH,aACgBA,GAC+B,mBAAlC5D,KAAK0D,UAAUC,gBACxBxC,QAAQC,MAAM,6CAEhB,IACE,OAAOpB,KAAK0D,UAAUC,eAAeC,EACtC,CAAC,MAAO6D,GACPtG,QAAQC,MACN,iGACAwC,EAEH,CACD,MAAO,EACT,EAACS,EAAA,WAEC,MAAMsH,EAAmE,GACzE,GAAG3L,KAAK+C,SAAS,CACf,MACMwC,EAAU,GADFvF,KAAKmD,aAAa,UAAY,0BAE5CwI,EAAerB,KAAK,CAClBsB,UAAU,EAAEzF,oBACHA,QAETZ,QAAQA,EACRsG,UAAU,gBAEb,CACD,OAAOF,CACT,aAEeG,GACb,IAAK9L,KAAKkD,yBACR,OAAOlE,EAAAgB,KAAgB0C,EAAA,KAACO,cAAc6I,EAE1C,cA6BqBC,GACnB,GAAIA,EAAOpG,WACT3G,EAAAgB,aAAiBgM,YAAY,CAAA,EAAI,QAC5B,CACL,MAAMnJ,EAA6B,CAAA,EACnC,IAAI0C,EAAU,GACdwG,EAAOE,eAAe/B,SAASgC,IACxBA,EAAIC,UACHD,EAAIzJ,WAAWoJ,UACjBhJ,EAAOqJ,EAAIzJ,WAAWoJ,YAAa,EAEnChJ,EAAoB,aAAI,EAEX,IAAX0C,IAAiBA,EAAU2G,EAAI3G,SAEpC,IAEHvG,EAAAgB,aAAiBgM,YAAYnJ,EAAQ0C,EACtC,CACH,GAK0B6G,eAAe3M,IAAI,cAG7C0C,OAAOiK,eAAeC,OAAO,YAAaxM"}
1
+ {"version":3,"file":"jb-select.umd.js","sources":["../lib/jb-select.ts","../../../common/scripts/device-detection.ts"],"sourcesContent":["import HTML from \"./jb-select.html\";\r\nimport CSS from \"./jb-select.scss\";\r\nimport {\r\n JBSelectCallbacks,\r\n JBSelectElements,\r\n JBSelectOptionElement,\r\n ValidationValue,\r\n} from \"./types\";\r\nimport {ValidationHelper, type ValidationItem, type ValidationResult, type WithValidation} from \"jb-validation\";\r\nimport { isMobile } from \"../../../common/scripts/device-detection\";\r\nimport {JBFormInputStandards} from 'jb-form';\r\n//TOption is the type of option, TValue is the type of value we extract from option\r\nexport class JBSelectWebComponent<TOption = any, TValue = TOption> extends HTMLElement implements WithValidation<ValidationValue<TOption,TValue>>, JBFormInputStandards<TValue> {\r\n static get formAssociated() {\r\n return true;\r\n }\r\n // we keep selected option here by option but we return TValue when user demand\r\n #value: TOption;\r\n #textValue = \"\";\r\n // if user set value and current option list is not contain the option.\r\n // we hold it in _notFoundedValue and select value when option value get updated\r\n #notFoundedValue: TValue = null;\r\n callbacks: JBSelectCallbacks<TOption,TValue> = {\r\n getOptionTitle: (option) => {\r\n if(typeof option == \"string\" || typeof option == \"number\"){\r\n return option.toString();\r\n }else{\r\n console.error(\"title must be string please provide a valid getOptionTitle\",\"provided title:\",option);\r\n return \"NOT SUPPORTED TITLE TYPE\";\r\n }\r\n },\r\n getOptionValue: null,\r\n getOptionDOM: null,\r\n getSelectedValueDOM: null,\r\n };\r\n elements!: JBSelectElements;\r\n get value():TValue{\r\n if (this.#value) {\r\n return this.#getOptionValue(this.#value);\r\n } else {\r\n return null;\r\n }\r\n }\r\n set value(value:TValue) {\r\n this.#setValueFromOutside(value);\r\n }\r\n get textValue() {\r\n return this.#textValue;\r\n }\r\n set textValue(value) {\r\n this.#textValue = value;\r\n this.elements.input.value = value;\r\n this.#updateOptionList(value);\r\n }\r\n get selectedOptionTitle() {\r\n if (this.value) {\r\n return this.#getOptionTitle(this.#value);\r\n } else {\r\n return \"\";\r\n }\r\n }\r\n #optionList: TOption[] = [];\r\n #displayOptionList: TOption[] = [];\r\n get optionList() {\r\n return this.#optionList || [];\r\n }\r\n set optionList(value) {\r\n if (!Array.isArray(value)) {\r\n console.error(\r\n \"your provided option list to jb-select is not a array. you must provide array value\",\r\n { value }\r\n );\r\n return;\r\n }\r\n this.#optionList = value;\r\n //every time optionList get updated we set our value base on current option list we use _notFoundedValue in case of value provided to component before optionList\r\n this.displayOptionList = this.#filterOptionList(this.textValue);\r\n this.#setValueOnOptionListChanged();\r\n }\r\n #placeholder = \"\";\r\n get placeholder() {\r\n return this.#placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this.#placeholder = value;\r\n if (this.value !== null && this.value !== undefined) {\r\n this.elements.input.placeholder = \"\";\r\n } else {\r\n this.elements.input.placeholder = value;\r\n }\r\n }\r\n //on mobile device when search modal open this will appear on search box\r\n #searchPlaceholder = \"search\";\r\n get searchPlaceholder() {\r\n return this.#searchPlaceholder;\r\n }\r\n set searchPlaceholder(value) {\r\n this.#searchPlaceholder = value;\r\n }\r\n get displayOptionList() {\r\n return this.#displayOptionList;\r\n }\r\n set displayOptionList(value: TOption[]) {\r\n if (Array.isArray(value) && value.length == 0) {\r\n this.elements.emptyListPlaceholder.classList.add(\"--show\");\r\n } else if (Array.isArray(value)) {\r\n this.elements.emptyListPlaceholder.classList.remove(\"--show\");\r\n }\r\n this.#displayOptionList = value;\r\n this.#updateOptionListDOM();\r\n }\r\n get isMobileDevice() {\r\n return isMobile();\r\n }\r\n get isOpen() {\r\n return this.elements.componentWrapper.classList.contains(\"--focused\");\r\n }\r\n // this value used by validation module to send to validation callbacks\r\n get #ValidationValue():ValidationValue<TOption,TValue>{\r\n return {\r\n inputtedText:this.#textValue,\r\n selectedOption:this.#value,\r\n value:this.value\r\n };\r\n }\r\n #validation = new ValidationHelper<ValidationValue<TOption,TValue>>(this.showValidationError.bind(this),this.clearValidationError.bind(this),()=>this.#ValidationValue,()=>this.textValue,this.#getInsideValidation.bind(this),this.#setValidationResult.bind(this));\r\n get validation(){\r\n return this.#validation;\r\n }\r\n #disabled = false;\r\n get disabled(){\r\n return this.#disabled;\r\n }\r\n set disabled(value:boolean){\r\n this.#disabled = value;\r\n this.elements.input.disabled = value;\r\n if(value){\r\n //TODO: remove as any when typescript support\r\n (this.#internals as any).states?.add(\"disabled\");\r\n }else{\r\n (this.#internals as any).states?.delete(\"disabled\");\r\n }\r\n }\r\n #required = false;\r\n set required(value:boolean){\r\n this.#required = value;\r\n this.#validation.checkValidity(false);\r\n }\r\n get required() {\r\n return this.#required;\r\n }\r\n #internals?: ElementInternals;\r\n /**\r\n * @description will determine if component trigger jb-validation mechanism automatically on user event or it just let user-developer handle validation mechanism by himself\r\n */\r\n get isAutoValidationDisabled(): boolean {\r\n //currently we only support disable-validation in attribute and only in initiate time but later we can add support for change of this \r\n return this.getAttribute('disable-auto-validation') === '' || this.getAttribute('disable-auto-validation') === 'true' ? true : false;\r\n }\r\n get name(){\r\n return this.getAttribute('name') || '';\r\n }\r\n initialValue: TValue | null = null;\r\n get isDirty(): boolean{\r\n return this.value !== this.initialValue;\r\n }\r\n constructor() {\r\n super();\r\n if (typeof this.attachInternals == \"function\") {\r\n //some browser dont support attachInternals\r\n this.#internals = this.attachInternals();\r\n }\r\n this.#initWebComponent();\r\n this.#initProp();\r\n }\r\n connectedCallback() {\r\n // standard web component event that called when all of dom is binded\r\n this.#callOnLoadEvent();\r\n this.#callOnInitEvent();\r\n }\r\n #callOnInitEvent() {\r\n const event = new CustomEvent(\"init\", { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n #callOnLoadEvent() {\r\n const event = new CustomEvent(\"load\", { bubbles: true, composed: true });\r\n this.dispatchEvent(event);\r\n }\r\n #initWebComponent() {\r\n const shadowRoot = this.attachShadow({\r\n mode: \"open\",\r\n delegatesFocus:true,\r\n });\r\n const html = `<style>${CSS}</style>` + \"\\n\" + HTML;\r\n const element = document.createElement(\"template\");\r\n element.innerHTML = html;\r\n shadowRoot.appendChild(element.content.cloneNode(true));\r\n this.elements = {\r\n input: shadowRoot.querySelector(\".select-box input\")!,\r\n componentWrapper: shadowRoot.querySelector(\".jb-select-web-component\")!,\r\n selectedValueWrapper: shadowRoot.querySelector(\r\n \".selected-value-wrapper\"\r\n )!,\r\n messageBox: shadowRoot.querySelector(\".message-box\")!,\r\n optionList: shadowRoot.querySelector(\".select-list\")!,\r\n optionListWrapper: shadowRoot.querySelector(\".select-list-wrapper\")!,\r\n arrowIcon: shadowRoot.querySelector(\".arrow-icon\")!,\r\n label: {\r\n wrapper: shadowRoot.querySelector(\"label\")!,\r\n text: shadowRoot.querySelector(\"label .label-value\")!,\r\n },\r\n emptyListPlaceholder: shadowRoot.querySelector(\r\n \".empty-list-placeholder\"\r\n )!,\r\n };\r\n this.#registerEventListener();\r\n }\r\n #registerEventListener() {\r\n this.elements.input.addEventListener(\"change\", (e:Event) => {\r\n this.#onInputChange(e);\r\n });\r\n this.elements.input.addEventListener(\r\n \"keypress\",\r\n this.#onInputKeyPress.bind(this)\r\n );\r\n this.elements.input.addEventListener(\"keyup\", this.#onInputKeyup.bind(this));\r\n this.elements.input.addEventListener(\r\n \"beforeinput\",\r\n this.#onInputBeforeInput.bind(this)\r\n );\r\n this.elements.input.addEventListener(\"input\", (e) => {\r\n this.#onInputInput(e as unknown as InputEvent);\r\n });\r\n this.elements.input.addEventListener(\"focus\", this.#onInputFocus.bind(this));\r\n this.elements.input.addEventListener(\"blur\", this.#onInputBlur.bind(this));\r\n this.elements.arrowIcon.addEventListener(\r\n \"click\",\r\n this.#onArrowKeyClick.bind(this)\r\n );\r\n }\r\n #initProp() {\r\n this.textValue = \"\";\r\n this.value = this.getAttribute(\"value\") as TValue || null ;\r\n }\r\n static get observedAttributes() {\r\n return [\r\n \"label\",\r\n \"message\",\r\n \"value\",\r\n \"required\",\r\n \"placeholder\",\r\n \"search-placeholder\",\r\n ];\r\n }\r\n attributeChangedCallback(name:string, oldValue:string, newValue:string) {\r\n // do something when an attribute has changed\r\n this.#onAttributeChange(name, newValue);\r\n }\r\n #onAttributeChange(name: string, value: string) {\r\n switch (name) {\r\n case \"label\":\r\n this.elements.label.text.innerHTML = value;\r\n if (value == null || value == undefined || value == \"\") {\r\n this.elements.label.wrapper.classList.add(\"--hide\");\r\n } else {\r\n this.elements.label.wrapper.classList.remove(\"--hide\");\r\n }\r\n break;\r\n case \"message\":\r\n this.elements.messageBox.innerHTML = value;\r\n break;\r\n case \"value\":\r\n this.#setValueFromOutside(value as TValue);\r\n break;\r\n case \"required\":\r\n if (value === \"\" || value == \"true\" || value == \"True\") {\r\n this.required = true;\r\n } else {\r\n this.required = false;\r\n }\r\n break;\r\n case \"placeholder\":\r\n this.placeholder = value;\r\n break;\r\n case \"search-placeholder\":\r\n this.searchPlaceholder = value;\r\n break;\r\n }\r\n }\r\n #setValueOnOptionListChanged() {\r\n //when option list changed we see if current value is valid for new optionlist we set it if not we reset value to null.\r\n //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\r\n if (this.#notFoundedValue) {\r\n //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\r\n //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\r\n const isSetted = this.#setValueFromOutside(this.#notFoundedValue);\r\n if (isSetted) {\r\n //after list update and when not founded value is found in new option list we clear old not founded value\r\n this.#notFoundedValue = null;\r\n }\r\n } else if (this.value) {\r\n this.#setValueFromOutside(this.value);\r\n }\r\n }\r\n #setValueFromOutside(value: TValue): boolean {\r\n //when user set value by attribute or value prop directly we call this function\r\n const matchedOption = this.optionList.find((option) => {\r\n // if we have value mapper we set selected value by object that match mapper\r\n if (this.#getOptionValue(option) == value) {\r\n return option;\r\n }\r\n });\r\n if (matchedOption || value === null || value === undefined) {\r\n this.#setValue(matchedOption);\r\n return true;\r\n } else {\r\n this.#notFoundedValue = value;\r\n return false;\r\n }\r\n }\r\n #setValue(value: TOption) {\r\n this.#notFoundedValue = null;\r\n this.#value = value;\r\n if (value === null || value === undefined) {\r\n this.textValue = \"\";\r\n this.#setSelectedOptionDom(null);\r\n this.elements.componentWrapper.classList.remove(\"--has-value\");\r\n //show placeholder when user empty data\r\n if (!(this.isMobileDevice && this.isOpen)) {\r\n this.elements.input.placeholder = this.placeholder;\r\n }\r\n } else {\r\n this.textValue = \"\";\r\n this.#setSelectedOptionDom(value);\r\n this.elements.componentWrapper.classList.add(\"--has-value\");\r\n //hide placeholder when user select data\r\n if (!(this.isMobileDevice && this.isOpen)) {\r\n this.elements.input.placeholder = \"\";\r\n }\r\n }\r\n //if user select an option we rest filter so user see all option again when open a select\r\n this.#updateOptionList(\"\");\r\n }\r\n #onArrowKeyClick() {\r\n if (this.isOpen) {\r\n this.blur();\r\n } else {\r\n this.focus();\r\n }\r\n }\r\n #onInputKeyPress(e:KeyboardEvent) {\r\n const eventOptions:KeyboardEventInit = {\r\n altKey:e.altKey,\r\n bubbles:e.bubbles,\r\n cancelable:e.cancelable,\r\n code:e.code,\r\n composed:e.composed,\r\n ctrlKey:e.ctrlKey,\r\n detail:e.detail,\r\n isComposing:e.isComposing,\r\n key:e.key,\r\n location:e.location,\r\n metaKey:e.metaKey,\r\n view:e.view,\r\n repeat:e.repeat,\r\n shiftKey:e.shiftKey \r\n };\r\n const event = new KeyboardEvent(\"keypress\",eventOptions);\r\n this.dispatchEvent(event);\r\n }\r\n #onInputBeforeInput(e: InputEvent) {\r\n // const inputtedText = e.data || \"\";\r\n //TODO: add cancelable event dispatch here\r\n }\r\n #onInputInput(e: InputEvent) {\r\n const inputtedText = (e.target as HTMLInputElement).value;\r\n this.textValue = inputtedText;\r\n this.#handleSelectedValueDisplay(inputtedText);\r\n this.#validation.checkValidity(false);\r\n this.#dispatchInputEvent(e);\r\n }\r\n #dispatchInputEvent(e: InputEvent) {\r\n const event = new InputEvent(\"input\", {\r\n bubbles: e.bubbles,\r\n cancelable: e.cancelable,\r\n composed: e.composed,\r\n data: e.data,\r\n dataTransfer: e.dataTransfer,\r\n detail: e.detail,\r\n inputType: e.inputType,\r\n isComposing: e.isComposing,\r\n targetRanges: e.getTargetRanges(),\r\n view: e.view,\r\n });\r\n this.dispatchEvent(event);\r\n }\r\n #onInputKeyup(e: KeyboardEvent) {\r\n const inputText = (e.target as HTMLInputElement).value;\r\n //here is the rare time we update #value directly because we want trigger event that may read value directly from dom\r\n if (e.key === \"Backspace\" || e.key === \"Delete\") {\r\n //because on keypress dont receive backspace key press\r\n this.#handleSelectedValueDisplay(inputText);\r\n }\r\n\r\n this.#triggerOnInputKeyup(e);\r\n }\r\n #handleSelectedValueDisplay(inputValue: string) {\r\n if (inputValue !== \"\") {\r\n this.elements.selectedValueWrapper.classList.add(\"--search-typed\");\r\n } else {\r\n this.elements.selectedValueWrapper.classList.remove(\"--search-typed\");\r\n }\r\n }\r\n #triggerOnInputKeyup(e: KeyboardEvent) {\r\n const event = new KeyboardEvent(\"keyup\", {\r\n altKey: e.altKey,\r\n bubbles: e.bubbles,\r\n cancelable: e.cancelable,\r\n code: e.code,\r\n ctrlKey: e.ctrlKey,\r\n detail: e.detail,\r\n key: e.key,\r\n shiftKey: e.shiftKey,\r\n charCode: e.charCode,\r\n location: e.location,\r\n composed: e.composed,\r\n isComposing: e.isComposing,\r\n metaKey: e.metaKey,\r\n repeat: e.repeat,\r\n keyCode: e.keyCode,\r\n view: e.view,\r\n });\r\n this.dispatchEvent(event);\r\n }\r\n #onInputChange(e: Event) {\r\n const inputText = (e.target as HTMLInputElement).value;\r\n //here is the rare time we update _text_value directly because we want trigger event that may read value directly from dom\r\n this.#textValue = inputText;\r\n }\r\n #onInputFocus() {\r\n this.focus();\r\n }\r\n #onInputBlur(e: FocusEvent) {\r\n const focusedElement = <Node>e.relatedTarget;\r\n if (\r\n this.elements.optionListWrapper.contains(focusedElement) ||\r\n this.elements.arrowIcon.contains(focusedElement)\r\n ) {\r\n //user click on a menu item\r\n } else {\r\n this.blur();\r\n }\r\n }\r\n focus() {\r\n this.elements.input.focus();\r\n this.#showOptionList();\r\n this.elements.componentWrapper.classList.add(\"--focused\");\r\n if (this.isMobileDevice) {\r\n this.elements.input.placeholder = this.#searchPlaceholder;\r\n }\r\n }\r\n blur() {\r\n this.elements.componentWrapper.classList.remove(\"--focused\");\r\n this.textValue = \"\";\r\n this.#handleSelectedValueDisplay(\"\");\r\n this.#hideOptionList();\r\n this.#validation.checkValidity(true);\r\n if (this.isMobileDevice) {\r\n if (this.value) {\r\n this.elements.input.placeholder = \"\";\r\n } else {\r\n this.elements.input.placeholder = this.placeholder;\r\n }\r\n }\r\n this.elements.input.blur();\r\n }\r\n #showOptionList() {\r\n this.elements.optionListWrapper.classList.add(\"--show\");\r\n }\r\n #hideOptionList() {\r\n this.elements.optionListWrapper.classList.remove(\"--show\");\r\n }\r\n #updateOptionList(filterText: string) {\r\n this.displayOptionList = this.#filterOptionList(filterText);\r\n }\r\n #updateOptionListDOM() {\r\n const optionDomList: HTMLElement[] = [];\r\n this.displayOptionList.forEach((item) => {\r\n const optionDOM = this.#createOptionDOM(item);\r\n optionDomList.push(optionDOM);\r\n });\r\n this.elements.optionList.innerHTML = \"\";\r\n optionDomList.forEach((optionElement) => {\r\n this.elements.optionList.appendChild(optionElement);\r\n });\r\n }\r\n #createOptionDOM(item: TOption): JBSelectOptionElement<TOption> {\r\n let optionDOM: JBSelectOptionElement<TOption> | null = null;\r\n const isSelected =\r\n this.#getOptionValue(this.#value) == this.#getOptionValue(item);\r\n if (typeof this.callbacks.getOptionDOM == \"function\") {\r\n optionDOM = this.callbacks.getOptionDOM(\r\n item,\r\n this.#onOptionClicked.bind(this),\r\n isSelected\r\n );\r\n } else {\r\n optionDOM = this.#createDefaultOptionDom(item, isSelected);\r\n }\r\n optionDOM.value = item;\r\n return optionDOM;\r\n }\r\n\r\n #createDefaultOptionDom(item: TOption, isSelected: boolean): JBSelectOptionElement<TOption> {\r\n const optionElement = document.createElement(\"div\");\r\n optionElement.classList.add(\"select-option\");\r\n if (isSelected) {\r\n optionElement.classList.add(\"--selected-option\");\r\n }\r\n //it has default function who return exact same input\r\n optionElement.innerHTML = this.#getOptionTitle(item);\r\n optionElement.addEventListener(\"click\", this.#onOptionClicked.bind(this));\r\n return optionElement;\r\n }\r\n #onOptionClicked(e: MouseEvent) {\r\n const prevValue = this.#value;\r\n const value = (e.currentTarget as JBSelectOptionElement<TOption>).value;\r\n this.#selectOption(value);\r\n this.blur();\r\n const dispatchedEvent = this.#dispatchOnChangeEvent();\r\n if(dispatchedEvent.defaultPrevented){\r\n e.preventDefault();\r\n this.#selectOption(prevValue);\r\n }\r\n }\r\n #selectOption(value: TOption) {\r\n this.#setValue(value);\r\n this.#checkValidity(true);\r\n }\r\n #filterOptionList(filterString: string): TOption[] {\r\n const displayOptionList: TOption[] = [];\r\n this.optionList.filter((option) => {\r\n const optionTitle = this.#getOptionTitle(option);\r\n const isString = typeof optionTitle == \"string\";\r\n if (isString && optionTitle.includes(filterString)) {\r\n displayOptionList.push(option);\r\n }\r\n if (!isString) {\r\n console.warn(\r\n \"the provided values for optionsList is not of type string.\",\r\n { option, title: optionTitle }\r\n );\r\n }\r\n });\r\n return displayOptionList;\r\n }\r\n /**\r\n * @description show given string as a error in message place\r\n * @public\r\n */\r\n showValidationError(message:string) {\r\n // if (errorType == \"REQUIRED\") {\r\n // const label = this.getAttribute(\"label\") || \"\";\r\n // this.elements.messageBox.innerHTML = `${label} حتما باید انتخاب شود`;\r\n // }\r\n this.elements.messageBox.innerHTML = message;\r\n this.elements.messageBox.classList.add(\"--error\");\r\n }\r\n clearValidationError() {\r\n this.elements.messageBox.innerHTML = this.getAttribute(\"message\") || \"\";\r\n this.elements.messageBox.classList.remove(\"--error\");\r\n }\r\n #dispatchOnChangeEvent() {\r\n const event = new Event(\"change\",{bubbles:true,cancelable:true});\r\n this.dispatchEvent(event);\r\n return event;\r\n }\r\n #setSelectedOptionDom(value: TOption) {\r\n //when user select option or value changed in any condition we set selected option DOM\r\n this.elements.selectedValueWrapper.innerHTML = \"\";\r\n //if value was null or undefined it remain empty\r\n if (value !== null && value !== undefined) {\r\n const selectedOptionDom = this.#createSelectedValueDom(value);\r\n this.elements.selectedValueWrapper.appendChild(selectedOptionDom);\r\n }\r\n }\r\n #createSelectedValueDom(value: TOption) {\r\n if (typeof this.callbacks.getSelectedValueDOM == \"function\") {\r\n return this.callbacks.getSelectedValueDOM(value);\r\n } else {\r\n return this.#createDefaultSelectedValueDom(value);\r\n }\r\n }\r\n #createDefaultSelectedValueDom(value: TOption) {\r\n const valueText = this.#getOptionTitle(value);\r\n const selectedOptionDom = document.createElement(\"div\");\r\n selectedOptionDom.classList.add(\"selected-value\");\r\n selectedOptionDom.innerHTML = valueText;\r\n return selectedOptionDom;\r\n }\r\n #getOptionValue(option: TOption):TValue{\r\n if (this.callbacks.getOptionValue && typeof this.callbacks.getOptionValue !== \"function\") {\r\n console.error(\"getOptionValue callback is not a function\");\r\n }\r\n try {\r\n if(typeof this.callbacks.getOptionValue == \"function\"){\r\n return this.callbacks.getOptionValue(option);\r\n }else{\r\n return option as unknown as TValue;\r\n }\r\n } catch (e) {\r\n console.error(\r\n `Invalid getOptionValue callback Result, must be a function that returns the value of an option`,\r\n option\r\n );\r\n }\r\n }\r\n #getOptionTitle(option: TOption): string {\r\n if (typeof this.callbacks.getOptionTitle !== \"function\") {\r\n console.error(\"getOptionTitle callback is not a function\");\r\n }\r\n try {\r\n return this.callbacks.getOptionTitle(option);\r\n } catch (e) {\r\n console.error(\r\n `Invalid getOptionTitle callback Result, must be a function that returns the value of an option`,\r\n option\r\n );\r\n }\r\n return \"\";\r\n }\r\n #getInsideValidation(){\r\n const ValidationList:ValidationItem<ValidationValue<TOption,TValue>>[] = [];\r\n if(this.required){\r\n const label = this.getAttribute(\"label\") || \"\";\r\n const message = `${label} حتما باید انتخاب شود`;\r\n ValidationList.push({\r\n validator:({selectedOption})=>{\r\n return selectedOption !== null && selectedOption !== undefined;\r\n },\r\n message:message,\r\n stateType:\"valueMissing\"\r\n });\r\n }\r\n return ValidationList;\r\n }\r\n //\r\n #checkValidity(showError: boolean) {\r\n if (!this.isAutoValidationDisabled) {\r\n return this.#validation.checkValidity(showError);\r\n }\r\n }\r\n /**\r\n * @public\r\n * @description this method used to check for validity but doesn't show error to user and just return the result\r\n * this method used by #internal of component\r\n */\r\n checkValidity(): boolean {\r\n const validationResult = this.#validation.checkValidity(false);\r\n if (!validationResult.isAllValid) {\r\n const event = new CustomEvent('invalid');\r\n this.dispatchEvent(event);\r\n }\r\n return validationResult.isAllValid;\r\n }\r\n /**\r\n * @public\r\n * @description this method used to check for validity and show error to user\r\n */\r\n reportValidity(): boolean {\r\n const validationResult = this.#validation.checkValidity(true);\r\n if (!validationResult.isAllValid) {\r\n const event = new CustomEvent('invalid');\r\n this.dispatchEvent(event);\r\n }\r\n return validationResult.isAllValid;\r\n }\r\n /**\r\n * @description this method called on every checkValidity calls and update validation result of #internal\r\n */\r\n #setValidationResult(result: ValidationResult<ValidationValue<TOption,TValue>>) {\r\n if (result.isAllValid) {\r\n this.#internals?.setValidity({}, '');\r\n } else {\r\n const states: ValidityStateFlags = {};\r\n let message = \"\";\r\n result.validationList.forEach((res) => {\r\n if (!res.isValid) {\r\n if (res.validation.stateType) {\r\n states[res.validation.stateType] = true;\r\n }else{\r\n states[\"customError\"] = true;\r\n }\r\n if (message == '') { message = res.message; }\r\n\r\n }\r\n });\r\n this.#internals?.setValidity(states, message);\r\n }\r\n }\r\n get validationMessage(){\r\n return this.#internals?.validationMessage || this.#validation.resultSummary.message;\r\n }\r\n}\r\nconst myElementNotExists = !customElements.get(\"jb-select\");\r\nif (myElementNotExists) {\r\n //prevent duplicate registering\r\n window.customElements.define(\"jb-select\", JBSelectWebComponent);\r\n}\r\n","export const isMobile = ()=>{\r\n return /Mobi/i.test(window.navigator.userAgent);\r\n};"],"names":["JBSelectWebComponent","HTMLElement","formAssociated","value","__classPrivateFieldGet","this","_JBSelectWebComponent_value","_JBSelectWebComponent_instances","_JBSelectWebComponent_getOptionValue","call","_JBSelectWebComponent_setValueFromOutside","textValue","_JBSelectWebComponent_textValue","__classPrivateFieldSet","elements","input","_JBSelectWebComponent_updateOptionList","selectedOptionTitle","_JBSelectWebComponent_getOptionTitle","optionList","_JBSelectWebComponent_optionList","Array","isArray","displayOptionList","_JBSelectWebComponent_filterOptionList","_JBSelectWebComponent_setValueOnOptionListChanged","console","error","placeholder","_JBSelectWebComponent_placeholder","undefined","searchPlaceholder","_JBSelectWebComponent_searchPlaceholder","_JBSelectWebComponent_displayOptionList","length","emptyListPlaceholder","classList","add","remove","_JBSelectWebComponent_updateOptionListDOM","isMobileDevice","test","window","navigator","userAgent","isOpen","componentWrapper","contains","validation","_JBSelectWebComponent_validation","disabled","_JBSelectWebComponent_disabled","states","delete","required","_JBSelectWebComponent_required","checkValidity","isAutoValidationDisabled","getAttribute","name","isDirty","initialValue","constructor","super","set","_JBSelectWebComponent_notFoundedValue","callbacks","getOptionTitle","option","toString","getOptionValue","getOptionDOM","getSelectedValueDOM","ValidationHelper","showValidationError","bind","clearValidationError","_JBSelectWebComponent_getInsideValidation","_JBSelectWebComponent_setValidationResult","_JBSelectWebComponent_internals","attachInternals","_JBSelectWebComponent_initWebComponent","_JBSelectWebComponent_initProp","connectedCallback","_JBSelectWebComponent_callOnLoadEvent","_JBSelectWebComponent_callOnInitEvent","observedAttributes","attributeChangedCallback","oldValue","newValue","focus","_JBSelectWebComponent_showOptionList","blur","_JBSelectWebComponent_handleSelectedValueDisplay","_JBSelectWebComponent_hideOptionList","message","messageBox","innerHTML","validationResult","isAllValid","event","CustomEvent","dispatchEvent","reportValidity","validationMessage","resultSummary","inputtedText","selectedOption","bubbles","composed","shadowRoot","attachShadow","mode","delegatesFocus","element","document","createElement","appendChild","content","cloneNode","querySelector","selectedValueWrapper","optionListWrapper","arrowIcon","label","wrapper","text","_JBSelectWebComponent_registerEventListener","addEventListener","e","_JBSelectWebComponent_onInputChange","_JBSelectWebComponent_onInputInput","_JBSelectWebComponent_onAttributeChange","matchedOption","find","_JBSelectWebComponent_setValue","_JBSelectWebComponent_setSelectedOptionDom","_JBSelectWebComponent_onArrowKeyClick","eventOptions","altKey","cancelable","code","ctrlKey","detail","isComposing","key","location","metaKey","view","repeat","shiftKey","KeyboardEvent","target","_JBSelectWebComponent_dispatchInputEvent","InputEvent","data","dataTransfer","inputType","targetRanges","getTargetRanges","inputText","_JBSelectWebComponent_triggerOnInputKeyup","inputValue","charCode","keyCode","_JBSelectWebComponent_onInputFocus","focusedElement","relatedTarget","filterText","optionDomList","forEach","item","optionDOM","_JBSelectWebComponent_createOptionDOM","push","optionElement","isSelected","_JBSelectWebComponent_onOptionClicked","_JBSelectWebComponent_createDefaultOptionDom","prevValue","currentTarget","_JBSelectWebComponent_selectOption","defaultPrevented","preventDefault","_JBSelectWebComponent_checkValidity","filterString","filter","optionTitle","isString","includes","warn","title","_JBSelectWebComponent_dispatchOnChangeEvent","Event","selectedOptionDom","_JBSelectWebComponent_createSelectedValueDom","_JBSelectWebComponent_createDefaultSelectedValueDom","valueText","ValidationList","validator","stateType","showError","result","setValidity","validationList","res","isValid","customElements","get","define"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './dist/modules/jb-validation/lib/types.js';
@@ -1 +1 @@
1
- export * from './lib/types';
1
+ export * from './dist/web-component/jb-form/lib/types';
@@ -1,7 +1,6 @@
1
1
  import { JBSelectCallbacks, JBSelectElements, ValidationValue } from "./types";
2
- import { ValidationHelper } from "jb-validation";
3
- import { WithValidation } from "jb-validation/types";
4
- import { JBFormInputStandards } from 'jb-form/types';
2
+ import { ValidationHelper, type WithValidation } from "jb-validation";
3
+ import { JBFormInputStandards } from 'jb-form';
5
4
  export declare class JBSelectWebComponent<TOption = any, TValue = TOption> extends HTMLElement implements WithValidation<ValidationValue<TOption, TValue>>, JBFormInputStandards<TValue> {
6
5
  #private;
7
6
  static get formAssociated(): boolean;
@@ -1,4 +1,4 @@
1
- @import "../../../common/scss/Medias.scss";
1
+ @use "../../../common/scss/Medias.scss" as *;
2
2
 
3
3
  :host {
4
4
  //define private variable here
package/lib/jb-select.ts CHANGED
@@ -6,10 +6,9 @@ import {
6
6
  JBSelectOptionElement,
7
7
  ValidationValue,
8
8
  } from "./types";
9
- import {ValidationHelper} from "jb-validation";
10
- import { ValidationItem, ValidationResult, WithValidation } from "jb-validation/types";
9
+ import {ValidationHelper, type ValidationItem, type ValidationResult, type WithValidation} from "jb-validation";
11
10
  import { isMobile } from "../../../common/scripts/device-detection";
12
- import {JBFormInputStandards} from 'jb-form/types';
11
+ import {JBFormInputStandards} from 'jb-form';
13
12
  //TOption is the type of option, TValue is the type of value we extract from option
14
13
  export class JBSelectWebComponent<TOption = any, TValue = TOption> extends HTMLElement implements WithValidation<ValidationValue<TOption,TValue>>, JBFormInputStandards<TValue> {
15
14
  static get formAssociated() {
@@ -524,10 +523,15 @@ export class JBSelectWebComponent<TOption = any, TValue = TOption> extends HTMLE
524
523
  return optionElement;
525
524
  }
526
525
  #onOptionClicked(e: MouseEvent) {
526
+ const prevValue = this.#value;
527
527
  const value = (e.currentTarget as JBSelectOptionElement<TOption>).value;
528
528
  this.#selectOption(value);
529
529
  this.blur();
530
- this.#triggerOnChangeEvent();
530
+ const dispatchedEvent = this.#dispatchOnChangeEvent();
531
+ if(dispatchedEvent.defaultPrevented){
532
+ e.preventDefault();
533
+ this.#selectOption(prevValue);
534
+ }
531
535
  }
532
536
  #selectOption(value: TOption) {
533
537
  this.#setValue(value);
@@ -566,9 +570,10 @@ export class JBSelectWebComponent<TOption = any, TValue = TOption> extends HTMLE
566
570
  this.elements.messageBox.innerHTML = this.getAttribute("message") || "";
567
571
  this.elements.messageBox.classList.remove("--error");
568
572
  }
569
- #triggerOnChangeEvent() {
570
- const event = new Event("change");
573
+ #dispatchOnChangeEvent() {
574
+ const event = new Event("change",{bubbles:true,cancelable:true});
571
575
  this.dispatchEvent(event);
576
+ return event;
572
577
  }
573
578
  #setSelectedOptionDom(value: TOption) {
574
579
  //when user select option or value changed in any condition we set selected option DOM
package/lib/types.ts CHANGED
@@ -4,6 +4,7 @@ export type JBSelectCallbacks<TOption,TValue> = {
4
4
  getOptionDOM: null | ((option:TOption, onSelectCallback:(e:MouseEvent)=>void, isSelected:boolean) => HTMLElement);
5
5
  getSelectedValueDOM: null | ((option:TOption) => HTMLElement);
6
6
  }
7
+ //TODO: create real custom element for select options
7
8
  export type JBSelectOptionElement<TOption> = HTMLElement & {value?: TOption};
8
9
  export type JBSelectElements = {
9
10
  input: HTMLInputElement,
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "select",
13
13
  "web component"
14
14
  ],
15
- "version": "5.0.0",
15
+ "version": "5.0.1",
16
16
  "bugs": "https://github.com/javadbat/jb-select/issues",
17
17
  "license": "MIT",
18
18
  "files": [
@@ -21,16 +21,16 @@
21
21
  "lib/",
22
22
  "dist/"
23
23
  ],
24
- "types": "./dist/dist/web-component/jb-select/lib/jb-select.d.ts",
24
+ "types": "./dist/web-component/jb-select/lib/jb-select.d.ts",
25
25
  "main": "index.js",
26
26
  "repository": {
27
27
  "type": "git",
28
28
  "url": "git@github.com:javadbat/jb-select.git"
29
29
  },
30
30
  "dependencies": {
31
- "jb-validation": ">=0.0.3"
31
+ "jb-validation": ">=0.0.6"
32
32
  },
33
33
  "devDependencies": {
34
- "jb-form":">=0.0.8"
34
+ "jb-form":">=0.1.0"
35
35
  }
36
- }
36
+ }