diff --git a/dist/index.d.ts b/dist/index.d.ts index 4d2520e..cab395d 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -584,6 +584,7 @@ export interface ICreateElementOptions { } | null; } export declare function createElement(tagName: string, options?: ICreateElementOptions): HTMLElement; +export declare function isElement(el: any): boolean; export declare function $1(sel: string | any, el?: HTMLElement): any; export declare function $$(sel: string | any, el?: HTMLElement): any; export declare function on(sel: any, handlers: { diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index ff2e089..0000000 --- a/dist/index.js +++ /dev/null @@ -1,2894 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.rightPart = exports.leftPart = exports.splitOnLast = exports.splitOnFirst = exports.css = exports.nameOf = exports.sanitize = exports.camelCaseAny = exports.map = exports.toKebabCase = exports.toPascalCase = exports.toCamelCase = exports.createError = exports.isFormData = exports.createFieldError = exports.createErrorStatus = exports.ApiResult = exports.getResponseStatus = exports.getMethod = exports.JsonApiClient = exports.JsonServiceClient = exports.GetAccessTokenResponse = exports.HttpMethods = exports.ServerEventUser = exports.GetEventSubscribers = exports.UpdateEventSubscriberResponse = exports.UpdateEventSubscriber = exports.ServerEventReceiver = exports.getAllMembers = exports.ServerEventsClient = exports.ReadyState = exports.SingletonInstanceResolver = exports.NewInstanceResolver = exports.MetadataType = exports.MetadataPropertyType = exports.MetadataAttribute = exports.MetadataDataMember = exports.MetadataDataContract = exports.MetadataTypeName = exports.MetadataTypes = exports.MetadataOperationType = exports.MetadataRoute = exports.MetadataTypesConfig = exports.GetNavItemsResponse = exports.GetNavItems = exports.NavItem = exports.EmptyResponse = exports.ErrorResponse = exports.ResponseError = exports.ResponseStatus = void 0; -exports.bootstrapForm = exports.bindHandlers = exports.bootstrap = exports.delaySet = exports.addScript = exports.on = exports.$$ = exports.$1 = exports.createElement = exports.padStart = exports.msToTime = exports.toTime = exports.toLocalISOString = exports.timeFmt12 = exports.dateFmtHM = exports.dateFmt = exports.padInt = exports.toDateFmt = exports.toDate = exports.isDate = exports.errorResponse = exports.errorResponseExcept = exports.errorResponseSummary = exports.toObject = exports.toFormData = exports.parseResponseStatus = exports.getField = exports.normalize = exports.normalizeKey = exports.parseCookie = exports.tryDecode = exports.stripQuotes = exports.bytesToBase64 = exports.setQueryString = exports.appendQueryString = exports.createUrl = exports.createPath = exports.combinePaths = exports.queryString = exports.humanify = exports.splitTitleCase = exports.isDigit = exports.isLower = exports.isUpper = exports.ucFirst = exports.humanize = exports.onlyProps = exports.chop = exports.lastRightPart = exports.lastLeftPart = void 0; -exports.toGuid = exports.fromGuid = exports.toTimeSpan = exports.fromTimeSpan = exports.toDateTime = exports.fromDateTime = exports.isNullOrEmpty = exports.indexOfAny = exports.htmlAttrs = exports.enc = exports.uniq = exports.flatMap = exports.toTimeSpanFmt = exports.toXsdDuration = exports.fromXsdDuration = exports.classNames = exports.NavOptions = exports.UserAttributes = exports.LinkButtonDefaults = exports.NavButtonGroupDefaults = exports.NavbarDefaults = exports.NavLinkDefaults = exports.NavDefaults = exports.btnClasses = exports.btnSizeClass = exports.BootstrapSizes = exports.btnColorClass = exports.BootstrapColors = exports.activeClass = exports.activeClassNav = exports.apiValueFmt = exports.apiValue = exports.mapGet = exports.resolve = exports.each = exports.apply = exports.omit = exports.pick = exports.safeVarName = exports.trimEnd = exports.populateForm = exports.triggerEvent = exports.sanitizeFormData = exports.serializeToFormData = exports.serializeToUrlEncoded = exports.serializeToObject = exports.serializeForm = exports.ajaxSubmit = exports.formSubmit = exports.toVarNames = void 0; -exports.Inspect = exports.createBus = exports.EventBus = exports.alignAuto = exports.alignRight = exports.alignCenter = exports.alignLeft = exports.uniqueKeys = exports.JSV = exports.StringBuffer = exports.toBase64String = exports.toByteArray = exports.fromByteArray = void 0; -class ResponseStatus { - constructor(init) { Object.assign(this, init); } -} -exports.ResponseStatus = ResponseStatus; -class ResponseError { - constructor(init) { Object.assign(this, init); } -} -exports.ResponseError = ResponseError; -class ErrorResponse { - constructor(init) { Object.assign(this, init); } -} -exports.ErrorResponse = ErrorResponse; -class EmptyResponse { - constructor(init) { Object.assign(this, init); } -} -exports.EmptyResponse = EmptyResponse; -class NavItem { - constructor(init) { Object.assign(this, init); } -} -exports.NavItem = NavItem; -class GetNavItems { - constructor(init) { Object.assign(this, init); } - createResponse() { return new GetNavItemsResponse(); } - getTypeName() { return 'GetNavItems'; } - getMethod() { return 'GET'; } -} -exports.GetNavItems = GetNavItems; -class GetNavItemsResponse { - constructor(init) { Object.assign(this, init); } -} -exports.GetNavItemsResponse = GetNavItemsResponse; -class MetadataTypesConfig { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataTypesConfig = MetadataTypesConfig; -class MetadataRoute { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataRoute = MetadataRoute; -class MetadataOperationType { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataOperationType = MetadataOperationType; -class MetadataTypes { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataTypes = MetadataTypes; -class MetadataTypeName { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataTypeName = MetadataTypeName; -class MetadataDataContract { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataDataContract = MetadataDataContract; -class MetadataDataMember { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataDataMember = MetadataDataMember; -class MetadataAttribute { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataAttribute = MetadataAttribute; -class MetadataPropertyType { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataPropertyType = MetadataPropertyType; -class MetadataType { - constructor(init) { Object.assign(this, init); } -} -exports.MetadataType = MetadataType; -class NewInstanceResolver { - tryResolve(ctor) { - return new ctor(); - } -} -exports.NewInstanceResolver = NewInstanceResolver; -class SingletonInstanceResolver { - tryResolve(ctor) { - return ctor.instance - || (ctor.instance = new ctor()); - } -} -exports.SingletonInstanceResolver = SingletonInstanceResolver; -function eventMessageType(evt) { - switch (evt) { - case 'onConnect': - return 'ServerEventConnect'; - case 'onHeartbeat': - return 'ServerEventHeartbeat'; - case 'onJoin': - return 'ServerEventJoin'; - case 'onLeave': - return 'ServerEventLeave'; - case 'onUpdate': - return 'ServerEventUpdate'; - } - return null; -} -/** - * EventSource - */ -var ReadyState; -(function (ReadyState) { - ReadyState[ReadyState["CONNECTING"] = 0] = "CONNECTING"; - ReadyState[ReadyState["OPEN"] = 1] = "OPEN"; - ReadyState[ReadyState["CLOSED"] = 2] = "CLOSED"; -})(ReadyState = exports.ReadyState || (exports.ReadyState = {})); -class ServerEventsClient { - constructor(baseUrl, channels, options = {}, eventSource = null) { - this.channels = channels; - this.options = options; - this.eventSource = eventSource; - this.onMessage = (e) => { - if (typeof document == "undefined") { //node - //latest node-fetch + eventsource doesn't split SSE messages properly - let requireSplitPos = e.data ? e.data.indexOf('\n') : -1; - if (requireSplitPos >= 0) { - let data = e.data; - let lastEventId = e.lastEventId; - let e1 = Object.assign({}, { lastEventId, data: data.substring(0, requireSplitPos) }), e2 = Object.assign({}, { lastEventId, data: data.substring(requireSplitPos + 1) }); - this._onMessage(e1); - this._onMessage(e2); - return; - } - } - this._onMessage(e); - }; - this._onMessage = (e) => { - if (this.stopped) - return; - let opt = this.options; - if (typeof document == "undefined") { - var document = { - querySelectorAll: sel => [] - }; - } - let parts = splitOnFirst(e.data, " "); - let channel = null; - let selector = parts[0]; - let selParts = splitOnFirst(selector, "@"); - if (selParts.length > 1) { - channel = selParts[0]; - selector = selParts[1]; - } - const json = parts[1]; - let body = null; - try { - body = json ? JSON.parse(json) : null; - } - catch (ignore) { } - parts = splitOnFirst(selector, "."); - if (parts.length <= 1) - throw "invalid selector format: " + selector; - let op = parts[0], target = parts[1].replace(new RegExp("%20", "g"), " "); - const tokens = splitOnFirst(target, "$"); - const [cmd, cssSelector] = tokens; - const els = cssSelector && $$(cssSelector); - const el = els && els[0]; - const eventId = parseInt(e.lastEventId); - const data = e.data; - const type = eventMessageType(cmd) || "ServerEventMessage"; - const request = { eventId, data, type, - channel, selector, json, body, op, target: tokens[0], cssSelector, meta: {} }; - const mergedBody = typeof body == "object" - ? Object.assign({}, request, body) - : request; - if (opt.validate && opt.validate(request) === false) - return; - let headers = new Headers(); - headers.set("Content-Type", "text/plain"); - if (op === "cmd") { - if (cmd === "onConnect") { - this.connectionInfo = mergedBody; - if (typeof body.heartbeatIntervalMs == "string") - this.connectionInfo.heartbeatIntervalMs = parseInt(body.heartbeatIntervalMs); - if (typeof body.idleTimeoutMs == "string") - this.connectionInfo.idleTimeoutMs = parseInt(body.idleTimeoutMs); - Object.assign(opt, body); - let fn = opt.handlers["onConnect"]; - if (fn) { - fn.call(el || document.body, this.connectionInfo, request); - if (this.stopped) - return; - } - if (opt.heartbeatUrl) { - if (opt.heartbeat) { - clearInterval(opt.heartbeat); - } - opt.heartbeat = setInterval(() => __awaiter(this, void 0, void 0, function* () { - if (this.eventSource.readyState === EventSource.CLOSED) { - clearInterval(opt.heartbeat); - const stopFn = opt.handlers["onStop"]; - if (stopFn != null) - stopFn.apply(this.eventSource); - this.reconnectServerEvents({ error: new Error("EventSource is CLOSED") }); - return; - } - const reqHeartbeat = new Request(opt.heartbeatUrl, { - method: "POST", mode: "cors", headers: headers, credentials: this.serviceClient.credentials - }); - try { - let res = yield fetch(reqHeartbeat); - if (!res.ok) { - const error = new Error(`${res.status} - ${res.statusText}`); - this.reconnectServerEvents({ error }); - } - else { - yield res.text(); - } - } - catch (error) { - this.reconnectServerEvents({ error }); - } - }), (this.connectionInfo && this.connectionInfo.heartbeatIntervalMs) || opt.heartbeatIntervalMs || 10000); - } - if (opt.unRegisterUrl) { - if (typeof window != "undefined") { - window.onunload = () => { - if (navigator.sendBeacon) { // Chrome https://developers.google.com/web/updates/2019/12/chrome-80-deps-rems - this.stopped = true; - if (this.eventSource) - this.eventSource.close(); - navigator.sendBeacon(opt.unRegisterUrl); - } - else { - this.stop(); - } - }; - } - } - this.updateSubscriberUrl = opt.updateSubscriberUrl; - this.updateChannels((opt.channels || "").split(",")); - } - else { - let isCmdMsg = cmd == "onJoin" || cmd == "onLeave" || cmd == "onUpdate"; - let fn = opt.handlers[cmd]; - if (fn) { - if (isCmdMsg) { - fn.call(el || document.body, mergedBody); - } - else { - fn.call(el || document.body, body, request); - } - } - else { - if (!isCmdMsg) { //global receiver - let r = opt.receivers && opt.receivers["cmd"]; - this.invokeReceiver(r, cmd, el, request, "cmd"); - } - } - if (isCmdMsg) { - fn = opt.handlers["onCommand"]; - if (fn) { - fn.call(el || document.body, mergedBody); - } - } - } - } - else if (op === "trigger") { - this.raiseEvent(target, request); - } - else if (op === "css") { - css(els || $$("body"), cmd, body); - } - //Named Receiver - let r = opt.receivers && opt.receivers[op]; - this.invokeReceiver(r, cmd, el, request, op); - if (!eventMessageType(cmd)) { - let fn = opt.handlers["onMessage"]; - if (fn) { - fn.call(el || document.body, mergedBody); - } - } - if (opt.onTick) - opt.onTick(); - }; - this.onError = (error) => { - if (this.stopped) - return; - if (!error) - error = event; - let fn = this.options.onException; - if (fn != null) - fn.call(this.eventSource, error); - if (this.options.onTick) - this.options.onTick(); - }; - if (this.channels.length === 0) - throw "at least 1 channel is required"; - this.resolver = this.options.resolver || new NewInstanceResolver(); - this.eventStreamUri = combinePaths(baseUrl, "event-stream") + "?"; - this.updateChannels(channels); - this.serviceClient = new JsonServiceClient(baseUrl); - this.listeners = {}; - this.withCredentials = true; - if (!this.options.handlers) - this.options.handlers = {}; - } - getEventSourceOptions() { - return { withCredentials: this.withCredentials }; - } - reconnectServerEvents(opt = {}) { - if (this.stopped) - return; - if (opt.error) - this.onError(opt.error); - const hold = this.eventSource; - let url = opt.url || this.eventStreamUri || hold.url; - if (this.options.resolveStreamUrl != null) { - url = this.options.resolveStreamUrl(url); - } - const es = this.EventSource - ? new this.EventSource(url, this.getEventSourceOptions()) - : new EventSource(url, this.getEventSourceOptions()); - es.addEventListener('error', e => (opt.onerror || hold.onerror || this.onError)(e)); - es.addEventListener('message', opt.onmessage || hold.onmessage || this.onMessage); - let fn = this.options.onReconnect; - if (fn != null) - fn.call(es, opt.error); - if (hold.removeEventListener) { - hold.removeEventListener('error', this.onError); - hold.removeEventListener('message', this.onMessage); - } - hold.close(); - return this.eventSource = es; - } - start() { - this.stopped = false; - if (this.eventSource == null || this.eventSource.readyState === EventSource.CLOSED) { - let url = this.eventStreamUri; - if (this.options.resolveStreamUrl != null) { - url = this.options.resolveStreamUrl(url); - } - this.eventSource = this.EventSource - ? new this.EventSource(url, this.getEventSourceOptions()) - : new EventSource(url, this.getEventSourceOptions()); - this.eventSource.addEventListener('error', this.onError); - this.eventSource.addEventListener('message', e => this.onMessage(e)); - } - return this; - } - stop() { - this.stopped = true; - if (this.eventSource) { - this.eventSource.close(); - } - let opt = this.options; - if (opt && opt.heartbeat) { - clearInterval(opt.heartbeat); - } - let hold = this.connectionInfo; - if (hold == null || hold.unRegisterUrl == null) - return new Promise((resolve, reject) => resolve()); - this.connectionInfo = null; - return fetch(new Request(hold.unRegisterUrl, { method: "POST", mode: "cors", credentials: this.serviceClient.credentials })) - .then(res => { if (!res.ok) - throw new Error(`${res.status} - ${res.statusText}`); }) - .catch(this.onError); - } - invokeReceiver(r, cmd, el, request, name) { - if (r) { - if (typeof r == "function") { - r = this.resolver.tryResolve(r); - } - cmd = cmd.replace("-", ""); - r.client = this; - r.request = request; - if (typeof (r[cmd]) == "function") { - r[cmd].call(el || r, request.body, request); - } - else if (cmd in r) { - r[cmd] = request.body; - } - else { - let metaProp = Object.getOwnPropertyDescriptor(r, cmd); - if (metaProp != null) { - if (metaProp.set) { - metaProp.set(request.body); - } - else if (metaProp.writable) { - r[cmd] = request.body; - } - return; - } - let cmdLower = cmd.toLowerCase(); - getAllMembers(r).forEach(k => { - if (k.toLowerCase() == cmdLower) { - if (typeof r[k] == "function") { - r[k].call(el || r, request.body, request); - } - else { - r[k] = request.body; - } - return; - } - }); - let noSuchMethod = r["noSuchMethod"]; - if (typeof noSuchMethod == "function") { - noSuchMethod.call(el || r, request.target, request); - } - } - } - } - hasConnected() { - return this.connectionInfo != null; - } - registerHandler(name, fn) { - if (!this.options.handlers) - this.options.handlers = {}; - this.options.handlers[name] = fn; - return this; - } - setResolver(resolver) { - this.options.resolver = resolver; - return this; - } - registerReceiver(receiver) { - return this.registerNamedReceiver("cmd", receiver); - } - registerNamedReceiver(name, receiver) { - if (!this.options.receivers) - this.options.receivers = {}; - this.options.receivers[name] = receiver; - return this; - } - unregisterReceiver(name = "cmd") { - if (this.options.receivers) { - delete this.options.receivers[name]; - } - return this; - } - updateChannels(channels) { - this.channels = channels; - const url = this.eventSource != null - ? this.eventSource.url - : this.eventStreamUri; - this.eventStreamUri = url.substring(0, Math.min(url.indexOf("?"), url.length)) + "?channels=" + channels.join(",") + "&t=" + new Date().getTime(); - } - update(subscribe, unsubscribe) { - let sub = typeof subscribe == "string" ? subscribe.split(',') : subscribe; - let unsub = typeof unsubscribe == "string" ? unsubscribe.split(',') : unsubscribe; - let channels = []; - for (let i in this.channels) { - let c = this.channels[i]; - if (unsub == null || unsub.indexOf(c) === -1) { - channels.push(c); - } - } - if (sub) { - for (let i in sub) { - let c = sub[i]; - if (channels.indexOf(c) === -1) { - channels.push(c); - } - } - } - this.updateChannels(channels); - } - addListener(eventName, handler) { - let handlers = this.listeners[eventName] || (this.listeners[eventName] = []); - handlers.push(handler); - return this; - } - removeListener(eventName, handler) { - let handlers = this.listeners[eventName]; - if (handlers) { - let pos = handlers.indexOf(handler); - if (pos >= 0) { - handlers.splice(pos, 1); - } - } - return this; - } - raiseEvent(eventName, msg) { - let handlers = this.listeners[eventName]; - if (handlers) { - handlers.forEach(x => { - try { - x(msg); - } - catch (e) { - this.onError(e); - } - }); - } - } - getConnectionInfo() { - if (this.connectionInfo == null) - throw "Not Connected"; - return this.connectionInfo; - } - getSubscriptionId() { - return this.getConnectionInfo().id; - } - updateSubscriber(request) { - if (request.id == null) - request.id = this.getSubscriptionId(); - return this.serviceClient.post(request) - .then(x => { - this.update(request.subscribeChannels, request.unsubscribeChannels); - }).catch(this.onError); - } - subscribeToChannels(...channels) { - let request = new UpdateEventSubscriber(); - request.id = this.getSubscriptionId(); - request.subscribeChannels = channels; - return this.serviceClient.post(request) - .then(x => { - this.update(channels, null); - }).catch(this.onError); - } - unsubscribeFromChannels(...channels) { - let request = new UpdateEventSubscriber(); - request.id = this.getSubscriptionId(); - request.unsubscribeChannels = channels; - return this.serviceClient.post(request) - .then(x => { - this.update(null, channels); - }).catch(this.onError); - } - getChannelSubscribers() { - let request = new GetEventSubscribers(); - request.channels = this.channels; - return this.serviceClient.get(request) - .then(r => r.map(x => this.toServerEventUser(x))) - .catch(e => { - this.onError(e); - return []; - }); - } - toServerEventUser(map) { - let channels = map["channels"]; - let to = new ServerEventUser(); - to.userId = map["userId"]; - to.displayName = map["displayName"]; - to.profileUrl = map["profileUrl"]; - to.channels = channels ? channels.split(',') : null; - for (let k in map) { - if (k == "userId" || k == "displayName" || - k == "profileUrl" || k == "channels") - continue; - if (to.meta == null) - to.meta = {}; - to.meta[k] = map[k]; - } - return to; - } -} -exports.ServerEventsClient = ServerEventsClient; -ServerEventsClient.UnknownChannel = "*"; -function getAllMembers(o) { - let props = []; - do { - const l = Object.getOwnPropertyNames(o) - .concat(Object.getOwnPropertySymbols(o).map(s => s.toString())) - .sort() - .filter((p, i, arr) => p !== 'constructor' && //not the constructor - (i == 0 || p !== arr[i - 1]) && //not overriding in this prototype - props.indexOf(p) === -1 //not overridden in a child - ); - props = props.concat(l); - } while ((o = Object.getPrototypeOf(o)) && //walk-up the prototype chain - Object.getPrototypeOf(o) //not the the Object prototype methods (hasOwnProperty, etc...) - ); - return props; -} -exports.getAllMembers = getAllMembers; -class ServerEventReceiver { - noSuchMethod(selector, message) { } -} -exports.ServerEventReceiver = ServerEventReceiver; -class UpdateEventSubscriber { - createResponse() { return new UpdateEventSubscriberResponse(); } - getTypeName() { return "UpdateEventSubscriber"; } -} -exports.UpdateEventSubscriber = UpdateEventSubscriber; -class UpdateEventSubscriberResponse { -} -exports.UpdateEventSubscriberResponse = UpdateEventSubscriberResponse; -class GetEventSubscribers { - createResponse() { return []; } - getTypeName() { return "GetEventSubscribers"; } -} -exports.GetEventSubscribers = GetEventSubscribers; -class ServerEventUser { -} -exports.ServerEventUser = ServerEventUser; -class HttpMethods { -} -exports.HttpMethods = HttpMethods; -HttpMethods.Get = "GET"; -HttpMethods.Post = "POST"; -HttpMethods.Put = "PUT"; -HttpMethods.Delete = "DELETE"; -HttpMethods.Patch = "PATCH"; -HttpMethods.Head = "HEAD"; -HttpMethods.Options = "OPTIONS"; -HttpMethods.hasRequestBody = (method) => !(method === "GET" || method === "DELETE" || method === "HEAD" || method === "OPTIONS"); -class GetAccessToken { - constructor(init) { Object.assign(this, init); } - createResponse() { return new GetAccessTokenResponse(); } - getTypeName() { return 'GetAccessToken'; } - getMethod() { return 'POST'; } -} -class GetAccessTokenResponse { -} -exports.GetAccessTokenResponse = GetAccessTokenResponse; -class JsonServiceClient { - constructor(baseUrl = "/") { - this.baseUrl = baseUrl; - this.replyBaseUrl = combinePaths(baseUrl, "json", "reply") + "/"; - this.oneWayBaseUrl = combinePaths(baseUrl, "json", "oneway") + "/"; - this.mode = "cors"; - this.credentials = "include"; - this.headers = new Headers(); - this.headers.set("Content-Type", "application/json"); - this.manageCookies = typeof document == "undefined"; //because node-fetch doesn't - this.cookies = {}; - this.enableAutoRefreshToken = true; - } - setCredentials(userName, password) { - this.userName = userName; - this.password = password; - } - useBasePath(path) { - this.basePath = path; - return this; - } - set basePath(path) { - if (!path) { - this.replyBaseUrl = combinePaths(this.baseUrl, "json", "reply") + "/"; - this.oneWayBaseUrl = combinePaths(this.baseUrl, "json", "oneway") + "/"; - } - else { - if (path[0] != '/') { - path = '/' + path; - } - this.replyBaseUrl = combinePaths(this.baseUrl, path) + "/"; - this.oneWayBaseUrl = combinePaths(this.baseUrl, path) + "/"; - } - } - apply(f) { - f(this); - return this; - } - get(request, args) { - return typeof request != "string" - ? this.fetch(HttpMethods.Get, request, args) - : this.fetch(HttpMethods.Get, null, args, this.toAbsoluteUrl(request)); - } - delete(request, args) { - return typeof request != "string" - ? this.fetch(HttpMethods.Delete, request, args) - : this.fetch(HttpMethods.Delete, null, args, this.toAbsoluteUrl(request)); - } - post(request, args) { - return this.fetch(HttpMethods.Post, request, args); - } - postToUrl(url, request, args) { - return this.fetch(HttpMethods.Post, request, args, this.toAbsoluteUrl(url)); - } - postBody(request, body, args) { - return this.fetchBody(HttpMethods.Post, request, body, args); - } - put(request, args) { - return this.fetch(HttpMethods.Put, request, args); - } - putToUrl(url, request, args) { - return this.fetch(HttpMethods.Put, request, args, this.toAbsoluteUrl(url)); - } - putBody(request, body, args) { - return this.fetchBody(HttpMethods.Put, request, body, args); - } - patch(request, args) { - return this.fetch(HttpMethods.Patch, request, args); - } - patchToUrl(url, request, args) { - return this.fetch(HttpMethods.Patch, request, args, this.toAbsoluteUrl(url)); - } - patchBody(request, body, args) { - return this.fetchBody(HttpMethods.Patch, request, body, args); - } - publish(request, args) { - return this.sendOneWay(request, args); - } - sendOneWay(request, args) { - const url = combinePaths(this.oneWayBaseUrl, nameOf(request)); - return this.fetch(HttpMethods.Post, request, null, url); - } - sendAll(requests) { - if (requests.length == 0) - return Promise.resolve([]); - const url = combinePaths(this.replyBaseUrl, nameOf(requests[0]) + "[]"); - return this.fetch(HttpMethods.Post, requests, null, url); - } - sendAllOneWay(requests) { - if (requests.length == 0) - return Promise.resolve(void 0); - const url = combinePaths(this.oneWayBaseUrl, nameOf(requests[0]) + "[]"); - return this.fetch(HttpMethods.Post, requests, null, url) - .then(r => void 0); - } - createUrlFromDto(method, request) { - let url = combinePaths(this.replyBaseUrl, nameOf(request)); - const hasRequestBody = HttpMethods.hasRequestBody(method); - if (!hasRequestBody) - url = appendQueryString(url, request); - return url; - } - toAbsoluteUrl(relativeOrAbsoluteUrl) { - return relativeOrAbsoluteUrl.startsWith("http://") || - relativeOrAbsoluteUrl.startsWith("https://") - ? relativeOrAbsoluteUrl - : combinePaths(this.baseUrl, relativeOrAbsoluteUrl); - } - deleteCookie(name) { - if (this.manageCookies) { - delete this.cookies[name]; - } - else { - if (document) { - document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/'; - } - } - } - createRequest({ method, request, url, args, body }) { - if (!url) - url = this.createUrlFromDto(method, request); - if (args) - url = appendQueryString(url, args); - if (this.bearerToken != null) { - this.headers.set("Authorization", "Bearer " + this.bearerToken); - } - else if (this.userName != null) { - this.headers.set('Authorization', 'Basic ' + JsonServiceClient.toBase64(`${this.userName}:${this.password}`)); - } - if (this.manageCookies) { - let cookies = Object.keys(this.cookies) - .map(x => { - let c = this.cookies[x]; - return c.expires && c.expires < new Date() - ? null - : `${c.name}=${encodeURIComponent(c.value)}`; - }) - .filter(x => !!x); - if (cookies.length > 0) - this.headers.set("Cookie", cookies.join("; ")); - else - this.headers.delete("Cookie"); - } - let headers = new Headers(this.headers); - let hasRequestBody = HttpMethods.hasRequestBody(method); - let reqInit = { - url, - method: method, - mode: this.mode, - credentials: this.credentials, - headers, - compress: false, // https://github.com/bitinn/node-fetch/issues/93#issuecomment-200791658 - }; - if (hasRequestBody) { - reqInit.body = body || JSON.stringify(request); - if (isFormData(body)) { - reqInit.body = sanitizeFormData(body); - headers.delete('Content-Type'); //set by FormData - } - } - if (this.requestFilter != null) - this.requestFilter(reqInit); - if (JsonServiceClient.globalRequestFilter != null) - JsonServiceClient.globalRequestFilter(reqInit); - return reqInit; - } - json(res) { - if (this.parseJson) - return this.parseJson(res); - return res.text().then(txt => { - return txt.length > 0 ? JSON.parse(txt) : null; - }); - } - applyResponseFilters(res) { - if (this.responseFilter != null) - this.responseFilter(res); - if (JsonServiceClient.globalResponseFilter != null) - JsonServiceClient.globalResponseFilter(res); - } - createResponse(res, request) { - if (!res.ok) { - this.applyResponseFilters(res); - throw res; - } - if (this.manageCookies) { - let setCookies = []; - res.headers.forEach((v, k) => { - switch (k.toLowerCase()) { - case "set-cookie": - let cookies = v.split(','); - cookies.forEach(c => setCookies.push(c)); - break; - } - }); - setCookies.forEach(x => { - let cookie = parseCookie(x); - if (cookie) - this.cookies[cookie.name] = cookie; - }); - } - res.headers.forEach((v, k) => { - switch (k.toLowerCase()) { - case "x-cookies": - if (v.split(',').indexOf('ss-reftok') >= 0) - this.useTokenCookie = true; - break; - } - }); - this.applyResponseFilters(res); - let x = request && typeof request != "string" && typeof request.createResponse == 'function' - ? request.createResponse() - : null; - if (typeof x === 'string') - return res.text().then(o => o); - let contentType = res.headers.get("content-type"); - let isJson = contentType && contentType.indexOf("application/json") !== -1; - if (isJson) { - return this.json(res).then(o => o); - } - if (typeof Uint8Array != "undefined" && x instanceof Uint8Array) { - if (typeof res.arrayBuffer != 'function') - throw new Error("This fetch polyfill does not implement 'arrayBuffer'"); - return res.arrayBuffer().then(o => new Uint8Array(o)); - } - else if (typeof Blob == "function" && x instanceof Blob) { - if (typeof res.blob != 'function') - throw new Error("This fetch polyfill does not implement 'blob'"); - return res.blob().then(o => o); - } - let contentLength = res.headers.get("content-length"); - if (contentLength === "0" || (contentLength == null && !isJson)) { - return res.text().then(_ => x); - } - return this.json(res).then(o => o); //fallback - } - handleError(holdRes, res, type = null) { - if (res instanceof Error) - throw this.raiseError(holdRes, res); - // res.json can only be called once. - if (res.bodyUsed) - throw this.raiseError(res, createErrorResponse(res.status, res.statusText, type)); - let isErrorResponse = typeof res.json == "undefined" && res.responseStatus; - if (isErrorResponse) { - return new Promise((resolve, reject) => reject(this.raiseError(null, res))); - } - return this.json(res).then(o => { - let errorDto = sanitize(o); - if (!errorDto.responseStatus) - throw createErrorResponse(res.status, res.statusText, type); - if (type != null) - errorDto.type = type; - throw errorDto; - }).catch(error => { - // No responseStatus body, set from `res` Body object - if (error instanceof Error - || (typeof window != "undefined" && window.DOMException && error instanceof window.DOMException /*MS Edge*/)) { - throw this.raiseError(res, createErrorResponse(res.status, res.statusText, type)); - } - throw this.raiseError(res, error); - }); - } - fetch(method, request, args, url) { - return this.sendRequest({ method, request, args, url }); - } - fetchBody(method, request, body, args) { - let url = combinePaths(this.replyBaseUrl, nameOf(request)); - return this.sendRequest({ - method, - request: body, - body: typeof body == "string" - ? body - : isFormData(body) - ? body - : JSON.stringify(body), - url: appendQueryString(url, request), - args, - returns: request - }); - } - sendRequest(info) { - const req = this.createRequest(info); - const returns = info.returns || info.request; - let holdRes = null; - const resendRequest = () => { - const req = this.createRequest(info); - if (this.urlFilter) - this.urlFilter(req.url); - return fetch(req.url, req) - .then(res => this.createResponse(res, returns)) - .catch(res => this.handleError(holdRes, res)); - }; - if (this.urlFilter) - this.urlFilter(req.url); - return fetch(req.url, req) - .then(res => { - holdRes = res; - const response = this.createResponse(res, returns); - return response; - }) - .catch(res => { - if (res.status === 401) { - if (this.enableAutoRefreshToken && (this.refreshToken || this.useTokenCookie || this.cookies['ss-reftok'] != null)) { - const jwtReq = new GetAccessToken({ refreshToken: this.refreshToken, useTokenCookie: !!this.useTokenCookie }); - let url = this.refreshTokenUri || this.createUrlFromDto(HttpMethods.Post, jwtReq); - if (this.useTokenCookie) { - this.bearerToken = null; - this.headers.delete("Authorization"); - } - let jwtRequest = this.createRequest({ method: HttpMethods.Post, request: jwtReq, args: null, url }); - return fetch(url, jwtRequest) - .then(r => this.createResponse(r, jwtReq).then(jwtResponse => { - this.bearerToken = jwtResponse.accessToken || null; - return resendRequest(); - })) - .catch(res => { - if (this.onAuthenticationRequired) { - return this.onAuthenticationRequired() - .then(resendRequest) - .catch(resHandler => { - return this.handleError(holdRes, resHandler, "RefreshTokenException"); - }); - } - else { - return this.handleError(holdRes, res, "RefreshTokenException"); - } - }); - } - else { - if (this.onAuthenticationRequired) { - return this.onAuthenticationRequired().then(resendRequest); - } - } - } - return this.handleError(holdRes, res); - }); - } - raiseError(res, error) { - if (this.exceptionFilter != null) { - this.exceptionFilter(res, error); - } - return error; - } - // Generic send that uses APIs preferred HTTP Method (requires v5.13+ DTOs) - send(request, args, url) { - return this.sendRequest({ method: getMethod(request), request, args, url }); - } - // Generic send IReturnVoid that uses APIs preferred HTTP Method (requires v5.13+ DTOs) - sendVoid(request, args, url) { - return this.sendRequest({ method: getMethod(request), request, args, url }); - } - api(request, args, method) { - return __awaiter(this, void 0, void 0, function* () { - try { - const result = yield this.fetch(getMethod(request, method), request, args); - return new ApiResult({ response: result }); - } - catch (e) { - return new ApiResult({ error: getResponseStatus(e) }); - } - }); - } - apiVoid(request, args, method) { - return __awaiter(this, void 0, void 0, function* () { - try { - const result = yield this.fetch(getMethod(request, method), request, args); - return new ApiResult({ response: result !== null && result !== void 0 ? result : new EmptyResponse() }); - } - catch (e) { - return new ApiResult({ error: getResponseStatus(e) }); - } - }); - } - apiForm(request, body, args, method) { - return __awaiter(this, void 0, void 0, function* () { - try { - const result = yield this.fetchBody(getMethod(request, method), request, body, args); - return new ApiResult({ response: result }); - } - catch (e) { - return new ApiResult({ error: getResponseStatus(e) }); - } - }); - } - apiFormVoid(request, body, args, method) { - return __awaiter(this, void 0, void 0, function* () { - try { - const result = yield this.fetchBody(getMethod(request, method), request, body, args); - return new ApiResult({ response: result !== null && result !== void 0 ? result : new EmptyResponse() }); - } - catch (e) { - return new ApiResult({ error: getResponseStatus(e) }); - } - }); - } -} -exports.JsonServiceClient = JsonServiceClient; -class JsonApiClient { - static create(baseUrl = "/", f) { - let client = new JsonServiceClient(baseUrl).apply(c => { - c.basePath = "/api"; - c.headers = new Headers(); //avoid pre-flight CORS requests - if (f) { - f(c); - } - }); - return client; - } -} -exports.JsonApiClient = JsonApiClient; -function getMethod(request, method) { - return method !== null && method !== void 0 ? method : (typeof request.getMethod == "function" - ? request.getMethod() - : HttpMethods.Post); -} -exports.getMethod = getMethod; -function getResponseStatus(e) { - var _a, _b; - return (_b = (_a = e.responseStatus) !== null && _a !== void 0 ? _a : e.ResponseStatus) !== null && _b !== void 0 ? _b : (e.errorCode - ? e - : (e.message ? createErrorStatus(e.message, e.errorCode) : null)); -} -exports.getResponseStatus = getResponseStatus; -class ApiResult { - constructor(init) { Object.assign(this, init); } - get completed() { return this.response != null || this.error != null; } - get failed() { var _a, _b; return ((_a = this.error) === null || _a === void 0 ? void 0 : _a.errorCode) != null || ((_b = this.error) === null || _b === void 0 ? void 0 : _b.message) != null; } - get succeeded() { return !this.failed && this.response != null; } - get errorMessage() { var _a; return (_a = this.error) === null || _a === void 0 ? void 0 : _a.message; } - get errorCode() { var _a; return (_a = this.error) === null || _a === void 0 ? void 0 : _a.errorCode; } - get errors() { var _a, _b; return (_b = (_a = this.error) === null || _a === void 0 ? void 0 : _a.errors) !== null && _b !== void 0 ? _b : []; } - get errorSummary() { return this.error != null && this.errors.length == 0 ? this.errorMessage : null; } - fieldError(fieldName) { - var _a; - let matchField = fieldName.toLowerCase(); - return (_a = this.errors) === null || _a === void 0 ? void 0 : _a.find(x => x.fieldName.toLowerCase() == matchField); - } - fieldErrorMessage(fieldName) { var _a; return (_a = this.fieldError(fieldName)) === null || _a === void 0 ? void 0 : _a.message; } - hasFieldError(fieldName) { return this.fieldError(fieldName) != null; } - showSummary(exceptFields = []) { - if (!this.failed) - return false; - return exceptFields.every(x => !this.hasFieldError(x)); - } - summaryMessage(exceptFields = []) { - if (this.showSummary(exceptFields)) { - // Return first field error that's not visible - let fieldSet = exceptFields.map(x => x.toLowerCase()); - let fieldError = fieldSet.find(x => fieldSet.indexOf(x.toLowerCase()) == -1); - return fieldError !== null && fieldError !== void 0 ? fieldError : this.errorMessage; - } - } - addFieldError(fieldName, message, errorCode = 'Exception') { - if (!this.error) - this.error = new ResponseStatus(); - const fieldError = this.fieldError(fieldName); - if (fieldError != null) { - fieldError.errorCode = errorCode; - fieldError.message = message; - } - else { - this.error.errors.push(new ResponseError({ fieldName, errorCode, message })); - } - } -} -exports.ApiResult = ApiResult; -function createErrorStatus(message, errorCode = 'Exception') { - return new ResponseStatus({ errorCode, message }); -} -exports.createErrorStatus = createErrorStatus; -function createFieldError(fieldName, message, errorCode = 'Exception') { - return new ResponseStatus({ errors: [new ResponseError({ fieldName, errorCode, message })] }); -} -exports.createFieldError = createFieldError; -function isFormData(body) { return typeof window != "undefined" && body instanceof FormData; } -exports.isFormData = isFormData; -function createErrorResponse(errorCode, message, type = null) { - const error = apply(new ErrorResponse(), e => { - if (type != null) - e.type = type; - e.responseStatus = apply(new ResponseStatus(), status => { - status.errorCode = errorCode && errorCode.toString(); - status.message = message; - }); - }); - return error; -} -function createError(errorCode, message, fieldName) { - return new ErrorResponse({ - responseStatus: new ResponseStatus({ - errorCode, - message, - errors: fieldName ? [new ResponseError({ errorCode, message, fieldName })] : undefined - }) - }); -} -exports.createError = createError; -function toCamelCase(s) { return !s ? s : s.charAt(0).toLowerCase() + s.substring(1); } -exports.toCamelCase = toCamelCase; -function toPascalCase(s) { return !s ? s : s.charAt(0).toUpperCase() + s.substring(1); } -exports.toPascalCase = toPascalCase; -function toKebabCase(s) { return (s || '').replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); } -exports.toKebabCase = toKebabCase; -function map(o, f) { return o == null ? null : f(o); } -exports.map = map; -function camelCaseAny(o) { - if (!o || !(o instanceof Object) || Array.isArray(o)) - return o; - let to = {}; - for (let k in o) { - if (o.hasOwnProperty(k)) { - const key = toCamelCase(k); - const val = o[k]; - if (Array.isArray(val)) - to[key] = val.map(x => camelCaseAny(x)); - else if (val instanceof Object) - to[key] = camelCaseAny(val); - else - to[key] = val; - } - } - return to; -} -exports.camelCaseAny = camelCaseAny; -function sanitize(status) { - if (!sanitize) - return sanitize; - if (status.responseStatus) - return status; - if (status.errors) - return status; - let to = camelCaseAny(status); - return to; -} -exports.sanitize = sanitize; -function nameOf(o) { - if (!o) - return "null"; - if (typeof o.getTypeName == "function") - return o.getTypeName(); - let ctor = o && o.constructor; - if (ctor == null) - throw `${o} doesn't have constructor`; - if (ctor.name) - return ctor.name; - let str = ctor.toString(); - return str.substring(9, str.indexOf("(")); //"function ".length == 9 -} -exports.nameOf = nameOf; -/* utils */ -function log(o, prefix = "LOG") { - console.log(prefix, o); - return o; -} -function css(selector, name, value) { - const els = typeof selector == "string" - ? document.querySelectorAll(selector) - : selector; - for (let i = 0; i < els.length; i++) { - const el = els[i]; - if (el != null && el.style != null) { - el.style[name] = value; - } - } -} -exports.css = css; -function splitOnFirst(s, c) { - if (!s) - return [s]; - let pos = s.indexOf(c); - return pos >= 0 ? [s.substring(0, pos), s.substring(pos + 1)] : [s]; -} -exports.splitOnFirst = splitOnFirst; -function splitOnLast(s, c) { - if (!s) - return [s]; - let pos = s.lastIndexOf(c); - return pos >= 0 - ? [s.substring(0, pos), s.substring(pos + 1)] - : [s]; -} -exports.splitOnLast = splitOnLast; -function leftPart(s, needle) { - if (s == null) - return null; - let pos = s.indexOf(needle); - return pos == -1 - ? s - : s.substring(0, pos); -} -exports.leftPart = leftPart; -function rightPart(s, needle) { - if (s == null) - return null; - let pos = s.indexOf(needle); - return pos == -1 - ? s - : s.substring(pos + needle.length); -} -exports.rightPart = rightPart; -function lastLeftPart(s, needle) { - if (s == null) - return null; - let pos = s.lastIndexOf(needle); - return pos == -1 - ? s - : s.substring(0, pos); -} -exports.lastLeftPart = lastLeftPart; -function lastRightPart(s, needle) { - if (s == null) - return null; - let pos = s.lastIndexOf(needle); - return pos == -1 - ? s - : s.substring(pos + needle.length); -} -exports.lastRightPart = lastRightPart; -function chop(str, len = 1) { - len = Math.abs(len); - return str ? len < str.length ? str.substring(0, str.length - len) : '' : str; -} -exports.chop = chop; -function onlyProps(obj, keys) { - let to = {}; - keys.forEach(key => to[key] = obj[key]); - return to; -} -exports.onlyProps = onlyProps; -function splitCase(t) { - return typeof t != 'string' ? t : t.replace(/([A-Z]|[0-9]+)/g, ' $1').replace(/_/g, ' ').trim(); -} -function humanize(s) { return (!s || s.indexOf(' ') >= 0 ? s : splitCase(toPascalCase(s))); } -exports.humanize = humanize; -const ucFirst = (s) => s.charAt(0).toUpperCase() + s.substring(1); -exports.ucFirst = ucFirst; -const isUpper = (c) => c >= 'A' && c <= 'Z'; -exports.isUpper = isUpper; -const isLower = (c) => c >= 'a' && c <= 'z'; -exports.isLower = isLower; -const isDigit = (c) => c >= '0' && c <= '9'; -exports.isDigit = isDigit; -const upperOrDigit = (c) => (0, exports.isUpper)(c) || (0, exports.isDigit)(c); -function splitTitleCase(s) { - let to = []; - if (typeof s != 'string') - return to; - let lastSplit = 0; - for (let i = 0; i < s.length; i++) { - let c = s[i]; - let prev = i > 0 ? s[i - 1] : null; - let next = i + 1 < s.length ? s[i + 1] : null; - if (upperOrDigit(c) && (!upperOrDigit(prev) || !upperOrDigit(next))) { - to.push(s.substring(lastSplit, i)); - lastSplit = i; - } - } - to.push(s.substring(lastSplit, s.length)); - return to.filter(x => !!x); -} -exports.splitTitleCase = splitTitleCase; -function humanify(s) { return !s || s.indexOf(' ') >= 0 ? s : (0, exports.ucFirst)(splitTitleCase(s).join(' ')); } -exports.humanify = humanify; -function queryString(url) { - if (!url || url.indexOf('?') === -1) - return {}; - let pairs = rightPart(url, '?').split('&'); - let map = {}; - for (let i = 0; i < pairs.length; ++i) { - let p = pairs[i].split('='); - map[p[0]] = p.length > 1 - ? decodeURIComponent(p[1].replace(/\+/g, ' ')) - : null; - } - return map; -} -exports.queryString = queryString; -function combinePaths(...paths) { - let parts = [], i, l; - for (i = 0, l = paths.length; i < l; i++) { - let arg = paths[i]; - parts = arg.indexOf("://") === -1 - ? parts.concat(arg.split("/")) - : parts.concat(arg.lastIndexOf("/") === arg.length - 1 ? arg.substring(0, arg.length - 1) : arg); - } - let combinedPaths = []; - for (i = 0, l = parts.length; i < l; i++) { - let part = parts[i]; - if (!part || part === ".") - continue; - if (part === "..") - combinedPaths.pop(); - else - combinedPaths.push(part); - } - if (parts[0] === "") - combinedPaths.unshift(""); - return combinedPaths.join("/") || (combinedPaths.length ? "/" : "."); -} -exports.combinePaths = combinePaths; -function createPath(route, args) { - let argKeys = {}; - for (let k in args) { - argKeys[k.toLowerCase()] = k; - } - let parts = route.split("/"); - let url = ""; - for (let i = 0; i < parts.length; i++) { - let p = parts[i]; - if (p == null) - p = ""; - if (p[0] === "{" && p[p.length - 1] === "}") { - const key = argKeys[p.substring(1, p.length - 1).toLowerCase()]; - if (key) { - p = args[key]; - delete args[key]; - } - } - if (url.length > 0) - url += "/"; - url += p; - } - return url; -} -exports.createPath = createPath; -function createUrl(route, args) { - let url = createPath(route, args); - return appendQueryString(url, args); -} -exports.createUrl = createUrl; -function appendQueryString(url, args) { - for (let k in args) { - if (args.hasOwnProperty(k)) { - let val = args[k]; - if (typeof val == 'undefined') - continue; - url += url.indexOf("?") >= 0 ? "&" : "?"; - url += k + (val === null ? '' : "=" + qsValue(val)); - } - } - return url; -} -exports.appendQueryString = appendQueryString; -function setQueryString(url, args) { - const baseUrl = leftPart(url, '?'); - const qs = Object.assign(queryString(url), args); - return appendQueryString(baseUrl, qs); -} -exports.setQueryString = setQueryString; -function qsValue(arg) { - if (arg == null) - return ""; - if (typeof Uint8Array != "undefined" && arg instanceof Uint8Array) - return bytesToBase64(arg); - return encodeURIComponent(arg) || ""; -} -//from: https://github.com/madmurphy/stringview.js/blob/master/stringview.js -function bytesToBase64(aBytes) { - let eqLen = (3 - (aBytes.length % 3)) % 3, sB64Enc = ""; - for (let nMod3, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) { - nMod3 = nIdx % 3; - nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24); - if (nMod3 === 2 || aBytes.length - nIdx === 1) { - sB64Enc += String.fromCharCode(uint6ToB64(nUint24 >>> 18 & 63), uint6ToB64(nUint24 >>> 12 & 63), uint6ToB64(nUint24 >>> 6 & 63), uint6ToB64(nUint24 & 63)); - nUint24 = 0; - } - } - return eqLen === 0 - ? sB64Enc - : sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? "=" : "=="); -} -exports.bytesToBase64 = bytesToBase64; -function uint6ToB64(nUint6) { - return nUint6 < 26 ? - nUint6 + 65 - : nUint6 < 52 ? - nUint6 + 71 - : nUint6 < 62 ? - nUint6 - 4 - : nUint6 === 62 ? 43 - : nUint6 === 63 ? 47 : 65; -} -function _btoa(base64) { - return typeof btoa == 'function' - ? btoa(base64) - : Buffer.from(base64).toString('base64'); -} -function _atob(base64) { - return typeof atob == 'function' - ? atob(base64) - : Buffer.from(base64, 'base64').toString(); -} -//from: http://stackoverflow.com/a/30106551/85785 -JsonServiceClient.toBase64 = (str) => _btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (match, p1) => String.fromCharCode(new Number('0x' + p1).valueOf()))); -function stripQuotes(s) { return s && s[0] == '"' && s[s.length] == '"' ? s.slice(1, -1) : s; } -exports.stripQuotes = stripQuotes; -function tryDecode(s) { - try { - return decodeURIComponent(s); - } - catch (e) { - return s; - } -} -exports.tryDecode = tryDecode; -function parseCookie(setCookie) { - if (!setCookie) - return null; - let to = null; - let pairs = setCookie.split(/; */); - for (let i = 0; i < pairs.length; i++) { - let pair = pairs[i]; - let parts = splitOnFirst(pair, '='); - let name = parts[0].trim(); - let value = parts.length > 1 ? tryDecode(stripQuotes(parts[1].trim())) : null; - if (i == 0) { - to = { name, value, path: "/" }; - } - else { - let lower = name.toLowerCase(); - if (lower == "httponly") { - to.httpOnly = true; - } - else if (lower == "secure") { - to.secure = true; - } - else if (lower == "expires") { - to.expires = new Date(value); - // MS Edge returns Invalid Date when using '-' in "12-Mar-2037" - if (to.expires.toString() === "Invalid Date") { - to.expires = new Date(value.replace(/-/g, " ")); - } - } - else { - to[name] = value; - } - } - } - return to; -} -exports.parseCookie = parseCookie; -function normalizeKey(key) { return key.toLowerCase().replace(/_/g, ''); } -exports.normalizeKey = normalizeKey; -function isArray(o) { return Object.prototype.toString.call(o) === '[object Array]'; } -function normalize(dto, deep) { - if (isArray(dto)) { - if (!deep) - return dto; - const to = []; - for (let i = 0; i < dto.length; i++) { - to[i] = normalize(dto[i], deep); - } - return to; - } - if (typeof dto != "object") - return dto; - let o = {}; - for (let k in dto) { - o[normalizeKey(k)] = deep ? normalize(dto[k], deep) : dto[k]; - } - return o; -} -exports.normalize = normalize; -function getField(o, name) { - return o == null || name == null ? null : - o[name] || - o[Object.keys(o).filter(k => normalizeKey(k) === normalizeKey(name))[0] || '']; -} -exports.getField = getField; -function parseResponseStatus(json, defaultMsg = null) { - try { - let err = JSON.parse(json); - return sanitize(err.ResponseStatus || err.responseStatus); - } - catch (e) { - return { - message: defaultMsg || e.message || e, - __error: { error: e, json: json } - }; - } -} -exports.parseResponseStatus = parseResponseStatus; -function toFormData(o) { - if (typeof window == "undefined") - return; - let formData = new FormData(); - for (let name in o) { - formData.append(name, o[name]); - } - return formData; -} -exports.toFormData = toFormData; -function toObject(keys) { - const to = {}; - if (!keys) - return to; - if (typeof keys != "object") - throw new Error("keys must be an Array of object keys"); - const arr = Array.prototype.slice.call(keys); - arr.forEach(key => { - if (this[key]) { - to[key] = this[key]; - } - }); - return to; -} -exports.toObject = toObject; -function errorResponseSummary() { - const responseStatus = this.responseStatus || this.ResponseStatus; - if (responseStatus == null) - return undefined; - const status = responseStatus.ErrorCode ? sanitize(responseStatus) : responseStatus; - return !status.errors || status.errors.length == 0 - ? status.message || status.errorCode - : undefined; -} -exports.errorResponseSummary = errorResponseSummary; -function errorResponseExcept(fieldNames) { - const responseStatus = this.responseStatus || this.ResponseStatus; - if (responseStatus == null) - return undefined; - const status = responseStatus.ErrorCode ? sanitize(responseStatus) : responseStatus; - const names = toVarNames(fieldNames); - if (names && !(status.errors == null || status.errors.length == 0)) { - const lowerFieldsNames = names.map(x => (x || '').toLowerCase()); - for (let field of status.errors) { - if (lowerFieldsNames.indexOf((field.fieldName || '').toLowerCase()) !== -1) { - return undefined; - } - } - for (let field of status.errors) { - if (lowerFieldsNames.indexOf((field.fieldName || '').toLowerCase()) === -1) { - return field.message || field.errorCode; - } - } - } - return status.message || status.errorCode || undefined; -} -exports.errorResponseExcept = errorResponseExcept; -function errorResponse(fieldName) { - if (fieldName == null) - return errorResponseSummary.call(this); - const responseStatus = this.responseStatus || this.ResponseStatus; - if (responseStatus == null) - return undefined; - const status = responseStatus.ErrorCode ? sanitize(responseStatus) : responseStatus; - if (status.errors == null || status.errors.length == 0) - return undefined; - const field = status.errors.find(x => (x.fieldName || '').toLowerCase() == fieldName.toLowerCase()); - return field - ? field.message || field.errorCode - : undefined; -} -exports.errorResponse = errorResponse; -function isDate(d) { return d && Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d); } -exports.isDate = isDate; -function toDate(s) { - return !s ? null - : isDate(s) - ? s - : s[0] == '/' - ? new Date(parseFloat(/Date\(([^)]+)\)/.exec(s)[1])) - : new Date(s); -} -exports.toDate = toDate; -function toDateFmt(s) { return dateFmt(toDate(s)); } -exports.toDateFmt = toDateFmt; -function padInt(n) { return n < 10 ? '0' + n : n; } -exports.padInt = padInt; -function dateFmt(d = new Date()) { return d.getFullYear() + '/' + padInt(d.getMonth() + 1) + '/' + padInt(d.getDate()); } -exports.dateFmt = dateFmt; -function dateFmtHM(d = new Date()) { return d.getFullYear() + '/' + padInt(d.getMonth() + 1) + '/' + padInt(d.getDate()) + ' ' + padInt(d.getHours()) + ":" + padInt(d.getMinutes()); } -exports.dateFmtHM = dateFmtHM; -function timeFmt12(d = new Date()) { return padInt((d.getHours() + 24) % 12 || 12) + ":" + padInt(d.getMinutes()) + ":" + padInt(d.getSeconds()) + " " + (d.getHours() > 12 ? "PM" : "AM"); } -exports.timeFmt12 = timeFmt12; -function toLocalISOString(d = new Date()) { - return `${d.getFullYear()}-${padInt(d.getMonth() + 1)}-${padInt(d.getDate())}T${padInt(d.getHours())}:${padInt(d.getMinutes())}:${padInt(d.getSeconds())}`; -} -exports.toLocalISOString = toLocalISOString; -function toTime(s) { - if (typeof s == 'string' && s.indexOf(':') >= 0) - return s; - const ms = s instanceof Date - ? s.getTime() - : typeof s == 'string' - ? fromXsdDuration(s) * 1000 - : s; - return msToTime(ms); -} -exports.toTime = toTime; -function msToTime(s) { - const ms = s % 1000; - s = (s - ms) / 1000; - const secs = s % 60; - s = (s - secs) / 60; - const mins = s % 60; - const hrs = (s - mins) / 60; - let t = padInt(hrs) + ':' + padInt(mins) + ':' + padInt(secs); - return ms > 0 - ? t + '.' + padStart(`${ms}`, 3, '0').substring(0, 3) - : t; -} -exports.msToTime = msToTime; -function padStart(s, len, pad) { - len = Math.floor(len) || 0; - if (len < s.length) - return s; - pad = pad ? String(pad) : ' '; - let p = ''; - let l = len - s.length; - let i = 0; - while (p.length < l) { - if (!pad[i]) - i = 0; - p += pad[i]; - i++; - } - return p + s.slice(0); -} -exports.padStart = padStart; -function bsAlert(msg) { return '
' + msg + '
'; } -function attr(e, name) { return e.getAttribute(name); } -function sattr(e, name, value) { return e.setAttribute(name, value); } -function rattr(e, name) { return e.removeAttribute(name); } -function createElement(tagName, options) { - const keyAliases = { className: 'class', htmlFor: 'for' }; - const el = document.createElement(tagName); - if (options === null || options === void 0 ? void 0 : options.attrs) { - for (const key in options.attrs) { - sattr(el, keyAliases[key] || key, options.attrs[key]); - } - } - if (options === null || options === void 0 ? void 0 : options.events) { - on(el, options.events); - } - if (options && options.insertAfter) { - options.insertAfter.parentNode.insertBefore(el, options.insertAfter.nextSibling); - } - return el; -} -exports.createElement = createElement; -function showInvalidInputs() { - let errorMsg = attr(this, 'data-invalid'); - if (errorMsg) { - //[data-invalid] can either be on input control or .form-check container containing group of radio/checkbox - const isCheck = this.type === "checkbox" || this.type === "radio" || hasClass(this, 'form-check'); - const elFormCheck = isCheck ? parent(this, 'form-check') : null; - if (!isCheck) - addClass(this, 'is-invalid'); - else - addClass(elFormCheck || this.parentElement, 'is-invalid form-control'); - const elNext = this.nextElementSibling; - const elLast = elNext && (attr(elNext, 'for') === this.id || elNext.tagName === "SMALL") - ? (isCheck ? elFormCheck || elNext.parentElement : elNext) - : this; - const elError = elLast != null && elLast.nextElementSibling && hasClass(elLast.nextElementSibling, 'invalid-feedback') - ? elLast.nextElementSibling - : createElement("div", { insertAfter: elLast, attrs: { className: 'invalid-feedback' } }); - elError.innerHTML = errorMsg; - } -} -function parent(el, cls) { - while (el != null && !hasClass(el, cls)) - el = el.parentElement; - return el; -} -function hasClass(el, cls) { - return !el ? false - : el.classList - ? el.classList.contains(cls) - : (" " + el.className + " ").replace(/[\n\t\r]/g, " ").indexOf(" " + cls + " ") > -1; -} -function addClass(el, cls) { - return !el ? null - : el.classList - ? el.classList.add(...cls.split(' ')) - : !hasClass(el, cls) - ? el.className = (el.className + " " + cls).trim() : null; -} -function remClass(el, cls) { - return !el ? null - : el.classList - ? el.classList.remove(cls) - : hasClass(el, cls) - ? el.className = el.className.replace(/(\s|^)someclass(\s|$)/, ' ') - : null; -} -function $1(sel, el) { - return typeof sel === "string" ? (el || document).querySelector(sel) : sel || null; -} -exports.$1 = $1; -function $$(sel, el) { - return typeof sel === "string" - ? Array.prototype.slice.call((el || document).querySelectorAll(sel)) - : Array.isArray(sel) ? sel : [sel]; -} -exports.$$ = $$; -function on(sel, handlers) { - $$(sel).forEach(e => { - Object.keys(handlers).forEach(function (evt) { - let fn = handlers[evt]; - if (typeof evt === 'string' && typeof fn === 'function') { - e.addEventListener(evt, handlers[evt] = fn.bind(e)); - } - }); - }); - return handlers; -} -exports.on = on; -function addScript(src) { - return new Promise((resolve, reject) => { - document.body.appendChild(createElement('script', { - attrs: { src }, - events: { - load: resolve, - error: reject, - } - })); - }); -} -exports.addScript = addScript; -function delaySet(f, opt) { - let duration = opt && opt.duration || 300; - let timeout = setTimeout(() => f(true), duration); - return () => { clearTimeout(timeout); f(false); }; -} -exports.delaySet = delaySet; -// init generic behavior to bootstrap elements -function bootstrap(el) { - const els = (el || document).querySelectorAll('[data-invalid]'); - for (let i = 0; i < els.length; i++) { - showInvalidInputs.call(els[i]); - } -} -exports.bootstrap = bootstrap; -if (typeof window != "undefined" && window.Element !== undefined) { // polyfill IE9+ - if (!Element.prototype.matches) { - Element.prototype.matches = Element.prototype.msMatchesSelector || - Element.prototype.webkitMatchesSelector; - } - if (!Element.prototype.closest) { - Element.prototype.closest = function (s) { - let el = this; - do { - if (el.matches(s)) - return el; - el = el.parentElement || el.parentNode; - } while (el !== null && el.nodeType === 1); - return null; - }; - } -} -function handleEvent(handlers, el = document, type) { - el.addEventListener(type, function (evt) { - const evtData = `data-${type}`; - let el = evt.target; - let x = attr(el, evtData); - if (!x) { - let elParent = el.closest(`[${evtData}]`); - if (elParent) { - x = attr(elParent, evtData); - el = elParent; - } - } - if (!x) - return; - let pos = x.indexOf(':'); - if (pos >= 0) { - const cmd = x.substring(0, pos); - const data = x.substring(pos + 1); - const fn = handlers[cmd]; - if (fn) { - fn.apply(el, data.split(',')); - } - } - else { - const fn = handlers[x]; - if (fn) { - fn.apply(el, [].slice.call(arguments)); - } - } - }); -} -function bindHandlers(handlers, el = document, opt = null) { - if (opt && opt.events) { - opt.events.forEach(evt => handleEvent(handlers, el, evt)); - } - else { - ['click', 'dblclick', 'change', 'focus', 'blur', 'focusin', 'focusout', 'select', 'keydown', 'keypress', 'keyup', 'hover', 'toggle', 'input'] - .forEach(evt => { - if (el.querySelector(`[data-${evt}]`)) { - handleEvent(handlers, el, evt); - } - }); - } -} -exports.bindHandlers = bindHandlers; -function bootstrapForm(form, options) { - if (!form) - return; - if (options.model) - populateForm(form, options.model); - form.onsubmit = function (evt) { - evt.preventDefault(); - options.type = "bootstrap-v4"; - return ajaxSubmit(form, options); - }; -} -exports.bootstrapForm = bootstrapForm; -function applyErrors(f, status, opt) { - const validation = { - overrideMessages: false, - messages: { - NotEmpty: "Required", - NotNull: "Required", - Email: "Invalid email", - AlreadyExists: "Already exists" - }, - errorFilter: function (errorMsg, errorCode, type) { - return this.overrideMessages - ? this.messages[errorCode] || errorMsg || splitCase(errorCode) - : errorMsg || splitCase(errorCode); - } - }; - clearErrors(f); - if (!status) - return; - status = sanitize(status); - addClass(f, "has-errors"); - const bs4 = opt && opt.type === "bootstrap-v4"; - const v = Object.assign(Object.assign({}, validation), opt); - if (opt.messages) { - v.overrideMessages = true; - } - const filter = v.errorFilter.bind(v); - const errors = status.errors; - if (errors && errors.length) { - let fieldMap = {}, fieldLabelMap = {}; - $$("input,textarea,select,button").forEach(x => { - const el = x; - const prev = el.previousElementSibling; - const next = el.nextElementSibling; - const isCheck = el.type === "radio" || el.type === "checkbox"; - const fieldId = (!isCheck ? el.id : null) || attr(el, "name"); - if (!fieldId) - return; - const key = fieldId.toLowerCase(); - fieldMap[key] = el; - if (!bs4) { - if (hasClass(prev, "help-inline") || hasClass(prev, "help-block")) { - fieldLabelMap[key] = prev; - } - else if (hasClass(next, "help-inline") || hasClass(next, "help-block")) { - fieldLabelMap[key] = next; - } - } - }); - $$(".help-inline[data-for],.help-block[data-for]").forEach(el => { - const key = attr(el, "data-for").toLowerCase(); - fieldLabelMap[key] = el; - }); - for (let error of errors) { - const key = (error.fieldName || "").toLowerCase(); - const field = fieldMap[key]; - if (field) { - if (!bs4) { - addClass(field, "error"); - addClass(field.parentElement, "has-error"); - } - else { - const type = attr(field, 'type'), isCheck = type === "radio" || type === "checkbox"; - if (!isCheck) - addClass(field, "is-invalid"); - sattr(field, "data-invalid", filter(error.message, error.errorCode, "field")); - } - } - const lblErr = fieldLabelMap[key]; - if (!lblErr) - continue; - addClass(lblErr, "error"); - lblErr.innerHTML = filter(error.message, error.errorCode, "field"); - lblErr.style.display = 'block'; - } - $$("[data-validation-summary]").forEach(el => { - const fields = attr(el, 'data-validation-summary').split(','); - const summaryMsg = errorResponseExcept.call(status, fields); - if (summaryMsg) - el.innerHTML = bsAlert(summaryMsg); - }); - } - else { - const htmlSummary = filter(status.message || splitCase(status.errorCode), status.errorCode, "summary"); - if (!bs4) { - $$(".error-summary").forEach(el => { - el.innerHTML = htmlSummary(el).style.display = 'block'; - }); - } - else { - $$('[data-validation-summary]').forEach(el => el.innerHTML = htmlSummary[0] === "<" ? htmlSummary : bsAlert(htmlSummary)); - } - } - return f; -} -function clearErrors(f) { - remClass(f, 'has-errors'); - $$('.error-summary').forEach(el => { - el.innerHTML = ""; - el.style.display = "none"; - }); - $$('[data-validation-summary]').forEach(el => { - el.innerHTML = ""; - }); - $$('.error').forEach(el => remClass(el, 'error')); - $$('.form-check.is-invalid [data-invalid]').forEach(el => { - rattr(el, 'data-invalid'); - }); - $$('.form-check.is-invalid').forEach(el => remClass(el, 'form-control')); - $$('.is-invalid').forEach(el => { - remClass(el, 'is-invalid'); - rattr(el, 'data-invalid'); - }); - $$('.is-valid').forEach(el => remClass(el, 'is-valid')); -} -var Types; -(function (Types) { - Types["MultiPart"] = "multipart/form-data"; - Types["UrlEncoded"] = "application/x-www-form-urlencoded"; - Types["Json"] = "application/json"; -})(Types || (Types = {})); -function toVarNames(names) { - return !names ? [] : - isArray(names) - ? names - : names.split(',').map(s => s.trim()); -} -exports.toVarNames = toVarNames; -function formSubmit(options = {}) { - const f = this; - const contentType = attr(f, 'enctype') || Types.UrlEncoded; - if (contentType == Types.MultiPart && window.FormData === undefined) - throw new Error(`FormData Type is needed to send '${Types.MultiPart}' Content Types`); - let body; - try { - body = serializeForm(f, contentType); - } - catch (e) { - throw new Error(`${e.message || e}`); - } - const headers = new Headers(); - headers.set("Accept", Types.Json); - headers.set("Content-Type", contentType); - const req = { - method: attr(f, 'method') || 'POST', - credentials: 'include', - mode: 'cors', - headers, - body, - }; - if (options.requestFilter) - options.requestFilter(req); - return fetch(new Request(options.url || attr(f, 'action'), req)) - .catch(e => { throw new Error(`Network is unreachable (${e.message || e})`); }) - .then(r => { - if (options.responseFilter) - options.responseFilter(r); - if (!r.ok) { - return r.json() - .catch(e => { throw new Error("The request failed with " + (r.statusText || r.status)); }) - .then(o => { throw Object.assign(new ErrorResponse(), sanitize(o)); }); - } - handleHeaderBehaviors(f, r); - return fromResponse(r); - }); -} -exports.formSubmit = formSubmit; -function handleHeaderBehaviors(f, r) { - const loc = r.headers.get('X-Location'); - if (loc) { - location.href = loc; - } - const evt = r.headers.get('X-Trigger'); - if (evt) { - const pos = evt.indexOf(':'); - const cmd = pos >= 0 ? evt.substring(0, pos) : evt; - const data = pos >= 0 ? evt.substring(pos + 1) : null; - triggerEvent(f, cmd, data ? [data] : []); - } -} -function ajaxSubmit(f, options = {}) { - const type = options.type; - const bs4 = type === "bootstrap-v4"; - clearErrors(f); - try { - if (options.validate && options.validate.call(f) === false) - return false; - } - catch (e) { - return false; - } - addClass(f, 'loading'); - const disableSel = options.onSubmitDisable == null - ? "[type=submit]" - : options.onSubmitDisable; - const disable = disableSel != null && disableSel != ""; - if (disable) { - $$(disableSel).forEach(el => { - sattr(el, 'disabled', 'disabled'); - }); - } - function handleError(errMsg, err = null) { - if (err) { - applyErrors(f, err.ResponseStatus || err.responseStatus, Object.assign({}, options)); - } - else if (errMsg) { - addClass(f, "has-errors"); - const errorSummary = $$(".error-summary")[0]; - if (errorSummary) { - errorSummary.innerHTML = errMsg; - } - if (bs4) { - const elSummary = $$('[data-validation-summary]')[0]; - if (elSummary) { - elSummary.innerHTML = bsAlert(errMsg); - } - } - } - if (options.error) { - options.error.call(f, err); - } - if (bs4) { - $$('[data-invalid]').forEach(el => showInvalidInputs.call(el)); - } - } - const submitFn = options.submit || formSubmit; - return submitFn.call(f, options) - .then(obj => { - if (options.success) - options.success.call(f, obj); - return false; - }) - .catch(e => { - if (e.responseStatus) - handleError(null, e); - else - handleError(`${e.message || e}`, null); - }) - .finally(() => { - remClass(f, 'loading'); - if (disable) { - $$(disableSel).forEach(el => { - rattr(el, 'disabled'); - }); - } - if (options.complete) { - options.complete.call(f); - } - }); -} -exports.ajaxSubmit = ajaxSubmit; -function fromResponse(r) { - const contentType = r.headers.get("content-type"); - const isJson = contentType && contentType.indexOf(Types.Json) !== -1; - if (isJson) - return r.json(); - let len = r.headers.get("content-length"); - if (len === "0" || (len == null && !isJson)) - return null; - return r.json(); -} -function serializeForm(form, contentType = null) { - return contentType === Types.MultiPart - ? new FormData(form) - : contentType == Types.Json - ? JSON.stringify(serializeToObject(form)) - : serializeToUrlEncoded(form); -} -exports.serializeForm = serializeForm; -function formEntries(form, state, fn) { - let field, f = form; - let len = f.elements.length; - for (let i = 0; i < len; i++) { - field = f.elements[i]; - if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') { - if (field.type == 'select-multiple') { - for (let j = f.elements[i].options.length - 1; j >= 0; j--) { - if (field.options[j].selected) - fn(state, field.name, field.options[j].value); - } - } - else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) { - fn(state, field.name, field.value); - } - } - } - return state; -} -function serializeToObject(form) { - return formEntries(form, {}, (to, name, value) => to[name] = value); -} -exports.serializeToObject = serializeToObject; -function serializeToUrlEncoded(form) { - const to = formEntries(form, [], (s, name, value) => typeof value == 'string' - ? s.push(encodeURIComponent(name) + "=" + encodeURIComponent(value)) - : null); - return to.join('&').replace(/%20/g, '+'); -} -exports.serializeToUrlEncoded = serializeToUrlEncoded; -function serializeToFormData(form) { - return formEntries(form, new FormData(), (to, name, value) => to.append(name, value)); -} -exports.serializeToFormData = serializeToFormData; -function sanitizeFormData(formData) { - // @ts-ignore - for (let [key, value] of formData) { - // Remove 0 length files - if (typeof value == 'object' && value.size === 0) { - formData.delete(key); - } - } - return formData; -} -exports.sanitizeFormData = sanitizeFormData; -function triggerEvent(el, name, data = null) { - if (document.createEvent) { - let evt = document.createEvent(name == 'click' || name.startsWith('mouse') ? 'MouseEvents' : 'HTMLEvents'); - evt.initEvent(name, true, true); - evt.data = data; - el.dispatchEvent(evt); - } - else { - let evt = document.createEventObject(); - el.fireEvent("on" + name, evt); - } -} -exports.triggerEvent = triggerEvent; -function populateForm(form, model) { - if (!model) - return; - const toggleCase = (s) => !s ? s : - s[0] === s[0].toUpperCase() ? toCamelCase(s) : s[0] === s[0].toLowerCase() ? toPascalCase(s) : s; - for (let key in model) { - let val = model[key]; - if (typeof val == 'undefined' || val === null) - val = ''; - const el = form.elements.namedItem(key) || form.elements.namedItem(toggleCase(key)); - const input = el; - if (!el) - continue; - const type = input.type || el[0].type; - switch (type) { - case 'radio': - case 'checkbox': - const len = el.length; - for (let i = 0; i < len; i++) { - el[i].checked = (val.indexOf(el[i].value) > -1); - } - break; - case 'select-multiple': - const values = isArray(val) ? val : [val]; - const select = el; - for (let i = 0; i < select.options.length; i++) { - select.options[i].selected = (values.indexOf(select.options[i].value) > -1); - } - break; - case 'select': - case 'select-one': - input.value = val.toString() || val; - break; - case 'date': - const d = toDate(val); - if (d) - input.value = d.toISOString().split('T')[0]; - break; - default: - input.value = val; - break; - } - } -} -exports.populateForm = populateForm; -function trimEnd(s, c) { - let end = s.length; - while (end > 0 && s[end - 1] === c) { - --end; - } - return (end < s.length) ? s.substring(0, end) : s; -} -exports.trimEnd = trimEnd; -function safeVarName(s) { - return s.replace(/[\W]+/g, ''); -} -exports.safeVarName = safeVarName; -function pick(o, keys) { - const to = {}; - for (const k in o) { - if (o.hasOwnProperty(k) && keys.indexOf(k) >= 0) { - to[k] = o[k]; - } - } - return to; -} -exports.pick = pick; -function omit(o, keys) { - const to = {}; - for (const k in o) { - if (o.hasOwnProperty(k) && keys.indexOf(k) < 0) { - to[k] = o[k]; - } - } - return to; -} -exports.omit = omit; -function apply(x, fn) { - fn(x); - return x; -} -exports.apply = apply; -function each(xs, f, o) { - return xs.reduce((acc, x) => { f(acc, x); return acc; }, o || {}); -} -exports.each = each; -function resolve(o, f) { - let ret = typeof o == 'function' ? o() : o; - return typeof f == 'function' ? f(ret) : ret; -} -exports.resolve = resolve; -function mapGet(o, name) { - if (!o || !name) - return null; - let ret = o[name]; - if (ret) - return ret; - if (typeof o == 'object') { - let nameLower = name.toLowerCase(); - let match = Object.keys(o).find(k => k.toLowerCase() === nameLower); - return match ? o[match] : null; - } - return null; -} -exports.mapGet = mapGet; -function apiValue(o) { - if (o == null) - return ''; - if (typeof o == 'string') - return o.substring(0, 6) === '/Date(' - ? toDate(o) - : o.trim(); - return o; -} -exports.apiValue = apiValue; -function apiValueFmt(o) { - let ret = apiValue(o); - return (ret != null - ? isDate(ret) - ? dateFmt(ret) - : ret - : null) || ''; -} -exports.apiValueFmt = apiValueFmt; -/* NAV */ -function activeClassNav(x, activePath) { - return x.href != null && (x.exact || activePath.length <= 1 - ? trimEnd(activePath, '/').toLowerCase() === trimEnd((x.href), '/').toLowerCase() - : trimEnd(activePath, '/').toLowerCase().startsWith(trimEnd((x.href), '/').toLowerCase())) - ? 'active' - : null; -} -exports.activeClassNav = activeClassNav; -function activeClass(href, activePath, exact) { - return href != null && (exact || activePath.length <= 1 - ? trimEnd(activePath, '/').toLowerCase() === trimEnd(href, '/').toLowerCase() - : trimEnd(activePath, '/').toLowerCase().startsWith(trimEnd(href, '/').toLowerCase())) - ? 'active' - : null; -} -exports.activeClass = activeClass; -function bootstrapColors() { return ['primary', 'secondary', 'success', 'info', 'warning', 'danger', 'light', 'dark']; } -exports.BootstrapColors = bootstrapColors(); -function btnColorClass(props) { - for (const color of bootstrapColors()) { - if (props[color]) { - return 'btn-' + color; - } - if (props['outline-' + color]) { - return 'btn-outline-' + color; - } - } - return null; -} -exports.btnColorClass = btnColorClass; -function bootstrapSizes() { return ['xs', 'sm', 'md', 'lg']; } -exports.BootstrapSizes = bootstrapSizes(); -function btnSizeClass(props) { - for (const size of bootstrapSizes()) { - if (props[size]) { - return 'btn-' + size; - } - } - return null; -} -exports.btnSizeClass = btnSizeClass; -function btnClasses(props) { - const to = []; - const color = btnColorClass(props); - if (color) { - to.push(color); - } - const size = btnSizeClass(props); - if (size) { - to.push(size); - } - if (props.block) { - to.push('btn-block'); - } - return to; -} -exports.btnClasses = btnClasses; -class NavDefaults { - static create() { return new NavOptions(); } - static forNav(options) { return options || NavDefaults.create(); } - static overrideDefaults(targets, source) { - if (targets == null) { - return source; - } - targets = Object.assign({}, targets); // clone - if (targets.navClass === NavDefaults.navClass && source.navClass != null) { - targets.navClass = source.navClass; - } - if (targets.navItemClass === NavDefaults.navItemClass && source.navItemClass != null) { - targets.navItemClass = source.navItemClass; - } - if (targets.navLinkClass === NavDefaults.navLinkClass && source.navLinkClass != null) { - targets.navLinkClass = source.navLinkClass; - } - if (targets.childNavItemClass === NavDefaults.childNavItemClass && source.childNavItemClass != null) { - targets.childNavItemClass = source.childNavItemClass; - } - if (targets.childNavLinkClass === NavDefaults.childNavLinkClass && source.childNavLinkClass != null) { - targets.childNavLinkClass = source.childNavLinkClass; - } - if (targets.childNavMenuClass === NavDefaults.childNavMenuClass && source.childNavMenuClass != null) { - targets.childNavMenuClass = source.childNavMenuClass; - } - if (targets.childNavMenuItemClass === NavDefaults.childNavMenuItemClass && source.childNavMenuItemClass != null) { - targets.childNavMenuItemClass = source.childNavMenuItemClass; - } - return targets; - } - static showNav(navItem, attributes) { - if (attributes == null || attributes.length === 0) { - return navItem.show == null; - } - if (navItem.show != null && attributes.indexOf(navItem.show) < 0) { - return false; - } - if (navItem.hide != null && attributes.indexOf(navItem.hide) >= 0) { - return false; - } - return true; - } -} -exports.NavDefaults = NavDefaults; -NavDefaults.navClass = 'nav'; -NavDefaults.navItemClass = 'nav-item'; -NavDefaults.navLinkClass = 'nav-link'; -NavDefaults.childNavItemClass = 'nav-item dropdown'; -NavDefaults.childNavLinkClass = 'nav-link dropdown-toggle'; -NavDefaults.childNavMenuClass = 'dropdown-menu'; -NavDefaults.childNavMenuItemClass = 'dropdown-item'; -class NavLinkDefaults { - static forNavLink(options) { return options || NavDefaults.create(); } -} -exports.NavLinkDefaults = NavLinkDefaults; -class NavbarDefaults { - static create() { return new NavOptions({ navClass: NavbarDefaults.navClass }); } - static forNavbar(options) { return NavDefaults.overrideDefaults(options, NavbarDefaults.create()); } -} -exports.NavbarDefaults = NavbarDefaults; -NavbarDefaults.navClass = 'navbar-nav'; -class NavButtonGroupDefaults { - static create() { return new NavOptions({ navClass: NavButtonGroupDefaults.navClass, navItemClass: NavButtonGroupDefaults.navItemClass }); } - static forNavButtonGroup(options) { return NavDefaults.overrideDefaults(options, NavButtonGroupDefaults.create()); } -} -exports.NavButtonGroupDefaults = NavButtonGroupDefaults; -NavButtonGroupDefaults.navClass = 'btn-group'; -NavButtonGroupDefaults.navItemClass = 'btn btn-primary'; -class LinkButtonDefaults { - static create() { return new NavOptions({ navItemClass: LinkButtonDefaults.navItemClass }); } - static forLinkButton(options) { return NavDefaults.overrideDefaults(options || null, LinkButtonDefaults.create()); } -} -exports.LinkButtonDefaults = LinkButtonDefaults; -LinkButtonDefaults.navItemClass = 'btn'; -class UserAttributes { - static fromSession(session) { - const to = []; - if (session != null) { - to.push('auth'); - if (session.roles) { - to.push(...session.roles.map(x => 'role:' + x)); - } - if (session.permissions) { - to.push(...session.permissions.map(x => 'perm:' + x)); - } - } - return to; - } -} -exports.UserAttributes = UserAttributes; -class NavOptions { - static fromSession(session, to) { - to = to || new NavOptions(); - to.attributes = UserAttributes.fromSession(session); - return to; - } - constructor(init) { - this.attributes = []; - this.navClass = NavDefaults.navClass; - this.navItemClass = NavDefaults.navItemClass; - this.navLinkClass = NavDefaults.navLinkClass; - this.childNavItemClass = NavDefaults.childNavItemClass; - this.childNavLinkClass = NavDefaults.childNavLinkClass; - this.childNavMenuClass = NavDefaults.childNavMenuClass; - this.childNavMenuItemClass = NavDefaults.childNavMenuItemClass; - Object.assign(this, init); - } -} -exports.NavOptions = NavOptions; -function classNames(...args) { - const classes = []; - for (let i = 0; i < args.length; i++) { - const arg = args[i]; - if (!arg) - continue; - const argType = typeof arg; - if (argType === 'string' || argType === 'number') { - classes.push(arg); - } - else if (Array.isArray(arg) && arg.length) { - const inner = classNames.apply(null, arg); - if (inner) { - classes.push(inner); - } - } - else if (argType === 'object') { - for (let key of Object.keys(arg)) { - if (arg[key]) { - classes.push(key); - } - } - } - } - return classes.join(' '); -} -exports.classNames = classNames; -function fromXsdDuration(xsd) { - let days = 0; - let hours = 0; - let minutes = 0; - let seconds = 0; - let ms = 0.0; - let t = splitOnFirst(xsd.substring(1), 'T'); - let hasTime = t.length == 2; - let d = splitOnFirst(t[0], 'D'); - if (d.length == 2) { - days = parseInt(d[0], 10) || 0; - } - if (hasTime) { - let h = splitOnFirst(t[1], 'H'); - if (h.length == 2) { - hours = parseInt(h[0], 10) || 0; - } - let m = splitOnFirst(h[h.length - 1], 'M'); - if (m.length == 2) { - minutes = parseInt(m[0], 10) || 0; - } - let s = splitOnFirst(m[m.length - 1], 'S'); - if (s.length == 2) { - ms = parseFloat(s[0]); - } - seconds = ms | 0; - ms -= seconds; - } - let totalSecs = (days * 24 * 60 * 60) + (hours * 60 * 60) + (minutes * 60) + seconds; - return totalSecs + ms; -} -exports.fromXsdDuration = fromXsdDuration; -function timeFmt(time, asXsd) { - let totalSeconds = time; - let wholeSeconds = time | 0; - let seconds = wholeSeconds; - let sec = (seconds >= 60 ? seconds % 60 : seconds); - seconds = (seconds / 60); - let min = seconds >= 60 ? seconds % 60 : seconds; - seconds = (seconds / 60); - let hours = seconds >= 24 ? seconds % 24 : seconds; - let days = seconds / 24; - let remainingSecs = sec + (totalSeconds - wholeSeconds); - let sb = asXsd ? 'P' : ''; - if (asXsd) { - if ((days | 0) > 0) { - sb += `${days | 0}D`; - } - if (days == 0 || (hours + min + sec) + remainingSecs > 0) { - sb += "T"; - if ((hours | 0) > 0) { - sb += `${hours | 0}H`; - } - if ((min | 0) > 0) { - sb += `${min | 0}M`; - } - if (remainingSecs > 0) { - let secFmt = remainingSecs.toFixed(7); - secFmt = trimEnd(trimEnd(secFmt, '0'), '.'); - sb += `${secFmt}S`; - } - else if (sb.length == 2) { - sb += '0S'; - } - } - } - else { - if ((days | 0) > 0) { - sb += `${days | 0}:`; - } - sb += `${padInt(hours | 0)}:${padInt(min | 0)}:`; - if (remainingSecs > 0) { - let secFmt = remainingSecs.toFixed(7); - secFmt = trimEnd(trimEnd(secFmt, '0'), '.'); - sb += remainingSecs >= 10 ? `${secFmt}` : `0${secFmt}`; - } - else { - sb += '00'; - } - } - return sb; -} -function toXsdDuration(time) { return timeFmt(time, true); } -exports.toXsdDuration = toXsdDuration; -function toTimeSpanFmt(time) { return timeFmt(time, false); } -exports.toTimeSpanFmt = toTimeSpanFmt; -function flatMap(f, xs) { return xs.reduce((r, x) => r.concat(f(x)), []); } -exports.flatMap = flatMap; -function uniq(xs) { return Array.from(new Set(xs)).sort((x, y) => x > y ? 1 : -1); } -exports.uniq = uniq; -function enc(o) { - return o == null ? null : typeof o == 'string' - ? o.replace(/&/g, '&').replace(//g, '>').replace(/'/g, ''').replace(/"/g, '"') - : `${o}`; -} -exports.enc = enc; -function htmlAttrs(o) { - let sb = []; - Object.keys(o).forEach(k => { - if (sb.length > 0) - sb.push(' '); - sb.push(k); - sb.push('="'); - sb.push(enc(o[k])); - sb.push('"'); - }); - return sb.join(''); -} -exports.htmlAttrs = htmlAttrs; -function indexOfAny(str, needles) { - for (let i = 0, len = needles.length; i < len; i++) { - let pos = str.indexOf(needles[i]); - if (pos >= 0) - return pos; - } - return -1; -} -exports.indexOfAny = indexOfAny; -function isNullOrEmpty(o) { - return (o === null || o === undefined || o === ""); -} -exports.isNullOrEmpty = isNullOrEmpty; -// From .NET DateTime (WCF JSON or ISO Date) to JS Date -function fromDateTime(dateTime) { - return toDate(dateTime); -} -exports.fromDateTime = fromDateTime; -// From JS Date to .NET DateTime (WCF JSON Date) -function toDateTime(date) { - return `\/Date(${date.getTime()})\/`; -} -exports.toDateTime = toDateTime; -// From .NET TimeSpan (XSD Duration) to JS String -function fromTimeSpan(xsdDuration) { - return xsdDuration; -} -exports.fromTimeSpan = fromTimeSpan; -// From JS String to .NET TimeSpan (XSD Duration) -function toTimeSpan(xsdDuration) { - return xsdDuration; -} -exports.toTimeSpan = toTimeSpan; -// From .NET Guid to JS String -function fromGuid(xsdDuration) { - return xsdDuration; -} -exports.fromGuid = fromGuid; -// From JS String to .NET Guid -function toGuid(xsdDuration) { - return xsdDuration; -} -exports.toGuid = toGuid; -// From .NET byte[] (Base64 String) to JVM signed byte[] -function fromByteArray(base64) { - let binaryStr = _atob(base64); - let len = binaryStr.length; - let bytes = new Uint8Array(len); - for (let i = 0; i < len; i++) { - bytes[i] = binaryStr.charCodeAt(i); - } - return bytes; -} -exports.fromByteArray = fromByteArray; -// From JS Uint8Array to .NET byte[] (Base64 String) -function toByteArray(bytes) { - let str = String.fromCharCode.apply(null, bytes); - return _btoa(str); -} -exports.toByteArray = toByteArray; -// From JS String to Base64 String -function toBase64String(source) { - return JsonServiceClient.toBase64(source); -} -exports.toBase64String = toBase64String; -class StringBuffer { - constructor(opt_a1, ...var_args) { - this.buffer_ = ''; - if (opt_a1 != null) - this.append.apply(this, arguments); - } - set(s) { - this.buffer_ = '' + s; - } - append(a1, opt_a2, ...var_args) { - this.buffer_ += String(a1); - if (opt_a2 != null) { - for (let i = 1; i < arguments.length; i++) { - this.buffer_ += arguments[i]; - } - } - return this; - } - clear() { this.buffer_ = ''; } - getLength() { return this.buffer_.length; } - toString() { return this.buffer_; } -} -exports.StringBuffer = StringBuffer; -class JSV { - static encodeString(str) { - if (str == null) - return null; - if (str === '') - return '""'; - if (str.indexOf('"')) - str = str.replace(/"/g, '""'); - return indexOfAny(str, JSV.ESCAPE_CHARS) >= 0 - ? '"' + str + '"' - : str; - } - static encodeArray(array) { - let value, sb = new StringBuffer(); - for (let i = 0, len = array.length; i < len; i++) { - value = array[i]; - if (isNullOrEmpty(value) || typeof value === 'function') - continue; - if (sb.getLength() > 0) - sb.append(','); - sb.append(JSV.stringify(value)); - } - return `[${sb.toString()}]`; - } - static encodeObject(obj) { - let value, sb = new StringBuffer(); - for (let key in obj) { - value = obj[key]; - if (!obj.hasOwnProperty(key) || isNullOrEmpty(value) || typeof value === 'function') - continue; - if (sb.getLength() > 0) - sb.append(','); - sb.append(JSV.encodeString(key)); - sb.append(':'); - sb.append(JSV.stringify(value)); - } - return `{${sb.toString()}}`; - } - static stringify(obj) { - if (obj === null || obj === undefined) - return null; - let typeOf = typeof (obj); - if (typeOf === 'function' || typeOf === 'symbol') - return null; - if (typeOf === 'object') { - let ctorStr = obj.constructor.toString().toLowerCase(); - if (ctorStr.indexOf('string') >= 0) - return JSV.encodeString(obj); - if (ctorStr.indexOf('boolean') >= 0) - return obj ? 'true' : 'false'; - if (ctorStr.indexOf('number') >= 0) - return obj; - if (ctorStr.indexOf('date') >= 0) - return JSV.encodeString(toLocalISOString(obj)); - if (ctorStr.indexOf('array') >= 0) - return JSV.encodeArray(obj); - return JSV.encodeObject(obj); - } - switch (typeOf) { - case 'string': - return JSV.encodeString(obj); - case 'boolean': - return obj ? 'true' : 'false'; - case 'number': - default: - return obj; - } - } -} -exports.JSV = JSV; -JSV.ESCAPE_CHARS = ['"', ':', ',', '{', '}', '[', ']', '\r', '\n']; -function uniqueKeys(rows) { - let to = []; - rows.forEach(o => Object.keys(o).forEach(k => { - if (to.indexOf(k) === -1) { - to.push(k); - } - })); - return to; -} -exports.uniqueKeys = uniqueKeys; -function alignLeft(str, len, pad = ' ') { - if (len < 0) - return ''; - let aLen = len + 1 - str.length; - if (aLen <= 0) - return str; - return pad + str + pad.repeat(len + 1 - str.length); -} -exports.alignLeft = alignLeft; -function alignCenter(str, len, pad = ' ') { - if (len < 0) - return ''; - if (!str) - str = ''; - let nLen = str.length; - let half = Math.floor(len / 2 - nLen / 2); - let odds = Math.abs((nLen % 2) - (len % 2)); - return pad.repeat(half + 1) + str + pad.repeat(half + 1 + odds); -} -exports.alignCenter = alignCenter; -function alignRight(str, len, pad = ' ') { - if (len < 0) - return ''; - let aLen = len + 1 - str.length; - if (aLen <= 0) - return str; - return pad.repeat(len + 1 - str.length) + str + pad; -} -exports.alignRight = alignRight; -function alignAuto(obj, len, pad = ' ') { - let str = `${obj}`; - if (str.length <= len) { - return typeof obj === "number" - ? alignRight(str, len, pad) - : alignLeft(str, len, pad); - } - return str; -} -exports.alignAuto = alignAuto; -function EventBus() { - let { subscribe, publish } = createBus(); - this.subscribe = subscribe; - this.publish = publish; -} -exports.EventBus = EventBus; -function createBus() { - let subscriptions = {}; - function subscribe(type, callback) { - let id = Symbol('id'); - if (!subscriptions[type]) - subscriptions[type] = {}; - subscriptions[type][id] = callback; - return { - unsubscribe: function () { - delete subscriptions[type][id]; - if (Object.getOwnPropertySymbols(subscriptions[type]).length === 0) { - delete subscriptions[type]; - } - } - }; - } - function publish(eventType, arg) { - if (!subscriptions[eventType]) - return; - Object.getOwnPropertySymbols(subscriptions[eventType]) - .forEach(key => subscriptions[eventType][key](arg)); - } - return { subscribe, publish }; -} -exports.createBus = createBus; -class Inspect { - static vars(obj) { - return __awaiter(this, void 0, void 0, function* () { - var _a; - if (typeof process != 'object') - return; - let inspectVarsPath = process.env.INSPECT_VARS; - if (!inspectVarsPath || !obj) - return; - // resolve dynamic path to prevent ng webpack static analysis - const nodeModule = (m) => 'no' + 'de:' + `${m}`; - yield (_a = nodeModule('fs'), Promise.resolve().then(() => require(_a))).then((fs) => __awaiter(this, void 0, void 0, function* () { - var _b; - yield (_b = nodeModule('path'), Promise.resolve().then(() => require(_b))).then(path => { - let varsPath = inspectVarsPath.replace(/\\/g, '/'); - if (varsPath.indexOf('/') >= 0) { - let dir = path.dirname(varsPath); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir); - } - } - fs.writeFileSync(varsPath, JSON.stringify(obj)); - }); - })); - }); - } - static dump(obj) { - let to = JSON.stringify(obj, null, 4); - return to.replace(/"/g, ''); - } - static printDump(obj) { console.log(Inspect.dump(obj)); } - static dumpTable(rows) { - let mapRows = rows; - let keys = uniqueKeys(mapRows); - let colSizes = {}; - keys.forEach(k => { - let max = k.length; - mapRows.forEach(row => { - let col = row[k]; - if (col != null) { - let valSize = `${col}`.length; - if (valSize > max) { - max = valSize; - } - } - }); - colSizes[k] = max; - }); - // sum + ' padding ' + | - let colSizesLength = Object.keys(colSizes).length; - let rowWidth = Object.keys(colSizes).map(k => colSizes[k]).reduce((p, c) => p + c, 0) + - (colSizesLength * 2) + - (colSizesLength + 1); - let sb = []; - sb.push(`+${'-'.repeat(rowWidth - 2)}+`); - let head = '|'; - keys.forEach(k => head += alignCenter(k, colSizes[k]) + '|'); - sb.push(head); - sb.push(`|${'-'.repeat(rowWidth - 2)}|`); - mapRows.forEach(row => { - let to = '|'; - keys.forEach(k => to += '' + alignAuto(row[k], colSizes[k]) + '|'); - sb.push(to); - }); - sb.push(`+${'-'.repeat(rowWidth - 2)}+`); - return sb.join('\n'); - } - static printDumpTable(rows) { console.log(Inspect.dumpTable(rows)); } -} -exports.Inspect = Inspect; diff --git a/dist/servicestack-client.min.js b/dist/servicestack-client.min.js index d3032f9..c56aa02 100644 --- a/dist/servicestack-client.min.js +++ b/dist/servicestack-client.min.js @@ -1 +1 @@ -var __assign=this&&this.__assign||function(){return(__assign=Object.assign||function(e){for(var t,n=1,r=arguments.length;na[0]&&t[1]>>(t=i%3)&24),2!=t&&e.length-i!=1||(r+=String.fromCharCode(xe(s>>>18&63),xe(s>>>12&63),xe(s>>>6&63),xe(63&s)),s=0);return 0==n?r:r.substring(0,r.length-n)+(1==n?"=":"==")}function xe(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function Le(e){return"function"==typeof btoa?btoa(e):Buffer.from(e).toString("base64")}function Ie(e){return e&&'"'==e[0]&&'"'==e[e.length]?e.slice(1,-1):e}function je(t){try{return decodeURIComponent(t)}catch(e){return t}}function Ae(e){if(!e)return null;for(var t=null,n=e.split(/; */),r=0;r'+e+""}function w(e,t){return e.getAttribute(t)}function Je(e,t,n){e.setAttribute(t,n)}function Ve(e,t){e.removeAttribute(t)}function We(e,t){var n={className:"class",htmlFor:"for"},r=document.createElement(e);if(null!=t&&t.attrs)for(var o in t.attrs)Je(r,n[o]||o,t.attrs[o]);return null!=t&&t.events&&Ke(r,t.events),t&&t.insertAfter&&t.insertAfter.parentNode.insertBefore(r,t.insertAfter.nextSibling),r}function $e(){var e,t,n,r=w(this,"data-invalid");r&&(e=(n="checkbox"===this.type||"radio"===this.type||S(this,"form-check"))?function(e,t){for(;null!=e&&!S(e,t);)e=e.parentElement;return e}(this,"form-check"):null,n?E(e||this.parentElement,"is-invalid form-control"):E(this,"is-invalid"),(null!=(n=!(t=this.nextElementSibling)||w(t,"for")!==this.id&&"SMALL"!==t.tagName?this:n?e||t.parentElement:t)&&n.nextElementSibling&&S(n.nextElementSibling,"invalid-feedback")?n.nextElementSibling:We("div",{insertAfter:n,attrs:{className:"invalid-feedback"}})).innerHTML=r)}function S(e,t){return!!e&&(e.classList?e.classList.contains(t):-1<(" "+e.className+" ").replace(/[\n\t\r]/g," ").indexOf(" "+t+" "))}function E(e,t){var n;e&&(e.classList?(n=e.classList).add.apply(n,t.split(" ")):S(e,t)||(e.className=(e.className+" "+t).trim()))}function O(e,t){return e?e.classList?e.classList.remove(t):S(e,t)?e.className=e.className.replace(/(\s|^)someclass(\s|$)/," "):null:null}function T(e,t){return"string"==typeof e?Array.prototype.slice.call((t||document).querySelectorAll(e)):Array.isArray(e)?e:[e]}function Ke(e,r){return T(e).forEach(function(n){Object.keys(r).forEach(function(e){var t=r[e];"string"==typeof e&&"function"==typeof t&&n.addEventListener(e,r[e]=t.bind(n))})}),r}function Qe(s,e,i){(e=void 0===e?document:e).addEventListener(i,function(e){var t,n,r="data-".concat(i),e=e.target,o=w(e,r);o||(t=e.closest("[".concat(r,"]")))&&(o=w(t,r),e=t),o&&(0<=(r=o.indexOf(":"))?(t=o.substring(0,r),r=o.substring(r+1),(n=s[t])&&n.apply(e,r.split(","))):(n=s[o])&&n.apply(e,[].slice.call(arguments)))})}function Xe(e){O(e,"has-errors"),T(".error-summary").forEach(function(e){e.innerHTML="",e.style.display="none"}),T("[data-validation-summary]").forEach(function(e){e.innerHTML=""}),T(".error").forEach(function(e){return O(e,"error")}),T(".form-check.is-invalid [data-invalid]").forEach(function(e){Ve(e,"data-invalid")}),T(".form-check.is-invalid").forEach(function(e){return O(e,"form-control")}),T(".is-invalid").forEach(function(e){O(e,"is-invalid"),Ve(e,"data-invalid")}),T(".is-valid").forEach(function(e){return O(e,"is-valid")})}function Ye(e){return e?Ue(e)?e:e.split(",").map(function(e){return e.trim()}):[]}function Ze(s){void 0===s&&(s={});var e,i=this,t=w(i,"enctype")||d.UrlEncoded;if(t==d.MultiPart&&void 0===window.FormData)throw new Error("FormData Type is needed to send '".concat(d.MultiPart,"' Content Types"));try{e=tt(i,t)}catch(e){throw new Error("".concat(e.message||e))}var n=new Headers,t=(n.set("Accept",d.Json),n.set("Content-Type",t),{method:w(i,"method")||"POST",credentials:"include",mode:"cors",headers:n,body:e});return s.requestFilter&&s.requestFilter(t),fetch(new Request(s.url||w(i,"action"),t)).catch(function(e){throw new Error("Network is unreachable (".concat(e.message||e,")"))}).then(function(t){var e,n,r,o;return s.responseFilter&&s.responseFilter(t),t.ok?(o=i,(e=(n=t).headers.get("X-Location"))&&(location.href=e),(e=n.headers.get("X-Trigger"))&&(n=e.indexOf(":"),r=0<=n?e.substring(0,n):e,e=0<=n?e.substring(n+1):null,it(o,r,e?[e]:[])),!(o=(o=(n=t).headers.get("content-type"))&&-1!==o.indexOf(d.Json))&&("0"===(r=n.headers.get("content-length"))||null==r&&!o)?null:n.json()):t.json().catch(function(e){throw new Error("The request failed with "+(t.statusText||t.status))}).then(function(e){throw Object.assign(new _,C(e))})})}function et(g,y){var b="bootstrap-v4"===(y=void 0===y?{}:y).type;Xe(g);try{if(y.validate&&!1===y.validate.call(g))return!1}catch(e){return!1}E(g,"loading");var e=null==y.onSubmitDisable?"[type=submit]":y.onSubmitDisable,t=null!=e&&""!=e;function n(e,t){if(t=void 0===t?null:t){var n=g,r=t.ResponseStatus||t.responseStatus,o=__assign({},y),s={overrideMessages:!1,messages:{NotEmpty:"Required",NotNull:"Required",Email:"Invalid email",AlreadyExists:"Already exists"},errorFilter:function(e,t,n){return this.overrideMessages?this.messages[t]||e||Oe(t):e||Oe(t)}};if(Xe(n),r){r=C(r),E(n,"has-errors");var i=o&&"bootstrap-v4"===o.type,n=__assign(__assign({},s),o),a=(o.messages&&(n.overrideMessages=!0),n.errorFilter.bind(n)),s=r.errors;if(s&&s.length){var u={},c={};T("input,textarea,select,button").forEach(function(e){var t=e.previousElementSibling,n=e.nextElementSibling,r=("radio"===e.type||"checkbox"===e.type?null:e.id)||w(e,"name");r&&(r=r.toLowerCase(),u[r]=e,i||(S(t,"help-inline")||S(t,"help-block")?c[r]=t:(S(n,"help-inline")||S(n,"help-block"))&&(c[r]=n)))}),T(".help-inline[data-for],.help-block[data-for]").forEach(function(e){var t=w(e,"data-for").toLowerCase();c[t]=e});for(var l=0,f=s;l/g,">").replace(/'/g,"'").replace(/"/g,"""):"".concat(e)}function St(e,t){for(var n=0,r=t.length;na[0]&&t[1]>>(t=i%3)&24),2!=t&&e.length-i!=1||(r+=String.fromCharCode(xe(s>>>18&63),xe(s>>>12&63),xe(s>>>6&63),xe(63&s)),s=0);return 0==n?r:r.substring(0,r.length-n)+(1==n?"=":"==")}function xe(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function Le(e){return"function"==typeof btoa?btoa(e):Buffer.from(e).toString("base64")}function Ie(e){return e&&'"'==e[0]&&'"'==e[e.length]?e.slice(1,-1):e}function je(t){try{return decodeURIComponent(t)}catch(e){return t}}function Ae(e){if(!e)return null;for(var t=null,n=e.split(/; */),r=0;r'+e+""}function w(e,t){return e.getAttribute(t)}function Je(e,t,n){e.setAttribute(t,n)}function Ve(e,t){e.removeAttribute(t)}function We(e,t){var n={className:"class",htmlFor:"for"},r=document.createElement(e);if(null!=t&&t.attrs)for(var o in t.attrs)Je(r,n[o]||o,t.attrs[o]);return null!=t&&t.events&&Qe(r,t.events),t&&t.insertAfter&&t.insertAfter.parentNode.insertBefore(r,t.insertAfter.nextSibling),r}function $e(){var e,t,n,r=w(this,"data-invalid");r&&(e=(n="checkbox"===this.type||"radio"===this.type||S(this,"form-check"))?function(e,t){for(;null!=e&&!S(e,t);)e=e.parentElement;return e}(this,"form-check"):null,n?E(e||this.parentElement,"is-invalid form-control"):E(this,"is-invalid"),(null!=(n=!(t=this.nextElementSibling)||w(t,"for")!==this.id&&"SMALL"!==t.tagName?this:n?e||t.parentElement:t)&&n.nextElementSibling&&S(n.nextElementSibling,"invalid-feedback")?n.nextElementSibling:We("div",{insertAfter:n,attrs:{className:"invalid-feedback"}})).innerHTML=r)}function S(e,t){return!!e&&(e.classList?e.classList.contains(t):-1<(" "+e.className+" ").replace(/[\n\t\r]/g," ").indexOf(" "+t+" "))}function E(e,t){var n;e&&(e.classList?(n=e.classList).add.apply(n,t.split(" ")):S(e,t)||(e.className=(e.className+" "+t).trim()))}function O(e,t){return e?e.classList?e.classList.remove(t):S(e,t)?e.className=e.className.replace(/(\s|^)someclass(\s|$)/," "):null:null}function Ke(e){return"undefined"!=typeof window&&(e instanceof window.Element||e==window.document)}function T(e,t){return"string"==typeof e?Array.prototype.slice.call((t||document).querySelectorAll(e)):Ke(e)?[e]:(Array.isArray(e)?e:[e]).flatMap(function(e){return T(e,t)})}function Qe(e,r){return T(e).forEach(function(n){Object.keys(r).forEach(function(e){var t=r[e];"string"==typeof e&&"function"==typeof t&&n.addEventListener(e,r[e]=t.bind(n))})}),r}function Xe(s,e,i){(e=void 0===e?document:e).addEventListener(i,function(e){var t,n,r="data-".concat(i),e=e.target,o=w(e,r);o||(t=e.closest("[".concat(r,"]")))&&(o=w(t,r),e=t),o&&(0<=(r=o.indexOf(":"))?(t=o.substring(0,r),r=o.substring(r+1),(n=s[t])&&n.apply(e,r.split(","))):(n=s[o])&&n.apply(e,[].slice.call(arguments)))})}function Ye(e){O(e,"has-errors"),T(".error-summary").forEach(function(e){e.innerHTML="",e.style.display="none"}),T("[data-validation-summary]").forEach(function(e){e.innerHTML=""}),T(".error").forEach(function(e){return O(e,"error")}),T(".form-check.is-invalid [data-invalid]").forEach(function(e){Ve(e,"data-invalid")}),T(".form-check.is-invalid").forEach(function(e){return O(e,"form-control")}),T(".is-invalid").forEach(function(e){O(e,"is-invalid"),Ve(e,"data-invalid")}),T(".is-valid").forEach(function(e){return O(e,"is-valid")})}function Ze(e){return e?Ue(e)?e:e.split(",").map(function(e){return e.trim()}):[]}function et(s){void 0===s&&(s={});var e,i=this,t=w(i,"enctype")||d.UrlEncoded;if(t==d.MultiPart&&void 0===window.FormData)throw new Error("FormData Type is needed to send '".concat(d.MultiPart,"' Content Types"));try{e=nt(i,t)}catch(e){throw new Error("".concat(e.message||e))}var n=new Headers,t=(n.set("Accept",d.Json),n.set("Content-Type",t),{method:w(i,"method")||"POST",credentials:"include",mode:"cors",headers:n,body:e});return s.requestFilter&&s.requestFilter(t),fetch(new Request(s.url||w(i,"action"),t)).catch(function(e){throw new Error("Network is unreachable (".concat(e.message||e,")"))}).then(function(t){var e,n,r,o;return s.responseFilter&&s.responseFilter(t),t.ok?(o=i,(e=(n=t).headers.get("X-Location"))&&(location.href=e),(e=n.headers.get("X-Trigger"))&&(n=e.indexOf(":"),r=0<=n?e.substring(0,n):e,e=0<=n?e.substring(n+1):null,at(o,r,e?[e]:[])),!(o=(o=(n=t).headers.get("content-type"))&&-1!==o.indexOf(d.Json))&&("0"===(r=n.headers.get("content-length"))||null==r&&!o)?null:n.json()):t.json().catch(function(e){throw new Error("The request failed with "+(t.statusText||t.status))}).then(function(e){throw Object.assign(new _,C(e))})})}function tt(g,y){var b="bootstrap-v4"===(y=void 0===y?{}:y).type;Ye(g);try{if(y.validate&&!1===y.validate.call(g))return!1}catch(e){return!1}E(g,"loading");var e=null==y.onSubmitDisable?"[type=submit]":y.onSubmitDisable,t=null!=e&&""!=e;function n(e,t){if(t=void 0===t?null:t){var n=g,r=t.ResponseStatus||t.responseStatus,o=__assign({},y),s={overrideMessages:!1,messages:{NotEmpty:"Required",NotNull:"Required",Email:"Invalid email",AlreadyExists:"Already exists"},errorFilter:function(e,t,n){return this.overrideMessages?this.messages[t]||e||Oe(t):e||Oe(t)}};if(Ye(n),r){r=C(r),E(n,"has-errors");var i=o&&"bootstrap-v4"===o.type,n=__assign(__assign({},s),o),a=(o.messages&&(n.overrideMessages=!0),n.errorFilter.bind(n)),s=r.errors;if(s&&s.length){var u={},c={};T("input,textarea,select,button").forEach(function(e){var t=e.previousElementSibling,n=e.nextElementSibling,r=("radio"===e.type||"checkbox"===e.type?null:e.id)||w(e,"name");r&&(r=r.toLowerCase(),u[r]=e,i||(S(t,"help-inline")||S(t,"help-block")?c[r]=t:(S(n,"help-inline")||S(n,"help-block"))&&(c[r]=n)))}),T(".help-inline[data-for],.help-block[data-for]").forEach(function(e){var t=w(e,"data-for").toLowerCase();c[t]=e});for(var l=0,f=s;l/g,">").replace(/'/g,"'").replace(/"/g,"""):"".concat(e)}function Et(e,t){for(var n=0,r=t.length;n{if("undefined"==typeof document){var t,r,s,n=e.data?e.data.indexOf("\n"):-1;if(0<=n)return t=e.data,s=e.lastEventId,r=Object.assign({},{lastEventId:s,data:t.substring(0,n)}),s=Object.assign({},{lastEventId:s,data:t.substring(n+1)}),this._onMessage(r),void this._onMessage(s)}this._onMessage(e)};_onMessage=a=>{if(!this.stopped){let n=this.options;void 0===o&&(o={querySelectorAll:e=>[]});var o,i=splitOnFirst(a.data," ");let e=null,t=i[0];var l=splitOnFirst(t,"@"),l=(1{if(this.eventSource.readyState===EventSource.CLOSED)clearInterval(n.heartbeat),null!=(e=n.handlers.onStop)&&e.apply(this.eventSource),this.reconnectServerEvents({error:new Error("EventSource is CLOSED")});else{var e=new Request(n.heartbeatUrl,{method:"POST",mode:"cors",headers:s,credentials:this.serviceClient.credentials});try{var t,r=await fetch(e);r.ok?await r.text():(t=new Error(r.status+" - "+r.statusText),this.reconnectServerEvents({error:t}))}catch(e){this.reconnectServerEvents({error:e})}}},this.connectionInfo&&this.connectionInfo.heartbeatIntervalMs||n.heartbeatIntervalMs||1e4)),n.unRegisterUrl&&"undefined"!=typeof window&&(window.onunload=()=>{navigator.sendBeacon?(this.stopped=!0,this.eventSource&&this.eventSource.close(),navigator.sendBeacon(n.unRegisterUrl)):this.stop()}),this.updateSubscriberUrl=n.updateSubscriberUrl,this.updateChannels((n.channels||"").split(","))}else{p="onJoin"==h||"onLeave"==h||"onUpdate"==h;let e=n.handlers[h];e?p?e.call(f||o.body,l):e.call(f||o.body,r,a):p||(c=n.receivers&&n.receivers.cmd,this.invokeReceiver(c,h,f,a,"cmd")),p&&(e=n.handlers.onCommand)&&e.call(f||o.body,l)}else"trigger"===u?this.raiseEvent(i,a):"css"===u&&css(d||$$("body"),h,r);c=n.receivers&&n.receivers[u];this.invokeReceiver(c,h,f,a,u),eventMessageType(h)||(p=n.handlers.onMessage)&&p.call(f||o.body,l),n.onTick&&n.onTick()}}};onError=e=>{var t;this.stopped||(e=e||event,null!=(t=this.options.onException)&&t.call(this.eventSource,e),this.options.onTick&&this.options.onTick())};getEventSourceOptions(){return{withCredentials:this.withCredentials}}reconnectServerEvents(t={}){if(!this.stopped){t.error&&this.onError(t.error);const n=this.eventSource;let e=t.url||this.eventStreamUri||n.url;null!=this.options.resolveStreamUrl&&(e=this.options.resolveStreamUrl(e));var r=new(this.EventSource||EventSource)(e,this.getEventSourceOptions()),s=(r.addEventListener("error",e=>(t.onerror||n.onerror||this.onError)(e)),r.addEventListener("message",t.onmessage||n.onmessage||this.onMessage),this.options.onReconnect);return null!=s&&s.call(r,t.error),n.removeEventListener&&(n.removeEventListener("error",this.onError),n.removeEventListener("message",this.onMessage)),n.close(),this.eventSource=r}}start(){if(this.stopped=!1,null==this.eventSource||this.eventSource.readyState===EventSource.CLOSED){let e=this.eventStreamUri;null!=this.options.resolveStreamUrl&&(e=this.options.resolveStreamUrl(e)),this.eventSource=new(this.EventSource||EventSource)(e,this.getEventSourceOptions()),this.eventSource.addEventListener("error",this.onError),this.eventSource.addEventListener("message",e=>this.onMessage(e))}return this}stop(){this.stopped=!0,this.eventSource&&this.eventSource.close();var e=this.options,e=(e&&e.heartbeat&&clearInterval(e.heartbeat),this.connectionInfo);return null==e||null==e.unRegisterUrl?new Promise((e,t)=>e()):(this.connectionInfo=null,fetch(new Request(e.unRegisterUrl,{method:"POST",mode:"cors",credentials:this.serviceClient.credentials})).then(e=>{if(!e.ok)throw new Error(e.status+" - "+e.statusText)}).catch(this.onError))}invokeReceiver(r,e,s,n,t){if(r)if("function"==typeof r&&(r=this.resolver.tryResolve(r)),e=e.replace("-",""),r.client=this,r.request=n,"function"==typeof r[e])r[e].call(s||r,n.body,n);else if(e in r)r[e]=n.body;else{var a=Object.getOwnPropertyDescriptor(r,e);if(null!=a)a.set?a.set(n.body):a.writable&&(r[e]=n.body);else{let t=e.toLowerCase();getAllMembers(r).forEach(e=>{e.toLowerCase()==t&&("function"==typeof r[e]?r[e].call(s||r,n.body,n):r[e]=n.body)});a=r.noSuchMethod;"function"==typeof a&&a.call(s||r,n.target,n)}}}hasConnected(){return null!=this.connectionInfo}registerHandler(e,t){return this.options.handlers||(this.options.handlers={}),this.options.handlers[e]=t,this}setResolver(e){return this.options.resolver=e,this}registerReceiver(e){return this.registerNamedReceiver("cmd",e)}registerNamedReceiver(e,t){return this.options.receivers||(this.options.receivers={}),this.options.receivers[e]=t,this}unregisterReceiver(e="cmd"){return this.options.receivers&&delete this.options.receivers[e],this}updateChannels(e){this.channels=e;var t=null!=this.eventSource?this.eventSource.url:this.eventStreamUri;this.eventStreamUri=t.substring(0,Math.min(t.indexOf("?"),t.length))+"?channels="+e.join(",")+"&t="+(new Date).getTime()}update(e,t){var r,s="string"==typeof e?e.split(","):e,n="string"==typeof t?t.split(","):t,a=[];for(r in this.channels){var o=this.channels[r];null!=n&&-1!==n.indexOf(o)||a.push(o)}if(s)for(var i in s){i=s[i];-1===a.indexOf(i)&&a.push(i)}this.updateChannels(a)}addListener(e,t){return(this.listeners[e]||(this.listeners[e]=[])).push(t),this}removeListener(e,t){e=this.listeners[e];return e&&0<=(t=e.indexOf(t))&&e.splice(t,1),this}raiseEvent(e,t){e=this.listeners[e];e&&e.forEach(e=>{try{e(t)}catch(e){this.onError(e)}})}getConnectionInfo(){if(null==this.connectionInfo)throw"Not Connected";return this.connectionInfo}getSubscriptionId(){return this.getConnectionInfo().id}updateSubscriber(t){return null==t.id&&(t.id=this.getSubscriptionId()),this.serviceClient.post(t).then(e=>{this.update(t.subscribeChannels,t.unsubscribeChannels)}).catch(this.onError)}subscribeToChannels(...t){var e=new UpdateEventSubscriber;return e.id=this.getSubscriptionId(),e.subscribeChannels=t,this.serviceClient.post(e).then(e=>{this.update(t,null)}).catch(this.onError)}unsubscribeFromChannels(...t){var e=new UpdateEventSubscriber;return e.id=this.getSubscriptionId(),e.unsubscribeChannels=t,this.serviceClient.post(e).then(e=>{this.update(null,t)}).catch(this.onError)}getChannelSubscribers(){var e=new GetEventSubscribers;return e.channels=this.channels,this.serviceClient.get(e).then(e=>e.map(e=>this.toServerEventUser(e))).catch(e=>(this.onError(e),[]))}toServerEventUser(e){var t,r=e.channels,s=new ServerEventUser;for(t in s.userId=e.userId,s.displayName=e.displayName,s.profileUrl=e.profileUrl,s.channels=r?r.split(","):null,e)"userId"!=t&&"displayName"!=t&&"profileUrl"!=t&&"channels"!=t&&(null==s.meta&&(s.meta={}),s.meta[t]=e[t]);return s}}function getAllMembers(e){let s=[];do{var t=Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e).map(e=>e.toString())).sort().filter((e,t,r)=>"constructor"!==e&&(0==t||e!==r[t-1])&&-1===s.indexOf(e));s=s.concat(t)}while((e=Object.getPrototypeOf(e))&&Object.getPrototypeOf(e));return s}class ServerEventReceiver{client;request;noSuchMethod(e,t){}}class UpdateEventSubscriber{id;subscribeChannels;unsubscribeChannels;createResponse(){return new UpdateEventSubscriberResponse}getTypeName(){return"UpdateEventSubscriber"}}class UpdateEventSubscriberResponse{responseStatus}class GetEventSubscribers{channels;createResponse(){return[]}getTypeName(){return"GetEventSubscribers"}}class ServerEventUser{userId;displayName;profileUrl;channels;meta}class HttpMethods{static Get="GET";static Post="POST";static Put="PUT";static Delete="DELETE";static Patch="PATCH";static Head="HEAD";static Options="OPTIONS";static hasRequestBody=e=>!("GET"===e||"DELETE"===e||"HEAD"===e||"OPTIONS"===e)}class GetAccessToken{constructor(e){Object.assign(this,e)}refreshToken;useTokenCookie;createResponse(){return new GetAccessTokenResponse}getTypeName(){return"GetAccessToken"}getMethod(){return"POST"}}class GetAccessTokenResponse{accessToken;responseStatus}class JsonServiceClient{baseUrl;replyBaseUrl;oneWayBaseUrl;mode;credentials;headers;userName;password;bearerToken;refreshToken;refreshTokenUri;useTokenCookie;enableAutoRefreshToken;requestFilter;static globalRequestFilter;responseFilter;static globalResponseFilter;exceptionFilter;urlFilter;onAuthenticationRequired;manageCookies;cookies;parseJson;static toBase64;constructor(e="/"){this.baseUrl=e,this.replyBaseUrl=combinePaths(e,"json","reply")+"/",this.oneWayBaseUrl=combinePaths(e,"json","oneway")+"/",this.mode="cors",this.credentials="include",this.headers=new Headers,this.headers.set("Content-Type","application/json"),this.manageCookies="undefined"==typeof document,this.cookies={},this.enableAutoRefreshToken=!0}setCredentials(e,t){this.userName=e,this.password=t}useBasePath(e){return this.basePath=e,this}set basePath(e){e?("/"!=e[0]&&(e="/"+e),this.replyBaseUrl=combinePaths(this.baseUrl,e)+"/",this.oneWayBaseUrl=combinePaths(this.baseUrl,e)+"/"):(this.replyBaseUrl=combinePaths(this.baseUrl,"json","reply")+"/",this.oneWayBaseUrl=combinePaths(this.baseUrl,"json","oneway")+"/")}apply(e){return e(this),this}get(e,t){return"string"!=typeof e?this.fetch(HttpMethods.Get,e,t):this.fetch(HttpMethods.Get,null,t,this.toAbsoluteUrl(e))}delete(e,t){return"string"!=typeof e?this.fetch(HttpMethods.Delete,e,t):this.fetch(HttpMethods.Delete,null,t,this.toAbsoluteUrl(e))}post(e,t){return this.fetch(HttpMethods.Post,e,t)}postToUrl(e,t,r){return this.fetch(HttpMethods.Post,t,r,this.toAbsoluteUrl(e))}postBody(e,t,r){return this.fetchBody(HttpMethods.Post,e,t,r)}put(e,t){return this.fetch(HttpMethods.Put,e,t)}putToUrl(e,t,r){return this.fetch(HttpMethods.Put,t,r,this.toAbsoluteUrl(e))}putBody(e,t,r){return this.fetchBody(HttpMethods.Put,e,t,r)}patch(e,t){return this.fetch(HttpMethods.Patch,e,t)}patchToUrl(e,t,r){return this.fetch(HttpMethods.Patch,t,r,this.toAbsoluteUrl(e))}patchBody(e,t,r){return this.fetchBody(HttpMethods.Patch,e,t,r)}publish(e,t){return this.sendOneWay(e,t)}sendOneWay(e,t){var r=combinePaths(this.oneWayBaseUrl,nameOf(e));return this.fetch(HttpMethods.Post,e,null,r)}sendAll(e){var t;return 0==e.length?Promise.resolve([]):(t=combinePaths(this.replyBaseUrl,nameOf(e[0])+"[]"),this.fetch(HttpMethods.Post,e,null,t))}sendAllOneWay(e){var t;return 0==e.length?Promise.resolve(void 0):(t=combinePaths(this.oneWayBaseUrl,nameOf(e[0])+"[]"),this.fetch(HttpMethods.Post,e,null,t).then(e=>{}))}createUrlFromDto(e,t){let r=combinePaths(this.replyBaseUrl,nameOf(t));e=HttpMethods.hasRequestBody(e);return r=e?r:appendQueryString(r,t)}toAbsoluteUrl(e){return e.startsWith("http://")||e.startsWith("https://")?e:combinePaths(this.baseUrl,e)}deleteCookie(e){this.manageCookies?delete this.cookies[e]:document&&(document.cookie=e+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/")}createRequest({method:e,request:t,url:r,args:s,body:n}){r=r||this.createUrlFromDto(e,t),s&&(r=appendQueryString(r,s)),null!=this.bearerToken?this.headers.set("Authorization","Bearer "+this.bearerToken):null!=this.userName&&this.headers.set("Authorization","Basic "+JsonServiceClient.toBase64(this.userName+":"+this.password)),this.manageCookies&&(0<(s=Object.keys(this.cookies).map(e=>{e=this.cookies[e];return e.expires&&e.expires0{"set-cookie"===t.toLowerCase()&&e.split(",").forEach(e=>r.push(e))}),r.forEach(e=>{e=parseCookie(e);e&&(this.cookies[e.name]=e)})}e.headers.forEach((e,t)=>{"x-cookies"===t.toLowerCase()&&0<=e.split(",").indexOf("ss-reftok")&&(this.useTokenCookie=!0)}),this.applyResponseFilters(e);let r=t&&"string"!=typeof t&&"function"==typeof t.createResponse?t.createResponse():null;if("string"==typeof r)return e.text().then(e=>e);t=e.headers.get("content-type"),t=t&&-1!==t.indexOf("application/json");if(t)return this.json(e).then(e=>e);if("undefined"!=typeof Uint8Array&&r instanceof Uint8Array){if("function"!=typeof e.arrayBuffer)throw new Error("This fetch polyfill does not implement 'arrayBuffer'");return e.arrayBuffer().then(e=>new Uint8Array(e))}if("function"==typeof Blob&&r instanceof Blob){if("function"!=typeof e.blob)throw new Error("This fetch polyfill does not implement 'blob'");return e.blob().then(e=>e)}var s=e.headers.get("content-length");return"0"===s||null==s&&!t?e.text().then(e=>r):this.json(e).then(e=>e)}handleError(e,r,t=null){if(r instanceof Error)throw this.raiseError(e,r);if(r.bodyUsed)throw this.raiseError(r,createErrorResponse(r.status,r.statusText,t));return void 0===r.json&&r.responseStatus?new Promise((e,t)=>t(this.raiseError(null,r))):this.json(r).then(e=>{e=sanitize(e);if(e.responseStatus)throw null!=t&&(e.type=t),e;throw createErrorResponse(r.status,r.statusText,t)}).catch(e=>{if(e instanceof Error||"undefined"!=typeof window&&window.DOMException&&e instanceof window.DOMException)throw this.raiseError(r,createErrorResponse(r.status,r.statusText,t));throw this.raiseError(r,e)})}fetch(e,t,r,s){return this.sendRequest({method:e,request:t,args:r,url:s})}fetchBody(e,t,r,s){var n=combinePaths(this.replyBaseUrl,nameOf(t));return this.sendRequest({method:e,request:r,body:"string"==typeof r||isFormData(r)?r:JSON.stringify(r),url:appendQueryString(n,t),args:s,returns:t})}sendRequest(t){var e=this.createRequest(t);const r=t.returns||t.request;let n=null;const a=()=>{var e=this.createRequest(t);return this.urlFilter&&this.urlFilter(e.url),fetch(e.url,e).then(e=>this.createResponse(e,r)).catch(e=>this.handleError(n,e))};return this.urlFilter&&this.urlFilter(e.url),fetch(e.url,e).then(e=>{return n=e,this.createResponse(e,r)}).catch(e=>{if(401===e.status){if(this.enableAutoRefreshToken&&(this.refreshToken||this.useTokenCookie||null!=this.cookies["ss-reftok"])){const s=new GetAccessToken({refreshToken:this.refreshToken,useTokenCookie:!!this.useTokenCookie});var t=this.refreshTokenUri||this.createUrlFromDto(HttpMethods.Post,s),r=(this.useTokenCookie&&(this.bearerToken=null,this.headers.delete("Authorization")),this.createRequest({method:HttpMethods.Post,request:s,args:null,url:t}));return fetch(t,r).then(e=>this.createResponse(e,s).then(e=>(this.bearerToken=e.accessToken||null,a()))).catch(e=>this.onAuthenticationRequired?this.onAuthenticationRequired().then(a).catch(e=>this.handleError(n,e,"RefreshTokenException")):this.handleError(n,e,"RefreshTokenException"))}if(this.onAuthenticationRequired)return this.onAuthenticationRequired().then(a)}return this.handleError(n,e)})}raiseError(e,t){return null!=this.exceptionFilter&&this.exceptionFilter(e,t),t}send(e,t,r){return this.sendRequest({method:getMethod(e),request:e,args:t,url:r})}sendVoid(e,t,r){return this.sendRequest({method:getMethod(e),request:e,args:t,url:r})}async api(e,t,r){try{var s=await this.fetch(getMethod(e,r),e,t);return new ApiResult({response:s})}catch(e){return new ApiResult({error:getResponseStatus(e)})}}async apiVoid(e,t,r){try{var s=await this.fetch(getMethod(e,r),e,t);return new ApiResult({response:s??new EmptyResponse})}catch(e){return new ApiResult({error:getResponseStatus(e)})}}async apiForm(e,t,r,s){try{var n=await this.fetchBody(getMethod(e,s),e,t,r);return new ApiResult({response:n})}catch(e){return new ApiResult({error:getResponseStatus(e)})}}async apiFormVoid(e,t,r,s){try{var n=await this.fetchBody(getMethod(e,s),e,t,r);return new ApiResult({response:n??new EmptyResponse})}catch(e){return new ApiResult({error:getResponseStatus(e)})}}}class JsonApiClient{static create(e="/",t){return new JsonServiceClient(e).apply(e=>{e.basePath="/api",e.headers=new Headers,t&&t(e)})}}function getMethod(e,t){return t??("function"==typeof e.getMethod?e.getMethod():HttpMethods.Post)}function getResponseStatus(e){return e.responseStatus??e.ResponseStatus??(e.errorCode?e:e.message?createErrorStatus(e.message,e.errorCode):null)}class ApiResult{response;error;constructor(e){Object.assign(this,e)}get completed(){return null!=this.response||null!=this.error}get failed(){return null!=this.error?.errorCode||null!=this.error?.message}get succeeded(){return!this.failed&&null!=this.response}get errorMessage(){return this.error?.message}get errorCode(){return this.error?.errorCode}get errors(){return this.error?.errors??[]}get errorSummary(){return null!=this.error&&0==this.errors.length?this.errorMessage:null}fieldError(e){let t=e.toLowerCase();return this.errors?.find(e=>e.fieldName.toLowerCase()==t)}fieldErrorMessage(e){return this.fieldError(e)?.message}hasFieldError(e){return null!=this.fieldError(e)}showSummary(e=[]){return!!this.failed&&e.every(e=>!this.hasFieldError(e))}summaryMessage(e=[]){if(this.showSummary(e)){let t=e.map(e=>e.toLowerCase());return t.find(e=>-1==t.indexOf(e.toLowerCase()))??this.errorMessage}}addFieldError(e,t,r="Exception"){this.error||(this.error=new ResponseStatus);var s=this.fieldError(e);null!=s?(s.errorCode=r,s.message=t):this.error.errors.push(new ResponseError({fieldName:e,errorCode:r,message:t}))}}function createErrorStatus(e,t="Exception"){return new ResponseStatus({errorCode:t,message:e})}function createFieldError(e,t,r="Exception"){return new ResponseStatus({errors:[new ResponseError({fieldName:e,errorCode:r,message:t})]})}function isFormData(e){return"undefined"!=typeof window&&e instanceof FormData}function createErrorResponse(t,r,s=null){return apply(new ErrorResponse,e=>{null!=s&&(e.type=s),e.responseStatus=apply(new ResponseStatus,e=>{e.errorCode=t&&t.toString(),e.message=r})})}function createError(e,t,r){return new ErrorResponse({responseStatus:new ResponseStatus({errorCode:e,message:t,errors:r?[new ResponseError({errorCode:e,message:t,fieldName:r})]:void 0})})}function toCamelCase(e){return e&&e.charAt(0).toLowerCase()+e.substring(1)}function toPascalCase(e){return e&&e.charAt(0).toUpperCase()+e.substring(1)}function toKebabCase(e){return(e||"").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function map(e,t){return null==e?null:t(e)}function camelCaseAny(e){if(!e||!(e instanceof Object)||Array.isArray(e))return e;var t,r,s,n={};for(t in e)e.hasOwnProperty(t)&&(r=toCamelCase(t),s=e[t],Array.isArray(s)?n[r]=s.map(e=>camelCaseAny(e)):s instanceof Object?n[r]=camelCaseAny(s):n[r]=s);return n}function sanitize(e){return sanitize&&(e.responseStatus||e.errors?e:camelCaseAny(e))}function nameOf(e){if(!e)return"null";if("function"==typeof e.getTypeName)return e.getTypeName();var t=e&&e.constructor;if(null==t)throw e+" doesn't have constructor";return t.name||(e=t.toString()).substring(9,e.indexOf("("))}function log(e,t="LOG"){return console.log(t,e),e}function css(e,t,r){var s="string"==typeof e?document.querySelectorAll(e):e;for(let e=0;er[e]=t[e]),r}function splitCase(e){return"string"!=typeof e?e:e.replace(/([A-Z]|[0-9]+)/g," $1").replace(/_/g," ").trim()}function humanize(e){return!e||0<=e.indexOf(" ")?e:splitCase(toPascalCase(e))}const ucFirst=e=>e.charAt(0).toUpperCase()+e.substring(1),isUpper=e=>"A"<=e&&e<="Z",isLower=e=>"a"<=e&&e<="z",isDigit=e=>"0"<=e&&e<="9",upperOrDigit=e=>isUpper(e)||isDigit(e);function splitTitleCase(t){var r=[];if("string"!=typeof t)return r;let s=0;for(let e=0;e!!e)}function humanify(e){return!e||0<=e.indexOf(" ")?e:ucFirst(splitTitleCase(e).join(" "))}function queryString(e){if(!e||-1===e.indexOf("?"))return{};var t=rightPart(e,"?").split("&"),r={};for(let e=0;e>>e&24),2!=e&&n.length-s!=1||(a+=String.fromCharCode(uint6ToB64(r>>>18&63),uint6ToB64(r>>>12&63),uint6ToB64(r>>>6&63),uint6ToB64(63&r)),r=0);return 0==e?a:a.substring(0,a.length-e)+(1==e?"=":"==")}function uint6ToB64(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function _btoa(e){return"function"==typeof btoa?btoa(e):Buffer.from(e).toString("base64")}function _atob(e){return"function"==typeof atob?atob(e):Buffer.from(e,"base64").toString()}function stripQuotes(e){return e&&'"'==e[0]&&'"'==e[e.length]?e.slice(1,-1):e}function tryDecode(t){try{return decodeURIComponent(t)}catch(e){return t}}function parseCookie(e){if(!e)return null;let t=null;var r=e.split(/; */);for(let e=0;enormalizeKey(e)===normalizeKey(t))[0]||""]}function parseResponseStatus(t,r=null){try{var e=JSON.parse(t);return sanitize(e.ResponseStatus||e.responseStatus)}catch(e){return{message:r||e.message||e,__error:{error:e,json:t}}}}function toFormData(e){if("undefined"!=typeof window){var t,r=new FormData;for(t in e)r.append(t,e[t]);return r}}function toObject(e){const t={};if(e){if("object"!=typeof e)throw new Error("keys must be an Array of object keys");Array.prototype.slice.call(e).forEach(e=>{this[e]&&(t[e]=this[e])})}return t}function errorResponseSummary(){var e=this.responseStatus||this.ResponseStatus;return null==e||(e=e.ErrorCode?sanitize(e):e).errors&&0!=e.errors.length?void 0:e.message||e.errorCode}function errorResponseExcept(e){var t=this.responseStatus||this.ResponseStatus;if(null!=t){t=t.ErrorCode?sanitize(t):t,e=toVarNames(e);if(e&&null!=t.errors&&0!=t.errors.length){var r,s,n=e.map(e=>(e||"").toLowerCase());for(r of t.errors)if(-1!==n.indexOf((r.fieldName||"").toLowerCase()))return;for(s of t.errors)if(-1===n.indexOf((s.fieldName||"").toLowerCase()))return s.message||s.errorCode}return t.message||t.errorCode||void 0}}function errorResponse(t){var e;return null==t?errorResponseSummary.call(this):null!=(e=this.responseStatus||this.ResponseStatus)&&null!=(e=e.ErrorCode?sanitize(e):e).errors&&0!=e.errors.length&&(e=e.errors.find(e=>(e.fieldName||"").toLowerCase()==t.toLowerCase()))?e.message||e.errorCode:void 0}function isDate(e){return e&&"[object Date]"===Object.prototype.toString.call(e)&&!isNaN(e)}function toDate(e){return e?isDate(e)?e:"/"==e[0]?new Date(parseFloat(/Date\(([^)]+)\)/.exec(e)[1])):new Date(e):null}function toDateFmt(e){return dateFmt(toDate(e))}function padInt(e){return e<10?"0"+e:e}function dateFmt(e=new Date){return e.getFullYear()+"/"+padInt(e.getMonth()+1)+"/"+padInt(e.getDate())}function dateFmtHM(e=new Date){return e.getFullYear()+"/"+padInt(e.getMonth()+1)+"/"+padInt(e.getDate())+" "+padInt(e.getHours())+":"+padInt(e.getMinutes())}function timeFmt12(e=new Date){return padInt((e.getHours()+24)%12||12)+":"+padInt(e.getMinutes())+":"+padInt(e.getSeconds())+" "+(12'+e+""}function attr(e,t){return e.getAttribute(t)}function sattr(e,t,r){return e.setAttribute(t,r)}function rattr(e,t){return e.removeAttribute(t)}function createElement(e,t){var r={className:"class",htmlFor:"for"},s=document.createElement(e);if(t?.attrs)for(const n in t.attrs)sattr(s,r[n]||n,t.attrs[n]);return t?.events&&on(s,t.events),t&&t.insertAfter&&t.insertAfter.parentNode.insertBefore(s,t.insertAfter.nextSibling),s}function showInvalidInputs(){var e,t,r,s=attr(this,"data-invalid");s&&(e=(r="checkbox"===this.type||"radio"===this.type||hasClass(this,"form-check"))?parent(this,"form-check"):null,r?addClass(e||this.parentElement,"is-invalid form-control"):addClass(this,"is-invalid"),(null!=(r=!(t=this.nextElementSibling)||attr(t,"for")!==this.id&&"SMALL"!==t.tagName?this:r?e||t.parentElement:t)&&r.nextElementSibling&&hasClass(r.nextElementSibling,"invalid-feedback")?r.nextElementSibling:createElement("div",{insertAfter:r,attrs:{className:"invalid-feedback"}})).innerHTML=s)}function parent(e,t){for(;null!=e&&!hasClass(e,t);)e=e.parentElement;return e}function hasClass(e,t){return!!e&&(e.classList?e.classList.contains(t):-1<(" "+e.className+" ").replace(/[\n\t\r]/g," ").indexOf(" "+t+" "))}function addClass(e,t){return e?e.classList?e.classList.add(...t.split(" ")):hasClass(e,t)?null:e.className=(e.className+" "+t).trim():null}function remClass(e,t){return e?e.classList?e.classList.remove(t):hasClass(e,t)?e.className=e.className.replace(/(\s|^)someclass(\s|$)/," "):null:null}function $1(e,t){return"string"==typeof e?(t||document).querySelector(e):e||null}function $$(e,t){return"string"==typeof e?Array.prototype.slice.call((t||document).querySelectorAll(e)):Array.isArray(e)?e:[e]}function on(e,s){return $$(e).forEach(r=>{Object.keys(s).forEach(function(e){var t=s[e];"string"==typeof e&&"function"==typeof t&&r.addEventListener(e,s[e]=t.bind(r))})}),s}function addScript(r){return new Promise((e,t)=>{document.body.appendChild(createElement("script",{attrs:{src:r},events:{load:e,error:t}}))})}function delaySet(e,t){t=t&&t.duration||300;let r=setTimeout(()=>e(!0),t);return()=>{clearTimeout(r),e(!1)}}function bootstrap(e){var t=(e||document).querySelectorAll("[data-invalid]");for(let e=0;ehandleEvent(t,r,e)):["click","dblclick","change","focus","blur","focusin","focusout","select","keydown","keypress","keyup","hover","toggle","input"].forEach(e=>{r.querySelector(`[data-${e}]`)&&handleEvent(t,r,e)})}function bootstrapForm(t,r){t&&(r.model&&populateForm(t,r.model),t.onsubmit=function(e){return e.preventDefault(),r.type="bootstrap-v4",ajaxSubmit(t,r)})}function applyErrors(e,r,t){var s={overrideMessages:!1,messages:{NotEmpty:"Required",NotNull:"Required",Email:"Invalid email",AlreadyExists:"Already exists"},errorFilter:function(e,t,r){return this.overrideMessages?this.messages[t]||e||splitCase(t):e||splitCase(t)}};if(clearErrors(e),r){r=sanitize(r),addClass(e,"has-errors");const h=t&&"bootstrap-v4"===t.type;var s={...s,...t},o=(t.messages&&(s.overrideMessages=!0),s.errorFilter.bind(s)),t=r.errors;if(t&&t.length){let n={},a={};$$("input,textarea,select,button").forEach(e=>{var t=e.previousElementSibling,r=e.nextElementSibling,s=("radio"===e.type||"checkbox"===e.type?null:e.id)||attr(e,"name");s&&(s=s.toLowerCase(),n[s]=e,h||(hasClass(t,"help-inline")||hasClass(t,"help-block")?a[s]=t:(hasClass(r,"help-inline")||hasClass(r,"help-block"))&&(a[s]=r)))}),$$(".help-inline[data-for],.help-block[data-for]").forEach(e=>{var t=attr(e,"data-for").toLowerCase();a[t]=e});for(var i of t){var l=(i.fieldName||"").toLowerCase(),u=n[l],c=(u&&(h?("radio"!==(c=attr(u,"type"))&&"checkbox"!==c&&addClass(u,"is-invalid"),sattr(u,"data-invalid",o(i.message,i.errorCode,"field"))):(addClass(u,"error"),addClass(u.parentElement,"has-error"))),a[l]);c&&(addClass(c,"error"),c.innerHTML=o(i.message,i.errorCode,"field"),c.style.display="block")}$$("[data-validation-summary]").forEach(e=>{var t=attr(e,"data-validation-summary").split(","),t=errorResponseExcept.call(r,t);t&&(e.innerHTML=bsAlert(t))})}else{const n=o(r.message||splitCase(r.errorCode),r.errorCode,"summary");h?$$("[data-validation-summary]").forEach(e=>e.innerHTML="<"===n[0]?n:bsAlert(n)):$$(".error-summary").forEach(e=>{e.innerHTML=n(e).style.display="block"})}return e}}function clearErrors(e){remClass(e,"has-errors"),$$(".error-summary").forEach(e=>{e.innerHTML="",e.style.display="none"}),$$("[data-validation-summary]").forEach(e=>{e.innerHTML=""}),$$(".error").forEach(e=>remClass(e,"error")),$$(".form-check.is-invalid [data-invalid]").forEach(e=>{rattr(e,"data-invalid")}),$$(".form-check.is-invalid").forEach(e=>remClass(e,"form-control")),$$(".is-invalid").forEach(e=>{remClass(e,"is-invalid"),rattr(e,"data-invalid")}),$$(".is-valid").forEach(e=>remClass(e,"is-valid"))}function toVarNames(e){return e?isArray(e)?e:e.split(",").map(e=>e.trim()):[]}function formSubmit(e={}){const r=this;var t=attr(r,"enctype")||Types.UrlEncoded;if(t==Types.MultiPart&&void 0===window.FormData)throw new Error(`FormData Type is needed to send '${Types.MultiPart}' Content Types`);let s;try{s=serializeForm(r,t)}catch(e){throw new Error(""+(e.message||e))}var n=new Headers,t=(n.set("Accept",Types.Json),n.set("Content-Type",t),{method:attr(r,"method")||"POST",credentials:"include",mode:"cors",headers:n,body:s});return e.requestFilter&&e.requestFilter(t),fetch(new Request(e.url||attr(r,"action"),t)).catch(e=>{throw new Error(`Network is unreachable (${e.message||e})`)}).then(t=>(e.responseFilter&&e.responseFilter(t),t.ok?(handleHeaderBehaviors(r,t),fromResponse(t)):t.json().catch(e=>{throw new Error("The request failed with "+(t.statusText||t.status))}).then(e=>{throw Object.assign(new ErrorResponse,sanitize(e))})))}function handleHeaderBehaviors(e,t){var r=t.headers.get("X-Location"),r=(r&&(location.href=r),t.headers.get("X-Trigger"));r&&triggerEvent(e,0<=(t=r.indexOf(":"))?r.substring(0,t):r,(e=0<=t?r.substring(t+1):null)?[e]:[])}function ajaxSubmit(s,n={}){const a="bootstrap-v4"===n.type;clearErrors(s);try{if(n.validate&&!1===n.validate.call(s))return!1}catch(e){return!1}addClass(s,"loading");const e=null==n.onSubmitDisable?"[type=submit]":n.onSubmitDisable,t=null!=e&&""!=e;function r(e,t=null){var r;t?applyErrors(s,t.ResponseStatus||t.responseStatus,{...n}):e&&(addClass(s,"has-errors"),(r=$$(".error-summary")[0])&&(r.innerHTML=e),a)&&(r=$$("[data-validation-summary]")[0])&&(r.innerHTML=bsAlert(e)),n.error&&n.error.call(s,t),a&&$$("[data-invalid]").forEach(e=>showInvalidInputs.call(e))}return t&&$$(e).forEach(e=>{sattr(e,"disabled","disabled")}),(n.submit||formSubmit).call(s,n).then(e=>(n.success&&n.success.call(s,e),!1)).catch(e=>{e.responseStatus?r(null,e):r(""+(e.message||e),null)}).finally(()=>{remClass(s,"loading"),t&&$$(e).forEach(e=>{rattr(e,"disabled")}),n.complete&&n.complete.call(s)})}function fromResponse(e){var t,r=e.headers.get("content-type"),r=r&&-1!==r.indexOf(Types.Json);return!r&&("0"===(t=e.headers.get("content-length"))||null==t&&!r)?null:e.json()}function serializeForm(e,t=null){return t===Types.MultiPart?new FormData(e):t==Types.Json?JSON.stringify(serializeToObject(e)):serializeToUrlEncoded(e)}function formEntries(e,r,s){var n,a=e,o=a.elements.length;for(let t=0;te[t]=r)}function serializeToUrlEncoded(e){return formEntries(e,[],(e,t,r)=>"string"==typeof r?e.push(encodeURIComponent(t)+"="+encodeURIComponent(r)):null).join("&").replace(/%20/g,"+")}function serializeToFormData(e){return formEntries(e,new FormData,(e,t,r)=>e.append(t,r))}function sanitizeFormData(e){for(var[t,r]of e)"object"==typeof r&&0===r.size&&e.delete(t);return e}function triggerEvent(e,t,r=null){var s;document.createEvent?((s=document.createEvent("click"==t||t.startsWith("mouse")?"MouseEvents":"HTMLEvents")).initEvent(t,!0,!0),s.data=r,e.dispatchEvent(s)):(r=document.createEventObject(),e.fireEvent("on"+t,r))}function populateForm(r,s){if(s){var n;for(let e in s){let t=s[e];void 0!==t&&null!==t||(t="");var a=r.elements.namedItem(e)||r.elements.namedItem((n=e)&&(n[0]===n[0].toUpperCase()?toCamelCase(n):n[0]===n[0].toLowerCase()?toPascalCase(n):n)),o=a;if(a)switch(o.type||a[0].type){case"radio":case"checkbox":var i=a.length;for(let e=0;e(r(e,t),e),t||{})}function resolve(e,t){e="function"==typeof e?e():e;return"function"==typeof t?t(e):e}function mapGet(e,r){if(!e||!r)return null;var s=e[r];if(s)return s;if("object"!=typeof e)return null;{let t=r.toLowerCase();s=Object.keys(e).find(e=>e.toLowerCase()===t);return s?e[s]:null}}function apiValue(e){return null==e?"":"string"==typeof e?"/Date("===e.substring(0,6)?toDate(e):e.trim():e}function apiValueFmt(e){e=apiValue(e);return(null!=e?isDate(e)?dateFmt(e):e:null)||""}function activeClassNav(e,t){return null!=e.href&&(e.exact||t.length<=1?trimEnd(t,"/").toLowerCase()===trimEnd(e.href,"/").toLowerCase():trimEnd(t,"/").toLowerCase().startsWith(trimEnd(e.href,"/").toLowerCase()))?"active":null}function activeClass(e,t,r){return null!=e&&(r||t.length<=1?trimEnd(t,"/").toLowerCase()===trimEnd(e,"/").toLowerCase():trimEnd(t,"/").toLowerCase().startsWith(trimEnd(e,"/").toLowerCase()))?"active":null}function bootstrapColors(){return["primary","secondary","success","info","warning","danger","light","dark"]}JsonServiceClient.toBase64=e=>_btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,(e,t)=>String.fromCharCode(new Number("0x"+t).valueOf()))),"undefined"!=typeof window&&void 0!==window.Element&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(e){let t=this;do{if(t.matches(e))return t}while(null!==(t=t.parentElement||t.parentNode)&&1===t.nodeType);return null})),function(e){e.MultiPart="multipart/form-data",e.UrlEncoded="application/x-www-form-urlencoded",e.Json="application/json"}(Types=Types||{});const BootstrapColors=bootstrapColors();function btnColorClass(e){for(const t of bootstrapColors()){if(e[t])return"btn-"+t;if(e["outline-"+t])return"btn-outline-"+t}return null}function bootstrapSizes(){return["xs","sm","md","lg"]}const BootstrapSizes=bootstrapSizes();function btnSizeClass(e){for(const t of bootstrapSizes())if(e[t])return"btn-"+t;return null}function btnClasses(e){var t=[],r=btnColorClass(e),r=(r&&t.push(r),btnSizeClass(e));return r&&t.push(r),e.block&&t.push("btn-block"),t}class NavDefaults{static navClass="nav";static navItemClass="nav-item";static navLinkClass="nav-link";static childNavItemClass="nav-item dropdown";static childNavLinkClass="nav-link dropdown-toggle";static childNavMenuClass="dropdown-menu";static childNavMenuItemClass="dropdown-item";static create(){return new NavOptions}static forNav(e){return e||NavDefaults.create()}static overrideDefaults(e,t){return null==e?t:((e=Object.assign({},e)).navClass===NavDefaults.navClass&&null!=t.navClass&&(e.navClass=t.navClass),e.navItemClass===NavDefaults.navItemClass&&null!=t.navItemClass&&(e.navItemClass=t.navItemClass),e.navLinkClass===NavDefaults.navLinkClass&&null!=t.navLinkClass&&(e.navLinkClass=t.navLinkClass),e.childNavItemClass===NavDefaults.childNavItemClass&&null!=t.childNavItemClass&&(e.childNavItemClass=t.childNavItemClass),e.childNavLinkClass===NavDefaults.childNavLinkClass&&null!=t.childNavLinkClass&&(e.childNavLinkClass=t.childNavLinkClass),e.childNavMenuClass===NavDefaults.childNavMenuClass&&null!=t.childNavMenuClass&&(e.childNavMenuClass=t.childNavMenuClass),e.childNavMenuItemClass===NavDefaults.childNavMenuItemClass&&null!=t.childNavMenuItemClass&&(e.childNavMenuItemClass=t.childNavMenuItemClass),e)}static showNav(e,t){return null==t||0===t.length?null==e.show:!(null!=e.show&&t.indexOf(e.show)<0||null!=e.hide&&0<=t.indexOf(e.hide))}}class NavLinkDefaults{static forNavLink(e){return e||NavDefaults.create()}}class NavbarDefaults{static navClass="navbar-nav";static create(){return new NavOptions({navClass:NavbarDefaults.navClass})}static forNavbar(e){return NavDefaults.overrideDefaults(e,NavbarDefaults.create())}}class NavButtonGroupDefaults{static navClass="btn-group";static navItemClass="btn btn-primary";static create(){return new NavOptions({navClass:NavButtonGroupDefaults.navClass,navItemClass:NavButtonGroupDefaults.navItemClass})}static forNavButtonGroup(e){return NavDefaults.overrideDefaults(e,NavButtonGroupDefaults.create())}}class LinkButtonDefaults{static navItemClass="btn";static create(){return new NavOptions({navItemClass:LinkButtonDefaults.navItemClass})}static forLinkButton(e){return NavDefaults.overrideDefaults(e||null,LinkButtonDefaults.create())}}class UserAttributes{static fromSession(e){var t=[];return null!=e&&(t.push("auth"),e.roles&&t.push(...e.roles.map(e=>"role:"+e)),e.permissions)&&t.push(...e.permissions.map(e=>"perm:"+e)),t}}class NavOptions{static fromSession(e,t){return(t=t||new NavOptions).attributes=UserAttributes.fromSession(e),t}attributes;activePath;baseHref;navClass;navItemClass;navLinkClass;childNavItemClass;childNavLinkClass;childNavMenuClass;childNavMenuItemClass;constructor(e){this.attributes=[],this.navClass=NavDefaults.navClass,this.navItemClass=NavDefaults.navItemClass,this.navLinkClass=NavDefaults.navLinkClass,this.childNavItemClass=NavDefaults.childNavItemClass,this.childNavLinkClass=NavDefaults.childNavLinkClass,this.childNavMenuClass=NavDefaults.childNavMenuClass,this.childNavMenuItemClass=NavDefaults.childNavMenuItemClass,Object.assign(this,e)}}function classNames(...t){var r=[];for(let e=0;ee.concat(r(t)),[])}function uniq(e){return Array.from(new Set(e)).sort((e,t)=>t/g,">").replace(/'/g,"'").replace(/"/g,"""):""+e}function htmlAttrs(t){let r=[];return Object.keys(t).forEach(e=>{0Object.keys(e).forEach(e=>{-1===t.indexOf(e)&&t.push(e)})),t}function alignLeft(e,t,r=" "){return t<0?"":t+1-e.length<=0?e:r+e+r.repeat(t+1-e.length)}function alignCenter(e,t,r=" "){var s,n;return t<0?"":(n=(e=e||"").length,s=Math.floor(t/2-n/2),n=Math.abs(n%2-t%2),r.repeat(s+1)+e+r.repeat(s+1+n))}function alignRight(e,t,r=" "){return t<0?"":t+1-e.length<=0?e:r.repeat(t+1-e.length)+e+r}function alignAuto(e,t,r=" "){var s=""+e;return s.length<=t?("number"==typeof e?alignRight:alignLeft)(s,t,r):s}function EventBus(){var{subscribe:e,publish:t}=createBus();this.subscribe=e,this.publish=t}function createBus(){let s={};return{subscribe:function(e,t){let r=Symbol("id");return s[e]||(s[e]={}),s[e][r]=t,{unsubscribe:function(){delete s[e][r],0===Object.getOwnPropertySymbols(s[e]).length&&delete s[e]}}},publish:function(t,r){s[t]&&Object.getOwnPropertySymbols(s[t]).forEach(e=>s[t][e](r))}}}class Inspect{static async vars(n){if("object"==typeof process){let s=process.env.INSPECT_VARS;if(s&&n){const e=e=>"node:"+e;await import(e("fs")).then(async r=>{await import(e("path")).then(e=>{var t=s.replace(/\\/g,"/");0<=t.indexOf("/")&&(e=e.dirname(t),r.existsSync(e)||r.mkdirSync(e)),r.writeFileSync(t,JSON.stringify(n))})})}}}static dump(e){return JSON.stringify(e,null,4).replace(/"/g,"")}static printDump(e){console.log(Inspect.dump(e))}static dumpTable(e){let s=e,n=uniqueKeys(s),a={};n.forEach(t=>{let r=t.length;s.forEach(e=>{var e=e[t];null!=e&&(e=(""+e).length)>r&&(r=e)}),a[t]=r});e=Object.keys(a).length,e=Object.keys(a).map(e=>a[e]).reduce((e,t)=>e+t,0)+2*e+(e+1);let o=[],t=(o.push(`+${"-".repeat(e-2)}+`),"|");return n.forEach(e=>t+=alignCenter(e,a[e])+"|"),o.push(t),o.push(`|${"-".repeat(e-2)}|`),s.forEach(t=>{let r="|";n.forEach(e=>r+=alignAuto(t[e],a[e])+"|"),o.push(r)}),o.push(`+${"-".repeat(e-2)}+`),o.join("\n")}static printDumpTable(e){console.log(Inspect.dumpTable(e))}}export{ResponseStatus,ResponseError,ErrorResponse,EmptyResponse,NavItem,GetNavItems,GetNavItemsResponse,MetadataTypesConfig,MetadataRoute,MetadataOperationType,MetadataTypes,MetadataTypeName,MetadataDataContract,MetadataDataMember,MetadataAttribute,MetadataPropertyType,MetadataType,NewInstanceResolver,SingletonInstanceResolver,ReadyState,ServerEventsClient,getAllMembers,ServerEventReceiver,UpdateEventSubscriber,UpdateEventSubscriberResponse,GetEventSubscribers,ServerEventUser,HttpMethods,GetAccessTokenResponse,JsonServiceClient,JsonApiClient,getMethod,getResponseStatus,ApiResult,createErrorStatus,createFieldError,isFormData,createError,toCamelCase,toPascalCase,toKebabCase,map,camelCaseAny,sanitize,nameOf,css,splitOnFirst,splitOnLast,leftPart,rightPart,lastLeftPart,lastRightPart,chop,onlyProps,humanize,ucFirst,isUpper,isLower,isDigit,splitTitleCase,humanify,queryString,combinePaths,createPath,createUrl,appendQueryString,setQueryString,bytesToBase64,stripQuotes,tryDecode,parseCookie,normalizeKey,normalize,getField,parseResponseStatus,toFormData,toObject,errorResponseSummary,errorResponseExcept,errorResponse,isDate,toDate,toDateFmt,padInt,dateFmt,dateFmtHM,timeFmt12,toLocalISOString,toTime,msToTime,padStart,createElement,$1,$$,on,addScript,delaySet,bootstrap,bindHandlers,bootstrapForm,toVarNames,formSubmit,ajaxSubmit,serializeForm,serializeToObject,serializeToUrlEncoded,serializeToFormData,sanitizeFormData,triggerEvent,populateForm,trimEnd,safeVarName,pick,omit,apply,each,resolve,mapGet,apiValue,apiValueFmt,activeClassNav,activeClass,BootstrapColors,btnColorClass,BootstrapSizes,btnSizeClass,btnClasses,NavDefaults,NavLinkDefaults,NavbarDefaults,NavButtonGroupDefaults,LinkButtonDefaults,UserAttributes,NavOptions,classNames,fromXsdDuration,toXsdDuration,toTimeSpanFmt,flatMap,uniq,enc,htmlAttrs,indexOfAny,isNullOrEmpty,fromDateTime,toDateTime,fromTimeSpan,toTimeSpan,fromGuid,toGuid,fromByteArray,toByteArray,toBase64String,StringBuffer,JSV,uniqueKeys,alignLeft,alignCenter,alignRight,alignAuto,EventBus,createBus,Inspect}; \ No newline at end of file +class ResponseStatus{constructor(e){Object.assign(this,e)}errorCode;message;stackTrace;errors;meta}class ResponseError{constructor(e){Object.assign(this,e)}errorCode;fieldName;message;meta}class ErrorResponse{constructor(e){Object.assign(this,e)}type;responseStatus}class EmptyResponse{constructor(e){Object.assign(this,e)}responseStatus}class NavItem{label;href;exact;id;className;iconClass;show;hide;children;meta;constructor(e){Object.assign(this,e)}}class GetNavItems{constructor(e){Object.assign(this,e)}createResponse(){return new GetNavItemsResponse}getTypeName(){return"GetNavItems"}getMethod(){return"GET"}}class GetNavItemsResponse{baseUrl;results;navItemsMap;meta;responseStatus;constructor(e){Object.assign(this,e)}}class MetadataTypesConfig{baseUrl;defaultNamespaces;defaultImports;includeTypes;excludeTypes;treatTypesAsStrings;globalNamespace;ignoreTypes;exportTypes;exportAttributes;ignoreTypesInNamespaces;constructor(e){Object.assign(this,e)}}class MetadataRoute{path;verbs;notes;summary;constructor(e){Object.assign(this,e)}}class MetadataOperationType{request;response;actions;returnsVoid;returnType;routes;dataModel;viewModel;requiresAuth;requiredRoles;requiresAnyRole;requiredPermissions;requiresAnyPermission;tags;constructor(e){Object.assign(this,e)}}class MetadataTypes{config;namespaces;types;operations;constructor(e){Object.assign(this,e)}}class MetadataTypeName{name;namespace;genericArgs;constructor(e){Object.assign(this,e)}}class MetadataDataContract{name;namespace;constructor(e){Object.assign(this,e)}}class MetadataDataMember{name;order;isRequired;emitDefaultValue;constructor(e){Object.assign(this,e)}}class MetadataAttribute{name;constructorArgs;args;constructor(e){Object.assign(this,e)}}class MetadataPropertyType{name;type;isValueType;isSystemType;isEnum;isPrimaryKey;typeNamespace;genericArgs;value;description;dataMember;readOnly;paramType;displayType;isRequired;allowableValues;allowableMin;allowableMax;attributes;constructor(e){Object.assign(this,e)}}class MetadataType{name;namespace;genericArgs;inherits;implements;displayType;description;isNested;isEnum;isEnumInt;isInterface;isAbstract;dataContract;properties;attributes;innerTypes;enumNames;enumValues;enumMemberValues;enumDescriptions;meta;constructor(e){Object.assign(this,e)}}class NewInstanceResolver{tryResolve(e){return new e}}class SingletonInstanceResolver{tryResolve(e){return e.instance||(e.instance=new e)}}function eventMessageType(e){switch(e){case"onConnect":return"ServerEventConnect";case"onHeartbeat":return"ServerEventHeartbeat";case"onJoin":return"ServerEventJoin";case"onLeave":return"ServerEventLeave";case"onUpdate":return"ServerEventUpdate"}return null}var ReadyState,Types;!function(e){e[e.CONNECTING=0]="CONNECTING",e[e.OPEN=1]="OPEN",e[e.CLOSED=2]="CLOSED"}(ReadyState=ReadyState||{});class ServerEventsClient{channels;options;eventSource;static UnknownChannel="*";eventStreamUri;updateSubscriberUrl;connectionInfo;serviceClient;stopped;resolver;listeners;EventSource;withCredentials;constructor(e,t,r={},s=null){if(this.channels=t,this.options=r,this.eventSource=s,0===this.channels.length)throw"at least 1 channel is required";this.resolver=this.options.resolver||new NewInstanceResolver,this.eventStreamUri=combinePaths(e,"event-stream")+"?",this.updateChannels(t),this.serviceClient=new JsonServiceClient(e),this.listeners={},this.withCredentials=!0,this.options.handlers||(this.options.handlers={})}onMessage=e=>{if("undefined"==typeof document){var t,r,s,n=e.data?e.data.indexOf("\n"):-1;if(0<=n)return t=e.data,s=e.lastEventId,r=Object.assign({},{lastEventId:s,data:t.substring(0,n)}),s=Object.assign({},{lastEventId:s,data:t.substring(n+1)}),this._onMessage(r),void this._onMessage(s)}this._onMessage(e)};_onMessage=a=>{if(!this.stopped){let n=this.options;void 0===o&&(o={querySelectorAll:e=>[]});var o,i=splitOnFirst(a.data," ");let e=null,t=i[0];var l=splitOnFirst(t,"@"),l=(1{if(this.eventSource.readyState===EventSource.CLOSED)clearInterval(n.heartbeat),null!=(e=n.handlers.onStop)&&e.apply(this.eventSource),this.reconnectServerEvents({error:new Error("EventSource is CLOSED")});else{var e=new Request(n.heartbeatUrl,{method:"POST",mode:"cors",headers:s,credentials:this.serviceClient.credentials});try{var t,r=await fetch(e);r.ok?await r.text():(t=new Error(r.status+" - "+r.statusText),this.reconnectServerEvents({error:t}))}catch(e){this.reconnectServerEvents({error:e})}}},this.connectionInfo&&this.connectionInfo.heartbeatIntervalMs||n.heartbeatIntervalMs||1e4)),n.unRegisterUrl&&"undefined"!=typeof window&&(window.onunload=()=>{navigator.sendBeacon?(this.stopped=!0,this.eventSource&&this.eventSource.close(),navigator.sendBeacon(n.unRegisterUrl)):this.stop()}),this.updateSubscriberUrl=n.updateSubscriberUrl,this.updateChannels((n.channels||"").split(","))}else{p="onJoin"==h||"onLeave"==h||"onUpdate"==h;let e=n.handlers[h];e?p?e.call(f||o.body,l):e.call(f||o.body,r,a):p||(c=n.receivers&&n.receivers.cmd,this.invokeReceiver(c,h,f,a,"cmd")),p&&(e=n.handlers.onCommand)&&e.call(f||o.body,l)}else"trigger"===u?this.raiseEvent(i,a):"css"===u&&css(d||$$("body"),h,r);c=n.receivers&&n.receivers[u];this.invokeReceiver(c,h,f,a,u),eventMessageType(h)||(p=n.handlers.onMessage)&&p.call(f||o.body,l),n.onTick&&n.onTick()}}};onError=e=>{var t;this.stopped||(e=e||event,null!=(t=this.options.onException)&&t.call(this.eventSource,e),this.options.onTick&&this.options.onTick())};getEventSourceOptions(){return{withCredentials:this.withCredentials}}reconnectServerEvents(t={}){if(!this.stopped){t.error&&this.onError(t.error);const n=this.eventSource;let e=t.url||this.eventStreamUri||n.url;null!=this.options.resolveStreamUrl&&(e=this.options.resolveStreamUrl(e));var r=new(this.EventSource||EventSource)(e,this.getEventSourceOptions()),s=(r.addEventListener("error",e=>(t.onerror||n.onerror||this.onError)(e)),r.addEventListener("message",t.onmessage||n.onmessage||this.onMessage),this.options.onReconnect);return null!=s&&s.call(r,t.error),n.removeEventListener&&(n.removeEventListener("error",this.onError),n.removeEventListener("message",this.onMessage)),n.close(),this.eventSource=r}}start(){if(this.stopped=!1,null==this.eventSource||this.eventSource.readyState===EventSource.CLOSED){let e=this.eventStreamUri;null!=this.options.resolveStreamUrl&&(e=this.options.resolveStreamUrl(e)),this.eventSource=new(this.EventSource||EventSource)(e,this.getEventSourceOptions()),this.eventSource.addEventListener("error",this.onError),this.eventSource.addEventListener("message",e=>this.onMessage(e))}return this}stop(){this.stopped=!0,this.eventSource&&this.eventSource.close();var e=this.options,e=(e&&e.heartbeat&&clearInterval(e.heartbeat),this.connectionInfo);return null==e||null==e.unRegisterUrl?new Promise((e,t)=>e()):(this.connectionInfo=null,fetch(new Request(e.unRegisterUrl,{method:"POST",mode:"cors",credentials:this.serviceClient.credentials})).then(e=>{if(!e.ok)throw new Error(e.status+" - "+e.statusText)}).catch(this.onError))}invokeReceiver(r,e,s,n,t){if(r)if("function"==typeof r&&(r=this.resolver.tryResolve(r)),e=e.replace("-",""),r.client=this,r.request=n,"function"==typeof r[e])r[e].call(s||r,n.body,n);else if(e in r)r[e]=n.body;else{var a=Object.getOwnPropertyDescriptor(r,e);if(null!=a)a.set?a.set(n.body):a.writable&&(r[e]=n.body);else{let t=e.toLowerCase();getAllMembers(r).forEach(e=>{e.toLowerCase()==t&&("function"==typeof r[e]?r[e].call(s||r,n.body,n):r[e]=n.body)});a=r.noSuchMethod;"function"==typeof a&&a.call(s||r,n.target,n)}}}hasConnected(){return null!=this.connectionInfo}registerHandler(e,t){return this.options.handlers||(this.options.handlers={}),this.options.handlers[e]=t,this}setResolver(e){return this.options.resolver=e,this}registerReceiver(e){return this.registerNamedReceiver("cmd",e)}registerNamedReceiver(e,t){return this.options.receivers||(this.options.receivers={}),this.options.receivers[e]=t,this}unregisterReceiver(e="cmd"){return this.options.receivers&&delete this.options.receivers[e],this}updateChannels(e){this.channels=e;var t=null!=this.eventSource?this.eventSource.url:this.eventStreamUri;this.eventStreamUri=t.substring(0,Math.min(t.indexOf("?"),t.length))+"?channels="+e.join(",")+"&t="+(new Date).getTime()}update(e,t){var r,s="string"==typeof e?e.split(","):e,n="string"==typeof t?t.split(","):t,a=[];for(r in this.channels){var o=this.channels[r];null!=n&&-1!==n.indexOf(o)||a.push(o)}if(s)for(var i in s){i=s[i];-1===a.indexOf(i)&&a.push(i)}this.updateChannels(a)}addListener(e,t){return(this.listeners[e]||(this.listeners[e]=[])).push(t),this}removeListener(e,t){e=this.listeners[e];return e&&0<=(t=e.indexOf(t))&&e.splice(t,1),this}raiseEvent(e,t){e=this.listeners[e];e&&e.forEach(e=>{try{e(t)}catch(e){this.onError(e)}})}getConnectionInfo(){if(null==this.connectionInfo)throw"Not Connected";return this.connectionInfo}getSubscriptionId(){return this.getConnectionInfo().id}updateSubscriber(t){return null==t.id&&(t.id=this.getSubscriptionId()),this.serviceClient.post(t).then(e=>{this.update(t.subscribeChannels,t.unsubscribeChannels)}).catch(this.onError)}subscribeToChannels(...t){var e=new UpdateEventSubscriber;return e.id=this.getSubscriptionId(),e.subscribeChannels=t,this.serviceClient.post(e).then(e=>{this.update(t,null)}).catch(this.onError)}unsubscribeFromChannels(...t){var e=new UpdateEventSubscriber;return e.id=this.getSubscriptionId(),e.unsubscribeChannels=t,this.serviceClient.post(e).then(e=>{this.update(null,t)}).catch(this.onError)}getChannelSubscribers(){var e=new GetEventSubscribers;return e.channels=this.channels,this.serviceClient.get(e).then(e=>e.map(e=>this.toServerEventUser(e))).catch(e=>(this.onError(e),[]))}toServerEventUser(e){var t,r=e.channels,s=new ServerEventUser;for(t in s.userId=e.userId,s.displayName=e.displayName,s.profileUrl=e.profileUrl,s.channels=r?r.split(","):null,e)"userId"!=t&&"displayName"!=t&&"profileUrl"!=t&&"channels"!=t&&(null==s.meta&&(s.meta={}),s.meta[t]=e[t]);return s}}function getAllMembers(e){let s=[];do{var t=Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e).map(e=>e.toString())).sort().filter((e,t,r)=>"constructor"!==e&&(0==t||e!==r[t-1])&&-1===s.indexOf(e));s=s.concat(t)}while((e=Object.getPrototypeOf(e))&&Object.getPrototypeOf(e));return s}class ServerEventReceiver{client;request;noSuchMethod(e,t){}}class UpdateEventSubscriber{id;subscribeChannels;unsubscribeChannels;createResponse(){return new UpdateEventSubscriberResponse}getTypeName(){return"UpdateEventSubscriber"}}class UpdateEventSubscriberResponse{responseStatus}class GetEventSubscribers{channels;createResponse(){return[]}getTypeName(){return"GetEventSubscribers"}}class ServerEventUser{userId;displayName;profileUrl;channels;meta}class HttpMethods{static Get="GET";static Post="POST";static Put="PUT";static Delete="DELETE";static Patch="PATCH";static Head="HEAD";static Options="OPTIONS";static hasRequestBody=e=>!("GET"===e||"DELETE"===e||"HEAD"===e||"OPTIONS"===e)}class GetAccessToken{constructor(e){Object.assign(this,e)}refreshToken;useTokenCookie;createResponse(){return new GetAccessTokenResponse}getTypeName(){return"GetAccessToken"}getMethod(){return"POST"}}class GetAccessTokenResponse{accessToken;responseStatus}class JsonServiceClient{baseUrl;replyBaseUrl;oneWayBaseUrl;mode;credentials;headers;userName;password;bearerToken;refreshToken;refreshTokenUri;useTokenCookie;enableAutoRefreshToken;requestFilter;static globalRequestFilter;responseFilter;static globalResponseFilter;exceptionFilter;urlFilter;onAuthenticationRequired;manageCookies;cookies;parseJson;static toBase64;constructor(e="/"){this.baseUrl=e,this.replyBaseUrl=combinePaths(e,"json","reply")+"/",this.oneWayBaseUrl=combinePaths(e,"json","oneway")+"/",this.mode="cors",this.credentials="include",this.headers=new Headers,this.headers.set("Content-Type","application/json"),this.manageCookies="undefined"==typeof document,this.cookies={},this.enableAutoRefreshToken=!0}setCredentials(e,t){this.userName=e,this.password=t}useBasePath(e){return this.basePath=e,this}set basePath(e){e?("/"!=e[0]&&(e="/"+e),this.replyBaseUrl=combinePaths(this.baseUrl,e)+"/",this.oneWayBaseUrl=combinePaths(this.baseUrl,e)+"/"):(this.replyBaseUrl=combinePaths(this.baseUrl,"json","reply")+"/",this.oneWayBaseUrl=combinePaths(this.baseUrl,"json","oneway")+"/")}apply(e){return e(this),this}get(e,t){return"string"!=typeof e?this.fetch(HttpMethods.Get,e,t):this.fetch(HttpMethods.Get,null,t,this.toAbsoluteUrl(e))}delete(e,t){return"string"!=typeof e?this.fetch(HttpMethods.Delete,e,t):this.fetch(HttpMethods.Delete,null,t,this.toAbsoluteUrl(e))}post(e,t){return this.fetch(HttpMethods.Post,e,t)}postToUrl(e,t,r){return this.fetch(HttpMethods.Post,t,r,this.toAbsoluteUrl(e))}postBody(e,t,r){return this.fetchBody(HttpMethods.Post,e,t,r)}put(e,t){return this.fetch(HttpMethods.Put,e,t)}putToUrl(e,t,r){return this.fetch(HttpMethods.Put,t,r,this.toAbsoluteUrl(e))}putBody(e,t,r){return this.fetchBody(HttpMethods.Put,e,t,r)}patch(e,t){return this.fetch(HttpMethods.Patch,e,t)}patchToUrl(e,t,r){return this.fetch(HttpMethods.Patch,t,r,this.toAbsoluteUrl(e))}patchBody(e,t,r){return this.fetchBody(HttpMethods.Patch,e,t,r)}publish(e,t){return this.sendOneWay(e,t)}sendOneWay(e,t){var r=combinePaths(this.oneWayBaseUrl,nameOf(e));return this.fetch(HttpMethods.Post,e,null,r)}sendAll(e){var t;return 0==e.length?Promise.resolve([]):(t=combinePaths(this.replyBaseUrl,nameOf(e[0])+"[]"),this.fetch(HttpMethods.Post,e,null,t))}sendAllOneWay(e){var t;return 0==e.length?Promise.resolve(void 0):(t=combinePaths(this.oneWayBaseUrl,nameOf(e[0])+"[]"),this.fetch(HttpMethods.Post,e,null,t).then(e=>{}))}createUrlFromDto(e,t){let r=combinePaths(this.replyBaseUrl,nameOf(t));e=HttpMethods.hasRequestBody(e);return r=e?r:appendQueryString(r,t)}toAbsoluteUrl(e){return e.startsWith("http://")||e.startsWith("https://")?e:combinePaths(this.baseUrl,e)}deleteCookie(e){this.manageCookies?delete this.cookies[e]:document&&(document.cookie=e+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/")}createRequest({method:e,request:t,url:r,args:s,body:n}){r=r||this.createUrlFromDto(e,t),s&&(r=appendQueryString(r,s)),null!=this.bearerToken?this.headers.set("Authorization","Bearer "+this.bearerToken):null!=this.userName&&this.headers.set("Authorization","Basic "+JsonServiceClient.toBase64(this.userName+":"+this.password)),this.manageCookies&&(0<(s=Object.keys(this.cookies).map(e=>{e=this.cookies[e];return e.expires&&e.expires0{"set-cookie"===t.toLowerCase()&&e.split(",").forEach(e=>r.push(e))}),r.forEach(e=>{e=parseCookie(e);e&&(this.cookies[e.name]=e)})}e.headers.forEach((e,t)=>{"x-cookies"===t.toLowerCase()&&0<=e.split(",").indexOf("ss-reftok")&&(this.useTokenCookie=!0)}),this.applyResponseFilters(e);let r=t&&"string"!=typeof t&&"function"==typeof t.createResponse?t.createResponse():null;if("string"==typeof r)return e.text().then(e=>e);t=e.headers.get("content-type"),t=t&&-1!==t.indexOf("application/json");if(t)return this.json(e).then(e=>e);if("undefined"!=typeof Uint8Array&&r instanceof Uint8Array){if("function"!=typeof e.arrayBuffer)throw new Error("This fetch polyfill does not implement 'arrayBuffer'");return e.arrayBuffer().then(e=>new Uint8Array(e))}if("function"==typeof Blob&&r instanceof Blob){if("function"!=typeof e.blob)throw new Error("This fetch polyfill does not implement 'blob'");return e.blob().then(e=>e)}var s=e.headers.get("content-length");return"0"===s||null==s&&!t?e.text().then(e=>r):this.json(e).then(e=>e)}handleError(e,r,t=null){if(r instanceof Error)throw this.raiseError(e,r);if(r.bodyUsed)throw this.raiseError(r,createErrorResponse(r.status,r.statusText,t));return void 0===r.json&&r.responseStatus?new Promise((e,t)=>t(this.raiseError(null,r))):this.json(r).then(e=>{e=sanitize(e);if(e.responseStatus)throw null!=t&&(e.type=t),e;throw createErrorResponse(r.status,r.statusText,t)}).catch(e=>{if(e instanceof Error||"undefined"!=typeof window&&window.DOMException&&e instanceof window.DOMException)throw this.raiseError(r,createErrorResponse(r.status,r.statusText,t));throw this.raiseError(r,e)})}fetch(e,t,r,s){return this.sendRequest({method:e,request:t,args:r,url:s})}fetchBody(e,t,r,s){var n=combinePaths(this.replyBaseUrl,nameOf(t));return this.sendRequest({method:e,request:r,body:"string"==typeof r||isFormData(r)?r:JSON.stringify(r),url:appendQueryString(n,t),args:s,returns:t})}sendRequest(t){var e=this.createRequest(t);const r=t.returns||t.request;let n=null;const a=()=>{var e=this.createRequest(t);return this.urlFilter&&this.urlFilter(e.url),fetch(e.url,e).then(e=>this.createResponse(e,r)).catch(e=>this.handleError(n,e))};return this.urlFilter&&this.urlFilter(e.url),fetch(e.url,e).then(e=>{return n=e,this.createResponse(e,r)}).catch(e=>{if(401===e.status){if(this.enableAutoRefreshToken&&(this.refreshToken||this.useTokenCookie||null!=this.cookies["ss-reftok"])){const s=new GetAccessToken({refreshToken:this.refreshToken,useTokenCookie:!!this.useTokenCookie});var t=this.refreshTokenUri||this.createUrlFromDto(HttpMethods.Post,s),r=(this.useTokenCookie&&(this.bearerToken=null,this.headers.delete("Authorization")),this.createRequest({method:HttpMethods.Post,request:s,args:null,url:t}));return fetch(t,r).then(e=>this.createResponse(e,s).then(e=>(this.bearerToken=e.accessToken||null,a()))).catch(e=>this.onAuthenticationRequired?this.onAuthenticationRequired().then(a).catch(e=>this.handleError(n,e,"RefreshTokenException")):this.handleError(n,e,"RefreshTokenException"))}if(this.onAuthenticationRequired)return this.onAuthenticationRequired().then(a)}return this.handleError(n,e)})}raiseError(e,t){return null!=this.exceptionFilter&&this.exceptionFilter(e,t),t}send(e,t,r){return this.sendRequest({method:getMethod(e),request:e,args:t,url:r})}sendVoid(e,t,r){return this.sendRequest({method:getMethod(e),request:e,args:t,url:r})}async api(e,t,r){try{var s=await this.fetch(getMethod(e,r),e,t);return new ApiResult({response:s})}catch(e){return new ApiResult({error:getResponseStatus(e)})}}async apiVoid(e,t,r){try{var s=await this.fetch(getMethod(e,r),e,t);return new ApiResult({response:s??new EmptyResponse})}catch(e){return new ApiResult({error:getResponseStatus(e)})}}async apiForm(e,t,r,s){try{var n=await this.fetchBody(getMethod(e,s),e,t,r);return new ApiResult({response:n})}catch(e){return new ApiResult({error:getResponseStatus(e)})}}async apiFormVoid(e,t,r,s){try{var n=await this.fetchBody(getMethod(e,s),e,t,r);return new ApiResult({response:n??new EmptyResponse})}catch(e){return new ApiResult({error:getResponseStatus(e)})}}}class JsonApiClient{static create(e="/",t){return new JsonServiceClient(e).apply(e=>{e.basePath="/api",e.headers=new Headers,t&&t(e)})}}function getMethod(e,t){return t??("function"==typeof e.getMethod?e.getMethod():HttpMethods.Post)}function getResponseStatus(e){return e.responseStatus??e.ResponseStatus??(e.errorCode?e:e.message?createErrorStatus(e.message,e.errorCode):null)}class ApiResult{response;error;constructor(e){Object.assign(this,e)}get completed(){return null!=this.response||null!=this.error}get failed(){return null!=this.error?.errorCode||null!=this.error?.message}get succeeded(){return!this.failed&&null!=this.response}get errorMessage(){return this.error?.message}get errorCode(){return this.error?.errorCode}get errors(){return this.error?.errors??[]}get errorSummary(){return null!=this.error&&0==this.errors.length?this.errorMessage:null}fieldError(e){let t=e.toLowerCase();return this.errors?.find(e=>e.fieldName.toLowerCase()==t)}fieldErrorMessage(e){return this.fieldError(e)?.message}hasFieldError(e){return null!=this.fieldError(e)}showSummary(e=[]){return!!this.failed&&e.every(e=>!this.hasFieldError(e))}summaryMessage(e=[]){if(this.showSummary(e)){let t=e.map(e=>e.toLowerCase());return t.find(e=>-1==t.indexOf(e.toLowerCase()))??this.errorMessage}}addFieldError(e,t,r="Exception"){this.error||(this.error=new ResponseStatus);var s=this.fieldError(e);null!=s?(s.errorCode=r,s.message=t):this.error.errors.push(new ResponseError({fieldName:e,errorCode:r,message:t}))}}function createErrorStatus(e,t="Exception"){return new ResponseStatus({errorCode:t,message:e})}function createFieldError(e,t,r="Exception"){return new ResponseStatus({errors:[new ResponseError({fieldName:e,errorCode:r,message:t})]})}function isFormData(e){return"undefined"!=typeof window&&e instanceof FormData}function createErrorResponse(t,r,s=null){return apply(new ErrorResponse,e=>{null!=s&&(e.type=s),e.responseStatus=apply(new ResponseStatus,e=>{e.errorCode=t&&t.toString(),e.message=r})})}function createError(e,t,r){return new ErrorResponse({responseStatus:new ResponseStatus({errorCode:e,message:t,errors:r?[new ResponseError({errorCode:e,message:t,fieldName:r})]:void 0})})}function toCamelCase(e){return e&&e.charAt(0).toLowerCase()+e.substring(1)}function toPascalCase(e){return e&&e.charAt(0).toUpperCase()+e.substring(1)}function toKebabCase(e){return(e||"").replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()}function map(e,t){return null==e?null:t(e)}function camelCaseAny(e){if(!e||!(e instanceof Object)||Array.isArray(e))return e;var t,r,s,n={};for(t in e)e.hasOwnProperty(t)&&(r=toCamelCase(t),s=e[t],Array.isArray(s)?n[r]=s.map(e=>camelCaseAny(e)):s instanceof Object?n[r]=camelCaseAny(s):n[r]=s);return n}function sanitize(e){return sanitize&&(e.responseStatus||e.errors?e:camelCaseAny(e))}function nameOf(e){if(!e)return"null";if("function"==typeof e.getTypeName)return e.getTypeName();var t=e&&e.constructor;if(null==t)throw e+" doesn't have constructor";return t.name||(e=t.toString()).substring(9,e.indexOf("("))}function log(e,t="LOG"){return console.log(t,e),e}function css(e,t,r){var s="string"==typeof e?document.querySelectorAll(e):e;for(let e=0;er[e]=t[e]),r}function splitCase(e){return"string"!=typeof e?e:e.replace(/([A-Z]|[0-9]+)/g," $1").replace(/_/g," ").trim()}function humanize(e){return!e||0<=e.indexOf(" ")?e:splitCase(toPascalCase(e))}const ucFirst=e=>e.charAt(0).toUpperCase()+e.substring(1),isUpper=e=>"A"<=e&&e<="Z",isLower=e=>"a"<=e&&e<="z",isDigit=e=>"0"<=e&&e<="9",upperOrDigit=e=>isUpper(e)||isDigit(e);function splitTitleCase(t){var r=[];if("string"!=typeof t)return r;let s=0;for(let e=0;e!!e)}function humanify(e){return!e||0<=e.indexOf(" ")?e:ucFirst(splitTitleCase(e).join(" "))}function queryString(e){if(!e||-1===e.indexOf("?"))return{};var t=rightPart(e,"?").split("&"),r={};for(let e=0;e>>e&24),2!=e&&n.length-s!=1||(a+=String.fromCharCode(uint6ToB64(r>>>18&63),uint6ToB64(r>>>12&63),uint6ToB64(r>>>6&63),uint6ToB64(63&r)),r=0);return 0==e?a:a.substring(0,a.length-e)+(1==e?"=":"==")}function uint6ToB64(e){return e<26?e+65:e<52?e+71:e<62?e-4:62===e?43:63===e?47:65}function _btoa(e){return"function"==typeof btoa?btoa(e):Buffer.from(e).toString("base64")}function _atob(e){return"function"==typeof atob?atob(e):Buffer.from(e,"base64").toString()}function stripQuotes(e){return e&&'"'==e[0]&&'"'==e[e.length]?e.slice(1,-1):e}function tryDecode(t){try{return decodeURIComponent(t)}catch(e){return t}}function parseCookie(e){if(!e)return null;let t=null;var r=e.split(/; */);for(let e=0;enormalizeKey(e)===normalizeKey(t))[0]||""]}function parseResponseStatus(t,r=null){try{var e=JSON.parse(t);return sanitize(e.ResponseStatus||e.responseStatus)}catch(e){return{message:r||e.message||e,__error:{error:e,json:t}}}}function toFormData(e){if("undefined"!=typeof window){var t,r=new FormData;for(t in e)r.append(t,e[t]);return r}}function toObject(e){const t={};if(e){if("object"!=typeof e)throw new Error("keys must be an Array of object keys");Array.prototype.slice.call(e).forEach(e=>{this[e]&&(t[e]=this[e])})}return t}function errorResponseSummary(){var e=this.responseStatus||this.ResponseStatus;return null==e||(e=e.ErrorCode?sanitize(e):e).errors&&0!=e.errors.length?void 0:e.message||e.errorCode}function errorResponseExcept(e){var t=this.responseStatus||this.ResponseStatus;if(null!=t){t=t.ErrorCode?sanitize(t):t,e=toVarNames(e);if(e&&null!=t.errors&&0!=t.errors.length){var r,s,n=e.map(e=>(e||"").toLowerCase());for(r of t.errors)if(-1!==n.indexOf((r.fieldName||"").toLowerCase()))return;for(s of t.errors)if(-1===n.indexOf((s.fieldName||"").toLowerCase()))return s.message||s.errorCode}return t.message||t.errorCode||void 0}}function errorResponse(t){var e;return null==t?errorResponseSummary.call(this):null!=(e=this.responseStatus||this.ResponseStatus)&&null!=(e=e.ErrorCode?sanitize(e):e).errors&&0!=e.errors.length&&(e=e.errors.find(e=>(e.fieldName||"").toLowerCase()==t.toLowerCase()))?e.message||e.errorCode:void 0}function isDate(e){return e&&"[object Date]"===Object.prototype.toString.call(e)&&!isNaN(e)}function toDate(e){return e?isDate(e)?e:"/"==e[0]?new Date(parseFloat(/Date\(([^)]+)\)/.exec(e)[1])):new Date(e):null}function toDateFmt(e){return dateFmt(toDate(e))}function padInt(e){return e<10?"0"+e:e}function dateFmt(e=new Date){return e.getFullYear()+"/"+padInt(e.getMonth()+1)+"/"+padInt(e.getDate())}function dateFmtHM(e=new Date){return e.getFullYear()+"/"+padInt(e.getMonth()+1)+"/"+padInt(e.getDate())+" "+padInt(e.getHours())+":"+padInt(e.getMinutes())}function timeFmt12(e=new Date){return padInt((e.getHours()+24)%12||12)+":"+padInt(e.getMinutes())+":"+padInt(e.getSeconds())+" "+(12'+e+""}function attr(e,t){return e.getAttribute(t)}function sattr(e,t,r){return e.setAttribute(t,r)}function rattr(e,t){return e.removeAttribute(t)}function createElement(e,t){var r={className:"class",htmlFor:"for"},s=document.createElement(e);if(t?.attrs)for(const n in t.attrs)sattr(s,r[n]||n,t.attrs[n]);return t?.events&&on(s,t.events),t&&t.insertAfter&&t.insertAfter.parentNode.insertBefore(s,t.insertAfter.nextSibling),s}function showInvalidInputs(){var e,t,r,s=attr(this,"data-invalid");s&&(e=(r="checkbox"===this.type||"radio"===this.type||hasClass(this,"form-check"))?parent(this,"form-check"):null,r?addClass(e||this.parentElement,"is-invalid form-control"):addClass(this,"is-invalid"),(null!=(r=!(t=this.nextElementSibling)||attr(t,"for")!==this.id&&"SMALL"!==t.tagName?this:r?e||t.parentElement:t)&&r.nextElementSibling&&hasClass(r.nextElementSibling,"invalid-feedback")?r.nextElementSibling:createElement("div",{insertAfter:r,attrs:{className:"invalid-feedback"}})).innerHTML=s)}function parent(e,t){for(;null!=e&&!hasClass(e,t);)e=e.parentElement;return e}function hasClass(e,t){return!!e&&(e.classList?e.classList.contains(t):-1<(" "+e.className+" ").replace(/[\n\t\r]/g," ").indexOf(" "+t+" "))}function addClass(e,t){return e?e.classList?e.classList.add(...t.split(" ")):hasClass(e,t)?null:e.className=(e.className+" "+t).trim():null}function remClass(e,t){return e?e.classList?e.classList.remove(t):hasClass(e,t)?e.className=e.className.replace(/(\s|^)someclass(\s|$)/," "):null:null}function isElement(e){return"undefined"!=typeof window&&(e instanceof window.Element||e==window.document)}function $1(e,t){return"string"==typeof e?(t||document).querySelector(e):e||null}function $$(e,t){return"string"==typeof e?Array.prototype.slice.call((t||document).querySelectorAll(e)):isElement(e)?[e]:(Array.isArray(e)?e:[e]).flatMap(e=>$$(e,t))}function on(e,s){return $$(e).forEach(r=>{Object.keys(s).forEach(function(e){var t=s[e];"string"==typeof e&&"function"==typeof t&&r.addEventListener(e,s[e]=t.bind(r))})}),s}function addScript(r){return new Promise((e,t)=>{document.body.appendChild(createElement("script",{attrs:{src:r},events:{load:e,error:t}}))})}function delaySet(e,t){t=t&&t.duration||300;let r=setTimeout(()=>e(!0),t);return()=>{clearTimeout(r),e(!1)}}function bootstrap(e){var t=(e||document).querySelectorAll("[data-invalid]");for(let e=0;ehandleEvent(t,r,e)):["click","dblclick","change","focus","blur","focusin","focusout","select","keydown","keypress","keyup","hover","toggle","input"].forEach(e=>{r.querySelector(`[data-${e}]`)&&handleEvent(t,r,e)})}function bootstrapForm(t,r){t&&(r.model&&populateForm(t,r.model),t.onsubmit=function(e){return e.preventDefault(),r.type="bootstrap-v4",ajaxSubmit(t,r)})}function applyErrors(e,r,t){var s={overrideMessages:!1,messages:{NotEmpty:"Required",NotNull:"Required",Email:"Invalid email",AlreadyExists:"Already exists"},errorFilter:function(e,t,r){return this.overrideMessages?this.messages[t]||e||splitCase(t):e||splitCase(t)}};if(clearErrors(e),r){r=sanitize(r),addClass(e,"has-errors");const h=t&&"bootstrap-v4"===t.type;var s={...s,...t},o=(t.messages&&(s.overrideMessages=!0),s.errorFilter.bind(s)),t=r.errors;if(t&&t.length){let n={},a={};$$("input,textarea,select,button").forEach(e=>{var t=e.previousElementSibling,r=e.nextElementSibling,s=("radio"===e.type||"checkbox"===e.type?null:e.id)||attr(e,"name");s&&(s=s.toLowerCase(),n[s]=e,h||(hasClass(t,"help-inline")||hasClass(t,"help-block")?a[s]=t:(hasClass(r,"help-inline")||hasClass(r,"help-block"))&&(a[s]=r)))}),$$(".help-inline[data-for],.help-block[data-for]").forEach(e=>{var t=attr(e,"data-for").toLowerCase();a[t]=e});for(var i of t){var l=(i.fieldName||"").toLowerCase(),u=n[l],c=(u&&(h?("radio"!==(c=attr(u,"type"))&&"checkbox"!==c&&addClass(u,"is-invalid"),sattr(u,"data-invalid",o(i.message,i.errorCode,"field"))):(addClass(u,"error"),addClass(u.parentElement,"has-error"))),a[l]);c&&(addClass(c,"error"),c.innerHTML=o(i.message,i.errorCode,"field"),c.style.display="block")}$$("[data-validation-summary]").forEach(e=>{var t=attr(e,"data-validation-summary").split(","),t=errorResponseExcept.call(r,t);t&&(e.innerHTML=bsAlert(t))})}else{const n=o(r.message||splitCase(r.errorCode),r.errorCode,"summary");h?$$("[data-validation-summary]").forEach(e=>e.innerHTML="<"===n[0]?n:bsAlert(n)):$$(".error-summary").forEach(e=>{e.innerHTML=n(e).style.display="block"})}return e}}function clearErrors(e){remClass(e,"has-errors"),$$(".error-summary").forEach(e=>{e.innerHTML="",e.style.display="none"}),$$("[data-validation-summary]").forEach(e=>{e.innerHTML=""}),$$(".error").forEach(e=>remClass(e,"error")),$$(".form-check.is-invalid [data-invalid]").forEach(e=>{rattr(e,"data-invalid")}),$$(".form-check.is-invalid").forEach(e=>remClass(e,"form-control")),$$(".is-invalid").forEach(e=>{remClass(e,"is-invalid"),rattr(e,"data-invalid")}),$$(".is-valid").forEach(e=>remClass(e,"is-valid"))}function toVarNames(e){return e?isArray(e)?e:e.split(",").map(e=>e.trim()):[]}function formSubmit(e={}){const r=this;var t=attr(r,"enctype")||Types.UrlEncoded;if(t==Types.MultiPart&&void 0===window.FormData)throw new Error(`FormData Type is needed to send '${Types.MultiPart}' Content Types`);let s;try{s=serializeForm(r,t)}catch(e){throw new Error(""+(e.message||e))}var n=new Headers,t=(n.set("Accept",Types.Json),n.set("Content-Type",t),{method:attr(r,"method")||"POST",credentials:"include",mode:"cors",headers:n,body:s});return e.requestFilter&&e.requestFilter(t),fetch(new Request(e.url||attr(r,"action"),t)).catch(e=>{throw new Error(`Network is unreachable (${e.message||e})`)}).then(t=>(e.responseFilter&&e.responseFilter(t),t.ok?(handleHeaderBehaviors(r,t),fromResponse(t)):t.json().catch(e=>{throw new Error("The request failed with "+(t.statusText||t.status))}).then(e=>{throw Object.assign(new ErrorResponse,sanitize(e))})))}function handleHeaderBehaviors(e,t){var r=t.headers.get("X-Location"),r=(r&&(location.href=r),t.headers.get("X-Trigger"));r&&triggerEvent(e,0<=(t=r.indexOf(":"))?r.substring(0,t):r,(e=0<=t?r.substring(t+1):null)?[e]:[])}function ajaxSubmit(s,n={}){const a="bootstrap-v4"===n.type;clearErrors(s);try{if(n.validate&&!1===n.validate.call(s))return!1}catch(e){return!1}addClass(s,"loading");const e=null==n.onSubmitDisable?"[type=submit]":n.onSubmitDisable,t=null!=e&&""!=e;function r(e,t=null){var r;t?applyErrors(s,t.ResponseStatus||t.responseStatus,{...n}):e&&(addClass(s,"has-errors"),(r=$$(".error-summary")[0])&&(r.innerHTML=e),a)&&(r=$$("[data-validation-summary]")[0])&&(r.innerHTML=bsAlert(e)),n.error&&n.error.call(s,t),a&&$$("[data-invalid]").forEach(e=>showInvalidInputs.call(e))}return t&&$$(e).forEach(e=>{sattr(e,"disabled","disabled")}),(n.submit||formSubmit).call(s,n).then(e=>(n.success&&n.success.call(s,e),!1)).catch(e=>{e.responseStatus?r(null,e):r(""+(e.message||e),null)}).finally(()=>{remClass(s,"loading"),t&&$$(e).forEach(e=>{rattr(e,"disabled")}),n.complete&&n.complete.call(s)})}function fromResponse(e){var t,r=e.headers.get("content-type"),r=r&&-1!==r.indexOf(Types.Json);return!r&&("0"===(t=e.headers.get("content-length"))||null==t&&!r)?null:e.json()}function serializeForm(e,t=null){return t===Types.MultiPart?new FormData(e):t==Types.Json?JSON.stringify(serializeToObject(e)):serializeToUrlEncoded(e)}function formEntries(e,r,s){var n,a=e,o=a.elements.length;for(let t=0;te[t]=r)}function serializeToUrlEncoded(e){return formEntries(e,[],(e,t,r)=>"string"==typeof r?e.push(encodeURIComponent(t)+"="+encodeURIComponent(r)):null).join("&").replace(/%20/g,"+")}function serializeToFormData(e){return formEntries(e,new FormData,(e,t,r)=>e.append(t,r))}function sanitizeFormData(e){for(var[t,r]of e)"object"==typeof r&&0===r.size&&e.delete(t);return e}function triggerEvent(e,t,r=null){var s;document.createEvent?((s=document.createEvent("click"==t||t.startsWith("mouse")?"MouseEvents":"HTMLEvents")).initEvent(t,!0,!0),s.data=r,e.dispatchEvent(s)):(r=document.createEventObject(),e.fireEvent("on"+t,r))}function populateForm(r,s){if(s){var n;for(let e in s){let t=s[e];void 0!==t&&null!==t||(t="");var a=r.elements.namedItem(e)||r.elements.namedItem((n=e)&&(n[0]===n[0].toUpperCase()?toCamelCase(n):n[0]===n[0].toLowerCase()?toPascalCase(n):n)),o=a;if(a)switch(o.type||a[0].type){case"radio":case"checkbox":var i=a.length;for(let e=0;e(r(e,t),e),t||{})}function resolve(e,t){e="function"==typeof e?e():e;return"function"==typeof t?t(e):e}function mapGet(e,r){if(!e||!r)return null;var s=e[r];if(s)return s;if("object"!=typeof e)return null;{let t=r.toLowerCase();s=Object.keys(e).find(e=>e.toLowerCase()===t);return s?e[s]:null}}function apiValue(e){return null==e?"":"string"==typeof e?"/Date("===e.substring(0,6)?toDate(e):e.trim():e}function apiValueFmt(e){e=apiValue(e);return(null!=e?isDate(e)?dateFmt(e):e:null)||""}function activeClassNav(e,t){return null!=e.href&&(e.exact||t.length<=1?trimEnd(t,"/").toLowerCase()===trimEnd(e.href,"/").toLowerCase():trimEnd(t,"/").toLowerCase().startsWith(trimEnd(e.href,"/").toLowerCase()))?"active":null}function activeClass(e,t,r){return null!=e&&(r||t.length<=1?trimEnd(t,"/").toLowerCase()===trimEnd(e,"/").toLowerCase():trimEnd(t,"/").toLowerCase().startsWith(trimEnd(e,"/").toLowerCase()))?"active":null}function bootstrapColors(){return["primary","secondary","success","info","warning","danger","light","dark"]}JsonServiceClient.toBase64=e=>_btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g,(e,t)=>String.fromCharCode(new Number("0x"+t).valueOf()))),"undefined"!=typeof window&&void 0!==window.Element&&(Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector),Element.prototype.closest||(Element.prototype.closest=function(e){let t=this;do{if(t.matches(e))return t}while(null!==(t=t.parentElement||t.parentNode)&&1===t.nodeType);return null})),function(e){e.MultiPart="multipart/form-data",e.UrlEncoded="application/x-www-form-urlencoded",e.Json="application/json"}(Types=Types||{});const BootstrapColors=bootstrapColors();function btnColorClass(e){for(const t of bootstrapColors()){if(e[t])return"btn-"+t;if(e["outline-"+t])return"btn-outline-"+t}return null}function bootstrapSizes(){return["xs","sm","md","lg"]}const BootstrapSizes=bootstrapSizes();function btnSizeClass(e){for(const t of bootstrapSizes())if(e[t])return"btn-"+t;return null}function btnClasses(e){var t=[],r=btnColorClass(e),r=(r&&t.push(r),btnSizeClass(e));return r&&t.push(r),e.block&&t.push("btn-block"),t}class NavDefaults{static navClass="nav";static navItemClass="nav-item";static navLinkClass="nav-link";static childNavItemClass="nav-item dropdown";static childNavLinkClass="nav-link dropdown-toggle";static childNavMenuClass="dropdown-menu";static childNavMenuItemClass="dropdown-item";static create(){return new NavOptions}static forNav(e){return e||NavDefaults.create()}static overrideDefaults(e,t){return null==e?t:((e=Object.assign({},e)).navClass===NavDefaults.navClass&&null!=t.navClass&&(e.navClass=t.navClass),e.navItemClass===NavDefaults.navItemClass&&null!=t.navItemClass&&(e.navItemClass=t.navItemClass),e.navLinkClass===NavDefaults.navLinkClass&&null!=t.navLinkClass&&(e.navLinkClass=t.navLinkClass),e.childNavItemClass===NavDefaults.childNavItemClass&&null!=t.childNavItemClass&&(e.childNavItemClass=t.childNavItemClass),e.childNavLinkClass===NavDefaults.childNavLinkClass&&null!=t.childNavLinkClass&&(e.childNavLinkClass=t.childNavLinkClass),e.childNavMenuClass===NavDefaults.childNavMenuClass&&null!=t.childNavMenuClass&&(e.childNavMenuClass=t.childNavMenuClass),e.childNavMenuItemClass===NavDefaults.childNavMenuItemClass&&null!=t.childNavMenuItemClass&&(e.childNavMenuItemClass=t.childNavMenuItemClass),e)}static showNav(e,t){return null==t||0===t.length?null==e.show:!(null!=e.show&&t.indexOf(e.show)<0||null!=e.hide&&0<=t.indexOf(e.hide))}}class NavLinkDefaults{static forNavLink(e){return e||NavDefaults.create()}}class NavbarDefaults{static navClass="navbar-nav";static create(){return new NavOptions({navClass:NavbarDefaults.navClass})}static forNavbar(e){return NavDefaults.overrideDefaults(e,NavbarDefaults.create())}}class NavButtonGroupDefaults{static navClass="btn-group";static navItemClass="btn btn-primary";static create(){return new NavOptions({navClass:NavButtonGroupDefaults.navClass,navItemClass:NavButtonGroupDefaults.navItemClass})}static forNavButtonGroup(e){return NavDefaults.overrideDefaults(e,NavButtonGroupDefaults.create())}}class LinkButtonDefaults{static navItemClass="btn";static create(){return new NavOptions({navItemClass:LinkButtonDefaults.navItemClass})}static forLinkButton(e){return NavDefaults.overrideDefaults(e||null,LinkButtonDefaults.create())}}class UserAttributes{static fromSession(e){var t=[];return null!=e&&(t.push("auth"),e.roles&&t.push(...e.roles.map(e=>"role:"+e)),e.permissions)&&t.push(...e.permissions.map(e=>"perm:"+e)),t}}class NavOptions{static fromSession(e,t){return(t=t||new NavOptions).attributes=UserAttributes.fromSession(e),t}attributes;activePath;baseHref;navClass;navItemClass;navLinkClass;childNavItemClass;childNavLinkClass;childNavMenuClass;childNavMenuItemClass;constructor(e){this.attributes=[],this.navClass=NavDefaults.navClass,this.navItemClass=NavDefaults.navItemClass,this.navLinkClass=NavDefaults.navLinkClass,this.childNavItemClass=NavDefaults.childNavItemClass,this.childNavLinkClass=NavDefaults.childNavLinkClass,this.childNavMenuClass=NavDefaults.childNavMenuClass,this.childNavMenuItemClass=NavDefaults.childNavMenuItemClass,Object.assign(this,e)}}function classNames(...t){var r=[];for(let e=0;ee.concat(r(t)),[])}function uniq(e){return Array.from(new Set(e)).sort((e,t)=>t/g,">").replace(/'/g,"'").replace(/"/g,"""):""+e}function htmlAttrs(t){let r=[];return Object.keys(t).forEach(e=>{0Object.keys(e).forEach(e=>{-1===t.indexOf(e)&&t.push(e)})),t}function alignLeft(e,t,r=" "){return t<0?"":t+1-e.length<=0?e:r+e+r.repeat(t+1-e.length)}function alignCenter(e,t,r=" "){var s,n;return t<0?"":(n=(e=e||"").length,s=Math.floor(t/2-n/2),n=Math.abs(n%2-t%2),r.repeat(s+1)+e+r.repeat(s+1+n))}function alignRight(e,t,r=" "){return t<0?"":t+1-e.length<=0?e:r.repeat(t+1-e.length)+e+r}function alignAuto(e,t,r=" "){var s=""+e;return s.length<=t?("number"==typeof e?alignRight:alignLeft)(s,t,r):s}function EventBus(){var{subscribe:e,publish:t}=createBus();this.subscribe=e,this.publish=t}function createBus(){let s={};return{subscribe:function(e,t){let r=Symbol("id");return s[e]||(s[e]={}),s[e][r]=t,{unsubscribe:function(){delete s[e][r],0===Object.getOwnPropertySymbols(s[e]).length&&delete s[e]}}},publish:function(t,r){s[t]&&Object.getOwnPropertySymbols(s[t]).forEach(e=>s[t][e](r))}}}class Inspect{static async vars(n){if("object"==typeof process){let s=process.env.INSPECT_VARS;if(s&&n){const e=e=>"node:"+e;await import(e("fs")).then(async r=>{await import(e("path")).then(e=>{var t=s.replace(/\\/g,"/");0<=t.indexOf("/")&&(e=e.dirname(t),r.existsSync(e)||r.mkdirSync(e)),r.writeFileSync(t,JSON.stringify(n))})})}}}static dump(e){return JSON.stringify(e,null,4).replace(/"/g,"")}static printDump(e){console.log(Inspect.dump(e))}static dumpTable(e){let s=e,n=uniqueKeys(s),a={};n.forEach(t=>{let r=t.length;s.forEach(e=>{var e=e[t];null!=e&&(e=(""+e).length)>r&&(r=e)}),a[t]=r});e=Object.keys(a).length,e=Object.keys(a).map(e=>a[e]).reduce((e,t)=>e+t,0)+2*e+(e+1);let o=[],t=(o.push(`+${"-".repeat(e-2)}+`),"|");return n.forEach(e=>t+=alignCenter(e,a[e])+"|"),o.push(t),o.push(`|${"-".repeat(e-2)}|`),s.forEach(t=>{let r="|";n.forEach(e=>r+=alignAuto(t[e],a[e])+"|"),o.push(r)}),o.push(`+${"-".repeat(e-2)}+`),o.join("\n")}static printDumpTable(e){console.log(Inspect.dumpTable(e))}}export{ResponseStatus,ResponseError,ErrorResponse,EmptyResponse,NavItem,GetNavItems,GetNavItemsResponse,MetadataTypesConfig,MetadataRoute,MetadataOperationType,MetadataTypes,MetadataTypeName,MetadataDataContract,MetadataDataMember,MetadataAttribute,MetadataPropertyType,MetadataType,NewInstanceResolver,SingletonInstanceResolver,ReadyState,ServerEventsClient,getAllMembers,ServerEventReceiver,UpdateEventSubscriber,UpdateEventSubscriberResponse,GetEventSubscribers,ServerEventUser,HttpMethods,GetAccessTokenResponse,JsonServiceClient,JsonApiClient,getMethod,getResponseStatus,ApiResult,createErrorStatus,createFieldError,isFormData,createError,toCamelCase,toPascalCase,toKebabCase,map,camelCaseAny,sanitize,nameOf,css,splitOnFirst,splitOnLast,leftPart,rightPart,lastLeftPart,lastRightPart,chop,onlyProps,humanize,ucFirst,isUpper,isLower,isDigit,splitTitleCase,humanify,queryString,combinePaths,createPath,createUrl,appendQueryString,setQueryString,bytesToBase64,stripQuotes,tryDecode,parseCookie,normalizeKey,normalize,getField,parseResponseStatus,toFormData,toObject,errorResponseSummary,errorResponseExcept,errorResponse,isDate,toDate,toDateFmt,padInt,dateFmt,dateFmtHM,timeFmt12,toLocalISOString,toTime,msToTime,padStart,createElement,isElement,$1,$$,on,addScript,delaySet,bootstrap,bindHandlers,bootstrapForm,toVarNames,formSubmit,ajaxSubmit,serializeForm,serializeToObject,serializeToUrlEncoded,serializeToFormData,sanitizeFormData,triggerEvent,populateForm,trimEnd,safeVarName,pick,omit,apply,each,resolve,mapGet,apiValue,apiValueFmt,activeClassNav,activeClass,BootstrapColors,btnColorClass,BootstrapSizes,btnSizeClass,btnClasses,NavDefaults,NavLinkDefaults,NavbarDefaults,NavButtonGroupDefaults,LinkButtonDefaults,UserAttributes,NavOptions,classNames,fromXsdDuration,toXsdDuration,toTimeSpanFmt,flatMap,uniq,enc,htmlAttrs,indexOfAny,isNullOrEmpty,fromDateTime,toDateTime,fromTimeSpan,toTimeSpan,fromGuid,toGuid,fromByteArray,toByteArray,toBase64String,StringBuffer,JSV,uniqueKeys,alignLeft,alignCenter,alignRight,alignAuto,EventBus,createBus,Inspect}; \ No newline at end of file diff --git a/dist/servicestack-client.mjs b/dist/servicestack-client.mjs index 26b20c6..6998c0f 100644 --- a/dist/servicestack-client.mjs +++ b/dist/servicestack-client.mjs @@ -1758,13 +1758,18 @@ function remClass(el, cls) { ? el.className = el.className.replace(/(\s|^)someclass(\s|$)/, ' ') : null; } +export function isElement(el) { + return typeof window != "undefined" && (el instanceof window.Element || el == window.document); +} export function $1(sel, el) { return typeof sel === "string" ? (el || document).querySelector(sel) : sel || null; } export function $$(sel, el) { - return typeof sel === "string" - ? Array.prototype.slice.call((el || document).querySelectorAll(sel)) - : Array.isArray(sel) ? sel : [sel]; + if (typeof sel === "string") + return Array.prototype.slice.call((el || document).querySelectorAll(sel)); + if (isElement(sel)) + return [sel]; + return (Array.isArray(sel) ? sel : [sel]).flatMap(x => $$(x, el)); } export function on(sel, handlers) { $$(sel).forEach(e => { diff --git a/dist/servicestack-client.umd.js b/dist/servicestack-client.umd.js index 1553373..230a88d 100644 --- a/dist/servicestack-client.umd.js +++ b/dist/servicestack-client.umd.js @@ -58,7 +58,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) { "use strict"; var __syncRequire = typeof module === "object" && typeof module.exports === "object"; Object.defineProperty(exports, "__esModule", { value: true }); - exports.Inspect = exports.createBus = exports.EventBus = exports.alignAuto = exports.alignRight = exports.alignCenter = exports.alignLeft = exports.uniqueKeys = exports.JSV = exports.StringBuffer = exports.toBase64String = exports.toByteArray = exports.fromByteArray = exports.toGuid = exports.fromGuid = exports.toTimeSpan = exports.fromTimeSpan = exports.toDateTime = exports.fromDateTime = exports.isNullOrEmpty = exports.indexOfAny = exports.htmlAttrs = exports.enc = exports.uniq = exports.flatMap = exports.toTimeSpanFmt = exports.toXsdDuration = exports.fromXsdDuration = exports.classNames = exports.NavOptions = exports.UserAttributes = exports.LinkButtonDefaults = exports.NavButtonGroupDefaults = exports.NavbarDefaults = exports.NavLinkDefaults = exports.NavDefaults = exports.btnClasses = exports.btnSizeClass = exports.BootstrapSizes = exports.btnColorClass = exports.BootstrapColors = exports.activeClass = exports.activeClassNav = exports.apiValueFmt = exports.apiValue = exports.mapGet = exports.resolve = exports.each = exports.apply = exports.omit = exports.pick = exports.safeVarName = exports.trimEnd = exports.populateForm = exports.triggerEvent = exports.sanitizeFormData = exports.serializeToFormData = exports.serializeToUrlEncoded = exports.serializeToObject = exports.serializeForm = exports.ajaxSubmit = exports.formSubmit = exports.toVarNames = exports.bootstrapForm = exports.bindHandlers = exports.bootstrap = exports.delaySet = exports.addScript = exports.on = exports.$$ = exports.$1 = exports.createElement = exports.padStart = exports.msToTime = exports.toTime = exports.toLocalISOString = exports.timeFmt12 = exports.dateFmtHM = exports.dateFmt = exports.padInt = exports.toDateFmt = exports.toDate = exports.isDate = exports.errorResponse = exports.errorResponseExcept = exports.errorResponseSummary = exports.toObject = exports.toFormData = exports.parseResponseStatus = exports.getField = exports.normalize = exports.normalizeKey = exports.parseCookie = exports.tryDecode = exports.stripQuotes = exports.bytesToBase64 = exports.setQueryString = exports.appendQueryString = exports.createUrl = exports.createPath = exports.combinePaths = exports.queryString = exports.humanify = exports.splitTitleCase = exports.isDigit = exports.isLower = exports.isUpper = exports.ucFirst = exports.humanize = exports.onlyProps = exports.chop = exports.lastRightPart = exports.lastLeftPart = exports.rightPart = exports.leftPart = exports.splitOnLast = exports.splitOnFirst = exports.css = exports.nameOf = exports.sanitize = exports.camelCaseAny = exports.map = exports.toKebabCase = exports.toPascalCase = exports.toCamelCase = exports.createError = exports.isFormData = exports.createFieldError = exports.createErrorStatus = exports.ApiResult = exports.getResponseStatus = exports.getMethod = exports.JsonApiClient = exports.JsonServiceClient = exports.GetAccessTokenResponse = exports.HttpMethods = exports.ServerEventUser = exports.GetEventSubscribers = exports.UpdateEventSubscriberResponse = exports.UpdateEventSubscriber = exports.ServerEventReceiver = exports.getAllMembers = exports.ServerEventsClient = exports.ReadyState = exports.SingletonInstanceResolver = exports.NewInstanceResolver = exports.MetadataType = exports.MetadataPropertyType = exports.MetadataAttribute = exports.MetadataDataMember = exports.MetadataDataContract = exports.MetadataTypeName = exports.MetadataTypes = exports.MetadataOperationType = exports.MetadataRoute = exports.MetadataTypesConfig = exports.GetNavItemsResponse = exports.GetNavItems = exports.NavItem = exports.EmptyResponse = exports.ErrorResponse = exports.ResponseError = exports.ResponseStatus = void 0; + exports.Inspect = exports.createBus = exports.EventBus = exports.alignAuto = exports.alignRight = exports.alignCenter = exports.alignLeft = exports.uniqueKeys = exports.JSV = exports.StringBuffer = exports.toBase64String = exports.toByteArray = exports.fromByteArray = exports.toGuid = exports.fromGuid = exports.toTimeSpan = exports.fromTimeSpan = exports.toDateTime = exports.fromDateTime = exports.isNullOrEmpty = exports.indexOfAny = exports.htmlAttrs = exports.enc = exports.uniq = exports.flatMap = exports.toTimeSpanFmt = exports.toXsdDuration = exports.fromXsdDuration = exports.classNames = exports.NavOptions = exports.UserAttributes = exports.LinkButtonDefaults = exports.NavButtonGroupDefaults = exports.NavbarDefaults = exports.NavLinkDefaults = exports.NavDefaults = exports.btnClasses = exports.btnSizeClass = exports.BootstrapSizes = exports.btnColorClass = exports.BootstrapColors = exports.activeClass = exports.activeClassNav = exports.apiValueFmt = exports.apiValue = exports.mapGet = exports.resolve = exports.each = exports.apply = exports.omit = exports.pick = exports.safeVarName = exports.trimEnd = exports.populateForm = exports.triggerEvent = exports.sanitizeFormData = exports.serializeToFormData = exports.serializeToUrlEncoded = exports.serializeToObject = exports.serializeForm = exports.ajaxSubmit = exports.formSubmit = exports.toVarNames = exports.bootstrapForm = exports.bindHandlers = exports.bootstrap = exports.delaySet = exports.addScript = exports.on = exports.$$ = exports.$1 = exports.isElement = exports.createElement = exports.padStart = exports.msToTime = exports.toTime = exports.toLocalISOString = exports.timeFmt12 = exports.dateFmtHM = exports.dateFmt = exports.padInt = exports.toDateFmt = exports.toDate = exports.isDate = exports.errorResponse = exports.errorResponseExcept = exports.errorResponseSummary = exports.toObject = exports.toFormData = exports.parseResponseStatus = exports.getField = exports.normalize = exports.normalizeKey = exports.parseCookie = exports.tryDecode = exports.stripQuotes = exports.bytesToBase64 = exports.setQueryString = exports.appendQueryString = exports.createUrl = exports.createPath = exports.combinePaths = exports.queryString = exports.humanify = exports.splitTitleCase = exports.isDigit = exports.isLower = exports.isUpper = exports.ucFirst = exports.humanize = exports.onlyProps = exports.chop = exports.lastRightPart = exports.lastLeftPart = exports.rightPart = exports.leftPart = exports.splitOnLast = exports.splitOnFirst = exports.css = exports.nameOf = exports.sanitize = exports.camelCaseAny = exports.map = exports.toKebabCase = exports.toPascalCase = exports.toCamelCase = exports.createError = exports.isFormData = exports.createFieldError = exports.createErrorStatus = exports.ApiResult = exports.getResponseStatus = exports.getMethod = exports.JsonApiClient = exports.JsonServiceClient = exports.GetAccessTokenResponse = exports.HttpMethods = exports.ServerEventUser = exports.GetEventSubscribers = exports.UpdateEventSubscriberResponse = exports.UpdateEventSubscriber = exports.ServerEventReceiver = exports.getAllMembers = exports.ServerEventsClient = exports.ReadyState = exports.SingletonInstanceResolver = exports.NewInstanceResolver = exports.MetadataType = exports.MetadataPropertyType = exports.MetadataAttribute = exports.MetadataDataMember = exports.MetadataDataContract = exports.MetadataTypeName = exports.MetadataTypes = exports.MetadataOperationType = exports.MetadataRoute = exports.MetadataTypesConfig = exports.GetNavItemsResponse = exports.GetNavItems = exports.NavItem = exports.EmptyResponse = exports.ErrorResponse = exports.ResponseError = exports.ResponseStatus = void 0; var ResponseStatus = /** @class */ (function () { function ResponseStatus(init) { Object.assign(this, init); @@ -1983,14 +1983,20 @@ var __generator = (this && this.__generator) || function (thisArg, body) { ? el.className = el.className.replace(/(\s|^)someclass(\s|$)/, ' ') : null; } + function isElement(el) { + return typeof window != "undefined" && (el instanceof window.Element || el == window.document); + } + exports.isElement = isElement; function $1(sel, el) { return typeof sel === "string" ? (el || document).querySelector(sel) : sel || null; } exports.$1 = $1; function $$(sel, el) { - return typeof sel === "string" - ? Array.prototype.slice.call((el || document).querySelectorAll(sel)) - : Array.isArray(sel) ? sel : [sel]; + if (typeof sel === "string") + return Array.prototype.slice.call((el || document).querySelectorAll(sel)); + if (isElement(sel)) + return [sel]; + return (Array.isArray(sel) ? sel : [sel]).flatMap(function (x) { return $$(x, el); }); } exports.$$ = $$; function on(sel, handlers) { diff --git a/src/index.d.ts b/src/index.d.ts index 4d2520e..cab395d 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -584,6 +584,7 @@ export interface ICreateElementOptions { } | null; } export declare function createElement(tagName: string, options?: ICreateElementOptions): HTMLElement; +export declare function isElement(el: any): boolean; export declare function $1(sel: string | any, el?: HTMLElement): any; export declare function $$(sel: string | any, el?: HTMLElement): any; export declare function on(sel: any, handlers: { diff --git a/src/index.ts b/src/index.ts index 0842715..97542a0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2144,14 +2144,18 @@ function remClass(el:Element|HTMLElement|null, cls:string) { return !el ? null ? el.className = el.className.replace(/(\s|^)someclass(\s|$)/, ' ') : null } - +export function isElement(el:any) { + return typeof window != "undefined" && (el instanceof window.Element || el == window.document) +} export function $1(sel:string|any, el?:HTMLElement) { return typeof sel === "string" ? (el || document).querySelector(sel) : sel || null } export function $$(sel:string|any, el?:HTMLElement) { - return typeof sel === "string" - ? Array.prototype.slice.call((el || document).querySelectorAll(sel)) - : Array.isArray(sel) ? sel : [sel] + if (typeof sel === "string") + return Array.prototype.slice.call((el || document).querySelectorAll(sel)) + if (isElement(sel)) + return [sel] + return (Array.isArray(sel) ? sel : [sel]).flatMap(x => $$(x, el)) } export function on(sel:any, handlers: {[name:string]:Function}) { $$(sel).forEach(e => {