powerpagestoolkit 3.0.313 → 3.0.3201
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -50,7 +50,7 @@ export default class DOMNodeReference {
|
|
|
50
50
|
* based on element type.
|
|
51
51
|
*/
|
|
52
52
|
protected _valueSync(): void;
|
|
53
|
-
protected _determineEventType(): keyof
|
|
53
|
+
protected _determineEventType(): keyof GlobalEventHandlersEventMap;
|
|
54
54
|
protected _isDateInput(): boolean;
|
|
55
55
|
protected _isValidFormElement(element: Element): element is FormElement;
|
|
56
56
|
protected _dateSync(element: HTMLInputElement): Promise<void>;
|
|
@@ -69,7 +69,7 @@ export default class DOMNodeReference {
|
|
|
69
69
|
* specified event occurs.
|
|
70
70
|
* @returns - Instance of this [provides option to method chain]
|
|
71
71
|
*/
|
|
72
|
-
on(eventType: keyof
|
|
72
|
+
on(eventType: keyof GlobalEventHandlersEventMap, eventHandler: <T extends Event>(this: DOMNodeReference, e: T | Event) => void): DOMNodeReference;
|
|
73
73
|
/**
|
|
74
74
|
* Hides the element by setting its display style to "none".
|
|
75
75
|
* @returns - Instance of this [provides option to method chain]
|
package/dist/src/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/safeAjax.ts", "../../src/core/API.ts", "../../src/ancillary/EventManager.ts", "../../src/ancillary/VisibilityManager.ts", "../../src/utils/createInfoElement.ts", "../../src/core/waitFor.ts", "../../src/errors/errors.ts", "../../src/constants/symbols.ts", "../../src/constants/EventTypes.ts", "../../src/ancillary/DOMNodeReference.ts", "../../src/ancillary/Radio.ts", "../../src/ancillary/ValueManager.ts", "../../src/core/PowerPagesElement.ts", "../../src/core/PowerPagesElementArray.ts", "../../src/utils/enhanceArray.ts", "../../src/core/getPowerPagesElement.ts", "../../src/core/bindForm.ts"],
|
|
4
|
-
"sourcesContent": ["// @ts-nocheck\r\n\r\n/**\r\n * Custom HTTP wrapper function that handles authentication for the call from within PowerPages for you, making it all the easier to make API calls with {@link API}\r\n */\r\nexport default function safeAjax(ajaxOptions) {\r\n const deferredAjax = $.Deferred();\r\n\r\n // shell is only available via runtime in a PowerPages portal\r\n\r\n shell\r\n .getTokenDeferred()\r\n .done(function (token) {\r\n // add headers for AJAX\r\n if (!ajaxOptions.headers) {\r\n $.extend(ajaxOptions, {\r\n headers: {\r\n __RequestVerificationToken: token,\r\n },\r\n });\r\n } else {\r\n ajaxOptions.headers[\"__RequestVerificationToken\"] = token;\r\n }\r\n $.ajax(ajaxOptions)\r\n .done(function (data, textStatus, jqXHR) {\r\n //eslint-disable-next-line\r\n validateLoginSession(data, textStatus, jqXHR, deferredAjax.resolve);\r\n })\r\n .fail(deferredAjax.reject); //AJAX\r\n })\r\n .fail(function () {\r\n deferredAjax.rejectWith(this, arguments); // on token failure pass the token AJAX and args\r\n });\r\n\r\n return deferredAjax.promise();\r\n}\r\n", "//@ts-nocheck\r\nimport safeAjax from \"../utils/safeAjax.ts\";\r\n\r\ninterface ODataJSON extends object {\r\n [key: `${string}@odata.bind` | string]: any;\r\n}\r\n\r\n/**\r\n * Provides abstract class `API` that allows basic create, read, and update operations in DataVerse via the PowerPages API\r\n * @method `createRecord` - Create a record in DataVerse\r\n * @method `getRecord<T>` - Get a record by ID from DataVerse\r\n * @method `getMultiple` - Get multiple records from DataVerse; with optional OData filtering\r\n * @method `updateRecord` - Update a record by ID in DataVerse\r\n */\r\nabstract class API {\r\n /**\r\n * @param tableSetName The dataverse set name for the table that you are updating a record in\r\n * @param data The JSON of the fields and data that are to be updated on the targeted record\r\n * @returns a Promise resolving the successful results *[record id]* of the POST request, or rejecting the failed results *[error]* of the POST request.\r\n */\r\n static createRecord(tableSetName: string, data: ODataJSON): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n safeAjax({\r\n type: \"POST\",\r\n url: `/_api/${tableSetName}`,\r\n data: JSON.stringify(data),\r\n contentType: \"application/json\",\r\n success: function (_response, _status, xhr) {\r\n resolve(xhr.getResponseHeader(\"entityid\"));\r\n },\r\n error: (error) => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n }\r\n /**\r\n *\r\n * @param tableSetName The DataVerse SET name of the table being queried\r\n * @param recordID the GUID of the records to be retrieved\r\n * @param selectColumns *OPTIONAL* if desired, enter your own custom OData query for advanced GET results. Format = select=column1,column2,column3...\r\n * @returns a Promise resolving the successful results of the GET request, or rejecting the failed results of the GET request\r\n */\r\n static getRecord<T>(\r\n tableSetName: string,\r\n recordID: string,\r\n selectColumns?: string\r\n ): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n const url = `/_api/${tableSetName}(${recordID})${\r\n selectColumns ? `?$${selectColumns}` : \"\"\r\n }`;\r\n\r\n safeAjax({\r\n type: \"GET\",\r\n url: url,\r\n success: resolve,\r\n error: reject,\r\n });\r\n });\r\n }\r\n /**\r\n *\r\n * @param tableSetName The dataverse set name of the table being queried\r\n * @param queryParameters *OPTIONAL* the OData query parameters for refining search results: *format = $filter=filters&$select=columns*\r\n * @returns a Promise resolving the successful results of the GET request, or rejecting the failed results of the GET request\r\n */\r\n static getMultiple(\r\n tableSetName: string,\r\n queryParameters?: string\r\n ): Promise<Array<object>> {\r\n return new Promise((resolve, reject) => {\r\n // Construct the URL based on the presence of query parameters\r\n const url = `/_api/${tableSetName}${\r\n queryParameters ? `?${queryParameters}` : \"\"\r\n }`;\r\n\r\n safeAjax({\r\n type: \"GET\",\r\n url: url,\r\n success: function (response) {\r\n resolve(response.value);\r\n },\r\n error: reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @param tableSetName The dataverse set name for the table that you are updating a record in\r\n * @param recordId The GUID of the record that is being updated\r\n * @param data The JSON of the fields and data that are to be updated on the targeted record\r\n * @returns A Promise with the results of the API execution\r\n */\r\n static updateRecord(\r\n tableSetName: string,\r\n recordId: string,\r\n data: ODataJSON\r\n ): Promise<any> {\r\n return new Promise((resolve, reject) => {\r\n const url = `/_api/${tableSetName}(${recordId})`;\r\n\r\n safeAjax({\r\n type: \"PATCH\",\r\n url: url,\r\n data: JSON.stringify(data),\r\n success: resolve,\r\n error: reject,\r\n });\r\n });\r\n }\r\n}\r\n\r\nexport default API;\r\n", "import type DOMNodeReference from \"./DOMNodeReference.ts\";\r\n\r\ndeclare type EventType = string;\r\ndeclare type Handler = (this: DOMNodeReference, ...args: any[]) => void;\r\ndeclare type Listeners = Set<DOMNodeReference>;\r\n\r\n/********/ /********/ export default class EventManager {\r\n private readonly events: Map<EventType, Handler> = new Map();\r\n private readonly listeners: Map<EventType, Listeners> = new Map();\r\n private readonly dependencyHandlers: Set<[DOMNodeReference, Handler]> =\r\n new Set();\r\n private observers: Array<MutationObserver | ResizeObserver> = [];\r\n private boundListeners: Array<BoundEventListener> = [];\r\n\r\n constructor() {}\r\n\r\n public dispatchDependencyHandlers(): void {\r\n for (const [dependency, handler] of this.dependencyHandlers) {\r\n handler.call(dependency);\r\n }\r\n }\r\n\r\n public registerDependent(\r\n dependency: DOMNodeReference,\r\n handler: Handler\r\n ): true | false {\r\n try {\r\n this.dependencyHandlers.add([dependency, handler]);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n public registerEvent(event: EventType, handler: Handler): true | false {\r\n if (this.events.has(event)) {\r\n console.error(\"Event registration has already been defined for: \", event);\r\n return false;\r\n }\r\n this.listeners.set(event, new Set());\r\n this.events.set(event, handler);\r\n return true;\r\n }\r\n\r\n public registerListener(\r\n event: EventType,\r\n listener: DOMNodeReference\r\n ): true | false {\r\n if (this.events.has(event)) {\r\n const listeners: Listeners = this.listeners.get(event) ?? new Set();\r\n listeners.add(listener);\r\n this.listeners.set(event, listeners);\r\n return true;\r\n } else {\r\n console.error(\"No event registration found for: \", event);\r\n return false;\r\n }\r\n }\r\n\r\n public emit(eventType: EventType, ...args: any[]): void {\r\n if (this.events.has(eventType)) {\r\n //\r\n const event: Handler = this.events.get(eventType) as Handler;\r\n const listeners: Listeners | undefined = this.listeners.get(eventType);\r\n //\r\n if (!listeners) return;\r\n //\r\n for (const listener of listeners) {\r\n event.call(listener, ...args);\r\n }\r\n //\r\n } else {\r\n console.error(\"Event not found in EventRegistry: \", eventType);\r\n }\r\n return;\r\n }\r\n\r\n public stopListening(listener: DOMNodeReference): void {\r\n for (const [_event, listeners] of this.listeners) {\r\n if (listeners.has(listener)) listeners.delete(listener);\r\n }\r\n }\r\n\r\n public registerObserver(\r\n observer: MutationObserver | ResizeObserver,\r\n observerOptions: {\r\n nodeToObserve: Element;\r\n options: Partial<ResizeObserverOptions> | Partial<MutationObserverInit>;\r\n }\r\n ): void {\r\n const { nodeToObserve, options } = observerOptions;\r\n observer.observe(nodeToObserve, options);\r\n this.observers.push(observer);\r\n }\r\n\r\n public registerDOMEventListener(\r\n element: Element,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (e: Event) => unknown\r\n ): void {\r\n element.addEventListener(eventType, handler);\r\n\r\n this.boundListeners.push({\r\n element,\r\n handler,\r\n event: eventType,\r\n });\r\n }\r\n\r\n public destroy(): void {\r\n // Remove all bound event listeners\r\n this.boundListeners?.forEach((binding) => {\r\n binding.element?.removeEventListener(binding.event, binding.handler);\r\n });\r\n this.boundListeners = []; // Clear the array\r\n\r\n // Disconnect all observers\r\n this.observers?.forEach((observer) => {\r\n observer.disconnect();\r\n });\r\n this.observers = []; // Clear the array\r\n\r\n this.events.clear();\r\n\r\n this.dependencyHandlers.clear();\r\n\r\n this.listeners.clear();\r\n }\r\n}\r\n", "export default class VisibilityManager {\r\n private declare visibilityController: HTMLElement | null;\r\n private defaultVisibility: string | null;\r\n\r\n public set defaultDisplay(newValue: string | null) {\r\n this.defaultVisibility = newValue;\r\n }\r\n\r\n constructor(target: HTMLElement) {\r\n // Set the default visibility controller to the element itself\r\n this.visibilityController = target;\r\n\r\n // If the element is a table, use its closest fieldset as the controller\r\n if (target.tagName === \"TABLE\") {\r\n const fieldset = target.closest(\"fieldset\");\r\n if (fieldset) {\r\n this.visibilityController = fieldset;\r\n }\r\n }\r\n\r\n // For specific tag types, use the closest 'td' if available as the controller\r\n const tagsRequiringTdParent = [\r\n \"SPAN\",\r\n \"INPUT\",\r\n \"TEXTAREA\",\r\n \"SELECT\",\r\n \"TABLE\",\r\n ];\r\n if (tagsRequiringTdParent.includes(target.tagName)) {\r\n const tdParent = target.closest(\"td\");\r\n if (tdParent) {\r\n this.visibilityController = tdParent;\r\n }\r\n }\r\n\r\n this.defaultVisibility = this.visibilityController.style.display;\r\n }\r\n\r\n public hide(): void {\r\n this.visibilityController!.style.display = \"none\";\r\n }\r\n\r\n public show(): void {\r\n this.visibilityController!.style.display = this.defaultVisibility!;\r\n }\r\n\r\n public toggleVisibility(shouldShow: boolean): void {\r\n shouldShow ? this.show() : this.hide();\r\n }\r\n\r\n public getVisibility(): true | false {\r\n return (\r\n window.getComputedStyle(this.visibilityController!).display !== \"none\" &&\r\n window.getComputedStyle(this.visibilityController!).visibility !==\r\n \"hidden\" &&\r\n this.visibilityController!.getBoundingClientRect().height > 0 &&\r\n this.visibilityController!.getBoundingClientRect().width > 0\r\n );\r\n }\r\n\r\n public destroy(): void {\r\n this.visibilityController = null;\r\n this.defaultVisibility = null;\r\n }\r\n}\r\n", "/**\r\n *\r\n * @param {string} titleString The text to display in the tooltip flyout content\r\n * @param iconStyle Optional CSS styles to apply to the info icon\r\n * @returns\r\n */\r\nexport default function CreateInfoEl(\r\n titleString: string,\r\n iconStyle?: Partial<CSSStyleDeclaration>\r\n) {\r\n // Input validation remains the same\r\n if (typeof titleString !== \"string\") {\r\n throw new Error(\r\n `argument \"titleString\" must be of type \"string\". Received: \"${typeof titleString}\"`\r\n );\r\n }\r\n if (iconStyle && typeof iconStyle !== \"object\") {\r\n throw new Error(\r\n `argument \"iconStyle\" must be of type \"object\". Received: \"${typeof iconStyle}\"`\r\n );\r\n }\r\n\r\n const span = document.createElement(\"span\");\r\n span.classList.add(\"info-icon\");\r\n\r\n const icon = document.createElement(\"i\");\r\n icon.classList.add(\"fa\", \"fa-solid\", \"fa-info-circle\");\r\n icon.setAttribute(\"aria-label\", \"Info\");\r\n icon.style.cursor = \"pointer\";\r\n\r\n const flyoutContent = document.createElement(\"div\");\r\n flyoutContent.innerHTML = titleString;\r\n flyoutContent.classList.add(\"flyout-content\");\r\n\r\n span.appendChild(icon);\r\n span.appendChild(flyoutContent);\r\n\r\n if (iconStyle) {\r\n Object.assign(icon.style, iconStyle);\r\n }\r\n\r\n // Function to position flyout content remains the same\r\n const positionFlyout = () => {\r\n flyoutContent.style.display = \"block\";\r\n\r\n const flyoutRect = flyoutContent.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n\r\n if (flyoutRect.right > viewportWidth) {\r\n const overflowAmount = flyoutRect.right - viewportWidth;\r\n flyoutContent.style.left = `calc(50% - ${overflowAmount}px)`;\r\n }\r\n\r\n if (flyoutRect.left < 0) {\r\n const overflowAmount = Math.abs(flyoutRect.left);\r\n flyoutContent.style.left = `calc(50% + ${overflowAmount}px)`;\r\n }\r\n };\r\n\r\n // Move event listeners to the span container\r\n span.addEventListener(\"mouseenter\", () => {\r\n positionFlyout();\r\n });\r\n\r\n span.addEventListener(\"mouseleave\", (event) => {\r\n // Check if we're not moving to a child element\r\n const relatedTarget = event.relatedTarget as Node;\r\n if (!span.contains(relatedTarget)) {\r\n flyoutContent.style.display = \"none\";\r\n }\r\n });\r\n\r\n // Touch handling remains on the icon for better mobile UX\r\n icon.addEventListener(\"touchstart\", (event) => {\r\n event.preventDefault();\r\n flyoutContent.style.display =\r\n flyoutContent.style.display === \"block\" ? \"none\" : \"block\";\r\n if (flyoutContent.style.display === \"block\") {\r\n positionFlyout();\r\n }\r\n });\r\n\r\n document.body.addEventListener(\"click\", (event: Event) => {\r\n if (!span.contains(event.target as Node)) {\r\n flyoutContent.style.display = \"none\";\r\n }\r\n });\r\n\r\n flyoutContent.style.display = \"none\";\r\n return span;\r\n}\r\n", "/**\r\n * Provides an async way to capture DOM elements; for when querySelector cannot capture the target due to async DOM content loading\r\n * @param **target** - basic querySelector syntax to select an element\r\n * @param **root** - optional parameter to replace document as the root from which to perform the node search\r\n * @returns the element(s) targeted by the `querySelector` string\r\n */\r\nexport default function waitFor(\r\n target: string,\r\n root: Element | Document,\r\n multiple: false,\r\n debounceTime: number\r\n): Promise<HTMLElement>;\r\n\r\nexport default function waitFor(\r\n target: string,\r\n root: Element | Document,\r\n multiple: true,\r\n debounceTime: number\r\n): Promise<HTMLElement[]>;\r\n\r\nexport default function waitFor(\r\n target: string,\r\n root: Element | Document = document,\r\n multiple: boolean = false,\r\n debounceTime: number\r\n): Promise<HTMLElement | HTMLElement[]> {\r\n //\r\n return new Promise((resolve, reject) => {\r\n //\r\n if (multiple) {\r\n //\r\n let timeout: any;\r\n const observedElements: HTMLElement[] = [];\r\n const observedSet: Set<HTMLElement> = new Set();\r\n\r\n if (debounceTime < 1) {\r\n return resolve(\r\n <HTMLElement[]>Array.from(root.querySelectorAll(<string>target))\r\n );\r\n }\r\n const observer = new MutationObserver(() => {\r\n const found = <HTMLElement[]>(\r\n Array.from(root.querySelectorAll(<string>target))\r\n );\r\n\r\n // If elements are found, store them in observedElements\r\n found.forEach((element) => {\r\n if (!observedSet.has(element)) {\r\n observedSet.add(element);\r\n observedElements.push(element);\r\n }\r\n });\r\n\r\n // Clear the previous timeout and set a new one\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n // Resolve the promise after debounce period if no more mutations\r\n if (observedElements.length > 0) {\r\n observer.disconnect();\r\n resolve(observedElements);\r\n } else {\r\n reject(\r\n new Error(\r\n `No elements found with target: \"${target}\" within ${\r\n debounceTime / 1000\r\n } seconds. If the element you are expecting has not loaded yet, consider raising your timeout.`\r\n )\r\n );\r\n }\r\n }, debounceTime);\r\n });\r\n\r\n observer.observe(root, {\r\n childList: true,\r\n subtree: true,\r\n attributes: false,\r\n });\r\n //\r\n } else {\r\n // Create observer to watch for target in DOM\r\n const observer = new MutationObserver(() => {\r\n const observedElement = <HTMLElement>root.querySelector(<string>target);\r\n if (observedElement) {\r\n clearTimeout(timeout);\r\n observer.disconnect();\r\n resolve(observedElement);\r\n }\r\n });\r\n const timeout = setTimeout(() => {\r\n observer.disconnect();\r\n reject(\r\n new Error(\r\n `Element not found by target: \"${target}\" within ${\r\n debounceTime / 1000\r\n } second. If the element you are expecting has not loaded yet, consider raising your timeout.`\r\n )\r\n );\r\n }, debounceTime);\r\n\r\n const element = <HTMLElement>root.querySelector(<string>target);\r\n if (element) {\r\n clearTimeout(timeout);\r\n return resolve(element);\r\n }\r\n\r\n observer.observe(root, {\r\n subtree: true,\r\n attributes: true,\r\n childList: true, // Detects added/removed child elements\r\n });\r\n //\r\n }\r\n //\r\n });\r\n //\r\n}\r\n", "import type DOMNodeReference from \"../ancillary/DOMNodeReference.ts\";\r\n\r\nclass CustomError extends Error {\r\n public node: DOMNodeReference;\r\n constructor(node: DOMNodeReference, message: string) {\r\n super(message);\r\n\r\n this.node = node;\r\n\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, this.constructor);\r\n }\r\n }\r\n}\r\n\r\nclass InitializationError extends CustomError {\r\n constructor(node: DOMNodeReference, error: string) {\r\n super(\r\n node,\r\n `There was an error initializing a DOMNodeReference for target: ${node.target}, :: ${error}`\r\n );\r\n }\r\n}\r\n\r\nclass NodeNotFoundError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(node, `The targeted DOM element was not found: ${node.target}`);\r\n }\r\n}\r\n\r\nclass Page_ValidatorsNotFoundError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(node, \"Page_Validators could not be found\");\r\n }\r\n}\r\n\r\nclass BusinessRuleError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(node, `Error applying business rule to target: ${node.target}`);\r\n }\r\n}\r\n\r\nclass SelfReferenceError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(\r\n node,\r\n \"Self-referential dependency found. A DOMNodeReference cannot depend on itself\"\r\n );\r\n }\r\n}\r\n\r\nclass LabelNotFoundError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(node, `No label could be found for the target: ${node.target}`);\r\n }\r\n}\r\n\r\nclass IncorrectParameterError extends CustomError {\r\n constructor(\r\n node: DOMNodeReference,\r\n functionName: string,\r\n argName: string,\r\n expectedTypes: string[],\r\n receivedType: any\r\n ) {\r\n const concatTypes = expectedTypes.join(\" or \");\r\n\r\n super(\r\n node,\r\n `${functionName} expects ${argName} to be of type ${concatTypes}. Received: ${\r\n receivedType === null ? \"null\" : typeof receivedType\r\n }`\r\n );\r\n }\r\n}\r\n\r\nconst Errors = {\r\n NodeNotFoundError,\r\n InitializationError,\r\n Page_ValidatorsNotFoundError,\r\n BusinessRuleError,\r\n SelfReferenceError,\r\n LabelNotFoundError,\r\n IncorrectParameterError,\r\n};\r\n\r\nexport default Errors;\r\n", "export const init: symbol = Symbol(\"init\");\r\nexport const destroy: symbol = Symbol(\"destroy\");\r\n", "/**\r\n * For use in setting up event management in the instances of PowerPagesElement\r\n * @see {@link PowerPagesElement}\r\n */\r\nexport const EventTypes = {\r\n CHECKBOX: \"click\",\r\n RADIO: \"click\",\r\n SELECT: \"change\",\r\n TEXT: \"keyup\",\r\n DEFAULT: \"input\",\r\n} as const;\r\n", "import type ValueManager from \"../ancillary/ValueManager.ts\";\r\nimport EventManager from \"../ancillary/EventManager.ts\";\r\nimport VisibilityManager from \"./VisibilityManager.ts\";\r\nimport createInfoEl from \"../utils/createInfoElement.ts\";\r\nimport waitFor from \"../core/waitFor.ts\";\r\nimport Errors from \"../errors/errors.ts\";\r\nimport { init, destroy } from \"../constants/symbols.ts\";\r\nimport { EventTypes } from \"../constants/EventTypes.ts\";\r\n\r\nexport default class DOMNodeReference {\r\n // declare static properties\r\n static instances: DOMNodeReference[] = [];\r\n\r\n // allow for indexing methods with symbols\r\n [key: symbol]: (...arg: any[]) => any;\r\n\r\n // properties initialized in the constructor\r\n public target: Element | string;\r\n public logicalName?: string;\r\n public root: Element;\r\n // public isRadio: boolean = false;\r\n protected timeoutMs: number;\r\n protected isLoaded: boolean;\r\n // protected radioType: RadioType | null = null;\r\n\r\n /**\r\n * The value of the element that this node represents\r\n * stays in syncs with the live DOM elements?.,m via event handler\r\n */\r\n public get value() {\r\n return this.valueManager!.value;\r\n }\r\n\r\n public set value(newValue) {\r\n this.valueManager!.setValue(newValue);\r\n }\r\n\r\n public get checked() {\r\n return this.valueManager!.checked;\r\n }\r\n\r\n public set defaultDisplay(newValue: string | null) {\r\n this.visibilityManager!.defaultDisplay = newValue;\r\n }\r\n\r\n // other properties made available after async s.init\r\n\r\n /**\r\n * The element targeted when instantiating DOMNodeReference.\r\n * Made available in order to perform normal DOM traversal,\r\n * or access properties not available through this class.\r\n */\r\n public declare element: HTMLElement;\r\n public visibilityManager!: VisibilityManager | null;\r\n public valueManager!: ValueManager | null;\r\n public eventManager!: EventManager | null;\r\n\r\n // public declare radioParent: DOMNodeReference | undefined;\r\n /**\r\n * Represents the 'yes' option of a boolean radio field.\r\n * This property is only available when the parent node\r\n * is a main field for a boolean radio input.\r\n */\r\n // public declare yesRadio: DOMNodeReference | undefined;\r\n /**\r\n * Represents the 'no' option of a boolean radio field.\r\n * This property is only available when the parent node\r\n * is a main field for a boolean radio input.\r\n */\r\n // public declare noRadio: DOMNodeReference | undefined;\r\n\r\n /**\r\n * Creates an instance of DOMNodeReference.\r\n * @param target - The CSS selector to find the desired DOM element.\r\n * @param root - Optionally specify the element within to search for the element targeted by 'target'\r\n * Defaults to 'document.body'\r\n */\r\n /******/ /******/ constructor(\r\n target: Element | string,\r\n root: Element = document.body,\r\n timeoutMs: number\r\n ) {\r\n this.target = target;\r\n this.logicalName = this._extractLogicalName(target);\r\n this.root = root;\r\n this.timeoutMs = timeoutMs;\r\n this.isLoaded = false;\r\n\r\n // The rest of initialization.\r\n }\r\n\r\n protected async [init](): Promise<void> {\r\n if (this.target instanceof HTMLElement) {\r\n this.element = this.target;\r\n } else {\r\n this.element = (await waitFor(\r\n this.target as string,\r\n this.root,\r\n false,\r\n this.timeoutMs\r\n )) as HTMLElement;\r\n }\r\n\r\n if (!this.element) {\r\n throw new Errors.NodeNotFoundError(this);\r\n }\r\n\r\n this.eventManager = new EventManager();\r\n this.visibilityManager = new VisibilityManager(this.element);\r\n }\r\n\r\n protected _extractLogicalName(target: Element | string): string {\r\n if (typeof target !== \"string\") return \"\";\r\n\r\n const bracketMatch = target.match(/\\[([^\\]]+)\\]/);\r\n if (!bracketMatch) return target.replace(/[#\\[\\]]/g, \"\");\r\n\r\n const content = bracketMatch[1];\r\n const quoteMatch = content.match(/[\"']([^\"']+)[\"']/);\r\n return (quoteMatch?.[1] || content).replace(/[#\\[\\]]/g, \"\");\r\n }\r\n\r\n /**\r\n * Initializes value synchronization with appropriate event listeners\r\n * based on element type.\r\n */\r\n protected _valueSync(): void {\r\n if (!this._isValidFormElement(this.element)) return;\r\n\r\n this.updateValue();\r\n const eventType = this._determineEventType();\r\n this.eventManager!.registerDOMEventListener(\r\n this.element,\r\n eventType,\r\n this.updateValue.bind(this)\r\n );\r\n\r\n if (this._isDateInput()) {\r\n this._dateSync(this.element as HTMLInputElement);\r\n }\r\n }\r\n\r\n protected _determineEventType(): keyof HTMLElementEventMap {\r\n if (this.element instanceof HTMLSelectElement) return \"change\";\r\n if (this.element instanceof HTMLTextAreaElement) return \"keyup\";\r\n if (!(this.element instanceof HTMLInputElement)) return EventTypes.DEFAULT;\r\n\r\n return (\r\n EventTypes[this.element.type.toUpperCase() as keyof typeof EventTypes] ||\r\n EventTypes.DEFAULT\r\n );\r\n }\r\n\r\n protected _isDateInput(): boolean {\r\n return (\r\n this.element instanceof HTMLInputElement &&\r\n this.element.dataset.type === \"date\"\r\n );\r\n }\r\n\r\n protected _isValidFormElement(element: Element): element is FormElement {\r\n return (\r\n element instanceof HTMLInputElement ||\r\n element instanceof HTMLSelectElement ||\r\n element instanceof HTMLTextAreaElement ||\r\n element instanceof HTMLSpanElement ||\r\n element instanceof HTMLButtonElement ||\r\n element instanceof HTMLFieldSetElement\r\n );\r\n }\r\n\r\n protected async _dateSync(element: HTMLInputElement): Promise<void> {\r\n const parentElement = element.parentElement;\r\n if (!parentElement) {\r\n throw new DOMException(\"Date input must have a parent element\");\r\n }\r\n\r\n const dateNode = (await waitFor(\r\n \"[data-date-format]\",\r\n parentElement,\r\n false,\r\n 1500\r\n )) as HTMLElement;\r\n\r\n this.eventManager!.registerDOMEventListener(\r\n dateNode,\r\n \"select\",\r\n this.updateValue.bind(this)\r\n );\r\n }\r\n\r\n protected _bindMethods() {\r\n const prototype = Object.getPrototypeOf(this);\r\n\r\n for (const key of Object.getOwnPropertyNames(prototype) as Array<\r\n keyof this\r\n >) {\r\n const value = this[key];\r\n\r\n // Ensure we're binding only functions and skip the constructor\r\n if (key !== \"constructor\" && typeof value === \"function\") {\r\n this[key] = value.bind(this);\r\n }\r\n }\r\n }\r\n\r\n protected [destroy](): void {\r\n // Clear other references\r\n this.isLoaded = false;\r\n this.value = null;\r\n\r\n this.eventManager!.destroy();\r\n this.eventManager = null;\r\n this.visibilityManager!.destroy();\r\n this.visibilityManager = null;\r\n this.valueManager!.destroy();\r\n this.valueManager = null;\r\n }\r\n\r\n /**\r\n * Updates the value and checked state based on element type\r\n * @public\r\n */\r\n public async updateValue(e?: Event): Promise<void> {\r\n if (e && !e.isTrusted) return;\r\n await this.valueManager!.updateValue(e);\r\n this.triggerDependentsHandlers();\r\n }\r\n\r\n protected triggerDependentsHandlers(): void {\r\n this.eventManager!.dispatchDependencyHandlers();\r\n }\r\n\r\n /**\r\n * Sets up an event listener based on the specified event type, executing the specified\r\n * event handler\r\n * @param eventType - The DOM event to watch for\r\n * @param eventHandler - The callback function that runs when the\r\n * specified event occurs.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public on(\r\n eventType: keyof HTMLElementEventMap,\r\n eventHandler: (this: DOMNodeReference, e: Event) => void\r\n ): DOMNodeReference {\r\n if (typeof eventHandler !== \"function\") {\r\n throw new Errors.IncorrectParameterError(\r\n this,\r\n \"on\",\r\n \"eventHandler\",\r\n [\"function\"],\r\n typeof eventHandler\r\n );\r\n }\r\n\r\n this.eventManager!.registerDOMEventListener(\r\n this.element,\r\n eventType,\r\n eventHandler.bind(this)\r\n );\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Hides the element by setting its display style to \"none\".\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public hide(): DOMNodeReference {\r\n this.visibilityManager!.hide();\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows the element by restoring its default display style.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public show(): DOMNodeReference {\r\n this.visibilityManager!.show();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param shouldShow - Either a function that returns true or false,\r\n * or a natural boolean to determine the visibility of this\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public toggleVisibility(\r\n shouldShow: ((this: DOMNodeReference) => boolean) | boolean\r\n ): DOMNodeReference {\r\n const bool: boolean =\r\n shouldShow instanceof Function ? shouldShow.call(this) : shouldShow;\r\n\r\n this.visibilityManager!.toggleVisibility(bool);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the value of the HTML element.\r\n * @param value - The value to set for the HTML element.\r\n * for parents of boolean radios, pass true or false as value, or\r\n * an expression returning a boolean\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public setValue(value: (() => any) | any): DOMNodeReference {\r\n if (value instanceof Function) {\r\n value = value();\r\n }\r\n this.valueManager!.setValue(value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Disables the element so that users cannot input any data\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public disable(): DOMNodeReference {\r\n (this.element as HTMLInputElement).disabled = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Clears all values and states of the element.\r\n * Handles different input types appropriately, and can be called\r\n * on an element containing N child inputs to clear all\r\n */\r\n public clearValue(): void {\r\n this.valueManager!.clearValue();\r\n\r\n // Handle nested input elements in container elements\r\n if (this._getChildren()) {\r\n this.callAgainstChildrenInputs((child) => child.clearValue());\r\n }\r\n }\r\n\r\n protected _getChildren(): DOMNodeReference[] | null {\r\n const childInputs: Element[] = Array.from(\r\n this.element.querySelectorAll(\"input, select, textarea\")\r\n );\r\n const childIds: string[] = childInputs.map((input) => {\r\n return input.id;\r\n });\r\n\r\n const children = DOMNodeReference.instances.filter((ref) => {\r\n return childIds.includes(ref.element.id);\r\n });\r\n\r\n return children.length > 0 ? children : null;\r\n }\r\n\r\n protected callAgainstChildrenInputs(\r\n callback: (child: DOMNodeReference) => any\r\n ): void {\r\n // Handle nested input elements in container elements\r\n const children: DOMNodeReference[] | null = this._getChildren();\r\n if (!children) {\r\n console.error(\"No child inputs found for target: \", this);\r\n return;\r\n }\r\n\r\n for (const child of children) {\r\n callback(child);\r\n }\r\n }\r\n\r\n /**\r\n * Enables the element so that users can input data\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public enable(): DOMNodeReference {\r\n (this.element as HTMLInputElement).disabled = false;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param elements - The elements to prepend to the element targeted by this.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public prepend(...elements: HTMLElement[]): DOMNodeReference {\r\n this.element.prepend(...elements);\r\n return this;\r\n }\r\n\r\n /**\r\n * Appends child elements to the HTML element.\r\n * @param elements - The elements to append to the element targeted by this.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public append(...elements: HTMLElement[]): DOMNodeReference {\r\n this.element.append(...elements);\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts elements before the HTML element.\r\n * @param elements - The elements to insert before the HTML element.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public before(...elements: HTMLElement[]): DOMNodeReference {\r\n this.element.before(...elements);\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts elements after the HTML element.\r\n * @param elements - The elements to insert after the HTML element.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public after(...elements: HTMLElement[]): DOMNodeReference {\r\n this.element.after(...elements);\r\n return this;\r\n }\r\n\r\n /**\r\n * Retrieves the label associated with the HTML element.\r\n * @returns The label element associated with this element.\r\n */\r\n public getLabel(): HTMLElement | null {\r\n const label =\r\n (document.querySelector(`#${this.element.id}_label`) as HTMLElement) ||\r\n null;\r\n if (!label) throw new Errors.LabelNotFoundError(this);\r\n return label;\r\n }\r\n\r\n /**\r\n * Adds a tooltip with specified text to the label associated with the HTML element.\r\n * @param innerHTML - The innerHTML to append into the tooltip.\r\n * @param containerStyle - Optional object with CSS Styles to apply to the info element\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public addLabelTooltip(\r\n innerHTML: string,\r\n containerStyle?: Partial<CSSStyleDeclaration>\r\n ): DOMNodeReference {\r\n this.getLabel()?.append(\r\n createInfoEl(innerHTML, containerStyle || undefined)\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a tooltip with the specified text to the element\r\n * @param innerHTML - The innerHTML to append into the tooltip\r\n * @param containerStyle - Optional object with CSS Styles to apply to the info element\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public addTooltip(\r\n innerHTML: string,\r\n containerStyle?: Partial<CSSStyleDeclaration>\r\n ): DOMNodeReference {\r\n this.append(createInfoEl(innerHTML, containerStyle || undefined));\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the inner HTML content of the HTML element.\r\n * @param string - The text to set as the inner HTML of the element.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public setInnerHTML(string: string) {\r\n this.element.innerHTML = string;\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes this element from the DOM\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public remove() {\r\n this.element.remove();\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets inline CSS styles on the element.\r\n * @param options - An object containing CSS property-value pairs, e.g., { display: 'block' }.\r\n * @returns The instance, enabling method chaining.\r\n */\r\n public setStyle(options: Partial<CSSStyleDeclaration>): this {\r\n if (options === null || typeof options !== \"object\") {\r\n throw new Errors.IncorrectParameterError(\r\n this,\r\n \"setStyle\",\r\n \"options\",\r\n [\"Partial<CSSStyleDeclaration>\"],\r\n typeof options\r\n );\r\n }\r\n\r\n // Iterate over own enumerable properties of the options object.\r\n Object.entries(options).forEach(([prop, value]) => {\r\n // Skip properties that are undefined.\r\n if (value !== undefined) {\r\n // Here we cast 'prop' as a key of CSSStyleDeclaration.\r\n // Using bracket notation allows dynamic property access.\r\n (this.element.style as any)[prop] = value;\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Applies a business rule to manage visibility, required state, value, and disabled state dynamically.\r\n * @see {@link BusinessRule}\r\n * @param rule The business rule containing conditions for various actions.\r\n * @param dependencies For re-evaluation of conditions when the state of the dependencies change\r\n * @returns Instance of this for method chaining.\r\n */\r\n public applyBusinessRule(\r\n rule: BusinessRule,\r\n dependencies: DependencyArray<DOMNodeReference>\r\n ): DOMNodeReference {\r\n try {\r\n // Apply Visibility Rule\r\n if (rule.setVisibility) {\r\n const condition = rule.setVisibility;\r\n const initialState = condition.call(this);\r\n this.toggleVisibility(initialState);\r\n }\r\n\r\n // Apply Required & Validation Rule\r\n if (rule.setRequirements) {\r\n const { isRequired, isValid } = rule.setRequirements();\r\n // get args? rule.setRequired(isRequired, isValid)\r\n\r\n if (typeof Page_Validators === \"undefined\") {\r\n throw new Errors.Page_ValidatorsNotFoundError(this);\r\n }\r\n\r\n let evaluationFunction: () => boolean = () => true;\r\n\r\n if (isRequired && isValid) {\r\n evaluationFunction = () => {\r\n const isFieldRequired = isRequired.call(this);\r\n const isFieldVisible = this.visibilityManager!.getVisibility();\r\n\r\n // If the field is not required, it is always valid\r\n // If the field is required, it must be visible and valid\r\n return (\r\n !isFieldRequired ||\r\n (isFieldVisible && isValid.call(this, isFieldRequired))\r\n );\r\n };\r\n } else if (isValid) {\r\n evaluationFunction = () => {\r\n const isFieldVisible = this.visibilityManager!.getVisibility();\r\n\r\n // The field must be visible and valid\r\n return isFieldVisible && isValid.call(this);\r\n };\r\n } else if (isRequired) {\r\n evaluationFunction = () => {\r\n const isFieldVisible = this.visibilityManager!.getVisibility();\r\n\r\n // The field must be visible and required\r\n return isFieldVisible && isRequired.call(this);\r\n };\r\n }\r\n\r\n this._createValidator(evaluationFunction);\r\n }\r\n\r\n // Apply Set Value Rule\r\n if (rule.setValue) {\r\n let { condition, value } = rule.setValue();\r\n if (value instanceof Function) value = value();\r\n if (condition.call(this)) {\r\n this.setValue.call(this, value);\r\n }\r\n }\r\n\r\n // Apply Disabled Rule\r\n if (rule.setDisabled) {\r\n const condition = rule.setDisabled;\r\n condition.call(this) ? this.disable() : this.enable();\r\n }\r\n\r\n const handler: BusinessRuleHandler =\r\n this._returnBusinessRuleHandler(rule);\r\n handler();\r\n\r\n // setup dep tracking\r\n if (dependencies.length) {\r\n this._configureDependencyTracking(handler, dependencies);\r\n }\r\n\r\n return this;\r\n } catch (error) {\r\n if (error instanceof Error) throw error;\r\n else throw new Errors.BusinessRuleError(this);\r\n }\r\n }\r\n\r\n protected _returnBusinessRuleHandler(\r\n rule: BusinessRule\r\n ): BusinessRuleHandler {\r\n return (): void => {\r\n let clearValues: boolean = false;\r\n if (rule.setVisibility) {\r\n const visibilityCondition = rule.setVisibility;\r\n clearValues = clearValues || !visibilityCondition.call(this);\r\n this.toggleVisibility(visibilityCondition.call(this));\r\n }\r\n if (rule.setRequirements && rule.setRequirements().isRequired) {\r\n const { isRequired } = rule.setRequirements();\r\n this.setRequiredLevel(isRequired!.call(this));\r\n }\r\n if (rule.setValue) {\r\n const { condition, value } = rule.setValue();\r\n if (condition.call(this)) this.setValue.call(this, value);\r\n }\r\n if (rule.setDisabled) {\r\n const disabledCondition = rule.setDisabled;\r\n disabledCondition.call(this) ? this.disable() : this.enable();\r\n }\r\n\r\n if (clearValues && !rule.setValue) {\r\n this.clearValue();\r\n }\r\n\r\n this.triggerDependentsHandlers();\r\n };\r\n }\r\n\r\n protected _createValidator(evaluationFunction: () => boolean): void {\r\n const fieldDisplayName = (() => {\r\n let label: any = this.getLabel();\r\n if (!label) {\r\n throw new Errors.LabelNotFoundError(this);\r\n }\r\n label = label.innerHTML;\r\n if (label.length > 50) {\r\n label = label.substring(0, 50) + \"...\";\r\n }\r\n return label;\r\n })();\r\n\r\n const validatorId = `${this.element.id}Validator`;\r\n\r\n const newValidator = document.createElement(\"span\");\r\n newValidator.style.display = \"none\";\r\n newValidator.id = validatorId;\r\n\r\n Object.assign(newValidator, {\r\n controltovalidate: this.element.id,\r\n errormessage: `<a href='#${this.element.id}_label'>${fieldDisplayName} is a required field</a>`,\r\n evaluationfunction: evaluationFunction,\r\n });\r\n\r\n if (Page_Validators == undefined)\r\n throw new Errors.Page_ValidatorsNotFoundError(this);\r\n\r\n Page_Validators.push(newValidator);\r\n }\r\n\r\n /**\r\n * Sets up tracking for dependencies using both event listeners and mutation observers.\r\n * @protected\r\n * @param handler The function to execute when dependencies change\r\n * @param dependencies Array of dependent DOM nodes to track\r\n * all other options defaults to true\r\n */\r\n protected _configureDependencyTracking(\r\n handler: DependencyHandler,\r\n dependencies: DOMNodeReference[]\r\n ): void {\r\n if (dependencies.length < 1) {\r\n console.error(\r\n `powerpagestoolkit: No dependencies specified for ${this.element.id}. ` +\r\n \"Include all required nodes in the dependency array for proper tracking.\"\r\n );\r\n return;\r\n }\r\n\r\n dependencies.forEach((dependency) => {\r\n if (!dependency || !(dependency instanceof DOMNodeReference)) {\r\n throw new TypeError(\r\n \"Each dependency must be a valid DOMNodeReference instance\"\r\n );\r\n }\r\n\r\n // Check for self-referential dependency\r\n if (dependency.logicalName === this.logicalName) {\r\n throw new Errors.SelfReferenceError(this);\r\n }\r\n\r\n // The node that THIS depends on needs to be able to send notifications to its dependents\r\n // dependency.dependents.set(this, handler.bind(this));\r\n dependency.eventManager!.registerDependent(this, handler.bind(this));\r\n });\r\n }\r\n\r\n /**\r\n * Sets the required level for the field by adding or removing the \"required-field\" class on the label.\r\n *\r\n * @param isRequired Determines whether the field should be marked as required.\r\n * If true, the \"required-field\" class is added to the label; if false, it is removed.\r\n * @returns Instance of this [provides option to method chain]\r\n */\r\n public setRequiredLevel(\r\n isRequired: (() => boolean) | boolean\r\n ): DOMNodeReference {\r\n if (isRequired instanceof Function) {\r\n isRequired()\r\n ? this.getLabel()?.classList.add(\"required-field\")\r\n : this.getLabel()?.classList.remove(\"required-field\");\r\n return this;\r\n } else {\r\n isRequired\r\n ? this.getLabel()?.classList.add(\"required-field\")\r\n : this.getLabel()?.classList.remove(\"required-field\");\r\n return this;\r\n }\r\n }\r\n\r\n /**\r\n * Executes a callback function once the element is fully loaded.\r\n * If the element is already loaded, the callback is called immediately.\r\n * Otherwise, a MutationObserver is used to detect when the element is added to the DOM.\r\n * @param callback A callback function to execute once the element is loaded.\r\n * Receives instance of 'this' as an argument\r\n */\r\n public onceLoaded(callback: (instance: DOMNodeReference) => any): any {\r\n if (this.isLoaded) {\r\n callback(this);\r\n return;\r\n }\r\n\r\n if (this.target instanceof HTMLElement) {\r\n callback(this);\r\n return;\r\n }\r\n const observer = new MutationObserver(\r\n function (this: DOMNodeReference) {\r\n if (document.querySelector(this.target as string)) {\r\n observer.disconnect(); // Stop observing once loaded\r\n this.isLoaded = true;\r\n callback(this); // Call the provided callback\r\n }\r\n }.bind(this)\r\n );\r\n\r\n this.eventManager!.registerObserver(observer, {\r\n nodeToObserve: document.body,\r\n options: { subtree: true, childList: true },\r\n });\r\n }\r\n}\r\n", "import DOMNodeReference from \"./DOMNodeReference.ts\";\r\nimport ValueManager from \"./ValueManager.ts\";\r\nimport Errors from \"../errors/errors.ts\";\r\nimport { init, destroy } from \"../constants/symbols.ts\";\r\n\r\nexport default class Radio extends DOMNodeReference {\r\n // allow for indexing methods with symbols\r\n [key: symbol]: (...arg: any[]) => any;\r\n\r\n protected radioType: RadioType | null = null;\r\n public declare radioParent: DOMNodeReference | undefined;\r\n\r\n constructor(\r\n parent: DOMNodeReference,\r\n target: Element | string,\r\n root: Element = document.body,\r\n timeoutMs: number,\r\n radioType: RadioType\r\n ) {\r\n super(target, root, timeoutMs);\r\n\r\n this.radioParent = parent;\r\n this.radioType = radioType;\r\n }\r\n\r\n public async [init](): Promise<void> {\r\n /**\r\n * dynamically define the s.init method using our custom symbol\r\n * this makes it so that the s.init method cannot be accessed outside\r\n * of this package: i.e. by any consumers of the package\r\n */\r\n try {\r\n await super[init]();\r\n\r\n this.valueManager = new ValueManager(this);\r\n\r\n this._valueSync();\r\n\r\n // we want to ensure that all method calls from the consumer have access to 'this'\r\n this._bindMethods();\r\n\r\n // when the element is removed from the DOM, destroy this\r\n const observer = new MutationObserver((mutations) => {\r\n for (const mutation of mutations) {\r\n if (Array.from(mutation.removedNodes).includes(this.element)) {\r\n this[destroy]();\r\n observer.disconnect();\r\n break;\r\n }\r\n }\r\n });\r\n\r\n observer.observe(document.body, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n DOMNodeReference.instances.push(this);\r\n\r\n this.isLoaded = true;\r\n } catch (error) {\r\n const errorMessage: string =\r\n error instanceof Error ? error.message : String(error);\r\n throw new Errors.InitializationError(this, errorMessage);\r\n }\r\n }\r\n\r\n override [destroy](): void {\r\n super[destroy]();\r\n this.radioParent = undefined;\r\n }\r\n}\r\n", "import PowerPagesElement from \"../core/PowerPagesElement.ts\";\r\nimport DOMNodeReference from \"./DOMNodeReference.ts\";\r\nimport Radio from \"./Radio.ts\";\r\n\r\ndeclare interface ValueManagerProps {\r\n element: HTMLElement;\r\n noRadio?: Radio;\r\n yesRadio?: Radio;\r\n radioParent?: DOMNodeReference;\r\n isRadio: boolean;\r\n}\r\n\r\nexport default class ValueManager {\r\n public value: any;\r\n public checked: true | false = false;\r\n private element: HTMLElement | null;\r\n private noRadio?: Radio | undefined;\r\n private yesRadio?: Radio | undefined;\r\n public declare radioParent?: DOMNodeReference | undefined;\r\n private isRadio: boolean = false;\r\n\r\n constructor(instance: DOMNodeReference) {\r\n if (instance instanceof PowerPagesElement) {\r\n this.noRadio = instance.noRadio;\r\n this.yesRadio = instance.yesRadio;\r\n }\r\n this.element = instance.element;\r\n this.isRadio = instance instanceof Radio;\r\n }\r\n\r\n public setValue(value: any): void {\r\n const validatedValue = this._validateValue(value);\r\n\r\n if (this.yesRadio instanceof Radio && this.noRadio instanceof Radio) {\r\n (this.yesRadio.element as HTMLInputElement).checked = Boolean(value);\r\n (this.noRadio.element as HTMLInputElement).checked = Boolean(!value);\r\n this.value = value;\r\n (this.element as HTMLInputElement).checked = Boolean(value);\r\n (this.element as HTMLInputElement).value = value;\r\n } else if (\r\n this.isRadio ||\r\n (this.element as HTMLInputElement).type === \"radio\"\r\n ) {\r\n (this.element as HTMLInputElement).checked = value;\r\n this.checked = value;\r\n this.radioParent?.updateValue();\r\n } else {\r\n (this.element as HTMLInputElement).value = validatedValue;\r\n }\r\n\r\n this.value = validatedValue;\r\n }\r\n\r\n public async updateValue(e?: Event): Promise<void> {\r\n if (e) {\r\n e.stopPropagation();\r\n }\r\n\r\n if (this.yesRadio instanceof Radio && this.noRadio instanceof Radio) {\r\n this.yesRadio!.updateValue();\r\n this.noRadio!.updateValue();\r\n }\r\n\r\n const elementValue = await this.getElementValue();\r\n this.value = elementValue.value;\r\n\r\n if (elementValue.checked !== undefined) {\r\n this.checked = elementValue.checked;\r\n }\r\n }\r\n\r\n public getElementValue(): Promise<ElementValue> {\r\n return new Promise((resolve) => {\r\n const input = this.element as HTMLInputElement;\r\n const select = this.element as HTMLSelectElement;\r\n\r\n if (this.yesRadio instanceof Radio && this.noRadio instanceof Radio) {\r\n resolve({\r\n value: this.yesRadio.checked,\r\n checked: this.yesRadio.checked,\r\n });\r\n }\r\n\r\n let returnValue: ElementValue = {\r\n value: null,\r\n };\r\n switch (input.type) {\r\n case \"checkbox\":\r\n case \"radio\":\r\n resolve({\r\n value: input.checked,\r\n checked: input.checked,\r\n });\r\n break;\r\n case \"select-multiple\":\r\n resolve({\r\n value: Array.from(select.selectedOptions).map(\r\n (option) => option.value\r\n ),\r\n });\r\n break;\r\n\r\n case \"select-one\":\r\n resolve({\r\n value: select.value,\r\n });\r\n break;\r\n\r\n case \"number\":\r\n resolve({\r\n value: input.value !== \"\" ? Number(input.value) : null,\r\n });\r\n break;\r\n\r\n default: {\r\n let cleanValue: string | number = input.value;\r\n if (this.element!.classList.contains(\"decimal\")) {\r\n cleanValue = parseFloat(input.value.replace(/[$,]/g, \"\").trim());\r\n }\r\n\r\n returnValue = {\r\n value: cleanValue,\r\n };\r\n }\r\n }\r\n\r\n returnValue = {\r\n ...returnValue,\r\n value: this._validateValue(returnValue.value),\r\n };\r\n\r\n resolve(returnValue);\r\n });\r\n }\r\n\r\n protected _validateValue(value: any): any {\r\n if (typeof value === \"boolean\" || value === \"true\" || value === \"false\") {\r\n return value === true || value === \"true\";\r\n }\r\n\r\n // If it's a select element or text input (not decimal), return as is\r\n if (\r\n this.element instanceof HTMLSelectElement ||\r\n ((this.element as HTMLInputElement).type === \"text\" &&\r\n !(this.element as HTMLInputElement).classList.contains(\"decimal\"))\r\n ) {\r\n return value;\r\n }\r\n\r\n // Handle null/empty cases\r\n if (value === null || value === \"\") {\r\n return value;\r\n }\r\n\r\n if (!isNaN(Number(value))) {\r\n return Number(value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n public clearValue(): void {\r\n try {\r\n const element = this.element;\r\n\r\n if (element instanceof HTMLInputElement) {\r\n switch (element.type.toLowerCase()) {\r\n case \"checkbox\":\r\n case \"radio\":\r\n element.checked = false;\r\n this.checked = false;\r\n this.value = false;\r\n break;\r\n\r\n case \"number\":\r\n element.value = \"\";\r\n this.value = null;\r\n break;\r\n\r\n default: // handles text, email, tel, etc.\r\n element.value = \"\";\r\n this.value = null;\r\n break;\r\n }\r\n } else if (element instanceof HTMLSelectElement) {\r\n if (element.multiple) {\r\n Array.from(element.options).forEach(\r\n (option) => (option.selected = false)\r\n );\r\n this.value = null;\r\n } else {\r\n element.selectedIndex = -1;\r\n this.value = null;\r\n }\r\n } else if (element instanceof HTMLTextAreaElement) {\r\n element.value = \"\";\r\n this.value = null;\r\n } else {\r\n this.value = null;\r\n }\r\n } catch (error) {\r\n const errorMessage = `Failed to clear values for element with target \"${this}\": ${\r\n error instanceof Error ? error.message : String(error)\r\n }`;\r\n throw new Error(errorMessage);\r\n }\r\n }\r\n\r\n public destroy(): void {\r\n this.value = null;\r\n this.checked = false;\r\n this.element = null;\r\n this.noRadio = undefined;\r\n this.yesRadio = undefined;\r\n this.isRadio = false;\r\n }\r\n}\r\n", "import DOMNodeReference from \"../ancillary/DOMNodeReference.ts\";\r\nimport ValueManager from \"../ancillary/ValueManager.ts\";\r\nimport Errors from \"../errors/errors.ts\";\r\nimport Radio from \"../ancillary/Radio.ts\";\r\nimport { init, destroy } from \"../constants/symbols.ts\";\r\n\r\nexport default class PowerPagesElement extends DOMNodeReference {\r\n // allow for indexing methods with symbols\r\n [key: symbol]: (...arg: any[]) => any;\r\n\r\n /**\r\n * Represents the 'yes' option of a boolean radio field.\r\n * This property is only available when the parent node\r\n * is a main field for a boolean radio input.\r\n */\r\n public declare yesRadio: Radio | undefined;\r\n /**\r\n * Represents the 'no' option of a boolean radio field.\r\n * This property is only available when the parent node\r\n * is a main field for a boolean radio input.\r\n */\r\n public declare noRadio: Radio | undefined;\r\n\r\n /**\r\n * Creates an instance of PowerPagesElement.\r\n * @param target - The CSS selector to find the desired DOM element.\r\n * @param root - Optionally specify the element within to search for the element targeted by 'target'\r\n * Defaults to 'document.body'\r\n */\r\n /******/ /******/ constructor(\r\n target: Element | string,\r\n root: Element = document.body,\r\n timeoutMs: number\r\n ) {\r\n super(target, root, timeoutMs);\r\n }\r\n\r\n //\r\n public async [init](): Promise<void> {\r\n /**\r\n * dynamically define the s.init method using our custom symbol\r\n * this makes it so that the s.init method cannot be accessed outside\r\n * of this package: i.e. by any consumers of the package\r\n */\r\n try {\r\n await super[init]();\r\n\r\n if (\r\n this.element.id &&\r\n this.element.querySelectorAll(\r\n `#${this.element.id} > input[type=\"radio\"]`\r\n ).length > 0\r\n ) {\r\n await this._attachRadioButtons();\r\n }\r\n\r\n this.valueManager = new ValueManager(this);\r\n\r\n this._valueSync();\r\n\r\n // we want to ensure that all method calls from the consumer have access to 'this'\r\n this._bindMethods();\r\n\r\n // when the element is removed from the DOM, destroy this\r\n const observer = new MutationObserver((mutations) => {\r\n for (const mutation of mutations) {\r\n if (Array.from(mutation.removedNodes).includes(this.element)) {\r\n if (typeof this[destroy] === \"function\") this[destroy]();\r\n observer.disconnect();\r\n break;\r\n }\r\n }\r\n });\r\n\r\n observer.observe(document.body, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n PowerPagesElement.instances.push(this);\r\n\r\n this.isLoaded = true;\r\n } catch (error) {\r\n const errorMessage: string =\r\n error instanceof Error ? error.message : String(error);\r\n throw new Errors.InitializationError(this, errorMessage);\r\n }\r\n }\r\n\r\n protected async _attachRadioButtons(): Promise<void> {\r\n if (!this.element) {\r\n console.error(\r\n \"'this.element' not found: cannot attach radio buttons for \",\r\n this.target\r\n );\r\n return;\r\n }\r\n\r\n this.yesRadio = new Radio(\r\n this,\r\n 'input[type=\"radio\"][value=\"1\"]',\r\n this.element,\r\n 0,\r\n \"truthy\"\r\n );\r\n\r\n this.noRadio = new Radio(\r\n this,\r\n 'input[type=\"radio\"][value=\"0\"]',\r\n this.element,\r\n 0,\r\n \"falsy\"\r\n );\r\n\r\n await this.yesRadio[init]();\r\n await this.noRadio[init]();\r\n }\r\n\r\n public override clearValue(): void {\r\n // Handle radio button group if present\r\n if (this.yesRadio instanceof Radio && this.noRadio instanceof Radio) {\r\n this.yesRadio.clearValue();\r\n this.noRadio.clearValue();\r\n }\r\n super.clearValue();\r\n }\r\n\r\n /**\r\n * Unchecks both the yes and no radio buttons if they exist.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public uncheckRadios(): DOMNodeReference {\r\n if (\r\n this.yesRadio instanceof DOMNodeReference &&\r\n this.noRadio instanceof DOMNodeReference\r\n ) {\r\n (this.yesRadio.element as HTMLInputElement).checked = false;\r\n (this.noRadio.element as HTMLInputElement).checked = false;\r\n } else {\r\n console.error(\r\n \"[SYNACT] Attempted to uncheck radios for an element that has no radios\"\r\n );\r\n }\r\n return this;\r\n }\r\n\r\n protected [destroy](): void {\r\n super[destroy]();\r\n // Destroy radio buttons if they exist\r\n this.yesRadio?.[destroy]();\r\n this.noRadio?.[destroy]();\r\n this.yesRadio = undefined;\r\n this.noRadio = undefined;\r\n }\r\n}\r\n", "import type PowerPagesElement from \"./PowerPagesElement.ts\";\r\n\r\nexport default class PowerPagesElementArray extends Array<PowerPagesElement> {\r\n /**\r\n * Hides all the containers of the PowerPagesElement instances in the array.\r\n */\r\n hideAll(this: PowerPagesElementArray) {\r\n this.forEach((instance: PowerPagesElement) => instance.hide());\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows all the containers of the PowerPagesElement instances in the array.\r\n */\r\n\r\n showAll(this: PowerPagesElementArray) {\r\n this.forEach((instance: PowerPagesElement) => instance.show());\r\n return this;\r\n }\r\n}\r\n", "import PowerPagesElementArray from \"../core/PowerPagesElementArray.ts\";\r\nimport type PowerPagesElement from \"../core/PowerPagesElement.ts\";\r\n\r\n/**\r\n *\r\n * @param array An array of PowerPagesElements to be modified with custom methods, as well as a custom getter. Custom getter allows for accessing properties within the array with bracket-style property access. See example\r\n * @example\r\n * ```javascript\r\n * const enhanced = enhanceArray(basicArray)\r\n * const someProp = enhanced['some_prop_logical_name']\r\n * ```\r\n */\r\nexport default function enhanceArray<T extends string>(\r\n array: PowerPagesElement[]\r\n): PowerPagesElementArray & Record<T, PowerPagesElement> {\r\n const enhancedArray = new PowerPagesElementArray(...array);\r\n\r\n return new Proxy(enhancedArray, {\r\n get(target, prop: string | symbol, receiver) {\r\n // Preserve existing array methods\r\n if (prop in target) {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n\r\n // Ensure `prop` is a string and search by `element.id`\r\n if (typeof prop === \"string\") {\r\n return target.find(\r\n (instance) =>\r\n instance.target.toString().replace(/[#\\[\\]]/g, \"\") === prop ||\r\n instance.logicalName === prop\r\n );\r\n }\r\n\r\n return undefined;\r\n },\r\n }) as PowerPagesElementArray & Record<T, PowerPagesElement>;\r\n}\r\n", "import type PowerPagesElementArray from \"./PowerPagesElementArray.ts\";\r\nimport PowerPagesElement from \"./PowerPagesElement.ts\";\r\nimport enhanceArray from \"../utils/enhanceArray.ts\";\r\nimport waitFor from \"./waitFor.ts\";\r\nimport { init } from \"../constants/symbols.ts\";\r\nimport Errors from \"../errors/errors.ts\";\r\n\r\n// Add function overloads to clearly specify return types based on the 'multiple' parameter\r\n/**\r\n * Creates and initializes a PowerPagesElement instance.\r\n * @see {@link CreationOptions}\r\n * @param **target** - The selector, using `querySelector` syntax, for the desired DOM element. Or, the `HTMLElement` itself for which to create a PowerPagesElement.\r\n * @param **options** - Options for advanced retrieval of elements\r\n * @param **options.multiple** - Should this call return an array of instantiated references, or just a single? Defaults to false, returning a single instance\r\n * @param **options.root** - Optionally specify the element within to search for the element targeted by 'target'. Defaults to `document.body`\r\n * @param **options.timeoutMs** - Optionally specify the amount of time that should be waited to find the targeted element before throwing error - useful for async DOM loading. Relies on MutationObserver. ***WARNING***: Implementing multiple references with timeout can result in infinite loading.\r\n * @returns A promise that resolves to a Proxy of the initialized PowerPagesElement instance.\r\n *\r\n * @see {@link PowerPagesElement}\r\n * @see {@link PowerPagesElementArray}\r\n * @see {@link enhanceArray}\r\n */\r\nexport default async function createPowerPagesElement(\r\n target: string | HTMLElement,\r\n options?: {\r\n /**\r\n * Should this call return an array of instantiated references, or just a single?\r\n * Defaults to false, returning a single instance.\r\n */\r\n multiple?: (() => boolean) | boolean;\r\n /**\r\n * Optionally specify the element within which to search for the element targeted by 'target'.\r\n * Defaults to 'document.body'.\r\n */\r\n root?: HTMLElement;\r\n /**\r\n * Optionally specify the amount of time that should be waited to find the targeted element before throwing an error.\r\n * Useful for async DOM loading. Relies on MutationObserver.\r\n * WARNING: Implementing multiple references with timeout can result in infinite loading.\r\n */\r\n timeoutMs?: number;\r\n }\r\n): Promise<PowerPagesElement>;\r\nexport default async function createPowerPagesElement(\r\n target: string,\r\n options?: {\r\n /**\r\n * Should this call return an array of instantiated references, or just a single?\r\n * Defaults to false, returning a single instance.\r\n */\r\n multiple?: false;\r\n /**\r\n * Optionally specify the element within which to search for the element targeted by 'target'.\r\n * Defaults to 'document.body'.\r\n */\r\n root?: HTMLElement;\r\n /**\r\n * Optionally specify the amount of time that should be waited to find the targeted element before throwing an error.\r\n * Useful for async DOM loading. Relies on MutationObserver.\r\n * WARNING: Implementing multiple references with timeout can result in infinite loading.\r\n */\r\n timeoutMs?: number;\r\n }\r\n): Promise<PowerPagesElement>;\r\n\r\nexport default async function createPowerPagesElement(\r\n target: Element,\r\n options?: {\r\n /**\r\n * Optionally specify the element within which to search for the element targeted by 'target'.\r\n * Defaults to 'document.body'.\r\n */\r\n root?: HTMLElement;\r\n /**\r\n * Optionally specify the amount of time that should be waited to find the targeted element before throwing an error.\r\n * Useful for async DOM loading. Relies on MutationObserver.\r\n * WARNING: Implementing multiple references with timeout can result in infinite loading.\r\n */\r\n timeoutMs?: number;\r\n }\r\n): Promise<PowerPagesElement>;\r\n\r\nexport default async function createPowerPagesElement(\r\n target: string,\r\n options?: {\r\n /**\r\n * Should this call return an array of instantiated references, or just a single?\r\n * Defaults to false, returning a single instance.\r\n */\r\n multiple?: true;\r\n /**\r\n * Optionally specify the element within which to search for the element targeted by 'target'.\r\n * Defaults to 'document.body'.\r\n */\r\n root?: HTMLElement;\r\n /**\r\n * Optionally specify the amount of time that should be waited to find the targeted element before throwing an error.\r\n * Useful for async DOM loading. Relies on MutationObserver.\r\n * WARNING: Implementing multiple references with timeout can result in infinite loading.\r\n */\r\n timeoutMs?: number;\r\n }\r\n): Promise<PowerPagesElementArray>;\r\n\r\nexport default async function createPowerPagesElement(\r\n target: Element | string,\r\n options: CreationOptions = {\r\n multiple: false,\r\n root: document.body,\r\n timeoutMs: 0,\r\n }\r\n): Promise<PowerPagesElement | PowerPagesElementArray> {\r\n try {\r\n if (typeof options !== \"object\") {\r\n throw new TypeError(\r\n `'options' must be of type 'object'. Received type: '${typeof options}'`\r\n );\r\n }\r\n\r\n validateOptions(options);\r\n const { multiple = false, root = document.body, timeoutMs = 0 } = options;\r\n\r\n // Evaluate multiple parameter once at the start\r\n const isMultiple = typeof multiple === \"function\" ? multiple() : multiple;\r\n\r\n if (isMultiple) {\r\n if (typeof target !== \"string\") {\r\n throw new TypeError(\r\n `'target' must be of type 'string' if 'multiple' is set to 'true'. Received type: '${typeof target}'`\r\n );\r\n }\r\n\r\n const elements = <HTMLElement[]>(\r\n await waitFor(target, root, true, timeoutMs)\r\n );\r\n\r\n // Avoid recursive call with multiple flag for better performance\r\n const initializedElements = <PowerPagesElementArray>await Promise.all(\r\n elements.map(async (element) => {\r\n const instance = new PowerPagesElement(element, root, timeoutMs);\r\n await instance[init]();\r\n return new Proxy(instance, createProxyHandler());\r\n })\r\n );\r\n return enhanceArray(initializedElements);\r\n }\r\n\r\n const instance = new PowerPagesElement(target, root, timeoutMs);\r\n await instance[init]();\r\n return new Proxy(instance, createProxyHandler());\r\n } catch (error) {\r\n if (error instanceof Error) throw error;\r\n else throw new Error(\"Failed to get DOM Node by target: \" + target);\r\n }\r\n}\r\n\r\nexport function validateOptions(options: Partial<CreationOptions>) {\r\n const { multiple = false, root = document.body, timeoutMs = 0 } = options;\r\n if (typeof multiple !== \"boolean\" && typeof multiple !== \"function\") {\r\n throw new TypeError(\r\n `'multiple' must be of type 'boolean' or 'function'. Received type: '${typeof multiple}'`\r\n );\r\n }\r\n if (typeof multiple === \"function\") {\r\n const value = multiple();\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(\r\n `'multiple' function must return a boolean. Received type: '${typeof value}'`\r\n );\r\n }\r\n }\r\n if (!(root instanceof HTMLElement)) {\r\n throw new TypeError(\r\n `'root' must be of type 'HTMLElement'. Received type: '${typeof root}'`\r\n );\r\n }\r\n if (typeof timeoutMs !== \"number\") {\r\n throw new TypeError(\r\n `'timeout' must be of type 'number'. Received type: '${typeof timeoutMs}'`\r\n );\r\n }\r\n return;\r\n}\r\n\r\n// Separate proxy handler for reusability\r\nexport function createProxyHandler() {\r\n return {\r\n get: (target: PowerPagesElement, prop: string | symbol) => {\r\n if (prop.toString().startsWith(\"_\")) return undefined;\r\n\r\n const value = target[<keyof PowerPagesElement>prop];\r\n if (typeof value === \"function\" && prop !== \"onceLoaded\") {\r\n return (...args: any[]) => {\r\n target.onceLoaded(() => value.apply(target, args));\r\n return target;\r\n };\r\n }\r\n return value;\r\n },\r\n };\r\n}\r\n", "import type PowerPagesElementArray from \"./PowerPagesElementArray.ts\";\r\nimport type PowerPagesElement from \"./PowerPagesElement.ts\";\r\nimport enhanceArray from \"../utils/enhanceArray.ts\";\r\nimport get from \"./getPowerPagesElement.ts\";\r\nimport API from \"./API.ts\";\r\n\r\n/**\r\n * When loading into a page in PowerPages that has a form,\r\n * you can use this function by passing in the GUID of the form, and you will receive an array/record\r\n * of {@link PowerPagesElement}s that represent all fields, sections, sub-grids, and tabs of the given form.\r\n * Access these properties of the {@link BoundForm} using the logical name of the control you need to access: form['logical_name']\r\n * you can then execute all the methods available from PowerPagesElement\r\n * @param formId - The string GUID of the form you want to bind to\r\n * @returns An array of PowerPagesElements, accessible as properties of a Record<string, PowerPagesElement> i.e. formProp = form[\"some_logicalName\"]\r\n * @example\r\n * ```js\r\n * bindForm(\"form-guid-0000\").then((form) => {\r\n * //...use the form\r\n * const field = form[\"field_logical_name\"]\r\n * // or\r\n * form[\"other_logical_name\"].someMethod()\r\n * })\r\n *\r\n * // or\r\n *\r\n * const form = await bindForm(\"form-guid-0000\")\r\n * ```\r\n * @see {@link BoundForm}\r\n * @see {@link PowerPagesElement}\r\n */\r\nexport default async function bindForm(\r\n formId: string\r\n): Promise<PowerPagesElementArray & Record<string, PowerPagesElement>> {\r\n try {\r\n const form = await API.getRecord<Form>(\"systemforms\", formId);\r\n const { formxml } = form;\r\n\r\n /**\r\n * since the form is coming in as a string containing XML\r\n * We have to set up a parser to extract the information we need\r\n */\r\n const parser = new DOMParser(); // establish the parser\r\n const xmlDoc = parser.parseFromString(formxml, \"application/xml\"); // parse the XML\r\n /**\r\n * Then we can get the attributes we want from the parsed XML\r\n */\r\n const controls = processElements(xmlDoc.getElementsByTagName(\"control\")); // get control elements (will represent columns in the form)\r\n const sections = processElements(xmlDoc.getElementsByTagName(\"section\")); // self explanatory\r\n const tabs = processElements(xmlDoc.getElementsByTagName(\"tab\")); // self explanatory\r\n\r\n // Resolve all promises, filtering out any null values\r\n const resolvedRefs = await Promise.all([...controls, ...sections, ...tabs]);\r\n /**\r\n * Then, finally, 'enhance' the array, adding custom methods and a custom 'getter'\r\n * which will allow us to access individual nodes using the syntax `array[\"logical_name\"]`\r\n */\r\n return enhanceArray(\r\n resolvedRefs.filter((ref): ref is PowerPagesElement => ref !== null)\r\n );\r\n /** handle errors */\r\n } catch (error: unknown) {\r\n if (error instanceof Error) {\r\n console.error(error.message);\r\n throw error; // Re-throw the original error to keep stack trace\r\n } else {\r\n console.error(error);\r\n throw new Error(String(error)); // Ensure non-Error values are converted to a string\r\n }\r\n }\r\n}\r\n\r\nfunction processElements(element: HTMLCollectionOf<Element>) {\r\n return Array.from(element)\r\n .map((element) => {\r\n // use a helper function to determine the attribute we want based on the tagname of the element\r\n const identifyingAttribute = getIdentifyingAttribute(element.tagName);\r\n const datafieldname = element.getAttribute(identifyingAttribute);\r\n // if we don't find the desired thing,\r\n if (!datafieldname) return null;\r\n\r\n const referenceString: string | null = createReferenceString(\r\n element.tagName,\r\n datafieldname\r\n );\r\n if (!referenceString) return null;\r\n\r\n return get(referenceString).catch((error) => {\r\n console.warn(\r\n `Failed to create a reference to the form field: ${datafieldname}`,\r\n error\r\n );\r\n return null;\r\n });\r\n })\r\n .filter(Boolean); // Remove null values\r\n}\r\n\r\nfunction getIdentifyingAttribute(tagName: string): string {\r\n return tagName === \"control\"\r\n ? \"id\"\r\n : tagName === \"tab\" || tagName === \"section\"\r\n ? \"name\"\r\n : \"id\";\r\n}\r\n\r\nfunction createReferenceString(\r\n tagName: string,\r\n datafieldname: string\r\n): string | null {\r\n if (tagName === \"control\") return `#${datafieldname}`;\r\n if (tagName === \"tab\" || tagName === \"section\") {\r\n return `[data-name=\"${datafieldname}\"]`;\r\n }\r\n return null; // Explicitly return null instead of undefined\r\n}\r\n"],
|
|
5
|
-
"mappings": "AAKe,SAARA,EAA0BC,EAAa,CAC5C,IAAMC,EAAe,EAAE,SAAS,EAIhC,aACG,iBAAiB,EACjB,KAAK,SAAUC,EAAO,CAEhBF,EAAY,QAOfA,EAAY,QAAQ,2BAAgCE,EANpD,EAAE,OAAOF,EAAa,CACpB,QAAS,CACP,2BAA4BE,CAC9B,CACF,CAAC,EAIH,EAAE,KAAKF,CAAW,EACf,KAAK,SAAUG,EAAMC,EAAYC,EAAO,CAEvC,qBAAqBF,EAAMC,EAAYC,EAAOJ,EAAa,OAAO,CACpE,CAAC,EACA,KAAKA,EAAa,MAAM,CAC7B,CAAC,EACA,KAAK,UAAY,CAChBA,EAAa,WAAW,KAAM,SAAS,CACzC,CAAC,EAEIA,EAAa,QAAQ,CAC9B,CCrBA,IAAeK,EAAf,KAAmB,CAMjB,OAAO,aAAaC,EAAsBC,EAAkC,CAC1E,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtCC,EAAS,CACP,KAAM,OACN,IAAK,SAASJ,CAAY,GAC1B,KAAM,KAAK,UAAUC,CAAI,EACzB,YAAa,mBACb,QAAS,SAAUI,EAAWC,EAASC,EAAK,CAC1CL,EAAQK,EAAI,kBAAkB,UAAU,CAAC,CAC3C,EACA,MAAQC,GAAU,CAChBL,EAAOK,CAAK,CACd,CACF,CAAC,CACH,CAAC,CACH,CAQA,OAAO,UACLR,EACAS,EACAC,EACY,CACZ,OAAO,IAAI,QAAQ,CAACR,EAASC,IAAW,CACtC,IAAMQ,EAAM,SAASX,CAAY,IAAIS,CAAQ,IAC3CC,EAAgB,KAAKA,CAAa,GAAK,EACzC,GAEAN,EAAS,CACP,KAAM,MACN,IAAKO,EACL,QAAST,EACT,MAAOC,CACT,CAAC,CACH,CAAC,CACH,CAOA,OAAO,YACLH,EACAY,EACwB,CACxB,OAAO,IAAI,QAAQ,CAACV,EAASC,IAAW,CAEtC,IAAMQ,EAAM,SAASX,CAAY,GAC/BY,EAAkB,IAAIA,CAAe,GAAK,EAC5C,GAEAR,EAAS,CACP,KAAM,MACN,IAAKO,EACL,QAAS,SAAUE,EAAU,CAC3BX,EAAQW,EAAS,KAAK,CACxB,EACA,MAAOV,CACT,CAAC,CACH,CAAC,CACH,CASA,OAAO,aACLH,EACAc,EACAb,EACc,CACd,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACtC,IAAMQ,EAAM,SAASX,CAAY,IAAIc,CAAQ,IAE7CV,EAAS,CACP,KAAM,QACN,IAAKO,EACL,KAAM,KAAK,UAAUV,CAAI,EACzB,QAASC,EACT,MAAOC,CACT,CAAC,CACH,CAAC,CACH,CACF,EAEOY,EAAQhB,EC5GO,IAAqBiB,EAArB,KAAkC,CACrC,OAAkC,IAAI,IACtC,UAAuC,IAAI,IAC3C,mBACf,IAAI,IACE,UAAsD,CAAC,EACvD,eAA4C,CAAC,EAErD,aAAc,CAAC,CAER,4BAAmC,CACxC,OAAW,CAACC,EAAYC,CAAO,IAAK,KAAK,mBACvCA,EAAQ,KAAKD,CAAU,CAE3B,CAEO,kBACLA,EACAC,EACc,CACd,GAAI,CACF,YAAK,mBAAmB,IAAI,CAACD,EAAYC,CAAO,CAAC,EAC1C,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEO,cAAcC,EAAkBD,EAAgC,CACrE,OAAI,KAAK,OAAO,IAAIC,CAAK,GACvB,QAAQ,MAAM,oDAAqDA,CAAK,EACjE,KAET,KAAK,UAAU,IAAIA,EAAO,IAAI,GAAK,EACnC,KAAK,OAAO,IAAIA,EAAOD,CAAO,EACvB,GACT,CAEO,iBACLC,EACAC,EACc,CACd,GAAI,KAAK,OAAO,IAAID,CAAK,EAAG,CAC1B,IAAME,EAAuB,KAAK,UAAU,IAAIF,CAAK,GAAK,IAAI,IAC9D,OAAAE,EAAU,IAAID,CAAQ,EACtB,KAAK,UAAU,IAAID,EAAOE,CAAS,EAC5B,EACT,KACE,gBAAQ,MAAM,oCAAqCF,CAAK,EACjD,EAEX,CAEO,KAAKG,KAAyBC,EAAmB,CACtD,GAAI,KAAK,OAAO,IAAID,CAAS,EAAG,CAE9B,IAAMH,EAAiB,KAAK,OAAO,IAAIG,CAAS,EAC1CD,EAAmC,KAAK,UAAU,IAAIC,CAAS,EAErE,GAAI,CAACD,EAAW,OAEhB,QAAWD,KAAYC,EACrBF,EAAM,KAAKC,EAAU,GAAGG,CAAI,CAGhC,MACE,QAAQ,MAAM,qCAAsCD,CAAS,CAGjE,CAEO,cAAcF,EAAkC,CACrD,OAAW,CAACI,EAAQH,CAAS,IAAK,KAAK,UACjCA,EAAU,IAAID,CAAQ,GAAGC,EAAU,OAAOD,CAAQ,CAE1D,CAEO,iBACLK,EACAC,EAIM,CACN,GAAM,CAAE,cAAAC,EAAe,QAAAC,CAAQ,EAAIF,EACnCD,EAAS,QAAQE,EAAeC,CAAO,EACvC,KAAK,UAAU,KAAKH,CAAQ,CAC9B,CAEO,yBACLI,EACAP,EACAJ,EACM,CACNW,EAAQ,iBAAiBP,EAAWJ,CAAO,EAE3C,KAAK,eAAe,KAAK,CACvB,QAAAW,EACA,QAAAX,EACA,MAAOI,CACT,CAAC,CACH,CAEO,SAAgB,CAErB,KAAK,gBAAgB,QAASQ,GAAY,CACxCA,EAAQ,SAAS,oBAAoBA,EAAQ,MAAOA,EAAQ,OAAO,CACrE,CAAC,EACD,KAAK,eAAiB,CAAC,EAGvB,KAAK,WAAW,QAASL,GAAa,CACpCA,EAAS,WAAW,CACtB,CAAC,EACD,KAAK,UAAY,CAAC,EAElB,KAAK,OAAO,MAAM,EAElB,KAAK,mBAAmB,MAAM,EAE9B,KAAK,UAAU,MAAM,CACvB,CACF,EChIA,IAAqBM,EAArB,KAAuC,CAE7B,kBAER,IAAW,eAAeC,EAAyB,CACjD,KAAK,kBAAoBA,CAC3B,CAEA,YAAYC,EAAqB,CAK/B,GAHA,KAAK,qBAAuBA,EAGxBA,EAAO,UAAY,QAAS,CAC9B,IAAMC,EAAWD,EAAO,QAAQ,UAAU,EACtCC,IACF,KAAK,qBAAuBA,EAEhC,CAUA,GAP8B,CAC5B,OACA,QACA,WACA,SACA,OACF,EAC0B,SAASD,EAAO,OAAO,EAAG,CAClD,IAAME,EAAWF,EAAO,QAAQ,IAAI,EAChCE,IACF,KAAK,qBAAuBA,EAEhC,CAEA,KAAK,kBAAoB,KAAK,qBAAqB,MAAM,OAC3D,CAEO,MAAa,CAClB,KAAK,qBAAsB,MAAM,QAAU,MAC7C,CAEO,MAAa,CAClB,KAAK,qBAAsB,MAAM,QAAU,KAAK,iBAClD,CAEO,iBAAiBC,EAA2B,CACjDA,EAAa,KAAK,KAAK,EAAI,KAAK,KAAK,CACvC,CAEO,eAA8B,CACnC,OACE,OAAO,iBAAiB,KAAK,oBAAqB,EAAE,UAAY,QAChE,OAAO,iBAAiB,KAAK,oBAAqB,EAAE,aAClD,UACF,KAAK,qBAAsB,sBAAsB,EAAE,OAAS,GAC5D,KAAK,qBAAsB,sBAAsB,EAAE,MAAQ,CAE/D,CAEO,SAAgB,CACrB,KAAK,qBAAuB,KAC5B,KAAK,kBAAoB,IAC3B,CACF,EC1De,SAARC,EACLC,EACAC,EACA,CAEA,GAAI,OAAOD,GAAgB,SACzB,MAAM,IAAI,MACR,+DAA+D,OAAOA,CAAW,GACnF,EAEF,GAAIC,GAAa,OAAOA,GAAc,SACpC,MAAM,IAAI,MACR,6DAA6D,OAAOA,CAAS,GAC/E,EAGF,IAAMC,EAAO,SAAS,cAAc,MAAM,EAC1CA,EAAK,UAAU,IAAI,WAAW,EAE9B,IAAMC,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,UAAU,IAAI,KAAM,WAAY,gBAAgB,EACrDA,EAAK,aAAa,aAAc,MAAM,EACtCA,EAAK,MAAM,OAAS,UAEpB,IAAMC,EAAgB,SAAS,cAAc,KAAK,EAClDA,EAAc,UAAYJ,EAC1BI,EAAc,UAAU,IAAI,gBAAgB,EAE5CF,EAAK,YAAYC,CAAI,EACrBD,EAAK,YAAYE,CAAa,EAE1BH,GACF,OAAO,OAAOE,EAAK,MAAOF,CAAS,EAIrC,IAAMI,EAAiB,IAAM,CAC3BD,EAAc,MAAM,QAAU,QAE9B,IAAME,EAAaF,EAAc,sBAAsB,EACjDG,EAAgB,OAAO,WAE7B,GAAID,EAAW,MAAQC,EAAe,CACpC,IAAMC,EAAiBF,EAAW,MAAQC,EAC1CH,EAAc,MAAM,KAAO,cAAcI,CAAc,KACzD,CAEA,GAAIF,EAAW,KAAO,EAAG,CACvB,IAAME,EAAiB,KAAK,IAAIF,EAAW,IAAI,EAC/CF,EAAc,MAAM,KAAO,cAAcI,CAAc,KACzD,CACF,EAGA,OAAAN,EAAK,iBAAiB,aAAc,IAAM,CACxCG,EAAe,CACjB,CAAC,EAEDH,EAAK,iBAAiB,aAAeO,GAAU,CAE7C,IAAMC,EAAgBD,EAAM,cACvBP,EAAK,SAASQ,CAAa,IAC9BN,EAAc,MAAM,QAAU,OAElC,CAAC,EAGDD,EAAK,iBAAiB,aAAeM,GAAU,CAC7CA,EAAM,eAAe,EACrBL,EAAc,MAAM,QAClBA,EAAc,MAAM,UAAY,QAAU,OAAS,QACjDA,EAAc,MAAM,UAAY,SAClCC,EAAe,CAEnB,CAAC,EAED,SAAS,KAAK,iBAAiB,QAAUI,GAAiB,CACnDP,EAAK,SAASO,EAAM,MAAc,IACrCL,EAAc,MAAM,QAAU,OAElC,CAAC,EAEDA,EAAc,MAAM,QAAU,OACvBF,CACT,CCtEe,SAARS,EACLC,EACAC,EAA2B,SAC3BC,EAAoB,GACpBC,EACsC,CAEtC,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CAEtC,GAAIH,EAAU,CAEZ,IAAII,EACEC,EAAkC,CAAC,EACnCC,EAAgC,IAAI,IAE1C,GAAIL,EAAe,EACjB,OAAOC,EACU,MAAM,KAAKH,EAAK,iBAAyBD,CAAM,CAAC,CACjE,EAEF,IAAMS,EAAW,IAAI,iBAAiB,IAAM,CAExC,MAAM,KAAKR,EAAK,iBAAyBD,CAAM,CAAC,EAI5C,QAASU,GAAY,CACpBF,EAAY,IAAIE,CAAO,IAC1BF,EAAY,IAAIE,CAAO,EACvBH,EAAiB,KAAKG,CAAO,EAEjC,CAAC,EAGD,aAAaJ,CAAO,EACpBA,EAAU,WAAW,IAAM,CAErBC,EAAiB,OAAS,GAC5BE,EAAS,WAAW,EACpBL,EAAQG,CAAgB,GAExBF,EACE,IAAI,MACF,mCAAmCL,CAAM,YACvCG,EAAe,GACjB,+FACF,CACF,CAEJ,EAAGA,CAAY,CACjB,CAAC,EAEDM,EAAS,QAAQR,EAAM,CACrB,UAAW,GACX,QAAS,GACT,WAAY,EACd,CAAC,CAEH,KAAO,CAEL,IAAMQ,EAAW,IAAI,iBAAiB,IAAM,CAC1C,IAAME,EAA+BV,EAAK,cAAsBD,CAAM,EAClEW,IACF,aAAaL,CAAO,EACpBG,EAAS,WAAW,EACpBL,EAAQO,CAAe,EAE3B,CAAC,EACKL,EAAU,WAAW,IAAM,CAC/BG,EAAS,WAAW,EACpBJ,EACE,IAAI,MACF,iCAAiCL,CAAM,YACrCG,EAAe,GACjB,8FACF,CACF,CACF,EAAGA,CAAY,EAETO,EAAuBT,EAAK,cAAsBD,CAAM,EAC9D,GAAIU,EACF,oBAAaJ,CAAO,EACbF,EAAQM,CAAO,EAGxBD,EAAS,QAAQR,EAAM,CACrB,QAAS,GACT,WAAY,GACZ,UAAW,EACb,CAAC,CAEH,CAEF,CAAC,CAEH,CCjHA,IAAMW,EAAN,cAA0B,KAAM,CACvB,KACP,YAAYC,EAAwBC,EAAiB,CACnD,MAAMA,CAAO,EAEb,KAAK,KAAOD,EAEZ,OAAO,eAAe,KAAM,WAAW,SAAS,EAE5C,MAAM,mBACR,MAAM,kBAAkB,KAAM,KAAK,WAAW,CAElD,CACF,EAEME,EAAN,cAAkCH,CAAY,CAC5C,YAAYC,EAAwBG,EAAe,CACjD,MACEH,EACA,kEAAkEA,EAAK,MAAM,QAAQG,CAAK,EAC5F,CACF,CACF,EAEMC,EAAN,cAAgCL,CAAY,CAC1C,YAAYC,EAAwB,CAClC,MAAMA,EAAM,2CAA2CA,EAAK,MAAM,EAAE,CACtE,CACF,EAEMK,EAAN,cAA2CN,CAAY,CACrD,YAAYC,EAAwB,CAClC,MAAMA,EAAM,oCAAoC,CAClD,CACF,EAEMM,EAAN,cAAgCP,CAAY,CAC1C,YAAYC,EAAwB,CAClC,MAAMA,EAAM,2CAA2CA,EAAK,MAAM,EAAE,CACtE,CACF,EAEMO,EAAN,cAAiCR,CAAY,CAC3C,YAAYC,EAAwB,CAClC,MACEA,EACA,+EACF,CACF,CACF,EAEMQ,EAAN,cAAiCT,CAAY,CAC3C,YAAYC,EAAwB,CAClC,MAAMA,EAAM,2CAA2CA,EAAK,MAAM,EAAE,CACtE,CACF,EAEMS,EAAN,cAAsCV,CAAY,CAChD,YACEC,EACAU,EACAC,EACAC,EACAC,EACA,CACA,IAAMC,EAAcF,EAAc,KAAK,MAAM,EAE7C,MACEZ,EACA,GAAGU,CAAY,YAAYC,CAAO,kBAAkBG,CAAW,eAC7DD,IAAiB,KAAO,OAAS,OAAOA,CAC1C,EACF,CACF,CACF,EAEME,EAAS,CACb,kBAAAX,EACA,oBAAAF,EACA,6BAAAG,EACA,kBAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,wBAAAC,CACF,EAEOO,EAAQD,ECxFR,IAAME,EAAe,OAAO,MAAM,EAC5BC,EAAkB,OAAO,SAAS,ECGxC,IAAMC,EAAa,CACxB,SAAU,QACV,MAAO,QACP,OAAQ,SACR,KAAM,QACN,QAAS,OACX,ECDA,IAAqBC,EAArB,MAAqBC,CAAiB,CAEpC,OAAO,UAAgC,CAAC,EAMjC,OACA,YACA,KAEG,UACA,SAOV,IAAW,OAAQ,CACjB,OAAO,KAAK,aAAc,KAC5B,CAEA,IAAW,MAAMC,EAAU,CACzB,KAAK,aAAc,SAASA,CAAQ,CACtC,CAEA,IAAW,SAAU,CACnB,OAAO,KAAK,aAAc,OAC5B,CAEA,IAAW,eAAeA,EAAyB,CACjD,KAAK,kBAAmB,eAAiBA,CAC3C,CAUO,kBACA,aACA,aAsBW,YAChBC,EACAC,EAAgB,SAAS,KACzBC,EACA,CACA,KAAK,OAASF,EACd,KAAK,YAAc,KAAK,oBAAoBA,CAAM,EAClD,KAAK,KAAOC,EACZ,KAAK,UAAYC,EACjB,KAAK,SAAW,EAGlB,CAEA,MAAiBC,CAAI,GAAmB,CAYtC,GAXI,KAAK,kBAAkB,YACzB,KAAK,QAAU,KAAK,OAEpB,KAAK,QAAW,MAAMC,EACpB,KAAK,OACL,KAAK,KACL,GACA,KAAK,SACP,EAGE,CAAC,KAAK,QACR,MAAM,IAAIC,EAAO,kBAAkB,IAAI,EAGzC,KAAK,aAAe,IAAIC,EACxB,KAAK,kBAAoB,IAAIC,EAAkB,KAAK,OAAO,CAC7D,CAEU,oBAAoBP,EAAkC,CAC9D,GAAI,OAAOA,GAAW,SAAU,MAAO,GAEvC,IAAMQ,EAAeR,EAAO,MAAM,cAAc,EAChD,GAAI,CAACQ,EAAc,OAAOR,EAAO,QAAQ,WAAY,EAAE,EAEvD,IAAMS,EAAUD,EAAa,CAAC,EAE9B,OADmBC,EAAQ,MAAM,kBAAkB,IAC9B,CAAC,GAAKA,GAAS,QAAQ,WAAY,EAAE,CAC5D,CAMU,YAAmB,CAC3B,GAAI,CAAC,KAAK,oBAAoB,KAAK,OAAO,EAAG,OAE7C,KAAK,YAAY,EACjB,IAAMC,EAAY,KAAK,oBAAoB,EAC3C,KAAK,aAAc,yBACjB,KAAK,QACLA,EACA,KAAK,YAAY,KAAK,IAAI,CAC5B,EAEI,KAAK,aAAa,GACpB,KAAK,UAAU,KAAK,OAA2B,CAEnD,CAEU,qBAAiD,CACzD,OAAI,KAAK,mBAAmB,kBAA0B,SAClD,KAAK,mBAAmB,oBAA4B,QAClD,KAAK,mBAAmB,iBAG5BC,EAAW,KAAK,QAAQ,KAAK,YAAY,CAA4B,GACrEA,EAAW,QAJ2CA,EAAW,OAMrE,CAEU,cAAwB,CAChC,OACE,KAAK,mBAAmB,kBACxB,KAAK,QAAQ,QAAQ,OAAS,MAElC,CAEU,oBAAoBC,EAA0C,CACtE,OACEA,aAAmB,kBACnBA,aAAmB,mBACnBA,aAAmB,qBACnBA,aAAmB,iBACnBA,aAAmB,mBACnBA,aAAmB,mBAEvB,CAEA,MAAgB,UAAUA,EAA0C,CAClE,IAAMC,EAAgBD,EAAQ,cAC9B,GAAI,CAACC,EACH,MAAM,IAAI,aAAa,uCAAuC,EAGhE,IAAMC,EAAY,MAAMV,EACtB,qBACAS,EACA,GACA,IACF,EAEA,KAAK,aAAc,yBACjBC,EACA,SACA,KAAK,YAAY,KAAK,IAAI,CAC5B,CACF,CAEU,cAAe,CACvB,IAAMC,EAAY,OAAO,eAAe,IAAI,EAE5C,QAAWC,KAAO,OAAO,oBAAoBD,CAAS,EAEnD,CACD,IAAME,EAAQ,KAAKD,CAAG,EAGlBA,IAAQ,eAAiB,OAAOC,GAAU,aAC5C,KAAKD,CAAG,EAAIC,EAAM,KAAK,IAAI,EAE/B,CACF,CAEA,CAAWC,CAAO,GAAU,CAE1B,KAAK,SAAW,GAChB,KAAK,MAAQ,KAEb,KAAK,aAAc,QAAQ,EAC3B,KAAK,aAAe,KACpB,KAAK,kBAAmB,QAAQ,EAChC,KAAK,kBAAoB,KACzB,KAAK,aAAc,QAAQ,EAC3B,KAAK,aAAe,IACtB,CAMA,MAAa,YAAY,EAA0B,CAC7C,GAAK,CAAC,EAAE,YACZ,MAAM,KAAK,aAAc,YAAY,CAAC,EACtC,KAAK,0BAA0B,EACjC,CAEU,2BAAkC,CAC1C,KAAK,aAAc,2BAA2B,CAChD,CAUO,GACLR,EACAS,EACkB,CAClB,GAAI,OAAOA,GAAiB,WAC1B,MAAM,IAAId,EAAO,wBACf,KACA,KACA,eACA,CAAC,UAAU,EACX,OAAOc,CACT,EAGF,YAAK,aAAc,yBACjB,KAAK,QACLT,EACAS,EAAa,KAAK,IAAI,CACxB,EAEO,IACT,CAMO,MAAyB,CAC9B,YAAK,kBAAmB,KAAK,EACtB,IACT,CAMO,MAAyB,CAC9B,YAAK,kBAAmB,KAAK,EACtB,IACT,CAOO,iBACLC,EACkB,CAClB,IAAMC,EACJD,aAAsB,SAAWA,EAAW,KAAK,IAAI,EAAIA,EAE3D,YAAK,kBAAmB,iBAAiBC,CAAI,EACtC,IACT,CASO,SAASJ,EAA4C,CAC1D,OAAIA,aAAiB,WACnBA,EAAQA,EAAM,GAEhB,KAAK,aAAc,SAASA,CAAK,EAE1B,IACT,CAMO,SAA4B,CACjC,OAAC,KAAK,QAA6B,SAAW,GACvC,IACT,CAOO,YAAmB,CACxB,KAAK,aAAc,WAAW,EAG1B,KAAK,aAAa,GACpB,KAAK,0BAA2BK,GAAUA,EAAM,WAAW,CAAC,CAEhE,CAEU,cAA0C,CAIlD,IAAMC,EAHyB,MAAM,KACnC,KAAK,QAAQ,iBAAiB,yBAAyB,CACzD,EACuC,IAAKC,GACnCA,EAAM,EACd,EAEKC,EAAW3B,EAAiB,UAAU,OAAQ4B,GAC3CH,EAAS,SAASG,EAAI,QAAQ,EAAE,CACxC,EAED,OAAOD,EAAS,OAAS,EAAIA,EAAW,IAC1C,CAEU,0BACRE,EACM,CAEN,IAAMF,EAAsC,KAAK,aAAa,EAC9D,GAAI,CAACA,EAAU,CACb,QAAQ,MAAM,qCAAsC,IAAI,EACxD,MACF,CAEA,QAAWH,KAASG,EAClBE,EAASL,CAAK,CAElB,CAMO,QAA2B,CAChC,OAAC,KAAK,QAA6B,SAAW,GACvC,IACT,CAMO,WAAWM,EAA2C,CAC3D,YAAK,QAAQ,QAAQ,GAAGA,CAAQ,EACzB,IACT,CAOO,UAAUA,EAA2C,CAC1D,YAAK,QAAQ,OAAO,GAAGA,CAAQ,EACxB,IACT,CAOO,UAAUA,EAA2C,CAC1D,YAAK,QAAQ,OAAO,GAAGA,CAAQ,EACxB,IACT,CAOO,SAASA,EAA2C,CACzD,YAAK,QAAQ,MAAM,GAAGA,CAAQ,EACvB,IACT,CAMO,UAA+B,CACpC,IAAMC,EACH,SAAS,cAAc,IAAI,KAAK,QAAQ,EAAE,QAAQ,GACnD,KACF,GAAI,CAACA,EAAO,MAAM,IAAIxB,EAAO,mBAAmB,IAAI,EACpD,OAAOwB,CACT,CAQO,gBACLC,EACAC,EACkB,CAClB,YAAK,SAAS,GAAG,OACfC,EAAaF,EAAWC,GAAkB,MAAS,CACrD,EACO,IACT,CAQO,WACLD,EACAC,EACkB,CAClB,YAAK,OAAOC,EAAaF,EAAWC,GAAkB,MAAS,CAAC,EACzD,IACT,CAOO,aAAaE,EAAgB,CAClC,YAAK,QAAQ,UAAYA,EAClB,IACT,CAMO,QAAS,CACd,YAAK,QAAQ,OAAO,EACb,IACT,CAOO,SAASC,EAA6C,CAC3D,GAAIA,IAAY,MAAQ,OAAOA,GAAY,SACzC,MAAM,IAAI7B,EAAO,wBACf,KACA,WACA,UACA,CAAC,8BAA8B,EAC/B,OAAO6B,CACT,EAIF,cAAO,QAAQA,CAAO,EAAE,QAAQ,CAAC,CAACC,EAAMlB,CAAK,IAAM,CAE7CA,IAAU,SAGX,KAAK,QAAQ,MAAckB,CAAI,EAAIlB,EAExC,CAAC,EAEM,IACT,CASO,kBACLmB,EACAC,EACkB,CAClB,GAAI,CAEF,GAAID,EAAK,cAAe,CAEtB,IAAME,EADYF,EAAK,cACQ,KAAK,IAAI,EACxC,KAAK,iBAAiBE,CAAY,CACpC,CAGA,GAAIF,EAAK,gBAAiB,CACxB,GAAM,CAAE,WAAAG,EAAY,QAAAC,CAAQ,EAAIJ,EAAK,gBAAgB,EAGrD,GAAI,OAAO,gBAAoB,IAC7B,MAAM,IAAI/B,EAAO,6BAA6B,IAAI,EAGpD,IAAIoC,EAAoC,IAAM,GAE1CF,GAAcC,EAChBC,EAAqB,IAAM,CACzB,IAAMC,EAAkBH,EAAW,KAAK,IAAI,EACtCI,EAAiB,KAAK,kBAAmB,cAAc,EAI7D,MACE,CAACD,GACAC,GAAkBH,EAAQ,KAAK,KAAME,CAAe,CAEzD,EACSF,EACTC,EAAqB,IACI,KAAK,kBAAmB,cAAc,GAGpCD,EAAQ,KAAK,IAAI,EAEnCD,IACTE,EAAqB,IACI,KAAK,kBAAmB,cAAc,GAGpCF,EAAW,KAAK,IAAI,GAIjD,KAAK,iBAAiBE,CAAkB,CAC1C,CAGA,GAAIL,EAAK,SAAU,CACjB,GAAI,CAAE,UAAAQ,EAAW,MAAA3B,CAAM,EAAImB,EAAK,SAAS,EACrCnB,aAAiB,WAAUA,EAAQA,EAAM,GACzC2B,EAAU,KAAK,IAAI,GACrB,KAAK,SAAS,KAAK,KAAM3B,CAAK,CAElC,CAGImB,EAAK,cACWA,EAAK,YACb,KAAK,IAAI,EAAI,KAAK,QAAQ,EAAI,KAAK,OAAO,GAGtD,IAAMS,EACJ,KAAK,2BAA2BT,CAAI,EACtC,OAAAS,EAAQ,EAGJR,EAAa,QACf,KAAK,6BAA6BQ,EAASR,CAAY,EAGlD,IACT,OAASS,EAAO,CACd,MAAIA,aAAiB,MAAaA,EACvB,IAAIzC,EAAO,kBAAkB,IAAI,CAC9C,CACF,CAEU,2BACR+B,EACqB,CACrB,MAAO,IAAY,CACjB,IAAIW,EAAuB,GAC3B,GAAIX,EAAK,cAAe,CACtB,IAAMY,EAAsBZ,EAAK,cACjCW,EAAcA,GAAe,CAACC,EAAoB,KAAK,IAAI,EAC3D,KAAK,iBAAiBA,EAAoB,KAAK,IAAI,CAAC,CACtD,CACA,GAAIZ,EAAK,iBAAmBA,EAAK,gBAAgB,EAAE,WAAY,CAC7D,GAAM,CAAE,WAAAG,CAAW,EAAIH,EAAK,gBAAgB,EAC5C,KAAK,iBAAiBG,EAAY,KAAK,IAAI,CAAC,CAC9C,CACA,GAAIH,EAAK,SAAU,CACjB,GAAM,CAAE,UAAAQ,EAAW,MAAA3B,CAAM,EAAImB,EAAK,SAAS,EACvCQ,EAAU,KAAK,IAAI,GAAG,KAAK,SAAS,KAAK,KAAM3B,CAAK,CAC1D,CACImB,EAAK,cACmBA,EAAK,YACb,KAAK,IAAI,EAAI,KAAK,QAAQ,EAAI,KAAK,OAAO,GAG1DW,GAAe,CAACX,EAAK,UACvB,KAAK,WAAW,EAGlB,KAAK,0BAA0B,CACjC,CACF,CAEU,iBAAiBK,EAAyC,CAClE,IAAMQ,GAAoB,IAAM,CAC9B,IAAIpB,EAAa,KAAK,SAAS,EAC/B,GAAI,CAACA,EACH,MAAM,IAAIxB,EAAO,mBAAmB,IAAI,EAE1C,OAAAwB,EAAQA,EAAM,UACVA,EAAM,OAAS,KACjBA,EAAQA,EAAM,UAAU,EAAG,EAAE,EAAI,OAE5BA,CACT,GAAG,EAEGqB,EAAc,GAAG,KAAK,QAAQ,EAAE,YAEhCC,EAAe,SAAS,cAAc,MAAM,EAUlD,GATAA,EAAa,MAAM,QAAU,OAC7BA,EAAa,GAAKD,EAElB,OAAO,OAAOC,EAAc,CAC1B,kBAAmB,KAAK,QAAQ,GAChC,aAAc,aAAa,KAAK,QAAQ,EAAE,WAAWF,CAAgB,2BACrE,mBAAoBR,CACtB,CAAC,EAEG,iBAAmB,KACrB,MAAM,IAAIpC,EAAO,6BAA6B,IAAI,EAEpD,gBAAgB,KAAK8C,CAAY,CACnC,CASU,6BACRN,EACAR,EACM,CACN,GAAIA,EAAa,OAAS,EAAG,CAC3B,QAAQ,MACN,oDAAoD,KAAK,QAAQ,EAAE,2EAErE,EACA,MACF,CAEAA,EAAa,QAASe,GAAe,CACnC,GAAI,CAACA,GAAc,EAAEA,aAAsBtD,GACzC,MAAM,IAAI,UACR,2DACF,EAIF,GAAIsD,EAAW,cAAgB,KAAK,YAClC,MAAM,IAAI/C,EAAO,mBAAmB,IAAI,EAK1C+C,EAAW,aAAc,kBAAkB,KAAMP,EAAQ,KAAK,IAAI,CAAC,CACrE,CAAC,CACH,CASO,iBACLN,EACkB,CAClB,OAAIA,aAAsB,UACxBA,EAAW,EACP,KAAK,SAAS,GAAG,UAAU,IAAI,gBAAgB,EAC/C,KAAK,SAAS,GAAG,UAAU,OAAO,gBAAgB,EAC/C,OAEPA,EACI,KAAK,SAAS,GAAG,UAAU,IAAI,gBAAgB,EAC/C,KAAK,SAAS,GAAG,UAAU,OAAO,gBAAgB,EAC/C,KAEX,CASO,WAAWZ,EAAoD,CACpE,GAAI,KAAK,SAAU,CACjBA,EAAS,IAAI,EACb,MACF,CAEA,GAAI,KAAK,kBAAkB,YAAa,CACtCA,EAAS,IAAI,EACb,MACF,CACA,IAAM0B,EAAW,IAAI,iBACnB,UAAkC,CAC5B,SAAS,cAAc,KAAK,MAAgB,IAC9CA,EAAS,WAAW,EACpB,KAAK,SAAW,GAChB1B,EAAS,IAAI,EAEjB,EAAE,KAAK,IAAI,CACb,EAEA,KAAK,aAAc,iBAAiB0B,EAAU,CAC5C,cAAe,SAAS,KACxB,QAAS,CAAE,QAAS,GAAM,UAAW,EAAK,CAC5C,CAAC,CACH,CACF,ECzuBA,IAAqBC,EAArB,cAAmCC,CAAiB,CAIxC,UAA8B,KAGxC,YACEC,EACAC,EACAC,EAAgB,SAAS,KACzBC,EACAC,EACA,CACA,MAAMH,EAAQC,EAAMC,CAAS,EAE7B,KAAK,YAAcH,EACnB,KAAK,UAAYI,CACnB,CAEA,MAAcC,CAAI,GAAmB,CAMnC,GAAI,CACF,MAAM,MAAMA,CAAI,EAAE,EAElB,KAAK,aAAe,IAAIC,EAAa,IAAI,EAEzC,KAAK,WAAW,EAGhB,KAAK,aAAa,EAGlB,IAAMC,EAAW,IAAI,iBAAkBC,GAAc,CACnD,QAAWC,KAAYD,EACrB,GAAI,MAAM,KAAKC,EAAS,YAAY,EAAE,SAAS,KAAK,OAAO,EAAG,CAC5D,KAAKC,CAAO,EAAE,EACdH,EAAS,WAAW,EACpB,KACF,CAEJ,CAAC,EAEDA,EAAS,QAAQ,SAAS,KAAM,CAC9B,UAAW,GACX,QAAS,EACX,CAAC,EAEDR,EAAiB,UAAU,KAAK,IAAI,EAEpC,KAAK,SAAW,EAClB,OAASY,EAAO,CACd,IAAMC,EACJD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACvD,MAAM,IAAIE,EAAO,oBAAoB,KAAMD,CAAY,CACzD,CACF,CAEA,CAAUF,CAAO,GAAU,CACzB,MAAMA,CAAO,EAAE,EACf,KAAK,YAAc,MACrB,CACF,EC3DA,IAAqBI,EAArB,KAAkC,CACzB,MACA,QAAwB,GACvB,QACA,QACA,SAEA,QAAmB,GAE3B,YAAYC,EAA4B,CAClCA,aAAoBC,IACtB,KAAK,QAAUD,EAAS,QACxB,KAAK,SAAWA,EAAS,UAE3B,KAAK,QAAUA,EAAS,QACxB,KAAK,QAAUA,aAAoBE,CACrC,CAEO,SAASC,EAAkB,CAChC,IAAMC,EAAiB,KAAK,eAAeD,CAAK,EAE5C,KAAK,oBAAoBD,GAAS,KAAK,mBAAmBA,GAC3D,KAAK,SAAS,QAA6B,QAAU,EAAQC,EAC7D,KAAK,QAAQ,QAA6B,QAAkB,CAACA,EAC9D,KAAK,MAAQA,EACZ,KAAK,QAA6B,QAAU,EAAQA,EACpD,KAAK,QAA6B,MAAQA,GAE3C,KAAK,SACJ,KAAK,QAA6B,OAAS,SAE3C,KAAK,QAA6B,QAAUA,EAC7C,KAAK,QAAUA,EACf,KAAK,aAAa,YAAY,GAE7B,KAAK,QAA6B,MAAQC,EAG7C,KAAK,MAAQA,CACf,CAEA,MAAa,YAAY,EAA0B,CAC7C,GACF,EAAE,gBAAgB,EAGhB,KAAK,oBAAoBF,GAAS,KAAK,mBAAmBA,IAC5D,KAAK,SAAU,YAAY,EAC3B,KAAK,QAAS,YAAY,GAG5B,IAAMG,EAAe,MAAM,KAAK,gBAAgB,EAChD,KAAK,MAAQA,EAAa,MAEtBA,EAAa,UAAY,SAC3B,KAAK,QAAUA,EAAa,QAEhC,CAEO,iBAAyC,CAC9C,OAAO,IAAI,QAASC,GAAY,CAC9B,IAAMC,EAAQ,KAAK,QACbC,EAAS,KAAK,QAEhB,KAAK,oBAAoBN,GAAS,KAAK,mBAAmBA,GAC5DI,EAAQ,CACN,MAAO,KAAK,SAAS,QACrB,QAAS,KAAK,SAAS,OACzB,CAAC,EAGH,IAAIG,EAA4B,CAC9B,MAAO,IACT,EACA,OAAQF,EAAM,KAAM,CAClB,IAAK,WACL,IAAK,QACHD,EAAQ,CACN,MAAOC,EAAM,QACb,QAASA,EAAM,OACjB,CAAC,EACD,MACF,IAAK,kBACHD,EAAQ,CACN,MAAO,MAAM,KAAKE,EAAO,eAAe,EAAE,IACvCE,GAAWA,EAAO,KACrB,CACF,CAAC,EACD,MAEF,IAAK,aACHJ,EAAQ,CACN,MAAOE,EAAO,KAChB,CAAC,EACD,MAEF,IAAK,SACHF,EAAQ,CACN,MAAOC,EAAM,QAAU,GAAK,OAAOA,EAAM,KAAK,EAAI,IACpD,CAAC,EACD,MAEF,QAAS,CACP,IAAII,EAA8BJ,EAAM,MACpC,KAAK,QAAS,UAAU,SAAS,SAAS,IAC5CI,EAAa,WAAWJ,EAAM,MAAM,QAAQ,QAAS,EAAE,EAAE,KAAK,CAAC,GAGjEE,EAAc,CACZ,MAAOE,CACT,CACF,CACF,CAEAF,EAAc,CACZ,GAAGA,EACH,MAAO,KAAK,eAAeA,EAAY,KAAK,CAC9C,EAEAH,EAAQG,CAAW,CACrB,CAAC,CACH,CAEU,eAAeN,EAAiB,CACxC,OAAI,OAAOA,GAAU,WAAaA,IAAU,QAAUA,IAAU,QACvDA,IAAU,IAAQA,IAAU,OAKnC,KAAK,mBAAmB,mBACtB,KAAK,QAA6B,OAAS,QAC3C,CAAE,KAAK,QAA6B,UAAU,SAAS,SAAS,GAMhEA,IAAU,MAAQA,IAAU,IAI3B,MAAM,OAAOA,CAAK,CAAC,EAHfA,EAIA,OAAOA,CAAK,CAIvB,CAEO,YAAmB,CACxB,GAAI,CACF,IAAMS,EAAU,KAAK,QAErB,GAAIA,aAAmB,iBACrB,OAAQA,EAAQ,KAAK,YAAY,EAAG,CAClC,IAAK,WACL,IAAK,QACHA,EAAQ,QAAU,GAClB,KAAK,QAAU,GACf,KAAK,MAAQ,GACb,MAEF,IAAK,SACHA,EAAQ,MAAQ,GAChB,KAAK,MAAQ,KACb,MAEF,QACEA,EAAQ,MAAQ,GAChB,KAAK,MAAQ,KACb,KACJ,MACSA,aAAmB,kBACxBA,EAAQ,UACV,MAAM,KAAKA,EAAQ,OAAO,EAAE,QACzBF,GAAYA,EAAO,SAAW,EACjC,EACA,KAAK,MAAQ,OAEbE,EAAQ,cAAgB,GACxB,KAAK,MAAQ,MAENA,aAAmB,qBAC5BA,EAAQ,MAAQ,GAChB,KAAK,MAAQ,MAEb,KAAK,MAAQ,IAEjB,OAASC,EAAO,CACd,IAAMC,EAAe,mDAAmD,IAAI,MAC1ED,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CACvD,GACA,MAAM,IAAI,MAAMC,CAAY,CAC9B,CACF,CAEO,SAAgB,CACrB,KAAK,MAAQ,KACb,KAAK,QAAU,GACf,KAAK,QAAU,KACf,KAAK,QAAU,OACf,KAAK,SAAW,OAChB,KAAK,QAAU,EACjB,CACF,EClNA,IAAqBC,EAArB,MAAqBC,UAA0BC,CAAiB,CAuB5C,YAChBC,EACAC,EAAgB,SAAS,KACzBC,EACA,CACA,MAAMF,EAAQC,EAAMC,CAAS,CAC/B,CAGA,MAAcC,CAAI,GAAmB,CAMnC,GAAI,CACF,MAAM,MAAMA,CAAI,EAAE,EAGhB,KAAK,QAAQ,IACb,KAAK,QAAQ,iBACX,IAAI,KAAK,QAAQ,EAAE,wBACrB,EAAE,OAAS,GAEX,MAAM,KAAK,oBAAoB,EAGjC,KAAK,aAAe,IAAIC,EAAa,IAAI,EAEzC,KAAK,WAAW,EAGhB,KAAK,aAAa,EAGlB,IAAMC,EAAW,IAAI,iBAAkBC,GAAc,CACnD,QAAWC,KAAYD,EACrB,GAAI,MAAM,KAAKC,EAAS,YAAY,EAAE,SAAS,KAAK,OAAO,EAAG,CACxD,OAAO,KAAKC,CAAO,GAAM,YAAY,KAAKA,CAAO,EAAE,EACvDH,EAAS,WAAW,EACpB,KACF,CAEJ,CAAC,EAEDA,EAAS,QAAQ,SAAS,KAAM,CAC9B,UAAW,GACX,QAAS,EACX,CAAC,EAEDP,EAAkB,UAAU,KAAK,IAAI,EAErC,KAAK,SAAW,EAClB,OAASW,EAAO,CACd,IAAMC,EACJD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACvD,MAAM,IAAIE,EAAO,oBAAoB,KAAMD,CAAY,CACzD,CACF,CAEA,MAAgB,qBAAqC,CACnD,GAAI,CAAC,KAAK,QAAS,CACjB,QAAQ,MACN,6DACA,KAAK,MACP,EACA,MACF,CAEA,KAAK,SAAW,IAAIE,EAClB,KACA,iCACA,KAAK,QACL,EACA,QACF,EAEA,KAAK,QAAU,IAAIA,EACjB,KACA,iCACA,KAAK,QACL,EACA,OACF,EAEA,MAAM,KAAK,SAAST,CAAI,EAAE,EAC1B,MAAM,KAAK,QAAQA,CAAI,EAAE,CAC3B,CAEgB,YAAmB,CAE7B,KAAK,oBAAoBS,GAAS,KAAK,mBAAmBA,IAC5D,KAAK,SAAS,WAAW,EACzB,KAAK,QAAQ,WAAW,GAE1B,MAAM,WAAW,CACnB,CAMO,eAAkC,CACvC,OACE,KAAK,oBAAoBb,GACzB,KAAK,mBAAmBA,GAEvB,KAAK,SAAS,QAA6B,QAAU,GACrD,KAAK,QAAQ,QAA6B,QAAU,IAErD,QAAQ,MACN,wEACF,EAEK,IACT,CAEA,CAAWS,CAAO,GAAU,CAC1B,MAAMA,CAAO,EAAE,EAEf,KAAK,WAAWA,CAAO,EAAE,EACzB,KAAK,UAAUA,CAAO,EAAE,EACxB,KAAK,SAAW,OAChB,KAAK,QAAU,MACjB,CACF,ECxJA,IAAqBK,EAArB,cAAoD,KAAyB,CAI3E,SAAsC,CACpC,YAAK,QAASC,GAAgCA,EAAS,KAAK,CAAC,EACtD,IACT,CAMA,SAAsC,CACpC,YAAK,QAASA,GAAgCA,EAAS,KAAK,CAAC,EACtD,IACT,CACF,ECPe,SAARC,EACLC,EACuD,CACvD,IAAMC,EAAgB,IAAIC,EAAuB,GAAGF,CAAK,EAEzD,OAAO,IAAI,MAAMC,EAAe,CAC9B,IAAIE,EAAQC,EAAuBC,EAAU,CAE3C,GAAID,KAAQD,EACV,OAAO,QAAQ,IAAIA,EAAQC,EAAMC,CAAQ,EAI3C,GAAI,OAAOD,GAAS,SAClB,OAAOD,EAAO,KACXG,GACCA,EAAS,OAAO,SAAS,EAAE,QAAQ,WAAY,EAAE,IAAMF,GACvDE,EAAS,cAAgBF,CAC7B,CAIJ,CACF,CAAC,CACH,CCoEA,eAAOG,EACLC,EACAC,EAA2B,CACzB,SAAU,GACV,KAAM,SAAS,KACf,UAAW,CACb,EACqD,CACrD,GAAI,CACF,GAAI,OAAOA,GAAY,SACrB,MAAM,IAAI,UACR,uDAAuD,OAAOA,CAAO,GACvE,EAGFC,EAAgBD,CAAO,EACvB,GAAM,CAAE,SAAAE,EAAW,GAAO,KAAAC,EAAO,SAAS,KAAM,UAAAC,EAAY,CAAE,EAAIJ,EAKlE,GAFmB,OAAOE,GAAa,WAAaA,EAAS,EAAIA,EAEjD,CACd,GAAI,OAAOH,GAAW,SACpB,MAAM,IAAI,UACR,qFAAqF,OAAOA,CAAM,GACpG,EAGF,IAAMM,EACJ,MAAMC,EAAQP,EAAQI,EAAM,GAAMC,CAAS,EAIvCG,EAA8C,MAAM,QAAQ,IAChEF,EAAS,IAAI,MAAOG,GAAY,CAC9B,IAAMC,EAAW,IAAIC,EAAkBF,EAASL,EAAMC,CAAS,EAC/D,aAAMK,EAASE,CAAI,EAAE,EACd,IAAI,MAAMF,EAAUG,EAAmB,CAAC,CACjD,CAAC,CACH,EACA,OAAOC,EAAaN,CAAmB,CACzC,CAEA,IAAME,EAAW,IAAIC,EAAkBX,EAAQI,EAAMC,CAAS,EAC9D,aAAMK,EAASE,CAAI,EAAE,EACd,IAAI,MAAMF,EAAUG,EAAmB,CAAC,CACjD,OAASE,EAAO,CACd,MAAIA,aAAiB,MAAaA,EACvB,IAAI,MAAM,qCAAuCf,CAAM,CACpE,CACF,CAEO,SAASE,EAAgBD,EAAmC,CACjE,GAAM,CAAE,SAAAE,EAAW,GAAO,KAAAC,EAAO,SAAS,KAAM,UAAAC,EAAY,CAAE,EAAIJ,EAClE,GAAI,OAAOE,GAAa,WAAa,OAAOA,GAAa,WACvD,MAAM,IAAI,UACR,uEAAuE,OAAOA,CAAQ,GACxF,EAEF,GAAI,OAAOA,GAAa,WAAY,CAClC,IAAMa,EAAQb,EAAS,EACvB,GAAI,OAAOa,GAAU,UACnB,MAAM,IAAI,UACR,8DAA8D,OAAOA,CAAK,GAC5E,CAEJ,CACA,GAAI,EAAEZ,aAAgB,aACpB,MAAM,IAAI,UACR,yDAAyD,OAAOA,CAAI,GACtE,EAEF,GAAI,OAAOC,GAAc,SACvB,MAAM,IAAI,UACR,uDAAuD,OAAOA,CAAS,GACzE,CAGJ,CAGO,SAASQ,GAAqB,CACnC,MAAO,CACL,IAAK,CAACb,EAA2BiB,IAA0B,CACzD,GAAIA,EAAK,SAAS,EAAE,WAAW,GAAG,EAAG,OAErC,IAAMD,EAAQhB,EAAgCiB,CAAI,EAClD,OAAI,OAAOD,GAAU,YAAcC,IAAS,aACnC,IAAIC,KACTlB,EAAO,WAAW,IAAMgB,EAAM,MAAMhB,EAAQkB,CAAI,CAAC,EAC1ClB,GAGJgB,CACT,CACF,CACF,CC1KA,eAAOG,EACLC,EACqE,CACrE,GAAI,CACF,IAAMC,EAAO,MAAMC,EAAI,UAAgB,cAAeF,CAAM,EACtD,CAAE,QAAAG,CAAQ,EAAIF,EAOdG,EADS,IAAI,UAAU,EACP,gBAAgBD,EAAS,iBAAiB,EAI1DE,EAAWC,EAAgBF,EAAO,qBAAqB,SAAS,CAAC,EACjEG,EAAWD,EAAgBF,EAAO,qBAAqB,SAAS,CAAC,EACjEI,EAAOF,EAAgBF,EAAO,qBAAqB,KAAK,CAAC,EAGzDK,EAAe,MAAM,QAAQ,IAAI,CAAC,GAAGJ,EAAU,GAAGE,EAAU,GAAGC,CAAI,CAAC,EAK1E,OAAOE,EACLD,EAAa,OAAQE,GAAkCA,IAAQ,IAAI,CACrE,CAEF,OAASC,EAAgB,CACvB,MAAIA,aAAiB,OACnB,QAAQ,MAAMA,EAAM,OAAO,EACrBA,IAEN,QAAQ,MAAMA,CAAK,EACb,IAAI,MAAM,OAAOA,CAAK,CAAC,EAEjC,CACF,CAEA,SAASN,EAAgBO,EAAoC,CAC3D,OAAO,MAAM,KAAKA,CAAO,EACtB,IAAKA,GAAY,CAEhB,IAAMC,EAAuBC,EAAwBF,EAAQ,OAAO,EAC9DG,EAAgBH,EAAQ,aAAaC,CAAoB,EAE/D,GAAI,CAACE,EAAe,OAAO,KAE3B,IAAMC,EAAiCC,EACrCL,EAAQ,QACRG,CACF,EACA,OAAKC,EAEEE,EAAIF,CAAe,EAAE,MAAOL,IACjC,QAAQ,KACN,mDAAmDI,CAAa,GAChEJ,CACF,EACO,KACR,EAR4B,IAS/B,CAAC,EACA,OAAO,OAAO,CACnB,CAEA,SAASG,EAAwBK,EAAyB,CACxD,OAAOA,IAAY,UACf,KACAA,IAAY,OAASA,IAAY,UACjC,OACA,IACN,CAEA,SAASF,EACPE,EACAJ,EACe,CACf,OAAII,IAAY,UAAkB,IAAIJ,CAAa,GAC/CI,IAAY,OAASA,IAAY,UAC5B,eAAeJ,CAAa,KAE9B,IACT",
|
|
4
|
+
"sourcesContent": ["// @ts-nocheck\r\n\r\n/**\r\n * Custom HTTP wrapper function that handles authentication for the call from within PowerPages for you, making it all the easier to make API calls with {@link API}\r\n */\r\nexport default function safeAjax(ajaxOptions) {\r\n const deferredAjax = $.Deferred();\r\n\r\n // shell is only available via runtime in a PowerPages portal\r\n\r\n shell\r\n .getTokenDeferred()\r\n .done(function (token) {\r\n // add headers for AJAX\r\n if (!ajaxOptions.headers) {\r\n $.extend(ajaxOptions, {\r\n headers: {\r\n __RequestVerificationToken: token,\r\n },\r\n });\r\n } else {\r\n ajaxOptions.headers[\"__RequestVerificationToken\"] = token;\r\n }\r\n $.ajax(ajaxOptions)\r\n .done(function (data, textStatus, jqXHR) {\r\n //eslint-disable-next-line\r\n validateLoginSession(data, textStatus, jqXHR, deferredAjax.resolve);\r\n })\r\n .fail(deferredAjax.reject); //AJAX\r\n })\r\n .fail(function () {\r\n deferredAjax.rejectWith(this, arguments); // on token failure pass the token AJAX and args\r\n });\r\n\r\n return deferredAjax.promise();\r\n}\r\n", "//@ts-nocheck\r\nimport safeAjax from \"../utils/safeAjax.ts\";\r\n\r\ninterface ODataJSON extends object {\r\n [key: `${string}@odata.bind` | string]: any;\r\n}\r\n\r\n/**\r\n * Provides abstract class `API` that allows basic create, read, and update operations in DataVerse via the PowerPages API\r\n * @method `createRecord` - Create a record in DataVerse\r\n * @method `getRecord<T>` - Get a record by ID from DataVerse\r\n * @method `getMultiple` - Get multiple records from DataVerse; with optional OData filtering\r\n * @method `updateRecord` - Update a record by ID in DataVerse\r\n */\r\nabstract class API {\r\n /**\r\n * @param tableSetName The dataverse set name for the table that you are updating a record in\r\n * @param data The JSON of the fields and data that are to be updated on the targeted record\r\n * @returns a Promise resolving the successful results *[record id]* of the POST request, or rejecting the failed results *[error]* of the POST request.\r\n */\r\n static createRecord(tableSetName: string, data: ODataJSON): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n safeAjax({\r\n type: \"POST\",\r\n url: `/_api/${tableSetName}`,\r\n data: JSON.stringify(data),\r\n contentType: \"application/json\",\r\n success: function (_response, _status, xhr) {\r\n resolve(xhr.getResponseHeader(\"entityid\"));\r\n },\r\n error: (error) => {\r\n reject(error);\r\n },\r\n });\r\n });\r\n }\r\n /**\r\n *\r\n * @param tableSetName The DataVerse SET name of the table being queried\r\n * @param recordID the GUID of the records to be retrieved\r\n * @param selectColumns *OPTIONAL* if desired, enter your own custom OData query for advanced GET results. Format = select=column1,column2,column3...\r\n * @returns a Promise resolving the successful results of the GET request, or rejecting the failed results of the GET request\r\n */\r\n static getRecord<T>(\r\n tableSetName: string,\r\n recordID: string,\r\n selectColumns?: string\r\n ): Promise<T> {\r\n return new Promise((resolve, reject) => {\r\n const url = `/_api/${tableSetName}(${recordID})${\r\n selectColumns ? `?$${selectColumns}` : \"\"\r\n }`;\r\n\r\n safeAjax({\r\n type: \"GET\",\r\n url: url,\r\n success: resolve,\r\n error: reject,\r\n });\r\n });\r\n }\r\n /**\r\n *\r\n * @param tableSetName The dataverse set name of the table being queried\r\n * @param queryParameters *OPTIONAL* the OData query parameters for refining search results: *format = $filter=filters&$select=columns*\r\n * @returns a Promise resolving the successful results of the GET request, or rejecting the failed results of the GET request\r\n */\r\n static getMultiple(\r\n tableSetName: string,\r\n queryParameters?: string\r\n ): Promise<Array<object>> {\r\n return new Promise((resolve, reject) => {\r\n // Construct the URL based on the presence of query parameters\r\n const url = `/_api/${tableSetName}${\r\n queryParameters ? `?${queryParameters}` : \"\"\r\n }`;\r\n\r\n safeAjax({\r\n type: \"GET\",\r\n url: url,\r\n success: function (response) {\r\n resolve(response.value);\r\n },\r\n error: reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n *\r\n * @param tableSetName The dataverse set name for the table that you are updating a record in\r\n * @param recordId The GUID of the record that is being updated\r\n * @param data The JSON of the fields and data that are to be updated on the targeted record\r\n * @returns A Promise with the results of the API execution\r\n */\r\n static updateRecord(\r\n tableSetName: string,\r\n recordId: string,\r\n data: ODataJSON\r\n ): Promise<any> {\r\n return new Promise((resolve, reject) => {\r\n const url = `/_api/${tableSetName}(${recordId})`;\r\n\r\n safeAjax({\r\n type: \"PATCH\",\r\n url: url,\r\n data: JSON.stringify(data),\r\n success: resolve,\r\n error: reject,\r\n });\r\n });\r\n }\r\n}\r\n\r\nexport default API;\r\n", "import type DOMNodeReference from \"./DOMNodeReference.ts\";\r\n\r\ndeclare type EventType = string;\r\ndeclare type Handler = (this: DOMNodeReference, ...args: any[]) => void;\r\ndeclare type Listeners = Set<DOMNodeReference>;\r\n\r\n/********/ /********/ export default class EventManager {\r\n private readonly events: Map<EventType, Handler> = new Map();\r\n private readonly listeners: Map<EventType, Listeners> = new Map();\r\n private readonly dependencyHandlers: Set<[DOMNodeReference, Handler]> =\r\n new Set();\r\n private observers: Array<MutationObserver | ResizeObserver> = [];\r\n private boundListeners: Array<BoundEventListener> = [];\r\n\r\n constructor() {}\r\n\r\n public dispatchDependencyHandlers(): void {\r\n for (const [dependency, handler] of this.dependencyHandlers) {\r\n handler.call(dependency);\r\n }\r\n }\r\n\r\n public registerDependent(\r\n dependency: DOMNodeReference,\r\n handler: Handler\r\n ): true | false {\r\n try {\r\n this.dependencyHandlers.add([dependency, handler]);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n public registerEvent(event: EventType, handler: Handler): true | false {\r\n if (this.events.has(event)) {\r\n console.error(\"Event registration has already been defined for: \", event);\r\n return false;\r\n }\r\n this.listeners.set(event, new Set());\r\n this.events.set(event, handler);\r\n return true;\r\n }\r\n\r\n public registerListener(\r\n event: EventType,\r\n listener: DOMNodeReference\r\n ): true | false {\r\n if (this.events.has(event)) {\r\n const listeners: Listeners = this.listeners.get(event) ?? new Set();\r\n listeners.add(listener);\r\n this.listeners.set(event, listeners);\r\n return true;\r\n } else {\r\n console.error(\"No event registration found for: \", event);\r\n return false;\r\n }\r\n }\r\n\r\n public emit(eventType: EventType, ...args: any[]): void {\r\n if (this.events.has(eventType)) {\r\n //\r\n const event: Handler = this.events.get(eventType) as Handler;\r\n const listeners: Listeners | undefined = this.listeners.get(eventType);\r\n //\r\n if (!listeners) return;\r\n //\r\n for (const listener of listeners) {\r\n event.call(listener, ...args);\r\n }\r\n //\r\n } else {\r\n console.error(\"Event not found in EventRegistry: \", eventType);\r\n }\r\n return;\r\n }\r\n\r\n public stopListening(listener: DOMNodeReference): void {\r\n for (const [_event, listeners] of this.listeners) {\r\n if (listeners.has(listener)) listeners.delete(listener);\r\n }\r\n }\r\n\r\n public registerObserver(\r\n observer: MutationObserver | ResizeObserver,\r\n observerOptions: {\r\n nodeToObserve: Element;\r\n options: Partial<ResizeObserverOptions> | Partial<MutationObserverInit>;\r\n }\r\n ): void {\r\n const { nodeToObserve, options } = observerOptions;\r\n observer.observe(nodeToObserve, options);\r\n this.observers.push(observer);\r\n }\r\n\r\n public registerDOMEventListener(\r\n element: Element,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (e: Event) => unknown\r\n ): void {\r\n element.addEventListener(eventType, handler);\r\n\r\n this.boundListeners.push({\r\n element,\r\n handler,\r\n event: eventType,\r\n });\r\n }\r\n\r\n public destroy(): void {\r\n // Remove all bound event listeners\r\n this.boundListeners?.forEach((binding) => {\r\n binding.element?.removeEventListener(binding.event, binding.handler);\r\n });\r\n this.boundListeners = []; // Clear the array\r\n\r\n // Disconnect all observers\r\n this.observers?.forEach((observer) => {\r\n observer.disconnect();\r\n });\r\n this.observers = []; // Clear the array\r\n\r\n this.events.clear();\r\n\r\n this.dependencyHandlers.clear();\r\n\r\n this.listeners.clear();\r\n }\r\n}\r\n", "export default class VisibilityManager {\r\n private declare visibilityController: HTMLElement | null;\r\n private defaultVisibility: string | null;\r\n\r\n public set defaultDisplay(newValue: string | null) {\r\n this.defaultVisibility = newValue;\r\n }\r\n\r\n constructor(target: HTMLElement) {\r\n // Set the default visibility controller to the element itself\r\n this.visibilityController = target;\r\n\r\n // If the element is a table, use its closest fieldset as the controller\r\n if (target.tagName === \"TABLE\") {\r\n const fieldset = target.closest(\"fieldset\");\r\n if (fieldset) {\r\n this.visibilityController = fieldset;\r\n }\r\n }\r\n\r\n // For specific tag types, use the closest 'td' if available as the controller\r\n const tagsRequiringTdParent = [\r\n \"SPAN\",\r\n \"INPUT\",\r\n \"TEXTAREA\",\r\n \"SELECT\",\r\n \"TABLE\",\r\n ];\r\n if (tagsRequiringTdParent.includes(target.tagName)) {\r\n const tdParent = target.closest(\"td\");\r\n if (tdParent) {\r\n this.visibilityController = tdParent;\r\n }\r\n }\r\n\r\n this.defaultVisibility = this.visibilityController.style.display;\r\n }\r\n\r\n public hide(): void {\r\n this.visibilityController!.style.display = \"none\";\r\n }\r\n\r\n public show(): void {\r\n this.visibilityController!.style.display = this.defaultVisibility!;\r\n }\r\n\r\n public toggleVisibility(shouldShow: boolean): void {\r\n shouldShow ? this.show() : this.hide();\r\n }\r\n\r\n public getVisibility(): true | false {\r\n return (\r\n window.getComputedStyle(this.visibilityController!).display !== \"none\" &&\r\n window.getComputedStyle(this.visibilityController!).visibility !==\r\n \"hidden\" &&\r\n this.visibilityController!.getBoundingClientRect().height > 0 &&\r\n this.visibilityController!.getBoundingClientRect().width > 0\r\n );\r\n }\r\n\r\n public destroy(): void {\r\n this.visibilityController = null;\r\n this.defaultVisibility = null;\r\n }\r\n}\r\n", "/**\r\n *\r\n * @param {string} titleString The text to display in the tooltip flyout content\r\n * @param iconStyle Optional CSS styles to apply to the info icon\r\n * @returns\r\n */\r\nexport default function CreateInfoEl(\r\n titleString: string,\r\n iconStyle?: Partial<CSSStyleDeclaration>\r\n) {\r\n // Input validation remains the same\r\n if (typeof titleString !== \"string\") {\r\n throw new Error(\r\n `argument \"titleString\" must be of type \"string\". Received: \"${typeof titleString}\"`\r\n );\r\n }\r\n if (iconStyle && typeof iconStyle !== \"object\") {\r\n throw new Error(\r\n `argument \"iconStyle\" must be of type \"object\". Received: \"${typeof iconStyle}\"`\r\n );\r\n }\r\n\r\n const span = document.createElement(\"span\");\r\n span.classList.add(\"info-icon\");\r\n\r\n const icon = document.createElement(\"i\");\r\n icon.classList.add(\"fa\", \"fa-solid\", \"fa-info-circle\");\r\n icon.setAttribute(\"aria-label\", \"Info\");\r\n icon.style.cursor = \"pointer\";\r\n\r\n const flyoutContent = document.createElement(\"div\");\r\n flyoutContent.innerHTML = titleString;\r\n flyoutContent.classList.add(\"flyout-content\");\r\n\r\n span.appendChild(icon);\r\n span.appendChild(flyoutContent);\r\n\r\n if (iconStyle) {\r\n Object.assign(icon.style, iconStyle);\r\n }\r\n\r\n // Function to position flyout content remains the same\r\n const positionFlyout = () => {\r\n flyoutContent.style.display = \"block\";\r\n\r\n const flyoutRect = flyoutContent.getBoundingClientRect();\r\n const viewportWidth = window.innerWidth;\r\n\r\n if (flyoutRect.right > viewportWidth) {\r\n const overflowAmount = flyoutRect.right - viewportWidth;\r\n flyoutContent.style.left = `calc(50% - ${overflowAmount}px)`;\r\n }\r\n\r\n if (flyoutRect.left < 0) {\r\n const overflowAmount = Math.abs(flyoutRect.left);\r\n flyoutContent.style.left = `calc(50% + ${overflowAmount}px)`;\r\n }\r\n };\r\n\r\n // Move event listeners to the span container\r\n span.addEventListener(\"mouseenter\", () => {\r\n positionFlyout();\r\n });\r\n\r\n span.addEventListener(\"mouseleave\", (event) => {\r\n // Check if we're not moving to a child element\r\n const relatedTarget = event.relatedTarget as Node;\r\n if (!span.contains(relatedTarget)) {\r\n flyoutContent.style.display = \"none\";\r\n }\r\n });\r\n\r\n // Touch handling remains on the icon for better mobile UX\r\n icon.addEventListener(\"touchstart\", (event) => {\r\n event.preventDefault();\r\n flyoutContent.style.display =\r\n flyoutContent.style.display === \"block\" ? \"none\" : \"block\";\r\n if (flyoutContent.style.display === \"block\") {\r\n positionFlyout();\r\n }\r\n });\r\n\r\n document.body.addEventListener(\"click\", (event: Event) => {\r\n if (!span.contains(event.target as Node)) {\r\n flyoutContent.style.display = \"none\";\r\n }\r\n });\r\n\r\n flyoutContent.style.display = \"none\";\r\n return span;\r\n}\r\n", "/**\r\n * Provides an async way to capture DOM elements; for when querySelector cannot capture the target due to async DOM content loading\r\n * @param **target** - basic querySelector syntax to select an element\r\n * @param **root** - optional parameter to replace document as the root from which to perform the node search\r\n * @returns the element(s) targeted by the `querySelector` string\r\n */\r\nexport default function waitFor(\r\n target: string,\r\n root: Element | Document,\r\n multiple: false,\r\n debounceTime: number\r\n): Promise<HTMLElement>;\r\n\r\nexport default function waitFor(\r\n target: string,\r\n root: Element | Document,\r\n multiple: true,\r\n debounceTime: number\r\n): Promise<HTMLElement[]>;\r\n\r\nexport default function waitFor(\r\n target: string,\r\n root: Element | Document = document,\r\n multiple: boolean = false,\r\n debounceTime: number\r\n): Promise<HTMLElement | HTMLElement[]> {\r\n //\r\n return new Promise((resolve, reject) => {\r\n //\r\n if (multiple) {\r\n //\r\n let timeout: any;\r\n const observedElements: HTMLElement[] = [];\r\n const observedSet: Set<HTMLElement> = new Set();\r\n\r\n if (debounceTime < 1) {\r\n return resolve(\r\n <HTMLElement[]>Array.from(root.querySelectorAll(<string>target))\r\n );\r\n }\r\n const observer = new MutationObserver(() => {\r\n const found = <HTMLElement[]>(\r\n Array.from(root.querySelectorAll(<string>target))\r\n );\r\n\r\n // If elements are found, store them in observedElements\r\n found.forEach((element) => {\r\n if (!observedSet.has(element)) {\r\n observedSet.add(element);\r\n observedElements.push(element);\r\n }\r\n });\r\n\r\n // Clear the previous timeout and set a new one\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n // Resolve the promise after debounce period if no more mutations\r\n if (observedElements.length > 0) {\r\n observer.disconnect();\r\n resolve(observedElements);\r\n } else {\r\n reject(\r\n new Error(\r\n `No elements found with target: \"${target}\" within ${\r\n debounceTime / 1000\r\n } seconds. If the element you are expecting has not loaded yet, consider raising your timeout.`\r\n )\r\n );\r\n }\r\n }, debounceTime);\r\n });\r\n\r\n observer.observe(root, {\r\n childList: true,\r\n subtree: true,\r\n attributes: false,\r\n });\r\n //\r\n } else {\r\n // Create observer to watch for target in DOM\r\n const observer = new MutationObserver(() => {\r\n const observedElement = <HTMLElement>root.querySelector(<string>target);\r\n if (observedElement) {\r\n clearTimeout(timeout);\r\n observer.disconnect();\r\n resolve(observedElement);\r\n }\r\n });\r\n const timeout = setTimeout(() => {\r\n observer.disconnect();\r\n reject(\r\n new Error(\r\n `Element not found by target: \"${target}\" within ${\r\n debounceTime / 1000\r\n } second. If the element you are expecting has not loaded yet, consider raising your timeout.`\r\n )\r\n );\r\n }, debounceTime);\r\n\r\n const element = <HTMLElement>root.querySelector(<string>target);\r\n if (element) {\r\n clearTimeout(timeout);\r\n return resolve(element);\r\n }\r\n\r\n observer.observe(root, {\r\n subtree: true,\r\n attributes: true,\r\n childList: true, // Detects added/removed child elements\r\n });\r\n //\r\n }\r\n //\r\n });\r\n //\r\n}\r\n", "import type DOMNodeReference from \"../ancillary/DOMNodeReference.ts\";\r\n\r\nclass CustomError extends Error {\r\n public node: DOMNodeReference;\r\n constructor(node: DOMNodeReference, message: string) {\r\n super(message);\r\n\r\n this.node = node;\r\n\r\n Object.setPrototypeOf(this, new.target.prototype);\r\n\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, this.constructor);\r\n }\r\n }\r\n}\r\n\r\nclass InitializationError extends CustomError {\r\n constructor(node: DOMNodeReference, error: string) {\r\n super(\r\n node,\r\n `There was an error initializing a DOMNodeReference for target: ${node.target}, :: ${error}`\r\n );\r\n }\r\n}\r\n\r\nclass NodeNotFoundError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(node, `The targeted DOM element was not found: ${node.target}`);\r\n }\r\n}\r\n\r\nclass Page_ValidatorsNotFoundError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(node, \"Page_Validators could not be found\");\r\n }\r\n}\r\n\r\nclass BusinessRuleError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(node, `Error applying business rule to target: ${node.target}`);\r\n }\r\n}\r\n\r\nclass SelfReferenceError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(\r\n node,\r\n \"Self-referential dependency found. A DOMNodeReference cannot depend on itself\"\r\n );\r\n }\r\n}\r\n\r\nclass LabelNotFoundError extends CustomError {\r\n constructor(node: DOMNodeReference) {\r\n super(node, `No label could be found for the target: ${node.target}`);\r\n }\r\n}\r\n\r\nclass IncorrectParameterError extends CustomError {\r\n constructor(\r\n node: DOMNodeReference,\r\n functionName: string,\r\n argName: string,\r\n expectedTypes: string[],\r\n receivedType: any\r\n ) {\r\n const concatTypes = expectedTypes.join(\" or \");\r\n\r\n super(\r\n node,\r\n `${functionName} expects ${argName} to be of type ${concatTypes}. Received: ${\r\n receivedType === null ? \"null\" : typeof receivedType\r\n }`\r\n );\r\n }\r\n}\r\n\r\nconst Errors = {\r\n NodeNotFoundError,\r\n InitializationError,\r\n Page_ValidatorsNotFoundError,\r\n BusinessRuleError,\r\n SelfReferenceError,\r\n LabelNotFoundError,\r\n IncorrectParameterError,\r\n};\r\n\r\nexport default Errors;\r\n", "export const init: symbol = Symbol(\"init\");\r\nexport const destroy: symbol = Symbol(\"destroy\");\r\n", "/**\r\n * For use in setting up event management in the instances of PowerPagesElement\r\n * @see {@link PowerPagesElement}\r\n */\r\nexport const EventTypes = {\r\n CHECKBOX: \"click\",\r\n RADIO: \"click\",\r\n SELECT: \"change\",\r\n TEXT: \"keyup\",\r\n DEFAULT: \"input\",\r\n} as const;\r\n", "import type ValueManager from \"../ancillary/ValueManager.ts\";\r\nimport EventManager from \"../ancillary/EventManager.ts\";\r\nimport VisibilityManager from \"./VisibilityManager.ts\";\r\nimport createInfoEl from \"../utils/createInfoElement.ts\";\r\nimport waitFor from \"../core/waitFor.ts\";\r\nimport Errors from \"../errors/errors.ts\";\r\nimport { init, destroy } from \"../constants/symbols.ts\";\r\nimport { EventTypes } from \"../constants/EventTypes.ts\";\r\n\r\nexport default class DOMNodeReference {\r\n // declare static properties\r\n static instances: DOMNodeReference[] = [];\r\n\r\n // allow for indexing methods with symbols\r\n [key: symbol]: (...arg: any[]) => any;\r\n\r\n // properties initialized in the constructor\r\n public target: Element | string;\r\n public logicalName?: string;\r\n public root: Element;\r\n // public isRadio: boolean = false;\r\n protected timeoutMs: number;\r\n protected isLoaded: boolean;\r\n // protected radioType: RadioType | null = null;\r\n\r\n /**\r\n * The value of the element that this node represents\r\n * stays in syncs with the live DOM elements?.,m via event handler\r\n */\r\n public get value() {\r\n return this.valueManager!.value;\r\n }\r\n\r\n public set value(newValue) {\r\n this.valueManager!.setValue(newValue);\r\n }\r\n\r\n public get checked() {\r\n return this.valueManager!.checked;\r\n }\r\n\r\n public set defaultDisplay(newValue: string | null) {\r\n this.visibilityManager!.defaultDisplay = newValue;\r\n }\r\n\r\n // other properties made available after async s.init\r\n\r\n /**\r\n * The element targeted when instantiating DOMNodeReference.\r\n * Made available in order to perform normal DOM traversal,\r\n * or access properties not available through this class.\r\n */\r\n public declare element: HTMLElement;\r\n public visibilityManager!: VisibilityManager | null;\r\n public valueManager!: ValueManager | null;\r\n public eventManager!: EventManager | null;\r\n\r\n // public declare radioParent: DOMNodeReference | undefined;\r\n /**\r\n * Represents the 'yes' option of a boolean radio field.\r\n * This property is only available when the parent node\r\n * is a main field for a boolean radio input.\r\n */\r\n // public declare yesRadio: DOMNodeReference | undefined;\r\n /**\r\n * Represents the 'no' option of a boolean radio field.\r\n * This property is only available when the parent node\r\n * is a main field for a boolean radio input.\r\n */\r\n // public declare noRadio: DOMNodeReference | undefined;\r\n\r\n /**\r\n * Creates an instance of DOMNodeReference.\r\n * @param target - The CSS selector to find the desired DOM element.\r\n * @param root - Optionally specify the element within to search for the element targeted by 'target'\r\n * Defaults to 'document.body'\r\n */\r\n /******/ /******/ constructor(\r\n target: Element | string,\r\n root: Element = document.body,\r\n timeoutMs: number\r\n ) {\r\n this.target = target;\r\n this.logicalName = this._extractLogicalName(target);\r\n this.root = root;\r\n this.timeoutMs = timeoutMs;\r\n this.isLoaded = false;\r\n\r\n // The rest of initialization.\r\n }\r\n\r\n protected async [init](): Promise<void> {\r\n if (this.target instanceof HTMLElement) {\r\n this.element = this.target;\r\n } else {\r\n this.element = (await waitFor(\r\n this.target as string,\r\n this.root,\r\n false,\r\n this.timeoutMs\r\n )) as HTMLElement;\r\n }\r\n\r\n if (!this.element) {\r\n throw new Errors.NodeNotFoundError(this);\r\n }\r\n\r\n this.eventManager = new EventManager();\r\n this.visibilityManager = new VisibilityManager(this.element);\r\n }\r\n\r\n protected _extractLogicalName(target: Element | string): string {\r\n if (typeof target !== \"string\") return \"\";\r\n\r\n const bracketMatch = target.match(/\\[([^\\]]+)\\]/);\r\n if (!bracketMatch) return target.replace(/[#\\[\\]]/g, \"\");\r\n\r\n const content = bracketMatch[1];\r\n const quoteMatch = content.match(/[\"']([^\"']+)[\"']/);\r\n return (quoteMatch?.[1] || content).replace(/[#\\[\\]]/g, \"\");\r\n }\r\n\r\n /**\r\n * Initializes value synchronization with appropriate event listeners\r\n * based on element type.\r\n */\r\n protected _valueSync(): void {\r\n if (!this._isValidFormElement(this.element)) return;\r\n\r\n this.updateValue();\r\n const eventType = this._determineEventType();\r\n this.eventManager!.registerDOMEventListener(\r\n this.element,\r\n eventType,\r\n this.updateValue.bind(this)\r\n );\r\n\r\n if (this._isDateInput()) {\r\n this._dateSync(this.element as HTMLInputElement);\r\n }\r\n }\r\n\r\n protected _determineEventType(): keyof GlobalEventHandlersEventMap {\r\n if (this.element instanceof HTMLSelectElement) return \"change\";\r\n if (this.element instanceof HTMLTextAreaElement) return \"keyup\";\r\n if (!(this.element instanceof HTMLInputElement)) return EventTypes.DEFAULT;\r\n\r\n return (\r\n EventTypes[this.element.type.toUpperCase() as keyof typeof EventTypes] ||\r\n EventTypes.DEFAULT\r\n );\r\n }\r\n\r\n protected _isDateInput(): boolean {\r\n return (\r\n this.element instanceof HTMLInputElement &&\r\n this.element.dataset.type === \"date\"\r\n );\r\n }\r\n\r\n protected _isValidFormElement(element: Element): element is FormElement {\r\n return (\r\n element instanceof HTMLInputElement ||\r\n element instanceof HTMLSelectElement ||\r\n element instanceof HTMLTextAreaElement ||\r\n element instanceof HTMLSpanElement ||\r\n element instanceof HTMLButtonElement ||\r\n element instanceof HTMLFieldSetElement\r\n );\r\n }\r\n\r\n protected async _dateSync(element: HTMLInputElement): Promise<void> {\r\n const parentElement = element.parentElement;\r\n if (!parentElement) {\r\n throw new DOMException(\"Date input must have a parent element\");\r\n }\r\n\r\n const dateNode = (await waitFor(\r\n \"[data-date-format]\",\r\n parentElement,\r\n false,\r\n 1500\r\n )) as HTMLElement;\r\n\r\n this.eventManager!.registerDOMEventListener(\r\n dateNode,\r\n \"select\",\r\n this.updateValue.bind(this)\r\n );\r\n }\r\n\r\n protected _bindMethods() {\r\n const prototype = Object.getPrototypeOf(this);\r\n\r\n for (const key of Object.getOwnPropertyNames(prototype) as Array<\r\n keyof this\r\n >) {\r\n const value = this[key];\r\n\r\n // Ensure we're binding only functions and skip the constructor\r\n if (key !== \"constructor\" && typeof value === \"function\") {\r\n this[key] = value.bind(this);\r\n }\r\n }\r\n }\r\n\r\n protected [destroy](): void {\r\n // Clear other references\r\n this.isLoaded = false;\r\n this.value = null;\r\n\r\n this.eventManager!.destroy();\r\n this.eventManager = null;\r\n this.visibilityManager!.destroy();\r\n this.visibilityManager = null;\r\n this.valueManager!.destroy();\r\n this.valueManager = null;\r\n }\r\n\r\n /**\r\n * Updates the value and checked state based on element type\r\n * @public\r\n */\r\n public async updateValue(e?: Event): Promise<void> {\r\n if (e && !e.isTrusted) return;\r\n await this.valueManager!.updateValue(e);\r\n this.triggerDependentsHandlers();\r\n }\r\n\r\n protected triggerDependentsHandlers(): void {\r\n this.eventManager!.dispatchDependencyHandlers();\r\n }\r\n\r\n /**\r\n * Sets up an event listener based on the specified event type, executing the specified\r\n * event handler\r\n * @param eventType - The DOM event to watch for\r\n * @param eventHandler - The callback function that runs when the\r\n * specified event occurs.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public on(\r\n eventType: keyof GlobalEventHandlersEventMap,\r\n eventHandler: <T extends Event>(\r\n this: DOMNodeReference,\r\n e: T | Event\r\n ) => void\r\n ): DOMNodeReference {\r\n if (typeof eventHandler !== \"function\") {\r\n throw new Errors.IncorrectParameterError(\r\n this,\r\n \"on\",\r\n \"eventHandler\",\r\n [\"function\"],\r\n typeof eventHandler\r\n );\r\n }\r\n\r\n this.eventManager!.registerDOMEventListener(\r\n this.element,\r\n eventType,\r\n eventHandler.bind(this)\r\n );\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Hides the element by setting its display style to \"none\".\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public hide(): DOMNodeReference {\r\n this.visibilityManager!.hide();\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows the element by restoring its default display style.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public show(): DOMNodeReference {\r\n this.visibilityManager!.show();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param shouldShow - Either a function that returns true or false,\r\n * or a natural boolean to determine the visibility of this\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public toggleVisibility(\r\n shouldShow: ((this: DOMNodeReference) => boolean) | boolean\r\n ): DOMNodeReference {\r\n const bool: boolean =\r\n shouldShow instanceof Function ? shouldShow.call(this) : shouldShow;\r\n\r\n this.visibilityManager!.toggleVisibility(bool);\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the value of the HTML element.\r\n * @param value - The value to set for the HTML element.\r\n * for parents of boolean radios, pass true or false as value, or\r\n * an expression returning a boolean\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public setValue(value: (() => any) | any): DOMNodeReference {\r\n if (value instanceof Function) {\r\n value = value();\r\n }\r\n this.valueManager!.setValue(value);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Disables the element so that users cannot input any data\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public disable(): DOMNodeReference {\r\n (this.element as HTMLInputElement).disabled = true;\r\n return this;\r\n }\r\n\r\n /**\r\n * Clears all values and states of the element.\r\n * Handles different input types appropriately, and can be called\r\n * on an element containing N child inputs to clear all\r\n */\r\n public clearValue(): void {\r\n this.valueManager!.clearValue();\r\n\r\n // Handle nested input elements in container elements\r\n if (this._getChildren()) {\r\n this.callAgainstChildrenInputs((child) => child.clearValue());\r\n }\r\n }\r\n\r\n protected _getChildren(): DOMNodeReference[] | null {\r\n const childInputs: Element[] = Array.from(\r\n this.element.querySelectorAll(\"input, select, textarea\")\r\n );\r\n const childIds: string[] = childInputs.map((input) => {\r\n return input.id;\r\n });\r\n\r\n const children = DOMNodeReference.instances.filter((ref) => {\r\n return childIds.includes(ref.element.id);\r\n });\r\n\r\n return children.length > 0 ? children : null;\r\n }\r\n\r\n protected callAgainstChildrenInputs(\r\n callback: (child: DOMNodeReference) => any\r\n ): void {\r\n // Handle nested input elements in container elements\r\n const children: DOMNodeReference[] | null = this._getChildren();\r\n if (!children) {\r\n console.error(\"No child inputs found for target: \", this);\r\n return;\r\n }\r\n\r\n for (const child of children) {\r\n callback(child);\r\n }\r\n }\r\n\r\n /**\r\n * Enables the element so that users can input data\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public enable(): DOMNodeReference {\r\n (this.element as HTMLInputElement).disabled = false;\r\n return this;\r\n }\r\n\r\n /**\r\n * @param elements - The elements to prepend to the element targeted by this.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public prepend(...elements: HTMLElement[]): DOMNodeReference {\r\n this.element.prepend(...elements);\r\n return this;\r\n }\r\n\r\n /**\r\n * Appends child elements to the HTML element.\r\n * @param elements - The elements to append to the element targeted by this.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public append(...elements: HTMLElement[]): DOMNodeReference {\r\n this.element.append(...elements);\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts elements before the HTML element.\r\n * @param elements - The elements to insert before the HTML element.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public before(...elements: HTMLElement[]): DOMNodeReference {\r\n this.element.before(...elements);\r\n return this;\r\n }\r\n\r\n /**\r\n * Inserts elements after the HTML element.\r\n * @param elements - The elements to insert after the HTML element.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public after(...elements: HTMLElement[]): DOMNodeReference {\r\n this.element.after(...elements);\r\n return this;\r\n }\r\n\r\n /**\r\n * Retrieves the label associated with the HTML element.\r\n * @returns The label element associated with this element.\r\n */\r\n public getLabel(): HTMLElement | null {\r\n const label =\r\n (document.querySelector(`#${this.element.id}_label`) as HTMLElement) ||\r\n null;\r\n if (!label) throw new Errors.LabelNotFoundError(this);\r\n return label;\r\n }\r\n\r\n /**\r\n * Adds a tooltip with specified text to the label associated with the HTML element.\r\n * @param innerHTML - The innerHTML to append into the tooltip.\r\n * @param containerStyle - Optional object with CSS Styles to apply to the info element\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public addLabelTooltip(\r\n innerHTML: string,\r\n containerStyle?: Partial<CSSStyleDeclaration>\r\n ): DOMNodeReference {\r\n this.getLabel()?.append(\r\n createInfoEl(innerHTML, containerStyle || undefined)\r\n );\r\n return this;\r\n }\r\n\r\n /**\r\n * Adds a tooltip with the specified text to the element\r\n * @param innerHTML - The innerHTML to append into the tooltip\r\n * @param containerStyle - Optional object with CSS Styles to apply to the info element\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public addTooltip(\r\n innerHTML: string,\r\n containerStyle?: Partial<CSSStyleDeclaration>\r\n ): DOMNodeReference {\r\n this.append(createInfoEl(innerHTML, containerStyle || undefined));\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets the inner HTML content of the HTML element.\r\n * @param string - The text to set as the inner HTML of the element.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public setInnerHTML(string: string) {\r\n this.element.innerHTML = string;\r\n return this;\r\n }\r\n\r\n /**\r\n * Removes this element from the DOM\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public remove() {\r\n this.element.remove();\r\n return this;\r\n }\r\n\r\n /**\r\n * Sets inline CSS styles on the element.\r\n * @param options - An object containing CSS property-value pairs, e.g., { display: 'block' }.\r\n * @returns The instance, enabling method chaining.\r\n */\r\n public setStyle(options: Partial<CSSStyleDeclaration>): this {\r\n if (options === null || typeof options !== \"object\") {\r\n throw new Errors.IncorrectParameterError(\r\n this,\r\n \"setStyle\",\r\n \"options\",\r\n [\"Partial<CSSStyleDeclaration>\"],\r\n typeof options\r\n );\r\n }\r\n\r\n // Iterate over own enumerable properties of the options object.\r\n Object.entries(options).forEach(([prop, value]) => {\r\n // Skip properties that are undefined.\r\n if (value !== undefined) {\r\n // Here we cast 'prop' as a key of CSSStyleDeclaration.\r\n // Using bracket notation allows dynamic property access.\r\n (this.element.style as any)[prop] = value;\r\n }\r\n });\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Applies a business rule to manage visibility, required state, value, and disabled state dynamically.\r\n * @see {@link BusinessRule}\r\n * @param rule The business rule containing conditions for various actions.\r\n * @param dependencies For re-evaluation of conditions when the state of the dependencies change\r\n * @returns Instance of this for method chaining.\r\n */\r\n public applyBusinessRule(\r\n rule: BusinessRule,\r\n dependencies: DependencyArray<DOMNodeReference>\r\n ): DOMNodeReference {\r\n try {\r\n // Apply Visibility Rule\r\n if (rule.setVisibility) {\r\n const condition = rule.setVisibility;\r\n const initialState = condition.call(this);\r\n this.toggleVisibility(initialState);\r\n }\r\n\r\n // Apply Required & Validation Rule\r\n if (rule.setRequirements) {\r\n const { isRequired, isValid } = rule.setRequirements();\r\n // get args? rule.setRequired(isRequired, isValid)\r\n\r\n if (typeof Page_Validators === \"undefined\") {\r\n throw new Errors.Page_ValidatorsNotFoundError(this);\r\n }\r\n\r\n let evaluationFunction: () => boolean = () => true;\r\n\r\n if (isRequired && isValid) {\r\n evaluationFunction = () => {\r\n const isFieldRequired = isRequired.call(this);\r\n const isFieldVisible = this.visibilityManager!.getVisibility();\r\n\r\n // If the field is not required, it is always valid\r\n // If the field is required, it must be visible and valid\r\n return (\r\n !isFieldRequired ||\r\n (isFieldVisible && isValid.call(this, isFieldRequired))\r\n );\r\n };\r\n } else if (isValid) {\r\n evaluationFunction = () => {\r\n const isFieldVisible = this.visibilityManager!.getVisibility();\r\n\r\n // The field must be visible and valid\r\n return isFieldVisible && isValid.call(this);\r\n };\r\n } else if (isRequired) {\r\n evaluationFunction = () => {\r\n const isFieldVisible = this.visibilityManager!.getVisibility();\r\n\r\n // The field must be visible and required\r\n return isFieldVisible && isRequired.call(this);\r\n };\r\n }\r\n\r\n this._createValidator(evaluationFunction);\r\n }\r\n\r\n // Apply Set Value Rule\r\n if (rule.setValue) {\r\n let { condition, value } = rule.setValue();\r\n if (value instanceof Function) value = value();\r\n if (condition.call(this)) {\r\n this.setValue.call(this, value);\r\n }\r\n }\r\n\r\n // Apply Disabled Rule\r\n if (rule.setDisabled) {\r\n const condition = rule.setDisabled;\r\n condition.call(this) ? this.disable() : this.enable();\r\n }\r\n\r\n const handler: BusinessRuleHandler =\r\n this._returnBusinessRuleHandler(rule);\r\n handler();\r\n\r\n // setup dep tracking\r\n if (dependencies.length) {\r\n this._configureDependencyTracking(handler, dependencies);\r\n }\r\n\r\n return this;\r\n } catch (error) {\r\n if (error instanceof Error) throw error;\r\n else throw new Errors.BusinessRuleError(this);\r\n }\r\n }\r\n\r\n protected _returnBusinessRuleHandler(\r\n rule: BusinessRule\r\n ): BusinessRuleHandler {\r\n return (): void => {\r\n let clearValues: boolean = false;\r\n if (rule.setVisibility) {\r\n const visibilityCondition = rule.setVisibility;\r\n clearValues = clearValues || !visibilityCondition.call(this);\r\n this.toggleVisibility(visibilityCondition.call(this));\r\n }\r\n if (rule.setRequirements && rule.setRequirements().isRequired) {\r\n const { isRequired } = rule.setRequirements();\r\n this.setRequiredLevel(isRequired!.call(this));\r\n }\r\n if (rule.setValue) {\r\n const { condition, value } = rule.setValue();\r\n if (condition.call(this)) this.setValue.call(this, value);\r\n }\r\n if (rule.setDisabled) {\r\n const disabledCondition = rule.setDisabled;\r\n disabledCondition.call(this) ? this.disable() : this.enable();\r\n }\r\n\r\n if (clearValues && !rule.setValue) {\r\n this.clearValue();\r\n }\r\n\r\n this.triggerDependentsHandlers();\r\n };\r\n }\r\n\r\n protected _createValidator(evaluationFunction: () => boolean): void {\r\n const fieldDisplayName = (() => {\r\n let label: any = this.getLabel();\r\n if (!label) {\r\n throw new Errors.LabelNotFoundError(this);\r\n }\r\n label = label.innerHTML;\r\n if (label.length > 50) {\r\n label = label.substring(0, 50) + \"...\";\r\n }\r\n return label;\r\n })();\r\n\r\n const validatorId = `${this.element.id}Validator`;\r\n\r\n const newValidator = document.createElement(\"span\");\r\n newValidator.style.display = \"none\";\r\n newValidator.id = validatorId;\r\n\r\n Object.assign(newValidator, {\r\n controltovalidate: this.element.id,\r\n errormessage: `<a href='#${this.element.id}_label'>${fieldDisplayName} is a required field</a>`,\r\n evaluationfunction: evaluationFunction,\r\n });\r\n\r\n if (Page_Validators == undefined)\r\n throw new Errors.Page_ValidatorsNotFoundError(this);\r\n\r\n Page_Validators.push(newValidator);\r\n }\r\n\r\n /**\r\n * Sets up tracking for dependencies using both event listeners and mutation observers.\r\n * @protected\r\n * @param handler The function to execute when dependencies change\r\n * @param dependencies Array of dependent DOM nodes to track\r\n * all other options defaults to true\r\n */\r\n protected _configureDependencyTracking(\r\n handler: DependencyHandler,\r\n dependencies: DOMNodeReference[]\r\n ): void {\r\n if (dependencies.length < 1) {\r\n console.error(\r\n `powerpagestoolkit: No dependencies specified for ${this.element.id}. ` +\r\n \"Include all required nodes in the dependency array for proper tracking.\"\r\n );\r\n return;\r\n }\r\n\r\n dependencies.forEach((dependency) => {\r\n if (!dependency || !(dependency instanceof DOMNodeReference)) {\r\n throw new TypeError(\r\n \"Each dependency must be a valid DOMNodeReference instance\"\r\n );\r\n }\r\n\r\n // Check for self-referential dependency\r\n if (dependency.logicalName === this.logicalName) {\r\n throw new Errors.SelfReferenceError(this);\r\n }\r\n\r\n // The node that THIS depends on needs to be able to send notifications to its dependents\r\n // dependency.dependents.set(this, handler.bind(this));\r\n dependency.eventManager!.registerDependent(this, handler.bind(this));\r\n });\r\n }\r\n\r\n /**\r\n * Sets the required level for the field by adding or removing the \"required-field\" class on the label.\r\n *\r\n * @param isRequired Determines whether the field should be marked as required.\r\n * If true, the \"required-field\" class is added to the label; if false, it is removed.\r\n * @returns Instance of this [provides option to method chain]\r\n */\r\n public setRequiredLevel(\r\n isRequired: (() => boolean) | boolean\r\n ): DOMNodeReference {\r\n if (isRequired instanceof Function) {\r\n isRequired()\r\n ? this.getLabel()?.classList.add(\"required-field\")\r\n : this.getLabel()?.classList.remove(\"required-field\");\r\n return this;\r\n } else {\r\n isRequired\r\n ? this.getLabel()?.classList.add(\"required-field\")\r\n : this.getLabel()?.classList.remove(\"required-field\");\r\n return this;\r\n }\r\n }\r\n\r\n /**\r\n * Executes a callback function once the element is fully loaded.\r\n * If the element is already loaded, the callback is called immediately.\r\n * Otherwise, a MutationObserver is used to detect when the element is added to the DOM.\r\n * @param callback A callback function to execute once the element is loaded.\r\n * Receives instance of 'this' as an argument\r\n */\r\n public onceLoaded(callback: (instance: DOMNodeReference) => any): any {\r\n if (this.isLoaded) {\r\n callback(this);\r\n return;\r\n }\r\n\r\n if (this.target instanceof HTMLElement) {\r\n callback(this);\r\n return;\r\n }\r\n const observer = new MutationObserver(\r\n function (this: DOMNodeReference) {\r\n if (document.querySelector(this.target as string)) {\r\n observer.disconnect(); // Stop observing once loaded\r\n this.isLoaded = true;\r\n callback(this); // Call the provided callback\r\n }\r\n }.bind(this)\r\n );\r\n\r\n this.eventManager!.registerObserver(observer, {\r\n nodeToObserve: document.body,\r\n options: { subtree: true, childList: true },\r\n });\r\n }\r\n}\r\n", "import DOMNodeReference from \"./DOMNodeReference.ts\";\r\nimport ValueManager from \"./ValueManager.ts\";\r\nimport Errors from \"../errors/errors.ts\";\r\nimport { init, destroy } from \"../constants/symbols.ts\";\r\n\r\nexport default class Radio extends DOMNodeReference {\r\n // allow for indexing methods with symbols\r\n [key: symbol]: (...arg: any[]) => any;\r\n\r\n protected radioType: RadioType | null = null;\r\n public declare radioParent: DOMNodeReference | undefined;\r\n\r\n constructor(\r\n parent: DOMNodeReference,\r\n target: Element | string,\r\n root: Element = document.body,\r\n timeoutMs: number,\r\n radioType: RadioType\r\n ) {\r\n super(target, root, timeoutMs);\r\n\r\n this.radioParent = parent;\r\n this.radioType = radioType;\r\n }\r\n\r\n public async [init](): Promise<void> {\r\n /**\r\n * dynamically define the s.init method using our custom symbol\r\n * this makes it so that the s.init method cannot be accessed outside\r\n * of this package: i.e. by any consumers of the package\r\n */\r\n try {\r\n await super[init]();\r\n\r\n this.valueManager = new ValueManager(this);\r\n\r\n this._valueSync();\r\n\r\n // we want to ensure that all method calls from the consumer have access to 'this'\r\n this._bindMethods();\r\n\r\n // when the element is removed from the DOM, destroy this\r\n const observer = new MutationObserver((mutations) => {\r\n for (const mutation of mutations) {\r\n if (Array.from(mutation.removedNodes).includes(this.element)) {\r\n this[destroy]();\r\n observer.disconnect();\r\n break;\r\n }\r\n }\r\n });\r\n\r\n observer.observe(document.body, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n DOMNodeReference.instances.push(this);\r\n\r\n this.isLoaded = true;\r\n } catch (error) {\r\n const errorMessage: string =\r\n error instanceof Error ? error.message : String(error);\r\n throw new Errors.InitializationError(this, errorMessage);\r\n }\r\n }\r\n\r\n override [destroy](): void {\r\n super[destroy]();\r\n this.radioParent = undefined;\r\n }\r\n}\r\n", "import PowerPagesElement from \"../core/PowerPagesElement.ts\";\r\nimport DOMNodeReference from \"./DOMNodeReference.ts\";\r\nimport Radio from \"./Radio.ts\";\r\n\r\ndeclare interface ValueManagerProps {\r\n element: HTMLElement;\r\n noRadio?: Radio;\r\n yesRadio?: Radio;\r\n radioParent?: DOMNodeReference;\r\n isRadio: boolean;\r\n}\r\n\r\nexport default class ValueManager {\r\n public value: any;\r\n public checked: true | false = false;\r\n private element: HTMLElement | null;\r\n private noRadio?: Radio | undefined;\r\n private yesRadio?: Radio | undefined;\r\n public declare radioParent?: DOMNodeReference | undefined;\r\n private isRadio: boolean = false;\r\n\r\n constructor(instance: DOMNodeReference) {\r\n if (instance instanceof PowerPagesElement) {\r\n this.noRadio = instance.noRadio;\r\n this.yesRadio = instance.yesRadio;\r\n }\r\n this.element = instance.element;\r\n this.isRadio = instance instanceof Radio;\r\n }\r\n\r\n public setValue(value: any): void {\r\n const validatedValue = this._validateValue(value);\r\n\r\n if (this.yesRadio instanceof Radio && this.noRadio instanceof Radio) {\r\n (this.yesRadio.element as HTMLInputElement).checked = Boolean(value);\r\n (this.noRadio.element as HTMLInputElement).checked = Boolean(!value);\r\n this.value = value;\r\n (this.element as HTMLInputElement).checked = Boolean(value);\r\n (this.element as HTMLInputElement).value = value;\r\n } else if (\r\n this.isRadio ||\r\n (this.element as HTMLInputElement).type === \"radio\"\r\n ) {\r\n (this.element as HTMLInputElement).checked = value;\r\n this.checked = value;\r\n this.radioParent?.updateValue();\r\n } else {\r\n (this.element as HTMLInputElement).value = validatedValue;\r\n }\r\n\r\n this.value = validatedValue;\r\n }\r\n\r\n public async updateValue(e?: Event): Promise<void> {\r\n if (e) {\r\n e.stopPropagation();\r\n }\r\n\r\n if (this.yesRadio instanceof Radio && this.noRadio instanceof Radio) {\r\n this.yesRadio!.updateValue();\r\n this.noRadio!.updateValue();\r\n }\r\n\r\n const elementValue = await this.getElementValue();\r\n this.value = elementValue.value;\r\n\r\n if (elementValue.checked !== undefined) {\r\n this.checked = elementValue.checked;\r\n }\r\n }\r\n\r\n public getElementValue(): Promise<ElementValue> {\r\n return new Promise((resolve) => {\r\n const input = this.element as HTMLInputElement;\r\n const select = this.element as HTMLSelectElement;\r\n\r\n if (this.yesRadio instanceof Radio && this.noRadio instanceof Radio) {\r\n resolve({\r\n value: this.yesRadio.checked,\r\n checked: this.yesRadio.checked,\r\n });\r\n }\r\n\r\n let returnValue: ElementValue = {\r\n value: null,\r\n };\r\n switch (input.type) {\r\n case \"checkbox\":\r\n case \"radio\":\r\n resolve({\r\n value: input.checked,\r\n checked: input.checked,\r\n });\r\n break;\r\n case \"select-multiple\":\r\n resolve({\r\n value: Array.from(select.selectedOptions).map(\r\n (option) => option.value\r\n ),\r\n });\r\n break;\r\n\r\n case \"select-one\":\r\n resolve({\r\n value: select.value,\r\n });\r\n break;\r\n\r\n case \"number\":\r\n resolve({\r\n value: input.value !== \"\" ? Number(input.value) : null,\r\n });\r\n break;\r\n\r\n default: {\r\n let cleanValue: string | number = input.value;\r\n if (this.element!.classList.contains(\"decimal\")) {\r\n cleanValue = parseFloat(input.value.replace(/[$,]/g, \"\").trim());\r\n }\r\n\r\n returnValue = {\r\n value: cleanValue,\r\n };\r\n }\r\n }\r\n\r\n returnValue = {\r\n ...returnValue,\r\n value: this._validateValue(returnValue.value),\r\n };\r\n\r\n resolve(returnValue);\r\n });\r\n }\r\n\r\n protected _validateValue(value: any): any {\r\n if (typeof value === \"boolean\" || value === \"true\" || value === \"false\") {\r\n return value === true || value === \"true\";\r\n }\r\n\r\n // If it's a select element or text input (not decimal), return as is\r\n if (\r\n this.element instanceof HTMLSelectElement ||\r\n ((this.element as HTMLInputElement).type === \"text\" &&\r\n !(this.element as HTMLInputElement).classList.contains(\"decimal\"))\r\n ) {\r\n return value;\r\n }\r\n\r\n // Handle null/empty cases\r\n if (value === null || value === \"\") {\r\n return value;\r\n }\r\n\r\n if (!isNaN(Number(value))) {\r\n return Number(value);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n public clearValue(): void {\r\n try {\r\n const element = this.element;\r\n\r\n if (element instanceof HTMLInputElement) {\r\n switch (element.type.toLowerCase()) {\r\n case \"checkbox\":\r\n case \"radio\":\r\n element.checked = false;\r\n this.checked = false;\r\n this.value = false;\r\n break;\r\n\r\n case \"number\":\r\n element.value = \"\";\r\n this.value = null;\r\n break;\r\n\r\n default: // handles text, email, tel, etc.\r\n element.value = \"\";\r\n this.value = null;\r\n break;\r\n }\r\n } else if (element instanceof HTMLSelectElement) {\r\n if (element.multiple) {\r\n Array.from(element.options).forEach(\r\n (option) => (option.selected = false)\r\n );\r\n this.value = null;\r\n } else {\r\n element.selectedIndex = -1;\r\n this.value = null;\r\n }\r\n } else if (element instanceof HTMLTextAreaElement) {\r\n element.value = \"\";\r\n this.value = null;\r\n } else {\r\n this.value = null;\r\n }\r\n } catch (error) {\r\n const errorMessage = `Failed to clear values for element with target \"${this}\": ${\r\n error instanceof Error ? error.message : String(error)\r\n }`;\r\n throw new Error(errorMessage);\r\n }\r\n }\r\n\r\n public destroy(): void {\r\n this.value = null;\r\n this.checked = false;\r\n this.element = null;\r\n this.noRadio = undefined;\r\n this.yesRadio = undefined;\r\n this.isRadio = false;\r\n }\r\n}\r\n", "import DOMNodeReference from \"../ancillary/DOMNodeReference.ts\";\r\nimport ValueManager from \"../ancillary/ValueManager.ts\";\r\nimport Errors from \"../errors/errors.ts\";\r\nimport Radio from \"../ancillary/Radio.ts\";\r\nimport { init, destroy } from \"../constants/symbols.ts\";\r\n\r\nexport default class PowerPagesElement extends DOMNodeReference {\r\n // allow for indexing methods with symbols\r\n [key: symbol]: (...arg: any[]) => any;\r\n\r\n /**\r\n * Represents the 'yes' option of a boolean radio field.\r\n * This property is only available when the parent node\r\n * is a main field for a boolean radio input.\r\n */\r\n public declare yesRadio: Radio | undefined;\r\n /**\r\n * Represents the 'no' option of a boolean radio field.\r\n * This property is only available when the parent node\r\n * is a main field for a boolean radio input.\r\n */\r\n public declare noRadio: Radio | undefined;\r\n\r\n /**\r\n * Creates an instance of PowerPagesElement.\r\n * @param target - The CSS selector to find the desired DOM element.\r\n * @param root - Optionally specify the element within to search for the element targeted by 'target'\r\n * Defaults to 'document.body'\r\n */\r\n /******/ /******/ constructor(\r\n target: Element | string,\r\n root: Element = document.body,\r\n timeoutMs: number\r\n ) {\r\n super(target, root, timeoutMs);\r\n }\r\n\r\n //\r\n public async [init](): Promise<void> {\r\n /**\r\n * dynamically define the s.init method using our custom symbol\r\n * this makes it so that the s.init method cannot be accessed outside\r\n * of this package: i.e. by any consumers of the package\r\n */\r\n try {\r\n await super[init]();\r\n\r\n if (\r\n this.element.id &&\r\n this.element.querySelectorAll(\r\n `#${this.element.id} > input[type=\"radio\"]`\r\n ).length > 0\r\n ) {\r\n await this._attachRadioButtons();\r\n }\r\n\r\n this.valueManager = new ValueManager(this);\r\n\r\n this._valueSync();\r\n\r\n // we want to ensure that all method calls from the consumer have access to 'this'\r\n this._bindMethods();\r\n\r\n // when the element is removed from the DOM, destroy this\r\n const observer = new MutationObserver((mutations) => {\r\n for (const mutation of mutations) {\r\n if (Array.from(mutation.removedNodes).includes(this.element)) {\r\n if (typeof this[destroy] === \"function\") this[destroy]();\r\n observer.disconnect();\r\n break;\r\n }\r\n }\r\n });\r\n\r\n observer.observe(document.body, {\r\n childList: true,\r\n subtree: true,\r\n });\r\n\r\n PowerPagesElement.instances.push(this);\r\n\r\n this.isLoaded = true;\r\n } catch (error) {\r\n const errorMessage: string =\r\n error instanceof Error ? error.message : String(error);\r\n throw new Errors.InitializationError(this, errorMessage);\r\n }\r\n }\r\n\r\n protected async _attachRadioButtons(): Promise<void> {\r\n if (!this.element) {\r\n console.error(\r\n \"'this.element' not found: cannot attach radio buttons for \",\r\n this.target\r\n );\r\n return;\r\n }\r\n\r\n this.yesRadio = new Radio(\r\n this,\r\n 'input[type=\"radio\"][value=\"1\"]',\r\n this.element,\r\n 0,\r\n \"truthy\"\r\n );\r\n\r\n this.noRadio = new Radio(\r\n this,\r\n 'input[type=\"radio\"][value=\"0\"]',\r\n this.element,\r\n 0,\r\n \"falsy\"\r\n );\r\n\r\n await this.yesRadio[init]();\r\n await this.noRadio[init]();\r\n }\r\n\r\n public override clearValue(): void {\r\n // Handle radio button group if present\r\n if (this.yesRadio instanceof Radio && this.noRadio instanceof Radio) {\r\n this.yesRadio.clearValue();\r\n this.noRadio.clearValue();\r\n }\r\n super.clearValue();\r\n }\r\n\r\n /**\r\n * Unchecks both the yes and no radio buttons if they exist.\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public uncheckRadios(): DOMNodeReference {\r\n if (\r\n this.yesRadio instanceof DOMNodeReference &&\r\n this.noRadio instanceof DOMNodeReference\r\n ) {\r\n (this.yesRadio.element as HTMLInputElement).checked = false;\r\n (this.noRadio.element as HTMLInputElement).checked = false;\r\n } else {\r\n console.error(\r\n \"[SYNACT] Attempted to uncheck radios for an element that has no radios\"\r\n );\r\n }\r\n return this;\r\n }\r\n\r\n protected [destroy](): void {\r\n super[destroy]();\r\n // Destroy radio buttons if they exist\r\n this.yesRadio?.[destroy]();\r\n this.noRadio?.[destroy]();\r\n this.yesRadio = undefined;\r\n this.noRadio = undefined;\r\n }\r\n}\r\n", "import type PowerPagesElement from \"./PowerPagesElement.ts\";\r\n\r\nexport default class PowerPagesElementArray extends Array<PowerPagesElement> {\r\n /**\r\n * Hides all the containers of the PowerPagesElement instances in the array.\r\n */\r\n hideAll(this: PowerPagesElementArray) {\r\n this.forEach((instance: PowerPagesElement) => instance.hide());\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows all the containers of the PowerPagesElement instances in the array.\r\n */\r\n\r\n showAll(this: PowerPagesElementArray) {\r\n this.forEach((instance: PowerPagesElement) => instance.show());\r\n return this;\r\n }\r\n}\r\n", "import PowerPagesElementArray from \"../core/PowerPagesElementArray.ts\";\r\nimport type PowerPagesElement from \"../core/PowerPagesElement.ts\";\r\n\r\n/**\r\n *\r\n * @param array An array of PowerPagesElements to be modified with custom methods, as well as a custom getter. Custom getter allows for accessing properties within the array with bracket-style property access. See example\r\n * @example\r\n * ```javascript\r\n * const enhanced = enhanceArray(basicArray)\r\n * const someProp = enhanced['some_prop_logical_name']\r\n * ```\r\n */\r\nexport default function enhanceArray<T extends string>(\r\n array: PowerPagesElement[]\r\n): PowerPagesElementArray & Record<T, PowerPagesElement> {\r\n const enhancedArray = new PowerPagesElementArray(...array);\r\n\r\n return new Proxy(enhancedArray, {\r\n get(target, prop: string | symbol, receiver) {\r\n // Preserve existing array methods\r\n if (prop in target) {\r\n return Reflect.get(target, prop, receiver);\r\n }\r\n\r\n // Ensure `prop` is a string and search by `element.id`\r\n if (typeof prop === \"string\") {\r\n return target.find(\r\n (instance) =>\r\n instance.target.toString().replace(/[#\\[\\]]/g, \"\") === prop ||\r\n instance.logicalName === prop\r\n );\r\n }\r\n\r\n return undefined;\r\n },\r\n }) as PowerPagesElementArray & Record<T, PowerPagesElement>;\r\n}\r\n", "import type PowerPagesElementArray from \"./PowerPagesElementArray.ts\";\r\nimport PowerPagesElement from \"./PowerPagesElement.ts\";\r\nimport enhanceArray from \"../utils/enhanceArray.ts\";\r\nimport waitFor from \"./waitFor.ts\";\r\nimport { init } from \"../constants/symbols.ts\";\r\nimport Errors from \"../errors/errors.ts\";\r\n\r\n// Add function overloads to clearly specify return types based on the 'multiple' parameter\r\n/**\r\n * Creates and initializes a PowerPagesElement instance.\r\n * @see {@link CreationOptions}\r\n * @param **target** - The selector, using `querySelector` syntax, for the desired DOM element. Or, the `HTMLElement` itself for which to create a PowerPagesElement.\r\n * @param **options** - Options for advanced retrieval of elements\r\n * @param **options.multiple** - Should this call return an array of instantiated references, or just a single? Defaults to false, returning a single instance\r\n * @param **options.root** - Optionally specify the element within to search for the element targeted by 'target'. Defaults to `document.body`\r\n * @param **options.timeoutMs** - Optionally specify the amount of time that should be waited to find the targeted element before throwing error - useful for async DOM loading. Relies on MutationObserver. ***WARNING***: Implementing multiple references with timeout can result in infinite loading.\r\n * @returns A promise that resolves to a Proxy of the initialized PowerPagesElement instance.\r\n *\r\n * @see {@link PowerPagesElement}\r\n * @see {@link PowerPagesElementArray}\r\n * @see {@link enhanceArray}\r\n */\r\nexport default async function createPowerPagesElement(\r\n target: string | HTMLElement,\r\n options?: {\r\n /**\r\n * Should this call return an array of instantiated references, or just a single?\r\n * Defaults to false, returning a single instance.\r\n */\r\n multiple?: (() => boolean) | boolean;\r\n /**\r\n * Optionally specify the element within which to search for the element targeted by 'target'.\r\n * Defaults to 'document.body'.\r\n */\r\n root?: HTMLElement;\r\n /**\r\n * Optionally specify the amount of time that should be waited to find the targeted element before throwing an error.\r\n * Useful for async DOM loading. Relies on MutationObserver.\r\n * WARNING: Implementing multiple references with timeout can result in infinite loading.\r\n */\r\n timeoutMs?: number;\r\n }\r\n): Promise<PowerPagesElement>;\r\nexport default async function createPowerPagesElement(\r\n target: string,\r\n options?: {\r\n /**\r\n * Should this call return an array of instantiated references, or just a single?\r\n * Defaults to false, returning a single instance.\r\n */\r\n multiple?: false;\r\n /**\r\n * Optionally specify the element within which to search for the element targeted by 'target'.\r\n * Defaults to 'document.body'.\r\n */\r\n root?: HTMLElement;\r\n /**\r\n * Optionally specify the amount of time that should be waited to find the targeted element before throwing an error.\r\n * Useful for async DOM loading. Relies on MutationObserver.\r\n * WARNING: Implementing multiple references with timeout can result in infinite loading.\r\n */\r\n timeoutMs?: number;\r\n }\r\n): Promise<PowerPagesElement>;\r\n\r\nexport default async function createPowerPagesElement(\r\n target: Element,\r\n options?: {\r\n /**\r\n * Optionally specify the element within which to search for the element targeted by 'target'.\r\n * Defaults to 'document.body'.\r\n */\r\n root?: HTMLElement;\r\n /**\r\n * Optionally specify the amount of time that should be waited to find the targeted element before throwing an error.\r\n * Useful for async DOM loading. Relies on MutationObserver.\r\n * WARNING: Implementing multiple references with timeout can result in infinite loading.\r\n */\r\n timeoutMs?: number;\r\n }\r\n): Promise<PowerPagesElement>;\r\n\r\nexport default async function createPowerPagesElement(\r\n target: string,\r\n options?: {\r\n /**\r\n * Should this call return an array of instantiated references, or just a single?\r\n * Defaults to false, returning a single instance.\r\n */\r\n multiple?: true;\r\n /**\r\n * Optionally specify the element within which to search for the element targeted by 'target'.\r\n * Defaults to 'document.body'.\r\n */\r\n root?: HTMLElement;\r\n /**\r\n * Optionally specify the amount of time that should be waited to find the targeted element before throwing an error.\r\n * Useful for async DOM loading. Relies on MutationObserver.\r\n * WARNING: Implementing multiple references with timeout can result in infinite loading.\r\n */\r\n timeoutMs?: number;\r\n }\r\n): Promise<PowerPagesElementArray>;\r\n\r\nexport default async function createPowerPagesElement(\r\n target: Element | string,\r\n options: CreationOptions = {\r\n multiple: false,\r\n root: document.body,\r\n timeoutMs: 0,\r\n }\r\n): Promise<PowerPagesElement | PowerPagesElementArray> {\r\n try {\r\n if (typeof options !== \"object\") {\r\n throw new TypeError(\r\n `'options' must be of type 'object'. Received type: '${typeof options}'`\r\n );\r\n }\r\n\r\n validateOptions(options);\r\n const { multiple = false, root = document.body, timeoutMs = 0 } = options;\r\n\r\n // Evaluate multiple parameter once at the start\r\n const isMultiple = typeof multiple === \"function\" ? multiple() : multiple;\r\n\r\n if (isMultiple) {\r\n if (typeof target !== \"string\") {\r\n throw new TypeError(\r\n `'target' must be of type 'string' if 'multiple' is set to 'true'. Received type: '${typeof target}'`\r\n );\r\n }\r\n\r\n const elements = <HTMLElement[]>(\r\n await waitFor(target, root, true, timeoutMs)\r\n );\r\n\r\n // Avoid recursive call with multiple flag for better performance\r\n const initializedElements = <PowerPagesElementArray>await Promise.all(\r\n elements.map(async (element) => {\r\n const instance = new PowerPagesElement(element, root, timeoutMs);\r\n await instance[init]();\r\n return new Proxy(instance, createProxyHandler());\r\n })\r\n );\r\n return enhanceArray(initializedElements);\r\n }\r\n\r\n const instance = new PowerPagesElement(target, root, timeoutMs);\r\n await instance[init]();\r\n return new Proxy(instance, createProxyHandler());\r\n } catch (error) {\r\n if (error instanceof Error) throw error;\r\n else throw new Error(\"Failed to get DOM Node by target: \" + target);\r\n }\r\n}\r\n\r\nexport function validateOptions(options: Partial<CreationOptions>) {\r\n const { multiple = false, root = document.body, timeoutMs = 0 } = options;\r\n if (typeof multiple !== \"boolean\" && typeof multiple !== \"function\") {\r\n throw new TypeError(\r\n `'multiple' must be of type 'boolean' or 'function'. Received type: '${typeof multiple}'`\r\n );\r\n }\r\n if (typeof multiple === \"function\") {\r\n const value = multiple();\r\n if (typeof value !== \"boolean\") {\r\n throw new TypeError(\r\n `'multiple' function must return a boolean. Received type: '${typeof value}'`\r\n );\r\n }\r\n }\r\n if (!(root instanceof HTMLElement)) {\r\n throw new TypeError(\r\n `'root' must be of type 'HTMLElement'. Received type: '${typeof root}'`\r\n );\r\n }\r\n if (typeof timeoutMs !== \"number\") {\r\n throw new TypeError(\r\n `'timeout' must be of type 'number'. Received type: '${typeof timeoutMs}'`\r\n );\r\n }\r\n return;\r\n}\r\n\r\n// Separate proxy handler for reusability\r\nexport function createProxyHandler() {\r\n return {\r\n get: (target: PowerPagesElement, prop: string | symbol) => {\r\n if (prop.toString().startsWith(\"_\")) return undefined;\r\n\r\n const value = target[<keyof PowerPagesElement>prop];\r\n if (typeof value === \"function\" && prop !== \"onceLoaded\") {\r\n return (...args: any[]) => {\r\n target.onceLoaded(() => value.apply(target, args));\r\n return target;\r\n };\r\n }\r\n return value;\r\n },\r\n };\r\n}\r\n", "import type PowerPagesElementArray from \"./PowerPagesElementArray.ts\";\r\nimport type PowerPagesElement from \"./PowerPagesElement.ts\";\r\nimport enhanceArray from \"../utils/enhanceArray.ts\";\r\nimport get from \"./getPowerPagesElement.ts\";\r\nimport API from \"./API.ts\";\r\n\r\n/**\r\n * When loading into a page in PowerPages that has a form,\r\n * you can use this function by passing in the GUID of the form, and you will receive an array/record\r\n * of {@link PowerPagesElement}s that represent all fields, sections, sub-grids, and tabs of the given form.\r\n * Access these properties of the {@link BoundForm} using the logical name of the control you need to access: form['logical_name']\r\n * you can then execute all the methods available from PowerPagesElement\r\n * @param formId - The string GUID of the form you want to bind to\r\n * @returns An array of PowerPagesElements, accessible as properties of a Record<string, PowerPagesElement> i.e. formProp = form[\"some_logicalName\"]\r\n * @example\r\n * ```js\r\n * bindForm(\"form-guid-0000\").then((form) => {\r\n * //...use the form\r\n * const field = form[\"field_logical_name\"]\r\n * // or\r\n * form[\"other_logical_name\"].someMethod()\r\n * })\r\n *\r\n * // or\r\n *\r\n * const form = await bindForm(\"form-guid-0000\")\r\n * ```\r\n * @see {@link BoundForm}\r\n * @see {@link PowerPagesElement}\r\n */\r\nexport default async function bindForm(\r\n formId: string\r\n): Promise<PowerPagesElementArray & Record<string, PowerPagesElement>> {\r\n try {\r\n const form = await API.getRecord<Form>(\"systemforms\", formId);\r\n const { formxml } = form;\r\n\r\n /**\r\n * since the form is coming in as a string containing XML\r\n * We have to set up a parser to extract the information we need\r\n */\r\n const parser = new DOMParser(); // establish the parser\r\n const xmlDoc = parser.parseFromString(formxml, \"application/xml\"); // parse the XML\r\n /**\r\n * Then we can get the attributes we want from the parsed XML\r\n */\r\n const controls = processElements(xmlDoc.getElementsByTagName(\"control\")); // get control elements (will represent columns in the form)\r\n const sections = processElements(xmlDoc.getElementsByTagName(\"section\")); // self explanatory\r\n const tabs = processElements(xmlDoc.getElementsByTagName(\"tab\")); // self explanatory\r\n\r\n // Resolve all promises, filtering out any null values\r\n const resolvedRefs = await Promise.all([...controls, ...sections, ...tabs]);\r\n /**\r\n * Then, finally, 'enhance' the array, adding custom methods and a custom 'getter'\r\n * which will allow us to access individual nodes using the syntax `array[\"logical_name\"]`\r\n */\r\n return enhanceArray(\r\n resolvedRefs.filter((ref): ref is PowerPagesElement => ref !== null)\r\n );\r\n /** handle errors */\r\n } catch (error: unknown) {\r\n if (error instanceof Error) {\r\n console.error(error.message);\r\n throw error; // Re-throw the original error to keep stack trace\r\n } else {\r\n console.error(error);\r\n throw new Error(String(error)); // Ensure non-Error values are converted to a string\r\n }\r\n }\r\n}\r\n\r\nfunction processElements(element: HTMLCollectionOf<Element>) {\r\n return Array.from(element)\r\n .map((element) => {\r\n // use a helper function to determine the attribute we want based on the tagname of the element\r\n const identifyingAttribute = getIdentifyingAttribute(element.tagName);\r\n const datafieldname = element.getAttribute(identifyingAttribute);\r\n // if we don't find the desired thing,\r\n if (!datafieldname) return null;\r\n\r\n const referenceString: string | null = createReferenceString(\r\n element.tagName,\r\n datafieldname\r\n );\r\n if (!referenceString) return null;\r\n\r\n return get(referenceString).catch((error) => {\r\n console.warn(\r\n `Failed to create a reference to the form field: ${datafieldname}`,\r\n error\r\n );\r\n return null;\r\n });\r\n })\r\n .filter(Boolean); // Remove null values\r\n}\r\n\r\nfunction getIdentifyingAttribute(tagName: string): string {\r\n return tagName === \"control\"\r\n ? \"id\"\r\n : tagName === \"tab\" || tagName === \"section\"\r\n ? \"name\"\r\n : \"id\";\r\n}\r\n\r\nfunction createReferenceString(\r\n tagName: string,\r\n datafieldname: string\r\n): string | null {\r\n if (tagName === \"control\") return `#${datafieldname}`;\r\n if (tagName === \"tab\" || tagName === \"section\") {\r\n return `[data-name=\"${datafieldname}\"]`;\r\n }\r\n return null; // Explicitly return null instead of undefined\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["safeAjax", "ajaxOptions", "deferredAjax", "token", "data", "textStatus", "jqXHR", "API", "tableSetName", "data", "resolve", "reject", "safeAjax", "_response", "_status", "xhr", "error", "recordID", "selectColumns", "url", "queryParameters", "response", "recordId", "API_default", "EventManager", "dependency", "handler", "event", "listener", "listeners", "eventType", "args", "_event", "observer", "observerOptions", "nodeToObserve", "options", "element", "binding", "VisibilityManager", "newValue", "target", "fieldset", "tdParent", "shouldShow", "CreateInfoEl", "titleString", "iconStyle", "span", "icon", "flyoutContent", "positionFlyout", "flyoutRect", "viewportWidth", "overflowAmount", "event", "relatedTarget", "waitFor", "target", "root", "multiple", "debounceTime", "resolve", "reject", "timeout", "observedElements", "observedSet", "observer", "element", "observedElement", "CustomError", "node", "message", "InitializationError", "error", "NodeNotFoundError", "Page_ValidatorsNotFoundError", "BusinessRuleError", "SelfReferenceError", "LabelNotFoundError", "IncorrectParameterError", "functionName", "argName", "expectedTypes", "receivedType", "concatTypes", "Errors", "errors_default", "init", "destroy", "EventTypes", "DOMNodeReference", "_DOMNodeReference", "newValue", "target", "root", "timeoutMs", "init", "waitFor", "errors_default", "EventManager", "VisibilityManager", "bracketMatch", "content", "eventType", "EventTypes", "element", "parentElement", "dateNode", "prototype", "key", "value", "destroy", "eventHandler", "shouldShow", "bool", "child", "childIds", "input", "children", "ref", "callback", "elements", "label", "innerHTML", "containerStyle", "CreateInfoEl", "string", "options", "prop", "rule", "dependencies", "initialState", "isRequired", "isValid", "evaluationFunction", "isFieldRequired", "isFieldVisible", "condition", "handler", "error", "clearValues", "visibilityCondition", "fieldDisplayName", "validatorId", "newValidator", "dependency", "observer", "Radio", "DOMNodeReference", "parent", "target", "root", "timeoutMs", "radioType", "init", "ValueManager", "observer", "mutations", "mutation", "destroy", "error", "errorMessage", "errors_default", "ValueManager", "instance", "PowerPagesElement", "Radio", "value", "validatedValue", "elementValue", "resolve", "input", "select", "returnValue", "option", "cleanValue", "element", "error", "errorMessage", "PowerPagesElement", "_PowerPagesElement", "DOMNodeReference", "target", "root", "timeoutMs", "init", "ValueManager", "observer", "mutations", "mutation", "destroy", "error", "errorMessage", "errors_default", "Radio", "PowerPagesElementArray", "instance", "enhanceArray", "array", "enhancedArray", "PowerPagesElementArray", "target", "prop", "receiver", "instance", "createPowerPagesElement", "target", "options", "validateOptions", "multiple", "root", "timeoutMs", "elements", "waitFor", "initializedElements", "element", "instance", "PowerPagesElement", "init", "createProxyHandler", "enhanceArray", "error", "value", "prop", "args", "bindForm", "formId", "form", "API_default", "formxml", "xmlDoc", "controls", "processElements", "sections", "tabs", "resolvedRefs", "enhanceArray", "ref", "error", "element", "identifyingAttribute", "getIdentifyingAttribute", "datafieldname", "referenceString", "createReferenceString", "createPowerPagesElement", "tagName"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "powerpagestoolkit",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3201",
|
|
4
4
|
"description": "Reference, manipulate, and engage with Power Pages sites through the nodes in the DOM; use a variety of custom methods that allow customizing your power pages site quicker and easier. ",
|
|
5
5
|
"main": "./dist/src/index.js",
|
|
6
6
|
"module": "./dist/src/index.js",
|