{"version":3,"sources":["site.js"],"names":["getUrlBase","match","location","pathname","escapeTextForHtml","text","container","document","createElement","innerText","innerHTML","namespace","args","baseObject","name","length","Error","object","window","component","split","nextObject","allowRadioButtonDeselection","elements","elementsGroupedByName","arrayGroupBy","element","values","previouslyCheckedElement","find","checked","addEventListener","dispatchEvent","Event","attachTextSelectingClickHandler","input","inputElement","getHtmlElement","lastMouseDownX","lastMouseDownY","handleMouseDown","event","clientX","clientY","handleMouseUp","xDelta","Math","abs","yDelta","select","removeEventListener","getLowestSiblingElementAfter","currentLowestElement","currentElement","nextElementSibling","currentLowestElementBottom","getBoundingClientRect","bottom","objectIsString","obj","Object","prototype","toString","call","throwIfNull","paramName","value","HTMLElement","getElementById","jQuery","console","error","jQueryValue","undefined","tryGetHtmlElement","log","alignItemsInContainers","referenceContainer","referenceItem","targetItem","referenceContainerElement","referenceItemElement","style","marginTop","y","FileSize","Class","create","field","method","property","constructor","_byteCount","self","byteCount","set","round","kilobyteCount","bytes","megabyteCount","kilobytes","gigabyteCount","megabytes","get","num","fractionDigits","toFixed","replace","toByteString","UrlBuilder","_base","_parameters","base","key","parameters","encodeURIComponent","queryString","entries","map","valueObj","filter","join","getDistinctElements","collection","distinctArray","includes","push","source","keySelector","Map","grouping","Array","groupBy","this","arrayMax","selector","didFindElement","maxElement","maxValue","arrayWithIndexes","array","nextIndex","currentIndex","showToast","toastContainer","aboveModalCount","handleAboveModalClose","zIndex","title","details","body","bodyHtml","bodyChildNode","status","hideAfter","aboveModal","headerBackgroundColorClass","headerForegroundColorClass","toast","className","setAttribute","prepend","toastHeader","append","toastHeaderLeftArea","appendChild","toastTitle","textContent","toastHeaderRightArea","toastDetails","toastCloseButton","type","toastCloseButtonText","toastBody","toastBodyText","toastController","$","toastLibraryOptions","animation","autohide","delay","on","showModal","modalContainer","titleText","bodyText","bodyNode","defaultCloseButtonText","buttons","onHidden","empty","remove","modal","tabIndex","$modal","dialog","content","header","closeButton","cross","html","node","setContent","footer","modalActions","toggle","show","hide","handleUpdate","dispose","defaultButtonExists","handleClick","isDefault","button","mouseEvent","keyboardEvent","stringIsNullOrWhiteSpace","string","test","arrayRemove","index","indexOf","splice","arrayChunk","chunkSize","chunks","startIndex","endIndex","slice","promiseDelay","milliseconds","Promise","resolve","setTimeout","getBoolFrom3RadioButtons","trueInput","falseInput","nullInput","trueInputElement","falseInputElement","nullInputElement","checkedCount","getBoolFromRadioButtons","trueRadioButtonIdOrElement","falseRadioButtonIdOrElement","trueRadioButton","falseRadioButton","getBoolFromSelect","nullIndex","trueIndex","falseIndex","selectedIndex","getValueIfSelected","elementOrId","getValue","setInputsEnabled","inputs","enabled","disabled","stripNewLines","convertInputDateToLocal","date","Date","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","objectComputeIfAbsent","computeValue","arrayRepeat","count","i","arrayRange","start","mapfn","realMapfn","from","getRandomElement","items","floor","random","getRandomString","chars","_","getRandomHtmlId","isDateSqlCompatable","isNaN","year","getFullYear","navigate","paths","position","path","initSelect2","$select","select2","select2Data","data","$selection","isOpen","searchInput","dropdown","$search","initMonthPicker","$input","datepicker","initialDate","dateInputFormatMatch","Number","displayFormatMatch","getInitialDate","autoclose","clearBtn","format","viewMode","minViewMode","maxViewMode","previousDate","reportDate","currentDate","getTime","TableOrderManager","_table","_createMoveUpButton","_createMoveDownButton","_persistReorder","table","createMoveUpButton","createMoveDownButton","persistReorder","drawButtons","rows","querySelectorAll","row","orderCell","querySelector","upButton","visibility","handleMove","downButton","positionDelta","tbody","rowToInsertBefore","previousElementSibling","insertBefore","rowToInsertAfter","WarnOfUnsavedChangesOnCloseHandler","_inputHasChanged","warning","preventDefault","returnValue","UnfocusedInputMasker","_input","_isMasked","_boundHandleFocus","_boundHandleBlur","_disposed","boundHandleFocus","focusEvent","handleFocus","boundHandleBlur","handleBlur","setMasked","matches","masked","redraw","classList","add","enableTabInInput","tabText","handleKeyDown","keyCode","execCommand","Persister","nestedClass","_setValue","setValue","_key","stringified","localStorage","getItem","JSON","parse","stringify","setItem","_element","_value","_hasValue","_stores","options","defaultValue","stores","isArray","hasValue","store","getResult","valueProp","newValue","DomToModelWriter","_domIdPrefix","_model","domIdPrefix","existingModel","model","components","idPart","nullRadioButton","e","valueAsDate"],"mappings":"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","file":"site.js","sourcesContent":["const getUrlBase = () => {\r\n const match = location.pathname.match(/^.*Med(?:Student)?Portal\\//i);\r\n return match && match[0] || \"/\";\r\n};\r\n\r\nconst escapeTextForHtml = text => {\r\n const container = document.createElement('span');\r\n container.innerText = text;\r\n return container.innerHTML;\r\n};\r\n\r\nconst namespace = (...args) => {\r\n let baseObject;\r\n let name;\r\n if (args.length === 1) {\r\n baseObject = null;\r\n name = args[0];\r\n } else if (args.length === 2) {\r\n baseObject = args[0];\r\n name = args[1];\r\n } else {\r\n throw new Error('Unsupported arguments');\r\n }\r\n\r\n let object = baseObject || window;\r\n\r\n if (name.length === 0) {\r\n return object;\r\n }\r\n\r\n for (const component of name.split('.')) {\r\n if (component.length === 0) {\r\n throw new Error('Name contains an empty path component');\r\n }\r\n\r\n let nextObject = object[component];\r\n if (nextObject == null) {\r\n nextObject = { };\r\n object[component] = nextObject;\r\n }\r\n\r\n object = nextObject;\r\n }\r\n\r\n return object;\r\n};\r\n\r\n/**\r\n * \r\n * @param {ArrayLike} elements\r\n */\r\nconst allowRadioButtonDeselection = elements => {\r\n const elementsGroupedByName = arrayGroupBy(elements, element => element.name);\r\n for (const elements of elementsGroupedByName.values()) {\r\n let previouslyCheckedElement = elements.find(element => element.checked);\r\n\r\n for (const element of elements) {\r\n element.addEventListener(\"click\", (/* event */) => {\r\n if (element === previouslyCheckedElement) {\r\n element.checked = false;\r\n element.dispatchEvent(new Event('input'));\r\n\r\n previouslyCheckedElement = null;\r\n } else {\r\n previouslyCheckedElement = element;\r\n }\r\n });\r\n }\r\n }\r\n};\r\n\r\nconst attachTextSelectingClickHandler = input => {\r\n const inputElement = getHtmlElement(input);\r\n\r\n let lastMouseDownX = null;\r\n let lastMouseDownY = null;\r\n\r\n const handleMouseDown = event => {\r\n lastMouseDownX = event.clientX;\r\n lastMouseDownY = event.clientY;\r\n };\r\n\r\n const handleMouseUp = event => {\r\n if (lastMouseDownX === null) {\r\n return;\r\n }\r\n\r\n const xDelta = Math.abs(event.clientX - lastMouseDownX);\r\n const yDelta = Math.abs(event.clientY - lastMouseDownY);\r\n if (xDelta >= 2 || yDelta >= 2) {\r\n return;\r\n }\r\n\r\n inputElement.select();\r\n };\r\n\r\n inputElement.addEventListener('mousedown', handleMouseDown);\r\n inputElement.addEventListener('mouseup', handleMouseUp);\r\n\r\n return () => {\r\n inputElement.removeEventListener('mousedown', handleMouseDown);\r\n inputElement.removeEventListener('mouseup', handleMouseUp);\r\n };\r\n};\r\n\r\nconst getLowestSiblingElementAfter = element => {\r\n let currentLowestElement = element;\r\n\r\n let currentElement = currentLowestElement;\r\n while (true) {\r\n currentElement = currentElement.nextElementSibling;\r\n if (currentElement == null) {\r\n break;\r\n }\r\n\r\n const currentLowestElementRect = currentLowestElement.getBoundingClientRect();\r\n const currentLowestElementBottom = currentLowestElementRect.bottom;\r\n\r\n const currentElementRect = currentElement.getBoundingClientRect();\r\n const currentElementBottom = currentElementRect.bottom;\r\n\r\n if (currentElementBottom > currentLowestElementBottom) {\r\n currentLowestElement = currentElement;\r\n }\r\n }\r\n\r\n return currentLowestElement;\r\n};\r\n\r\nconst objectIsString = obj => Object.prototype.toString.call(obj) === \"[object String]\";\r\n\r\nconst throwIfNull = (obj, paramName) => {\r\n if (obj == null) {\r\n throw new Error(`${paramName || 'Argument'} must not be null or undefined`);\r\n }\r\n};\r\n\r\n/**\r\n * @param {HTMLElement|String|jQuery} value value\r\n * @returns {HTMLElement} element\r\n */\r\nconst getHtmlElement = value => {\r\n if (value == null) {\r\n throw new Error('value must not be null or undefined');\r\n }\r\n\r\n if (value instanceof HTMLElement) {\r\n return value;\r\n }\r\n\r\n if (objectIsString(value)) {\r\n const element = document.getElementById(value);\r\n if (element == null) {\r\n throw new Error(`No such element with ID ${value}`);\r\n }\r\n\r\n return element;\r\n }\r\n\r\n if (value instanceof jQuery) {\r\n const element = value[0];\r\n if (element == null) {\r\n console.error({ jQueryValue: value });\r\n throw new Error('jQuery object was empty');\r\n }\r\n\r\n const secondElement = value[1];\r\n if (secondElement !== undefined) {\r\n console.error({ jQueryValue: value });\r\n throw new Error('jQuery object contains more than one element');\r\n }\r\n\r\n return element;\r\n }\r\n\r\n console.error({ value });\r\n throw new Error('value must be HtmlElement, string, or jQuery');\r\n};\r\n\r\n/**\r\n * @param {HTMLElement|String|jQuery} value value\r\n * @returns {HTMLElement|null} element\r\n */\r\nconst tryGetHtmlElement = value => {\r\n if (value == null) {\r\n return null;\r\n }\r\n\r\n if (value instanceof HTMLElement) {\r\n return value;\r\n }\r\n\r\n if (objectIsString(value)) {\r\n const element = document.getElementById(value);\r\n if (element == null) {\r\n return null;\r\n }\r\n\r\n return element;\r\n }\r\n\r\n if (value instanceof jQuery) {\r\n const element = value[0];\r\n if (element == null) {\r\n console.log({ jQueryValue: value });\r\n console.log('jQuery object was empty');\r\n return null;\r\n }\r\n\r\n const secondElement = value[1];\r\n if (secondElement !== undefined) {\r\n console.log({ jQueryValue: value });\r\n console.log('jQuery object contains more than one element');\r\n return null;\r\n }\r\n\r\n return element;\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst alignItemsInContainers = (referenceContainer, referenceItem, targetItem) => {\r\n const referenceContainerElement = getHtmlElement(referenceContainer);\r\n const referenceItemElement = getHtmlElement(referenceItem);\r\n const targetItemElement = getHtmlElement(targetItem);\r\n\r\n targetItemElement.style.marginTop = `${referenceItemElement.getBoundingClientRect().y - referenceContainerElement.getBoundingClientRect().y}px`;\r\n};\r\n\r\nconst FileSize = Class.create(({ field, method, property, constructor }) => {\r\n const kilo = 1024;\r\n\r\n const _byteCount = field();\r\n\r\n constructor((self, byteCount) => _byteCount.set(self, Math.round(byteCount || 0)));\r\n method('static bytes', byteCount => new FileSize(byteCount));\r\n method('static kilobytes', kilobyteCount => FileSize.bytes(kilobyteCount * kilo));\r\n method('static megabytes', megabyteCount => FileSize.kilobytes(megabyteCount * kilo));\r\n method('static gigabytes', gigabyteCount => FileSize.megabytes(gigabyteCount * kilo));\r\n\r\n property('byteCount', { get: self => _byteCount.get(self) });\r\n property('kilobyteCount', { get: self => self.byteCount / kilo });\r\n property('megabyteCount', { get: self => self.kilobyteCount / kilo });\r\n property('gigabyteCount', { get: self => self.megabyteCount / kilo });\r\n\r\n const round = (num, fractionDigits = 2) => num.toFixed(fractionDigits).replace(/\\.?0+$/, '');\r\n method('toByteString', self => `${self.byteCount} B`);\r\n method('toKilobyteString', self => `${round(self.kilobyteCount)} KB`);\r\n method('toMegabyteString', self => `${round(self.megabyteCount)} MB`);\r\n method('toGigabyteString', self => `${round(self.gigabyteCount)} MB`);\r\n method('toString', self => self.toByteString());\r\n});\r\n\r\nconst UrlBuilder = Class.create(({ field, method, constructor }) => {\r\n const _base = field();\r\n const _parameters = field();\r\n\r\n constructor((self, base) => {\r\n _base.set(self, base || '');\r\n _parameters.set(self, { });\r\n });\r\n\r\n method('set', (self, key, value) => {\r\n const parameters = _parameters.get(self);\r\n\r\n if (!objectIsString(key)) {\r\n throw new Error(\"key must be a string\");\r\n }\r\n if (key.length === 0) {\r\n throw new Error(\"key must not be empty\");\r\n }\r\n if (encodeURIComponent(key) != key) { // != to compare string and String\r\n throw new Error(\"key must not contain invalid characters\");\r\n }\r\n \r\n parameters[key] = value;\r\n return self;\r\n });\r\n\r\n method('build', self => {\r\n const base = _base.get(self);\r\n const parameters = _parameters.get(self);\r\n\r\n const queryString = Object.entries(parameters)\r\n .map(([key, valueObj]) => ({\r\n key,\r\n value: (valueObj != null) && valueObj.toString() || null\r\n }))\r\n .filter(({ value }) => value != null && value.length > 0)\r\n .map(({ key, value }) => `${key}=${encodeURIComponent(value)}`)\r\n .join(\"&\");\r\n\r\n if (queryString.length === 0) {\r\n return base;\r\n }\r\n return `${base}?${queryString}`;\r\n });\r\n});\r\n\r\nconst getDistinctElements = collection => {\r\n const distinctArray = [];\r\n\r\n for (const element of collection) {\r\n if (distinctArray.includes(element)) {\r\n continue;\r\n }\r\n\r\n distinctArray.push(element);\r\n }\r\n\r\n return distinctArray;\r\n};\r\n\r\n/**\r\n * \r\n * @param {ArrayLike} source\r\n * @param {function (TSource): TKey} keySelector\r\n * @returns {Map>}\r\n * \r\n * @template TSource, TKey\r\n */\r\nconst arrayGroupBy = (source, keySelector) => {\r\n const map = new Map();\r\n for (const element of source) {\r\n const key = keySelector(element);\r\n\r\n let grouping = map.get(key);\r\n if (typeof grouping === 'undefined') {\r\n grouping = [];\r\n map.set(key, grouping);\r\n }\r\n\r\n grouping.push(element);\r\n }\r\n\r\n return map;\r\n};\r\n\r\nArray.prototype.groupBy = function (keySelector) {\r\n return arrayGroupBy(this, keySelector);\r\n};\r\n\r\nconst arrayMax = (source, selector) => {\r\n let didFindElement = false;\r\n let maxElement = null;\r\n let maxValue = null;\r\n\r\n for (const element of source) {\r\n const value = selector == null\r\n ? element\r\n : selector(element);\r\n\r\n if (\r\n !didFindElement\r\n || value > maxValue\r\n ) {\r\n didFindElement = true;\r\n maxElement = element;\r\n maxValue = value;\r\n }\r\n }\r\n\r\n if (!didFindElement) {\r\n throw new Error('source contained no elements');\r\n }\r\n\r\n return { element: maxElement, value: maxValue };\r\n};\r\n\r\nconst arrayWithIndexes = array => {\r\n let nextIndex = 0;\r\n return Array.prototype.map.call(array, element => {\r\n const currentIndex = nextIndex;\r\n nextIndex += 1;\r\n\r\n return [currentIndex, element];\r\n });\r\n};\r\n\r\nconst showToast = (() => {\r\n const toastContainer = document.getElementById(\"ToastContainer\");\r\n\r\n let aboveModalCount = 0;\r\n const handleAboveModalOpen = () => {\r\n aboveModalCount += 1;\r\n if (aboveModalCount == 1) {\r\n toastContainer.style.zIndex = 1051;\r\n }\r\n };\r\n const handleAboveModalClose = () => {\r\n aboveModalCount -= 1;\r\n if (aboveModalCount == 0) {\r\n toastContainer.style.zIndex = 1;\r\n }\r\n };\r\n\r\n return ({\r\n title,\r\n details,\r\n body,\r\n bodyHtml,\r\n bodyChildNode,\r\n status,\r\n hideAfter,\r\n aboveModal\r\n } = {}) => {\r\n if (body != null && bodyHtml != null) {\r\n throw new Error(\"Both body and bodyHtml may not be specified\");\r\n }\r\n\r\n let headerBackgroundColorClass;\r\n let headerForegroundColorClass;\r\n const bodyBackgroundColorClass = \"bg-light\";\r\n const bodyForegroundColorClass = \"text-dark\";\r\n\r\n if (status === \"success\") {\r\n headerBackgroundColorClass = \"bg-success\";\r\n headerForegroundColorClass = \"text-light\";\r\n } else if (status === \"error\") {\r\n headerBackgroundColorClass = \"bg-danger\";\r\n headerForegroundColorClass = \"text-light\";\r\n } else { // status === \"info\"\r\n headerBackgroundColorClass = \"bg-primary\";\r\n headerForegroundColorClass = \"text-light\";\r\n }\r\n\r\n const toast = document.createElement(\"div\");\r\n toast.className = \"toast\";\r\n toast.setAttribute(\"role\", \"alert\");\r\n toast.setAttribute(\"aria-live\", \"assertive\");\r\n toast.setAttribute(\"aria-atomic\", true);\r\n toastContainer.prepend(toast);\r\n\r\n const toastHeader = document.createElement(\"div\");\r\n toastHeader.className = `toast-header ${headerBackgroundColorClass}`;\r\n toast.append(toastHeader);\r\n\r\n const toastHeaderLeftArea = document.createElement(\"div\");\r\n toastHeader.appendChild(toastHeaderLeftArea);\r\n\r\n //const toastImage = document.createElement(\"img\");\r\n //toastImage.src = \"...\";\r\n //toastImage.className = \"rounded mr-2\";\r\n //toastImage.alt = \"...\";\r\n //toastHeaderLeftArea.append(toastImage);\r\n //const toastImage = document.createElement(\"span\");\r\n //toastImage.className = \"glyphicon glyphicon-search text-white\";\r\n //toastHeaderLeftArea.append(toastImage);\r\n\r\n if (title != null) {\r\n const toastTitle = document.createElement(\"strong\");\r\n toastTitle.className = `mr-3 ${headerForegroundColorClass}`;\r\n toastTitle.textContent = title;\r\n toastHeaderLeftArea.append(toastTitle);\r\n }\r\n\r\n const toastHeaderRightArea = document.createElement(\"div\");\r\n toastHeader.appendChild(toastHeaderRightArea);\r\n\r\n if (details != null) {\r\n const toastDetails = document.createElement(\"small\");\r\n toastDetails.className = \"text-muted\";\r\n toastDetails.textContent = details;\r\n toastHeaderRightArea.append(toastDetails);\r\n }\r\n\r\n const toastCloseButton = document.createElement(\"button\");\r\n toastCloseButton.type = \"button\";\r\n toastCloseButton.className = `ml-2 mb-1 close ${headerForegroundColorClass}`;\r\n toastCloseButton.setAttribute(\"data-dismiss\", \"toast\");\r\n toastCloseButton.setAttribute(\"aria-label\", \"Close\");\r\n toastHeaderRightArea.append(toastCloseButton);\r\n\r\n const toastCloseButtonText = document.createElement(\"span\");\r\n toastCloseButtonText.setAttribute(\"aria-hidden\", true);\r\n toastCloseButtonText.textContent = \"×\";\r\n toastCloseButton.append(toastCloseButtonText);\r\n\r\n if (body != null || bodyHtml != null || bodyChildNode != null) {\r\n const toastBody = document.createElement(\"div\");\r\n toastBody.className = `toast-body ${bodyBackgroundColorClass}`;\r\n toast.append(toastBody);\r\n\r\n const toastBodyText = document.createElement(\"span\");\r\n toastBodyText.className = bodyForegroundColorClass;\r\n if (body != null) {\r\n toastBodyText.innerText = body;\r\n } else if (bodyHtml != null) {\r\n toastBodyText.innerHTML = bodyHtml;\r\n } else { // bodyChildNode != null\r\n toastBodyText.append(bodyChildNode);\r\n }\r\n toastBody.append(toastBodyText);\r\n }\r\n\r\n const toastController = $(toast);\r\n\r\n const toastLibraryOptions = {\r\n animation: true\r\n };\r\n\r\n if (hideAfter == null) {\r\n toastLibraryOptions.autohide = false;\r\n } else {\r\n toastLibraryOptions.autohide = true;\r\n toastLibraryOptions.delay = hideAfter;\r\n }\r\n\r\n toastController.toast(toastLibraryOptions);\r\n\r\n if (aboveModal) {\r\n handleAboveModalOpen();\r\n toastController.on('hidden.bs.toast', handleAboveModalClose);\r\n }\r\n\r\n toastController.toast('show');\r\n };\r\n})();\r\n\r\nconst showModal = (() => {\r\n const modalContainer = document.getElementById('ModalContainer');\r\n if (modalContainer === null) {\r\n throw new Error('Could not find ModalContainer element on document');\r\n }\r\n\r\n const setContent = (element, text, html, node) => {\r\n if (node != null) {\r\n element.append(node);\r\n } else if (html != null) {\r\n element.innerHTML = html;\r\n } else if (text != null) {\r\n element.innerText = text;\r\n }\r\n };\r\n\r\n return ({\r\n titleText,\r\n bodyText,\r\n bodyHtml,\r\n bodyNode,\r\n defaultCloseButtonText,\r\n buttons,\r\n onHidden\r\n } = { }) => {\r\n $(modalContainer).empty();\r\n $('body > .modal-backdrop').remove();\r\n\r\n const modal = document.createElement('div');\r\n modalContainer.append(modal);\r\n modal.className = 'modal fade';\r\n modal.tabIndex = -1;\r\n const $modal = $(modal);\r\n {\r\n const dialog = document.createElement('div');\r\n modal.append(dialog);\r\n dialog.className = 'modal-dialog';\r\n {\r\n const content = document.createElement('div');\r\n dialog.append(content);\r\n content.className = 'modal-content';\r\n {\r\n const header = document.createElement('div');\r\n content.append(header);\r\n header.className = 'modal-header';\r\n {\r\n const title = document.createElement('h5');\r\n header.append(title);\r\n title.className = 'modal-title';\r\n title.innerText = titleText || 'Title';\r\n \r\n const closeButton = document.createElement('button');\r\n header.append(closeButton);\r\n closeButton.type = 'button';\r\n closeButton.className = 'close';\r\n closeButton.setAttribute('data-dismiss', 'modal');\r\n {\r\n const cross = document.createElement('span');\r\n closeButton.append(cross);\r\n closeButton.innerHTML = '×';\r\n }\r\n }\r\n\r\n const body = document.createElement('div');\r\n content.append(body);\r\n body.className = 'modal-body';\r\n setContent(body, bodyText, bodyHtml, bodyNode);\r\n\r\n const footer = document.createElement('div');\r\n content.append(footer);\r\n footer.className = 'modal-footer';\r\n {\r\n if (buttons == null || buttons.length === 0 || defaultCloseButtonText != null) {\r\n const closeButton = document.createElement('button');\r\n footer.append(closeButton);\r\n closeButton.type = 'button';\r\n closeButton.className = 'btn btn-secondary';\r\n closeButton.setAttribute('data-dismiss', 'modal');\r\n closeButton.innerText = defaultCloseButtonText || 'Close';\r\n }\r\n\r\n if (buttons != null)\r\n {\r\n const modalActions = {\r\n toggle: () => $modal.modal('toggle'),\r\n show: () => $modal.modal('show'),\r\n hide: () => $modal.modal('hide'),\r\n handleUpdate: () => $modal.modal('handleUpdate'),\r\n dispose: () => $modal.modal('dispose')\r\n };\r\n\r\n let defaultButtonExists = false;\r\n\r\n for (const { text, className, handleClick, isDefault } of buttons) {\r\n const button = document.createElement('button');\r\n footer.append(button);\r\n button.type = 'button';\r\n button.className = className || 'btn btn-primary';\r\n button.innerText = text || 'Button';\r\n\r\n if (handleClick != null) {\r\n button.addEventListener('click', mouseEvent => handleClick(modalActions, { mouseEvent }));\r\n }\r\n\r\n const isEffectivelyDefault = (buttons.length === 1 && typeof isDefault === 'undefined') ? true : isDefault;\r\n if (isEffectivelyDefault) {\r\n if (defaultButtonExists) {\r\n throw new Error(`Cannot have multiple default buttons (\"${text}\")`);\r\n }\r\n defaultButtonExists = true;\r\n\r\n modal.addEventListener('keyup', keyboardEvent => {\r\n if (keyboardEvent.key === 'Enter') {\r\n handleClick(modalActions, { keyboardEvent });\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n $modal.modal();\r\n\r\n if (onHidden != null) {\r\n $modal.on('hidden.bs.modal', onHidden);\r\n }\r\n\r\n return $modal;\r\n };\r\n})();\r\n\r\nfunction stringIsNullOrWhiteSpace(string) {\r\n if (string == null) {\r\n return true;\r\n }\r\n\r\n const stringContainsANonWhitespaceCharacter = /\\S/.test(string);\r\n return !stringContainsANonWhitespaceCharacter;\r\n}\r\n\r\nfunction arrayRemove(array, element) {\r\n const index = array.indexOf(element);\r\n if (index === -1) {\r\n throw new Error(`Array does not contain element {element}`);\r\n }\r\n\r\n array.splice(index, 1);\r\n}\r\n\r\n/**\r\n * @param {any[]} array Array\r\n * @param {number} chunkSize Chunk size\r\n * @returns {any[]} Chunked array\r\n */\r\nfunction arrayChunk(array, chunkSize) {\r\n const chunks = [];\r\n\r\n let startIndex = 0;\r\n while (startIndex < array.length) {\r\n const endIndex = startIndex + chunkSize;\r\n chunks.push(array.slice(startIndex, endIndex));\r\n\r\n startIndex = endIndex;\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\nfunction promiseDelay(milliseconds) {\r\n return new Promise(resolve => {\r\n setTimeout(resolve, milliseconds);\r\n });\r\n}\r\n\r\nfunction getBoolFrom3RadioButtons({ trueInput, falseInput, nullInput } = { }) {\r\n const trueInputElement = getHtmlElement(trueInput);\r\n const falseInputElement = getHtmlElement(falseInput);\r\n const nullInputElement = getHtmlElement(nullInput);\r\n\r\n let checkedCount = 0;\r\n if (nullInputElement.checked) {\r\n checkedCount++;\r\n }\r\n if (falseInputElement.checked) {\r\n checkedCount++;\r\n }\r\n if (trueInputElement.checked) {\r\n checkedCount++;\r\n }\r\n\r\n if (checkedCount === 0) {\r\n throw new Error(\"None of the nullable bool radio buttons are checked\");\r\n }\r\n if (checkedCount > 1) {\r\n throw new Error(`${checkedCount} of the nullable bool radio buttons are checked. Only one may be checked`);\r\n }\r\n\r\n if (nullInputElement.checked) {\r\n return null;\r\n }\r\n if (falseInputElement.checked) {\r\n return false;\r\n }\r\n // trueRadioButton.checked\r\n return true;\r\n}\r\n\r\nfunction getBoolFromRadioButtons(trueRadioButtonIdOrElement, falseRadioButtonIdOrElement) {\r\n const trueRadioButton = getHtmlElement(trueRadioButtonIdOrElement);\r\n const falseRadioButton = getHtmlElement(falseRadioButtonIdOrElement);\r\n\r\n if (trueRadioButton.checked)\r\n {\r\n if (falseRadioButton.checked) {\r\n throw new Error(\"Both the true radio button and the false radio button were checked\");\r\n }\r\n\r\n return true;\r\n }\r\n\r\n if (falseRadioButton.checked) {\r\n return false;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction getBoolFromSelect(select, { nullIndex = 0, trueIndex = 1, falseIndex = 2 } = { }) {\r\n const selectElement = getHtmlElement(select);\r\n const selectedIndex = selectElement.selectedIndex;\r\n if (selectedIndex === undefined) {\r\n throw new Error(`Select ${select} has no selectedIndex property`);\r\n }\r\n\r\n switch (selectedIndex) {\r\n case nullIndex: {\r\n return null;\r\n }\r\n case trueIndex: {\r\n return true;\r\n }\r\n case falseIndex: {\r\n return false;\r\n }\r\n }\r\n\r\n throw new Error(`Select ${select}'s selected index (${selectedIndex}) does not match with any indexes`);\r\n}\r\n\r\nconst getValueIfSelected = (elementOrId, getValue) => {\r\n const element = getHtmlElement(elementOrId);\r\n\r\n if (element.selectedIndex === 0) {\r\n return null;\r\n }\r\n\r\n return getValue(element);\r\n};\r\n\r\nconst setInputsEnabled = (inputs, enabled) => {\r\n for (const input of inputs) {\r\n if (typeof input.disabled === 'undefined') {\r\n console.log('disabled property is undefined', input);\r\n continue;\r\n }\r\n\r\n input.disabled = !enabled;\r\n }\r\n};\r\n\r\nfunction stripNewLines(string) {\r\n return string && string.replace(/[\\r\\n]/g, \" \");\r\n}\r\n\r\n/**\r\n * Converts a date given by an HTML input element to a date for the user's time zone.\r\n * @param {Date} date\r\n * @returns {Date}\r\n */\r\nconst convertInputDateToLocal = date => {\r\n if (date == null) {\r\n return null;\r\n }\r\n\r\n return new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours(),\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds(),\r\n date.getUTCMilliseconds()\r\n );\r\n};\r\n\r\nfunction objectComputeIfAbsent(obj, key, computeValue) {\r\n if (Object(obj) !== obj) {\r\n throw new Error('obj must be an object');\r\n }\r\n\r\n let value = obj[key];\r\n if (typeof value === 'undefined') {\r\n value = computeValue(key);\r\n obj[key] = value;\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * Generates an array that contains one repeated value.\r\n * @param {T} element The value to be repeated.\r\n * @param {number} count The number of times to repeat the value in the generated array.\r\n * @returns {Array}\r\n * @template T\r\n */\r\nfunction arrayRepeat(element, count) {\r\n const array = [];\r\n for (let i = 0; i < count; i++) {\r\n array[i] = element;\r\n }\r\n\r\n return array;\r\n}\r\n\r\n/**\r\n * Generates a sequence of integral numbers within a specified range. Optionally maps each number with the specified mapping function.\r\n * @param {number} start The value of the first integer in the sequence.\r\n * @param {number} count The number of sequential integers to generate.\r\n * @param {function (number): T} [mapfn=(i: number) => i] A mapping function to call on every element of the array, or null.\r\n * @returns {Array}\r\n * @template T\r\n */\r\nfunction arrayRange(start, count, mapfn) {\r\n let realMapfn;\r\n if (mapfn == null) {\r\n realMapfn = (value, key) => key + start;\r\n } else {\r\n realMapfn = (value, key) => mapfn(key + start, key);\r\n }\r\n\r\n return Array.from({ length: count }, realMapfn);\r\n}\r\n\r\n/**\r\n * Gets a random element from an array.\r\n * @param {ArrayLike} items\r\n * @returns {T}\r\n * @template T\r\n */\r\nfunction getRandomElement(items) {\r\n return items[Math.floor(Math.random() * items.length)];\r\n}\r\n\r\n/**\r\n * Gets a random string of the specified length\r\n * @param {ArrayLike} chars\r\n * @param {number} length\r\n * @returns {String}\r\n */\r\nfunction getRandomString(chars, length) {\r\n return arrayRange(0, length, _ => getRandomElement(chars)).join('');\r\n}\r\n\r\n/**\r\n * Gets a random HTML element ID compatible with CSS.\r\n * @returns {String}\r\n */\r\nfunction getRandomHtmlId() {\r\n /*\r\n ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens (\"-\"), underscores (\"_\"), colons (\":\"), and periods (\".\").\r\n https://www.w3.org/TR/html401/types.html#type-name\r\n\r\n In CSS, identifiers (including element names, classes, and IDs in selectors) can contain only the characters [a-zA-Z0-9] and ISO 10646 characters U+00A0 and higher, plus the hyphen (-) and the underscore (_); they cannot start with a digit, two hyphens, or a hyphen followed by a digit. Identifiers can also contain escaped characters and any ISO 10646 character as a numeric code (see next item). For instance, the identifier \"B&W?\" may be written as \"B\\&W\\?\" or \"B\\26 W\\3F\".\r\n https://www.w3.org/TR/CSS2/syndata.html#characters\r\n */\r\n\r\n const parts = [\r\n getRandomString('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', 1),\r\n getRandomString('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', 127) // don't use :.\r\n ];\r\n return parts.join('');\r\n}\r\n\r\nconst isDateSqlCompatable = date => {\r\n if (date == null) {\r\n return true;\r\n }\r\n\r\n if (isNaN(date)) {\r\n return false;\r\n }\r\n\r\n const year = date.getFullYear();\r\n if (year < 1753 || year > 9999) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst navigate = (base, ...paths) => {\r\n let position = base;\r\n for (const path of paths) {\r\n if (position == null) {\r\n return position;\r\n }\r\n\r\n position = path(position);\r\n }\r\n\r\n return position;\r\n};\r\n\r\nconst initSelect2 = elementOrId => {\r\n const select = getHtmlElement(elementOrId);\r\n const $select = $(select);\r\n\r\n if (typeof $select.select2 === 'undefined') {\r\n throw new Error('Select2 script not loaded');\r\n }\r\n\r\n $select.select2();\r\n $select.on('change', () => select.dispatchEvent(new Event('input')));\r\n\r\n const select2Data = $select.data('select2');\r\n\r\n // Open dropdown if the selection is focused and a key is pressed\r\n // Populate the search input with the key that was pressed\r\n select2Data.$selection.on('keypress', event => {\r\n if (select2Data.isOpen()) {\r\n // Dropdown is already open\r\n return;\r\n }\r\n\r\n $select.select2('open');\r\n\r\n const searchInput = select2Data.dropdown.$search[0];\r\n searchInput.value = event.key;\r\n searchInput.dispatchEvent(new Event('change'));\r\n });\r\n};\r\n\r\nconst initMonthPicker = elementOrId => {\r\n const input = getHtmlElement(elementOrId);\r\n const $input = $(input);\r\n\r\n if (typeof $input.datepicker === 'undefined') {\r\n throw new Error('bootstrap-datepicker script not loaded');\r\n }\r\n\r\n const getInitialDate = text => {\r\n const dateInputFormatMatch = text.match(/^(\\d+)-(\\d+)(?:-(\\d+))?$/);\r\n if (dateInputFormatMatch != null) {\r\n return new Date(\r\n Number(dateInputFormatMatch[1]),\r\n Number(dateInputFormatMatch[2]) - 1,\r\n dateInputFormatMatch[3] == null ? 1 : Number(dateInputFormatMatch[3])\r\n );\r\n }\r\n\r\n const displayFormatMatch = text.match(/^(\\d+)\\/(\\d+)$/);\r\n if (displayFormatMatch != null) {\r\n return new Date(\r\n Number(displayFormatMatch[2]),\r\n Number(displayFormatMatch[1]) - 1,\r\n );\r\n }\r\n \r\n return null;\r\n };\r\n \r\n const initialDate = getInitialDate(input.value);\r\n \r\n $input.datepicker({\r\n autoclose: true,\r\n clearBtn: true,\r\n format: 'm/yyyy',\r\n viewMode: 'months',\r\n minViewMode: 'months',\r\n maxViewMode: 'years'\r\n });\r\n $input.datepicker('setDate', initialDate);\r\n\r\n let previousDate = initialDate;\r\n const reportDate = () => {\r\n const currentDate = $input.datepicker('getDate');\r\n if (\r\n (previousDate == null && currentDate == null)\r\n || (previousDate != null && currentDate != null && previousDate.getTime() === currentDate.getTime())\r\n ) {\r\n return;\r\n }\r\n\r\n previousDate = currentDate;\r\n input.dispatchEvent(new Event('input'));\r\n };\r\n\r\n $input.on('changeDate', reportDate);\r\n input.addEventListener('keyup', reportDate);\r\n};\r\n\r\nconst TableOrderManager = Class.create(({ field, constructor }) => {\r\n const _table = field();\r\n const _createMoveUpButton = field();\r\n const _createMoveDownButton = field();\r\n const _persistReorder = field();\r\n\r\n constructor((self, {\r\n table,\r\n createMoveUpButton,\r\n createMoveDownButton,\r\n persistReorder\r\n }) => {\r\n table = getHtmlElement(table);\r\n\r\n _table.set(self, table);\r\n _createMoveUpButton.set(self, createMoveUpButton);\r\n _createMoveDownButton.set(self, createMoveDownButton);\r\n _persistReorder.set(self, persistReorder);\r\n\r\n drawButtons(self);\r\n });\r\n\r\n const drawButtons = self => {\r\n const table = _table.get(self);\r\n const createMoveUpButton = _createMoveUpButton.get(self);\r\n const createMoveDownButton = _createMoveDownButton.get(self);\r\n\r\n const rows = table.querySelectorAll('tbody tr');\r\n\r\n for (const [index, row] of arrayWithIndexes(rows)) {\r\n const orderCell = row.querySelector('.order-column');\r\n\r\n $(orderCell).empty();\r\n\r\n const container = document.createElement('div');\r\n container.className = 'd-flex flex-column';\r\n orderCell.append(container);\r\n\r\n const upButton = createMoveUpButton();\r\n container.append(upButton);\r\n if (index === 0) {\r\n upButton.disabled = true;\r\n upButton.style.visibility = 'hidden';\r\n } else {\r\n upButton.addEventListener('click', () => handleMove(self, row, -1));\r\n }\r\n\r\n\r\n const downButton = createMoveDownButton();\r\n container.append(downButton);\r\n if (index === rows.length - 1) {\r\n downButton.disabled = true;\r\n downButton.style.visibility = 'hidden';\r\n } else {\r\n downButton.addEventListener('click', () => handleMove(self, row, 1));\r\n }\r\n }\r\n };\r\n\r\n const handleMove = (self, row, positionDelta) => {\r\n if (positionDelta === 0) {\r\n return;\r\n }\r\n\r\n const table = _table.get(self);\r\n const persistReorder = _persistReorder.get(self);\r\n\r\n const tbody = table.querySelector('tbody');\r\n\r\n if (positionDelta < 0) {\r\n let rowToInsertBefore = row;\r\n while (positionDelta < 0) {\r\n rowToInsertBefore = rowToInsertBefore.previousElementSibling;\r\n positionDelta++;\r\n }\r\n\r\n tbody.insertBefore(row, rowToInsertBefore);\r\n } else { // positionDelta > 0\r\n let rowToInsertAfter = row;\r\n while (positionDelta > 0) {\r\n rowToInsertAfter = rowToInsertAfter.nextElementSibling;\r\n positionDelta--;\r\n }\r\n\r\n tbody.insertBefore(row, rowToInsertAfter.nextElementSibling);\r\n }\r\n\r\n drawButtons(self);\r\n persistReorder();\r\n };\r\n});\r\n\r\nconst WarnOfUnsavedChangesOnCloseHandler = Class.create(({ field, method, property }) => {\r\n const _inputHasChanged = field();\r\n\r\n method('setChanged', self => {\r\n if (_inputHasChanged.get(self) === null) {\r\n window.addEventListener(\"beforeunload\", event => {\r\n if (!_inputHasChanged.get(self)) {\r\n return undefined;\r\n }\r\n\r\n const warning = \"You have unsaved changes.\";\r\n event.preventDefault();\r\n event.returnValue = warning;\r\n return warning;\r\n });\r\n }\r\n\r\n _inputHasChanged.set(self, true);\r\n });\r\n\r\n method('setSaved', self => _inputHasChanged.set(self, false));\r\n\r\n property('inputHasChanged', {\r\n get: self => _inputHasChanged.get(self) === true\r\n });\r\n});\r\n\r\nconst UnfocusedInputMasker = Class.create(({ field, method, constructor }) => {\r\n const _input = field();\r\n const _isMasked = field(() => false);\r\n const _boundHandleFocus = field();\r\n const _boundHandleBlur = field();\r\n const _disposed = field(() => false);\r\n\r\n constructor((self, input) => {\r\n input = getHtmlElement(input);\r\n\r\n const boundHandleFocus = focusEvent => handleFocus(self, focusEvent);\r\n const boundHandleBlur = focusEvent => handleBlur(self, focusEvent);\r\n\r\n input.addEventListener('focus', boundHandleFocus);\r\n input.addEventListener('blur', boundHandleBlur);\r\n\r\n _input.set(self, input);\r\n _boundHandleFocus.set(self, boundHandleFocus);\r\n _boundHandleBlur.set(self, boundHandleBlur);\r\n\r\n setMasked(self, !input.matches(':focus'));\r\n });\r\n\r\n const handleFocus = (self, focusEvent) => setMasked(self, false);\r\n const handleBlur = (self, focusEvent) => setMasked(self, true);\r\n\r\n const setMasked = (self, masked) => {\r\n _isMasked.set(self, masked);\r\n redraw(self);\r\n };\r\n\r\n const redraw = self => {\r\n const input = _input.get(self);\r\n const isMasked = _isMasked.get(self);\r\n\r\n if (isMasked) {\r\n input.classList.add('render-as-password');\r\n } else {\r\n input.classList.remove('render-as-password');\r\n }\r\n };\r\n\r\n method('dispose', self => {\r\n const input = _input.get(self);\r\n const boundHandleFocus = _boundHandleFocus.get(self);\r\n const boundHandleBlur = _boundHandleBlur.get(self);\r\n const disposed = _disposed.get(self);\r\n\r\n if (disposed) {\r\n return;\r\n }\r\n\r\n input.removeEventListener('focus', boundHandleFocus);\r\n input.removeEventListener('blur', boundHandleBlur);\r\n\r\n setMasked(self, false);\r\n\r\n _disposed.set(self, true);\r\n });\r\n});\r\n\r\nconst enableTabInInput = (input, tabText = ' ') => {\r\n input = getHtmlElement(input);\r\n\r\n const handleKeyDown = event => {\r\n if (event.keyCode !== 9) { // tab\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n document.execCommand('insertText', false, tabText);\r\n };\r\n\r\n input.addEventListener('keydown', handleKeyDown);\r\n return () => input.removeEventListener('keydown', handleKeyDown);\r\n};\r\n\r\nconst Persister = Class.create(({ nestedClass, field, property, constructor }) => {\r\n nestedClass('Stores', Class.create(({ nestedClass, constructor }) => {\r\n nestedClass('Function', Class.create(({ field, method, constructor }) => {\r\n const _setValue = field();\r\n\r\n constructor((self, setValue) => _setValue.set(self, setValue));\r\n\r\n method('set', (self, value) => {\r\n const setValue = _setValue.get(self);\r\n setValue(value);\r\n });\r\n }));\r\n\r\n nestedClass('LocalStorage', Class.create(({ field, method, constructor }) => {\r\n const _key = field();\r\n\r\n constructor((self, key) => {\r\n if (!objectIsString(key)) {\r\n throw new Error('key must be a string');\r\n }\r\n\r\n _key.set(self, key);\r\n });\r\n\r\n method('get', self => {\r\n const key = _key.get(self);\r\n\r\n const stringified = localStorage.getItem(key);\r\n if (stringified === null) {\r\n return null;\r\n }\r\n\r\n const obj = JSON.parse(stringified);\r\n return { value: obj };\r\n });\r\n\r\n method('set', (self, value) => {\r\n const key = _key.get(self);\r\n\r\n const stringified = JSON.stringify(value);\r\n localStorage.setItem(key, stringified);\r\n });\r\n }));\r\n\r\n nestedClass('InputElement', Class.create(({ field, method, constructor }) => {\r\n const _element = field();\r\n\r\n constructor((self, element) => _element.set(self, getHtmlElement(element)));\r\n\r\n method('set', (self, value) => {\r\n const element = _element.get(self);\r\n element.value = value;\r\n });\r\n }));\r\n\r\n nestedClass('CheckboxElement', Class.create(({ field, method, constructor }) => {\r\n const _element = field();\r\n\r\n constructor((self, element) => _element.set(self, getHtmlElement(element)));\r\n\r\n method('set', (self, value) => {\r\n const element = _element.get(self);\r\n element.checked = value;\r\n });\r\n }));\r\n\r\n constructor('private');\r\n }));\r\n\r\n const _value = field();\r\n const _hasValue = field(() => false);\r\n const _stores = field();\r\n\r\n constructor((self, options) => {\r\n if (options == null) {\r\n throw new Error('options missing');\r\n }\r\n\r\n if (!('defaultValue' in options)) {\r\n throw new Error('options.defaultValue missing');\r\n }\r\n\r\n const { defaultValue } = options;\r\n let { stores } = options;\r\n\r\n if (!Array.isArray(stores)) {\r\n if (stores != null) {\r\n throw new Error('options.stores must be an array or null');\r\n }\r\n\r\n stores = [];\r\n }\r\n\r\n _stores.set(self, stores);\r\n\r\n let value = null;\r\n let hasValue = false;\r\n for (const store of stores) {\r\n if (!store.get) {\r\n continue;\r\n }\r\n\r\n const getResult = store.get();\r\n if (getResult == null || !('value' in getResult)) {\r\n continue;\r\n }\r\n\r\n value = getResult.value;\r\n hasValue = true;\r\n break;\r\n }\r\n\r\n if (!hasValue) {\r\n value = defaultValue;\r\n }\r\n\r\n valueProp.set(self, value);\r\n });\r\n\r\n const valueProp = property('value', {\r\n get: self => _value.get(self),\r\n set: (self, newValue) => {\r\n const value = _value.get(self);\r\n const hasValue = _hasValue.get(self);\r\n const stores = _stores.get(self);\r\n\r\n if (hasValue && value === newValue) {\r\n return;\r\n }\r\n\r\n _value.set(self, newValue);\r\n _hasValue.set(self, true);\r\n\r\n for (const store of stores) {\r\n if (!store.set) {\r\n continue;\r\n }\r\n\r\n store.set(newValue);\r\n }\r\n }\r\n });\r\n});\r\n\r\nconst DomToModelWriter = Class.create(({ constructor, field, method, property }) => {\r\n const _domIdPrefix = field();\r\n const _model = field();\r\n\r\n constructor((self, domIdPrefix, existingModel) => {\r\n _domIdPrefix.set(self, domIdPrefix || '');\r\n _model.set(self, existingModel || {});\r\n });\r\n\r\n const setValue = (self, name, getValue) => {\r\n const model = _model.get(self);\r\n\r\n const components = name.split('.');\r\n const idPart = components.join('_');\r\n\r\n const value = getValue(idPart);\r\n namespace(model, components.slice(0, -1).join('.'))[components[components.length - 1]] = value;\r\n };\r\n\r\n method('setBool', (self, name) => setValue(self, name, idPart => {\r\n const domIdPrefix = _domIdPrefix.get(self);\r\n\r\n const trueRadioButton = tryGetHtmlElement(`${domIdPrefix}${idPart}_TrueRadioButton`);\r\n const falseRadioButton = tryGetHtmlElement(`${domIdPrefix}${idPart}_FalseRadioButton`);\r\n const nullRadioButton = tryGetHtmlElement(`${domIdPrefix}${idPart}_NullRadioButton`);\r\n\r\n const input = tryGetHtmlElement(`${domIdPrefix}${idPart}Input`);\r\n\r\n if (trueRadioButton != null) {\r\n if (nullRadioButton == null) {\r\n return getBoolFromRadioButtons(trueRadioButton, falseRadioButton);\r\n }\r\n\r\n return getBoolFrom3RadioButtons({\r\n trueInput: trueRadioButton,\r\n falseInput: falseRadioButton,\r\n nullInput: nullRadioButton\r\n });\r\n }\r\n\r\n if (input != null && 'checked' in input) {\r\n return input.checked;\r\n }\r\n\r\n throw new Error('bool type not supported');\r\n }));\r\n method('setString', (self, name) => setValue(self, name, idPart => {\r\n const domIdPrefix = _domIdPrefix.get(self);\r\n return getValueIfSelected(`${domIdPrefix}${idPart}Input`, e => e.value);\r\n }));\r\n method('setDate', (self, name) => setValue(self, name, idPart => {\r\n const domIdPrefix = _domIdPrefix.get(self);\r\n\r\n const input = getHtmlElement(`${domIdPrefix}${idPart}Input`);\r\n const $input = $(input);\r\n\r\n if ($input.data().datepicker != null) {\r\n const date = $(input).datepicker('getDate');\r\n return date;\r\n }\r\n\r\n return convertInputDateToLocal(input.valueAsDate);\r\n }));\r\n method('setNumber', (self, name) => setValue(self, name, idPart => {\r\n const domIdPrefix = _domIdPrefix.get(self);\r\n return getValueIfSelected(`${domIdPrefix}${idPart}Input`, e => Number(e.value));\r\n }));\r\n\r\n method('set', (self, name, value) => setValue(self, name, idPart => value));\r\n\r\n property('model', { get: self => _model.get(self) });\r\n});\r\n"]}