powerpagestoolkit 2.701.4 → 2.701.213
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.
- package/dist/src/index.js +3 -5
- package/dist/src/index.js.map +2 -2
- package/package.json +1 -1
package/dist/src/index.js
CHANGED
|
@@ -279,7 +279,7 @@ var EventTypes = {
|
|
|
279
279
|
CHECKBOX: "click",
|
|
280
280
|
RADIO: "click",
|
|
281
281
|
SELECT: "change",
|
|
282
|
-
|
|
282
|
+
TEXTAREA: "keyup",
|
|
283
283
|
DEFAULT: "input"
|
|
284
284
|
};
|
|
285
285
|
var DOMNodeReference = class _DOMNodeReference {
|
|
@@ -382,7 +382,6 @@ var DOMNodeReference = class _DOMNodeReference {
|
|
|
382
382
|
}
|
|
383
383
|
determineEventType() {
|
|
384
384
|
if (this.element instanceof HTMLSelectElement) return "change";
|
|
385
|
-
if (this.element instanceof HTMLTextAreaElement) return "keyup";
|
|
386
385
|
if (!(this.element instanceof HTMLInputElement)) return EventTypes.DEFAULT;
|
|
387
386
|
return EventTypes[this.element.type.toUpperCase()] || EventTypes.DEFAULT;
|
|
388
387
|
}
|
|
@@ -856,7 +855,6 @@ var DOMNodeReference = class _DOMNodeReference {
|
|
|
856
855
|
*/
|
|
857
856
|
applyBusinessRule(rule, dependencies) {
|
|
858
857
|
try {
|
|
859
|
-
const clearValuesOnHide = rule.setVisibility && rule.setVisibility.length > 1 ? rule.setVisibility[1] : true;
|
|
860
858
|
if (rule.setVisibility) {
|
|
861
859
|
const [condition] = rule.setVisibility;
|
|
862
860
|
const initialState = condition.call(this);
|
|
@@ -908,10 +906,10 @@ var DOMNodeReference = class _DOMNodeReference {
|
|
|
908
906
|
condition.call(this) ? this.disable() : this.enable();
|
|
909
907
|
}
|
|
910
908
|
if (dependencies.length) {
|
|
911
|
-
let visibilityCondition, isRequired, valueCondition, value, disabledCondition;
|
|
909
|
+
let visibilityCondition, clearValuesOnHide, isRequired, valueCondition, value, disabledCondition;
|
|
912
910
|
const aggregateHandler = (rule2) => {
|
|
913
911
|
if (rule2.setVisibility) {
|
|
914
|
-
[visibilityCondition] = rule2.setVisibility;
|
|
912
|
+
[visibilityCondition, clearValuesOnHide = true] = rule2.setVisibility;
|
|
915
913
|
this.toggleVisibility(visibilityCondition.call(this));
|
|
916
914
|
}
|
|
917
915
|
if (rule2.setRequired) {
|
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/core/waitFor.ts", "../../src/utils/createInfoElement.ts", "../../src/constants/symbols.ts", "../../src/errors/errors.ts", "../../src/core/DOMNodeReference.ts", "../../src/core/DOMNodeReferenceArray.ts", "../../src/utils/enhanceArray.ts", "../../src/core/createDOMNodeReferences.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\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: JSON): 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: object\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", "/**\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", "/**\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", "export const init = Symbol(\"__I\");\r\nexport const destroy = Symbol(\"__D\");\r\nexport const valueSync = Symbol(\"__VS\");\r\nexport const dateSync = Symbol(\"__DS\");\r\nexport const getElementValue = Symbol(\"__GEV\");\r\nexport const attachVisibilityController = Symbol(\"__AVC\");\r\nexport const attachRadioButtons = Symbol(\"__ARB\");\r\nexport const bindMethods = Symbol(\"__B\");\r\nexport const debounceTime = Symbol(\"__DT\");\r\nexport const observers = Symbol(\"__O\");\r\nexport const boundEventListeners = Symbol(\"__BEV\");\r\nexport const isValidFormElement = Symbol(\"__VFE\");\r\nexport const registerEventListener = Symbol(\"__REV\");\r\n", "import type DOMNodeReference from \"../core/DOMNodeReference.ts\";\r\n\r\nexport class DOMNodeInitializationError extends Error {\r\n constructor(instance: DOMNodeReference, error: string) {\r\n super(\r\n `There was an error initializing a DOMNodeReference for target: ${instance.target}, :: ${error}`\r\n );\r\n this.name = \"DOMNodeInitializationError\";\r\n }\r\n}\r\n\r\nexport class DOMNodeNotFoundError extends Error {\r\n constructor(instance: DOMNodeReference) {\r\n super(`The targeted DOM element was not found: ${instance.target}`);\r\n }\r\n}\r\n\r\nexport class ConditionalRenderingError extends Error {\r\n constructor(instance: DOMNodeReference, error: string) {\r\n super(\r\n `There was an error condiguring conditional rendering for target: ${instance.target} :: ${error}`\r\n );\r\n }\r\n}\r\n\r\nexport class ValidationConfigError extends Error {\r\n constructor(node: DOMNodeReference, message: string) {\r\n super(`Validation configuration error for ${node.target}: ${message}`);\r\n this.name = \"ValidationConfigError\";\r\n }\r\n}\r\n", "import waitFor from \"./waitFor.ts\";\r\nimport createInfoEl from \"../utils/createInfoElement.ts\";\r\nimport createRef from \"./createDOMNodeReferences.ts\";\r\nimport * as s from \"../constants/symbols.ts\";\r\nimport {\r\n ConditionalRenderingError,\r\n DOMNodeInitializationError,\r\n DOMNodeNotFoundError,\r\n ValidationConfigError,\r\n} from \"../errors/errors.ts\";\r\n\r\nconst 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\r\nexport default class DOMNodeReference {\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 protected [s.debounceTime]: number;\r\n protected isLoaded: boolean;\r\n protected defaultDisplay: string;\r\n protected [s.observers]: Array<MutationObserver> = [];\r\n protected [s.boundEventListeners]: Array<BoundEventListener> = [];\r\n protected isRadio: boolean = false;\r\n protected radioType: RadioType | null = null;\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 value: any;\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 protected declare visibilityController: HTMLElement;\r\n public declare checked: boolean;\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 | null;\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 | null;\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 debounceTime: number\r\n ) {\r\n this.target = target;\r\n this.logicalName = this.extractLogicalName(target);\r\n this.root = root;\r\n this[s.debounceTime] = debounceTime;\r\n this.isLoaded = false;\r\n this.defaultDisplay = \"\";\r\n this.value = null;\r\n\r\n // we want to ensure that all method calls from the consumer have access to 'this'\r\n this[s.bindMethods]();\r\n // we defer the rest of initialization\r\n }\r\n\r\n private 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 public async [s.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 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[s.debounceTime]\r\n )) as HTMLElement;\r\n }\r\n\r\n if (!this.element) {\r\n throw new DOMNodeNotFoundError(this);\r\n }\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[s.attachRadioButtons]();\r\n }\r\n\r\n this[s.valueSync]();\r\n this[s.attachVisibilityController]();\r\n this.defaultDisplay = this.visibilityController.style.display;\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[s.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 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 DOMNodeInitializationError(this, errorMessage);\r\n }\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 [s.valueSync](): void {\r\n if (!this[s.isValidFormElement](this.element)) return;\r\n\r\n this.updateValue();\r\n const eventType = this.determineEventType();\r\n this[s.registerEventListener](this.element, eventType, this.updateValue);\r\n\r\n if (this.isDateInput()) {\r\n this[s.dateSync](this.element as HTMLInputElement);\r\n }\r\n }\r\n\r\n private 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 private 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 [s.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 [s.registerEventListener](\r\n element: Element,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (e: Event) => unknown\r\n ) {\r\n element.addEventListener(eventType, handler);\r\n\r\n this[s.boundEventListeners].push({\r\n element,\r\n handler,\r\n event: eventType,\r\n });\r\n }\r\n\r\n protected async [s.dateSync](element: HTMLInputElement): Promise<void> {\r\n const parentElement = element.parentElement;\r\n if (!parentElement) {\r\n throw new Error(\"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[s.registerEventListener](dateNode, \"select\", this.updateValue);\r\n }\r\n\r\n /**\r\n * Gets the current value of the element based on its type\r\n * @protected\r\n * @returns Object containing value and optional checked state\r\n */\r\n protected [s.getElementValue](): ElementValue {\r\n const input = this.element as HTMLInputElement;\r\n const select = this.element as HTMLSelectElement;\r\n\r\n if (\r\n this.yesRadio instanceof DOMNodeReference &&\r\n this.noRadio instanceof DOMNodeReference\r\n ) {\r\n return {\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 switch (input.type) {\r\n case \"checkbox\":\r\n case \"radio\":\r\n return {\r\n value: input.checked,\r\n checked: input.checked,\r\n };\r\n\r\n case \"select-multiple\":\r\n return {\r\n value: Array.from(select.selectedOptions).map(\r\n (option) => option.value\r\n ),\r\n };\r\n\r\n case \"select-one\":\r\n return {\r\n value: select.value,\r\n };\r\n\r\n case \"number\":\r\n return {\r\n value: input.value !== \"\" ? Number(input.value) : null,\r\n };\r\n\r\n default: {\r\n let cleanValue: string = input.value;\r\n if (\r\n this.element.classList.contains(\"decimal\") ||\r\n this.element.classList.contains(\"money\")\r\n ) {\r\n cleanValue = input.value.replace(/[$,]/g, \"\");\r\n }\r\n\r\n returnValue = {\r\n value:\r\n this.element.classList.contains(\"decimal\") ||\r\n this.element.classList.contains(\"money\")\r\n ? parseFloat(cleanValue)\r\n : 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 return returnValue;\r\n }\r\n\r\n protected [s.attachVisibilityController](): void {\r\n // Set the default visibility controller to the element itself\r\n this.visibilityController = this.element;\r\n\r\n // If the element is a table, use its closest fieldset as the controller\r\n if (this.element.tagName === \"TABLE\") {\r\n const fieldset = this.element.closest(\"fieldset\");\r\n if (fieldset) {\r\n this.visibilityController = fieldset;\r\n }\r\n return;\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(this.element.tagName)) {\r\n const tdParent = this.element.closest(\"td\");\r\n if (tdParent) {\r\n this.visibilityController = tdParent;\r\n }\r\n }\r\n }\r\n\r\n protected async [s.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 = await createRef('input[type=\"radio\"][value=\"1\"]', {\r\n root: this.element,\r\n });\r\n this.yesRadio.isRadio = true;\r\n this.yesRadio.radioType = \"truthy\";\r\n this.noRadio = await createRef('input[type=\"radio\"][value=\"0\"]', {\r\n root: this.element,\r\n });\r\n this.noRadio.isRadio = true;\r\n this.noRadio.radioType = \"falsy\";\r\n }\r\n\r\n protected [s.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 [s.destroy](): void {\r\n this[s.boundEventListeners]?.forEach((binding) => {\r\n binding.element?.removeEventListener(binding.event, binding.handler);\r\n });\r\n this[s.observers]?.forEach((observer) => {\r\n observer.disconnect();\r\n });\r\n this.yesRadio?.[s.destroy]();\r\n this.noRadio?.[s.destroy]();\r\n this.yesRadio = null;\r\n this.noRadio = null;\r\n this.isLoaded = false;\r\n this.value = 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 updateValue(e?: Event): void {\r\n if (e && !e.isTrusted) return;\r\n\r\n if (e) {\r\n e.stopPropagation();\r\n }\r\n\r\n if (this.yesRadio && this.noRadio) {\r\n this.yesRadio!.updateValue();\r\n this.noRadio!.updateValue();\r\n }\r\n\r\n const elementValue = this[s.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 protected validateValue(value: any): any {\r\n if (value === null || value === \"\") {\r\n return value; // Preserve null or empty string\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 /**\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: (e: Event) => void\r\n ): DOMNodeReference {\r\n if (typeof eventHandler !== \"function\") {\r\n throw new Error(\r\n `Argument \"eventHandler\" must be a Function. Received: ${typeof eventHandler}`\r\n );\r\n }\r\n\r\n this[s.registerEventListener](\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.visibilityController.style.display = \"none\";\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.visibilityController.style.display = this.defaultDisplay;\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: ((instance: DOMNodeReference) => boolean) | boolean\r\n ): DOMNodeReference {\r\n if (shouldShow instanceof Function) {\r\n shouldShow(this) ? this.show() : this.hide();\r\n } else {\r\n shouldShow ? this.show() : this.hide();\r\n }\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\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 = value;\r\n (this.noRadio.element as HTMLInputElement).checked = !value;\r\n this.value = value;\r\n this.checked = value;\r\n (this.element as HTMLInputElement).checked = value;\r\n } else if (\r\n this.isRadio ||\r\n (this.element as HTMLInputElement).type === \"radio\"\r\n ) {\r\n this.checked = value;\r\n (this.element as HTMLInputElement).checked = value;\r\n } else {\r\n (this.element as HTMLInputElement).value = value;\r\n }\r\n\r\n this.value = this.validateValue(value);\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 try {\r\n (this.element as HTMLInputElement).disabled = true;\r\n } catch (error) {\r\n const errorMessage: string =\r\n error instanceof Error ? error.message : String(error);\r\n throw new Error(\r\n `There was an error trying to disable the target: ${this.target}: \"${errorMessage}\"`\r\n );\r\n }\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 * @returns - Instance of this [provides option to method chain]\r\n * @throws If clearing values fails\r\n */\r\n public async clearValue(): Promise<DOMNodeReference> {\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 = \"\";\r\n break;\r\n\r\n default: // handles text, email, tel, etc.\r\n element.value = \"\";\r\n this.value = \"\";\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 = [];\r\n } else {\r\n element.selectedIndex = -1;\r\n this.value = \"\";\r\n }\r\n } else if (element instanceof HTMLTextAreaElement) {\r\n element.value = \"\";\r\n this.value = \"\";\r\n } else {\r\n this.value = \"\";\r\n\r\n // Handle nested input elements in container elements\r\n const childInputs = Array.from(\r\n this.element.querySelectorAll(\"input, select, textarea\")\r\n );\r\n\r\n if (childInputs.length > 0) {\r\n const promises = childInputs.map(async (input) => {\r\n const inputRef = (await createRef(\r\n <HTMLElement>input\r\n )) as DOMNodeReference;\r\n return inputRef.clearValue();\r\n });\r\n\r\n await Promise.all(promises);\r\n }\r\n }\r\n\r\n // Handle radio button group if present\r\n if (\r\n this.yesRadio instanceof DOMNodeReference &&\r\n this.noRadio instanceof DOMNodeReference\r\n ) {\r\n await this.yesRadio.clearValue();\r\n await this.noRadio.clearValue();\r\n }\r\n\r\n // Dispatch events in the correct order\r\n const events = [\r\n new Event(\"input\", { bubbles: true }),\r\n new Event(\"change\", { bubbles: true }),\r\n new Event(\"click\", { bubbles: true }),\r\n ];\r\n\r\n events.forEach((event) => this.element.dispatchEvent(event));\r\n\r\n return this;\r\n } catch (error) {\r\n const errorMessage = `Failed to clear values for element with target \"${\r\n this.target\r\n }\": ${error instanceof Error ? error.message : String(error)}`;\r\n throw new Error(errorMessage);\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 try {\r\n (this.element as HTMLInputElement).disabled = false;\r\n } catch (_error) {\r\n throw new Error(\r\n `There was an error trying to disable the target: ${this.target}`\r\n );\r\n }\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 {HTMLElement} The label element associated with this element.\r\n */\r\n public getLabel(): HTMLElement | null {\r\n return document.querySelector(`#${this.element.id}_label`) || null;\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} 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 * @param options and object containing the styles you want to set : {key: value} e.g.: {'display': 'block'}\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public setStyle(options: Partial<CSSStyleDeclaration>) {\r\n if (Object.prototype.toString.call(options) !== \"[object Object]\") {\r\n throw new Error(\r\n `powerpagestoolkit: 'DOMNodeReference.setStyle' required options to be in the form of an object. Argument passed was of type: ${typeof options}`\r\n );\r\n }\r\n\r\n for (const _key in options) {\r\n const key: any = _key as keyof Partial<CSSStyleDeclaration>;\r\n this.element.style[key] = <string>options[key];\r\n }\r\n return this;\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 /**\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 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: DOMNodeReference[]\r\n ): DOMNodeReference {\r\n try {\r\n const clearValuesOnHide =\r\n rule.setVisibility && rule.setVisibility.length > 1\r\n ? rule.setVisibility![1]\r\n : true;\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.setRequired) {\r\n const [isRequired, isValid] = rule.setRequired;\r\n\r\n const fieldDisplayName = (() => {\r\n let label: any = this.getLabel();\r\n if (!label) {\r\n throw new Error(\r\n `There was an error accessing the label for this element: ${\r\n this.target as string\r\n }`\r\n );\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 if (typeof Page_Validators === \"undefined\") {\r\n throw new ValidationConfigError(this, \"Page_Validators not found\");\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: () => {\r\n const isFieldRequired = isRequired.call(this);\r\n const isFieldVisible =\r\n window.getComputedStyle(this.visibilityController).display !==\r\n \"none\";\r\n\r\n return (\r\n !isFieldRequired ||\r\n !isFieldVisible ||\r\n isValid.call(this, isFieldRequired)\r\n );\r\n },\r\n });\r\n\r\n Page_Validators.push(newValidator);\r\n this.setRequiredLevel(isRequired.call(this));\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 // setup dep tracking\r\n if (dependencies.length) {\r\n let visibilityCondition,\r\n isRequired,\r\n valueCondition,\r\n value,\r\n disabledCondition;\r\n const aggregateHandler = (rule: BusinessRule) => {\r\n if (rule.setVisibility) {\r\n [visibilityCondition] = rule.setVisibility;\r\n this.toggleVisibility(visibilityCondition.call(this));\r\n }\r\n if (rule.setRequired) {\r\n [isRequired] = rule.setRequired;\r\n this.setRequiredLevel(isRequired.call(this));\r\n }\r\n if (rule.setValue) {\r\n [valueCondition, value] = rule.setValue;\r\n if (valueCondition.call(this)) this.setValue.call(this, value);\r\n }\r\n if (rule.setDisabled) {\r\n disabledCondition = rule.setDisabled;\r\n disabledCondition.call(this) ? this.disable() : this.enable;\r\n }\r\n };\r\n this._configDependencyTracking(\r\n () => aggregateHandler(rule),\r\n dependencies,\r\n {\r\n clearValuesOnHide,\r\n observeVisibility: true,\r\n trackInputEvents: false,\r\n trackRadioButtons: false,\r\n }\r\n );\r\n }\r\n\r\n return this;\r\n } catch (error: any) {\r\n throw new ValidationConfigError(\r\n this,\r\n `Failed to apply business rule: ${error}`\r\n );\r\n }\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 * @param options Additional configuration options. clearValuesOnHide defaults to false.\r\n * all other options defaults to true\r\n */\r\n protected _configDependencyTracking(\r\n handler: () => void,\r\n dependencies: Array<DOMNodeReference>,\r\n options: {\r\n clearValuesOnHide?: boolean;\r\n observeVisibility?: boolean;\r\n trackInputEvents?: boolean;\r\n trackRadioButtons?: boolean;\r\n } = {\r\n clearValuesOnHide: false,\r\n observeVisibility: true,\r\n trackInputEvents: true,\r\n trackRadioButtons: true,\r\n }\r\n ): void {\r\n const {\r\n clearValuesOnHide = false,\r\n observeVisibility = true,\r\n trackInputEvents = true,\r\n trackRadioButtons = true,\r\n } = options;\r\n\r\n if (!dependencies?.length) {\r\n console.warn(\r\n `powerpagestoolkit: No dependencies specified for ${this.element.id}. ` +\r\n \"Include all referenced nodes in the dependency array for proper tracking.\"\r\n );\r\n return;\r\n }\r\n\r\n dependencies.forEach((dep) => {\r\n if (!dep || !(dep 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 // Handle value changes\r\n const handleChange = () => {\r\n handler();\r\n\r\n // Handle clearing values if element becomes hidden\r\n if (\r\n clearValuesOnHide &&\r\n window.getComputedStyle(this.visibilityController).display === \"none\"\r\n ) {\r\n this.clearValue();\r\n }\r\n };\r\n\r\n this[s.registerEventListener](dep.element, \"change\", handleChange);\r\n\r\n if (trackInputEvents) {\r\n this[s.registerEventListener](dep.element, \"input\", handleChange);\r\n }\r\n\r\n // Handle visibility changes\r\n if (observeVisibility) {\r\n const observer = new MutationObserver(() => {\r\n const display = window.getComputedStyle(\r\n dep.visibilityController\r\n ).display;\r\n if (display !== \"none\") {\r\n handler();\r\n }\r\n });\r\n\r\n observer.observe(dep.visibilityController, {\r\n attributes: true,\r\n attributeFilter: [\"style\"],\r\n subtree: false,\r\n });\r\n\r\n this[s.observers].push(observer);\r\n }\r\n\r\n // Handle radio button changes if applicable\r\n if (trackRadioButtons && dep.yesRadio && dep.noRadio) {\r\n [dep.yesRadio, dep.noRadio].forEach((radio) => {\r\n radio.on(\"change\", handleChange) as DOMNodeReference;\r\n //make sure to track event listener for s.destroy()\r\n this[s.boundEventListeners].push({\r\n element: radio.element,\r\n event: \"change\",\r\n handler: handleChange,\r\n });\r\n });\r\n }\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 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 });\r\n\r\n observer.observe(document.body, {\r\n subtree: true,\r\n childList: true,\r\n });\r\n\r\n this[s.observers].push(observer);\r\n }\r\n}\r\n", "import type DOMNodeReference from \"./DOMNodeReference.ts\";\r\n\r\nexport default class DOMNodeReferenceArray extends Array<DOMNodeReference> {\r\n /**\r\n * Hides all the containers of the DOMNodeReference instances in the array.\r\n */\r\n hideAll(this: DOMNodeReferenceArray) {\r\n this.forEach((instance: DOMNodeReference) => instance.hide());\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows all the containers of the DOMNodeReference instances in the array.\r\n */\r\n\r\n showAll(this: DOMNodeReferenceArray) {\r\n this.forEach((instance: DOMNodeReference) => instance.show());\r\n return this;\r\n }\r\n}\r\n", "import DOMNodeReferenceArray from \"../core/DOMNodeReferenceArray.ts\";\r\nimport type DOMNodeReference from \"../core/DOMNodeReference.ts\";\r\n\r\n/**\r\n *\r\n * @param array An array of DOMnodeReferences 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: DOMNodeReference[]\r\n): DOMNodeReferenceArray & Record<T, DOMNodeReference> {\r\n const enhancedArray = new DOMNodeReferenceArray(...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 DOMNodeReferenceArray & Record<T, DOMNodeReference>;\r\n}\r\n", "import DOMNodeReference from \"./DOMNodeReference.ts\";\r\nimport enhanceArray from \"../utils/enhanceArray.ts\";\r\nimport waitFor from \"./waitFor.ts\";\r\nimport { init } from \"../constants/symbols.ts\";\r\nimport type DOMNodeReferenceArray from \"./DOMNodeReferenceArray.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 DOMNodeReference 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 DOMNodeReference.\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 DOMNodeReference instance.\r\n *\r\n * @see {@link DOMNodeReference}\r\n * @see {@link DOMNodeReferenceArray}\r\n * @see {@link enhanceArray}\r\n */\r\nexport default async function createDOMNodeReference(\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<DOMNodeReference>;\r\nexport default async function createDOMNodeReference(\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<DOMNodeReference>;\r\n\r\nexport default async function createDOMNodeReference(\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<DOMNodeReference>;\r\n\r\nexport default async function createDOMNodeReference(\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<DOMNodeReferenceArray>;\r\n\r\nexport default async function createDOMNodeReference(\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<DOMNodeReference | DOMNodeReferenceArray> {\r\n try {\r\n if (typeof options !== \"object\") {\r\n throw new Error(\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 Error(\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 = <DOMNodeReferenceArray> await Promise.all(\r\n elements.map(async (element) => {\r\n const instance = new DOMNodeReference(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 DOMNodeReference(target, root, timeoutMs);\r\n await instance[init]();\r\n return new Proxy(instance, createProxyHandler());\r\n } catch (e) {\r\n throw new Error(<string> e);\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 Error(\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 Error(\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 Error(\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 Error(\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: DOMNodeReference, prop: string | symbol) => {\r\n if (prop.toString().startsWith(\"_\")) return undefined;\r\n\r\n const value = target[<keyof DOMNodeReference> 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 API from \"./API.ts\";\r\nimport createRef from \"./createDOMNodeReferences.ts\";\r\nimport enhanceArray from \"../utils/enhanceArray.ts\";\r\nimport type DOMNodeReference from \"./DOMNodeReference.ts\";\r\nimport type DOMNodeReferenceArray from \"./DOMNodeReferenceArray.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 DOMNodeReference}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 DOMNodeReference\r\n * @param formId - The string GUID of the form you want to bind to\r\n * @returns An array of DOMNodeReferences, accessible as properties of a Record<string, DOMNodeReference> 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 DOMNodeReference}\r\n */\r\nexport default async function bindForm(\r\n formId: string\r\n): Promise<DOMNodeReferenceArray & Record<string, DOMNodeReference>> {\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\r\n return enhanceArray(\r\n resolvedRefs.filter((ref): ref is DOMNodeReference => 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 createRef(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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",
|
|
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\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: JSON): 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: object\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", "/**\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", "/**\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", "export const init = Symbol(\"__I\");\r\nexport const destroy = Symbol(\"__D\");\r\nexport const valueSync = Symbol(\"__VS\");\r\nexport const dateSync = Symbol(\"__DS\");\r\nexport const getElementValue = Symbol(\"__GEV\");\r\nexport const attachVisibilityController = Symbol(\"__AVC\");\r\nexport const attachRadioButtons = Symbol(\"__ARB\");\r\nexport const bindMethods = Symbol(\"__B\");\r\nexport const debounceTime = Symbol(\"__DT\");\r\nexport const observers = Symbol(\"__O\");\r\nexport const boundEventListeners = Symbol(\"__BEV\");\r\nexport const isValidFormElement = Symbol(\"__VFE\");\r\nexport const registerEventListener = Symbol(\"__REV\");\r\n", "import type DOMNodeReference from \"../core/DOMNodeReference.ts\";\r\n\r\nexport class DOMNodeInitializationError extends Error {\r\n constructor(instance: DOMNodeReference, error: string) {\r\n super(\r\n `There was an error initializing a DOMNodeReference for target: ${instance.target}, :: ${error}`\r\n );\r\n this.name = \"DOMNodeInitializationError\";\r\n }\r\n}\r\n\r\nexport class DOMNodeNotFoundError extends Error {\r\n constructor(instance: DOMNodeReference) {\r\n super(`The targeted DOM element was not found: ${instance.target}`);\r\n }\r\n}\r\n\r\nexport class ConditionalRenderingError extends Error {\r\n constructor(instance: DOMNodeReference, error: string) {\r\n super(\r\n `There was an error condiguring conditional rendering for target: ${instance.target} :: ${error}`\r\n );\r\n }\r\n}\r\n\r\nexport class ValidationConfigError extends Error {\r\n constructor(node: DOMNodeReference, message: string) {\r\n super(`Validation configuration error for ${node.target}: ${message}`);\r\n this.name = \"ValidationConfigError\";\r\n }\r\n}\r\n", "import waitFor from \"./waitFor.ts\";\r\nimport createInfoEl from \"../utils/createInfoElement.ts\";\r\nimport createRef from \"./createDOMNodeReferences.ts\";\r\nimport * as s from \"../constants/symbols.ts\";\r\nimport {\r\n ConditionalRenderingError,\r\n DOMNodeInitializationError,\r\n DOMNodeNotFoundError,\r\n ValidationConfigError,\r\n} from \"../errors/errors.ts\";\r\n\r\nconst EventTypes = {\r\n CHECKBOX: \"click\",\r\n RADIO: \"click\",\r\n SELECT: \"change\",\r\n TEXTAREA: \"keyup\",\r\n DEFAULT: \"input\",\r\n} as const;\r\n\r\nexport default class DOMNodeReference {\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 protected [s.debounceTime]: number;\r\n protected isLoaded: boolean;\r\n protected defaultDisplay: string;\r\n protected [s.observers]: Array<MutationObserver> = [];\r\n protected [s.boundEventListeners]: Array<BoundEventListener> = [];\r\n protected isRadio: boolean = false;\r\n protected radioType: RadioType | null = null;\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 value: any;\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 protected declare visibilityController: HTMLElement;\r\n public declare checked: boolean;\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 | null;\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 | null;\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 debounceTime: number\r\n ) {\r\n this.target = target;\r\n this.logicalName = this.extractLogicalName(target);\r\n this.root = root;\r\n this[s.debounceTime] = debounceTime;\r\n this.isLoaded = false;\r\n this.defaultDisplay = \"\";\r\n this.value = null;\r\n\r\n // we want to ensure that all method calls from the consumer have access to 'this'\r\n this[s.bindMethods]();\r\n // we defer the rest of initialization\r\n }\r\n\r\n private 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 public async [s.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 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[s.debounceTime]\r\n )) as HTMLElement;\r\n }\r\n\r\n if (!this.element) {\r\n throw new DOMNodeNotFoundError(this);\r\n }\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[s.attachRadioButtons]();\r\n }\r\n\r\n this[s.valueSync]();\r\n this[s.attachVisibilityController]();\r\n this.defaultDisplay = this.visibilityController.style.display;\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[s.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 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 DOMNodeInitializationError(this, errorMessage);\r\n }\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 [s.valueSync](): void {\r\n if (!this[s.isValidFormElement](this.element)) return;\r\n\r\n this.updateValue();\r\n const eventType = this.determineEventType();\r\n this[s.registerEventListener](this.element, eventType, this.updateValue);\r\n\r\n if (this.isDateInput()) {\r\n this[s.dateSync](this.element as HTMLInputElement);\r\n }\r\n }\r\n\r\n private determineEventType(): keyof HTMLElementEventMap {\r\n if (this.element instanceof HTMLSelectElement) return \"change\";\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 private 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 [s.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 [s.registerEventListener](\r\n element: Element,\r\n eventType: keyof HTMLElementEventMap,\r\n handler: (e: Event) => unknown\r\n ) {\r\n element.addEventListener(eventType, handler);\r\n\r\n this[s.boundEventListeners].push({\r\n element,\r\n handler,\r\n event: eventType,\r\n });\r\n }\r\n\r\n protected async [s.dateSync](element: HTMLInputElement): Promise<void> {\r\n const parentElement = element.parentElement;\r\n if (!parentElement) {\r\n throw new Error(\"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[s.registerEventListener](dateNode, \"select\", this.updateValue);\r\n }\r\n\r\n /**\r\n * Gets the current value of the element based on its type\r\n * @protected\r\n * @returns Object containing value and optional checked state\r\n */\r\n protected [s.getElementValue](): ElementValue {\r\n const input = this.element as HTMLInputElement;\r\n const select = this.element as HTMLSelectElement;\r\n\r\n if (\r\n this.yesRadio instanceof DOMNodeReference &&\r\n this.noRadio instanceof DOMNodeReference\r\n ) {\r\n return {\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 switch (input.type) {\r\n case \"checkbox\":\r\n case \"radio\":\r\n return {\r\n value: input.checked,\r\n checked: input.checked,\r\n };\r\n\r\n case \"select-multiple\":\r\n return {\r\n value: Array.from(select.selectedOptions).map(\r\n (option) => option.value\r\n ),\r\n };\r\n\r\n case \"select-one\":\r\n return {\r\n value: select.value,\r\n };\r\n\r\n case \"number\":\r\n return {\r\n value: input.value !== \"\" ? Number(input.value) : null,\r\n };\r\n\r\n default: {\r\n let cleanValue: string = input.value;\r\n if (\r\n this.element.classList.contains(\"decimal\") ||\r\n this.element.classList.contains(\"money\")\r\n ) {\r\n cleanValue = input.value.replace(/[$,]/g, \"\");\r\n }\r\n\r\n returnValue = {\r\n value:\r\n this.element.classList.contains(\"decimal\") ||\r\n this.element.classList.contains(\"money\")\r\n ? parseFloat(cleanValue)\r\n : 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 return returnValue;\r\n }\r\n\r\n protected [s.attachVisibilityController](): void {\r\n // Set the default visibility controller to the element itself\r\n this.visibilityController = this.element;\r\n\r\n // If the element is a table, use its closest fieldset as the controller\r\n if (this.element.tagName === \"TABLE\") {\r\n const fieldset = this.element.closest(\"fieldset\");\r\n if (fieldset) {\r\n this.visibilityController = fieldset;\r\n }\r\n return;\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(this.element.tagName)) {\r\n const tdParent = this.element.closest(\"td\");\r\n if (tdParent) {\r\n this.visibilityController = tdParent;\r\n }\r\n }\r\n }\r\n\r\n protected async [s.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 = await createRef('input[type=\"radio\"][value=\"1\"]', {\r\n root: this.element,\r\n });\r\n this.yesRadio.isRadio = true;\r\n this.yesRadio.radioType = \"truthy\";\r\n this.noRadio = await createRef('input[type=\"radio\"][value=\"0\"]', {\r\n root: this.element,\r\n });\r\n this.noRadio.isRadio = true;\r\n this.noRadio.radioType = \"falsy\";\r\n }\r\n\r\n protected [s.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 [s.destroy](): void {\r\n this[s.boundEventListeners]?.forEach((binding) => {\r\n binding.element?.removeEventListener(binding.event, binding.handler);\r\n });\r\n this[s.observers]?.forEach((observer) => {\r\n observer.disconnect();\r\n });\r\n this.yesRadio?.[s.destroy]();\r\n this.noRadio?.[s.destroy]();\r\n this.yesRadio = null;\r\n this.noRadio = null;\r\n this.isLoaded = false;\r\n this.value = 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 updateValue(e?: Event): void {\r\n if (e && !e.isTrusted) return;\r\n\r\n if (e) {\r\n e.stopPropagation();\r\n }\r\n\r\n if (this.yesRadio && this.noRadio) {\r\n this.yesRadio!.updateValue();\r\n this.noRadio!.updateValue();\r\n }\r\n\r\n const elementValue = this[s.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\r\n protected validateValue(value: any): any {\r\n if (value === null || value === \"\") {\r\n return value; // Preserve null or empty string\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 /**\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: (e: Event) => void\r\n ): DOMNodeReference {\r\n if (typeof eventHandler !== \"function\") {\r\n throw new Error(\r\n `Argument \"eventHandler\" must be a Function. Received: ${typeof eventHandler}`\r\n );\r\n }\r\n\r\n this[s.registerEventListener](\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.visibilityController.style.display = \"none\";\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.visibilityController.style.display = this.defaultDisplay;\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: ((instance: DOMNodeReference) => boolean) | boolean\r\n ): DOMNodeReference {\r\n if (shouldShow instanceof Function) {\r\n shouldShow(this) ? this.show() : this.hide();\r\n } else {\r\n shouldShow ? this.show() : this.hide();\r\n }\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\r\n // const eventType = this.determineEventType();\r\n // this.element.dispatchEvent(new Event(eventType, { bubbles: false }));\r\n\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 = value;\r\n (this.noRadio.element as HTMLInputElement).checked = !value;\r\n this.value = value;\r\n this.checked = value;\r\n (this.element as HTMLInputElement).checked = value;\r\n } else if (\r\n this.isRadio ||\r\n (this.element as HTMLInputElement).type === \"radio\"\r\n ) {\r\n this.checked = value;\r\n (this.element as HTMLInputElement).checked = value;\r\n } else {\r\n (this.element as HTMLInputElement).value = value;\r\n }\r\n\r\n this.value = this.validateValue(value);\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 try {\r\n (this.element as HTMLInputElement).disabled = true;\r\n } catch (error) {\r\n const errorMessage: string =\r\n error instanceof Error ? error.message : String(error);\r\n throw new Error(\r\n `There was an error trying to disable the target: ${this.target}: \"${errorMessage}\"`\r\n );\r\n }\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 * @returns - Instance of this [provides option to method chain]\r\n * @throws If clearing values fails\r\n */\r\n public async clearValue(): Promise<DOMNodeReference> {\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 = \"\";\r\n break;\r\n\r\n default: // handles text, email, tel, etc.\r\n element.value = \"\";\r\n this.value = \"\";\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 = [];\r\n } else {\r\n element.selectedIndex = -1;\r\n this.value = \"\";\r\n }\r\n } else if (element instanceof HTMLTextAreaElement) {\r\n element.value = \"\";\r\n this.value = \"\";\r\n } else {\r\n this.value = \"\";\r\n\r\n // Handle nested input elements in container elements\r\n const childInputs = Array.from(\r\n this.element.querySelectorAll(\"input, select, textarea\")\r\n );\r\n\r\n if (childInputs.length > 0) {\r\n const promises = childInputs.map(async (input) => {\r\n const inputRef = (await createRef(\r\n <HTMLElement>input\r\n )) as DOMNodeReference;\r\n return inputRef.clearValue();\r\n });\r\n\r\n await Promise.all(promises);\r\n }\r\n }\r\n\r\n // Handle radio button group if present\r\n if (\r\n this.yesRadio instanceof DOMNodeReference &&\r\n this.noRadio instanceof DOMNodeReference\r\n ) {\r\n await this.yesRadio.clearValue();\r\n await this.noRadio.clearValue();\r\n }\r\n\r\n // Dispatch events in the correct order\r\n const events = [\r\n new Event(\"input\", { bubbles: true }),\r\n new Event(\"change\", { bubbles: true }),\r\n new Event(\"click\", { bubbles: true }),\r\n ];\r\n\r\n events.forEach((event) => this.element.dispatchEvent(event));\r\n\r\n return this;\r\n } catch (error) {\r\n const errorMessage = `Failed to clear values for element with target \"${\r\n this.target\r\n }\": ${error instanceof Error ? error.message : String(error)}`;\r\n throw new Error(errorMessage);\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 try {\r\n (this.element as HTMLInputElement).disabled = false;\r\n } catch (_error) {\r\n throw new Error(\r\n `There was an error trying to disable the target: ${this.target}`\r\n );\r\n }\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 {HTMLElement} The label element associated with this element.\r\n */\r\n public getLabel(): HTMLElement | null {\r\n return document.querySelector(`#${this.element.id}_label`) || null;\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} 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 * @param options and object containing the styles you want to set : {key: value} e.g.: {'display': 'block'}\r\n * @returns - Instance of this [provides option to method chain]\r\n */\r\n public setStyle(options: Partial<CSSStyleDeclaration>) {\r\n if (Object.prototype.toString.call(options) !== \"[object Object]\") {\r\n throw new Error(\r\n `powerpagestoolkit: 'DOMNodeReference.setStyle' required options to be in the form of an object. Argument passed was of type: ${typeof options}`\r\n );\r\n }\r\n\r\n for (const _key in options) {\r\n const key: any = _key as keyof Partial<CSSStyleDeclaration>;\r\n this.element.style[key] = <string>options[key];\r\n }\r\n return this;\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 /**\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 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: 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.setRequired) {\r\n const [isRequired, isValid] = rule.setRequired;\r\n\r\n const fieldDisplayName = (() => {\r\n let label: any = this.getLabel();\r\n if (!label) {\r\n throw new Error(\r\n `There was an error accessing the label for this element: ${\r\n this.target as string\r\n }`\r\n );\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 if (typeof Page_Validators === \"undefined\") {\r\n throw new ValidationConfigError(this, \"Page_Validators not found\");\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: () => {\r\n const isFieldRequired = isRequired.call(this);\r\n const isFieldVisible =\r\n window.getComputedStyle(this.visibilityController).display !==\r\n \"none\";\r\n\r\n return (\r\n !isFieldRequired ||\r\n !isFieldVisible ||\r\n isValid.call(this, isFieldRequired)\r\n );\r\n },\r\n });\r\n\r\n Page_Validators.push(newValidator);\r\n this.setRequiredLevel(isRequired.call(this));\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 // setup dep tracking\r\n if (dependencies.length) {\r\n let visibilityCondition,\r\n clearValuesOnHide,\r\n isRequired,\r\n valueCondition,\r\n value,\r\n disabledCondition;\r\n const aggregateHandler = (rule: BusinessRule) => {\r\n if (rule.setVisibility) {\r\n [visibilityCondition, clearValuesOnHide = true] =\r\n rule.setVisibility;\r\n this.toggleVisibility(visibilityCondition.call(this));\r\n }\r\n if (rule.setRequired) {\r\n [isRequired] = rule.setRequired;\r\n this.setRequiredLevel(isRequired.call(this));\r\n }\r\n if (rule.setValue) {\r\n [valueCondition, value] = rule.setValue;\r\n if (valueCondition.call(this)) this.setValue.call(this, value);\r\n }\r\n if (rule.setDisabled) {\r\n disabledCondition = rule.setDisabled;\r\n disabledCondition.call(this) ? this.disable() : this.enable;\r\n }\r\n };\r\n this._configDependencyTracking(\r\n () => aggregateHandler(rule),\r\n dependencies,\r\n {\r\n clearValuesOnHide,\r\n observeVisibility: true,\r\n trackInputEvents: false,\r\n trackRadioButtons: false,\r\n }\r\n );\r\n }\r\n\r\n return this;\r\n } catch (error: any) {\r\n throw new ValidationConfigError(\r\n this,\r\n `Failed to apply business rule: ${error}`\r\n );\r\n }\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 * @param options Additional configuration options. clearValuesOnHide defaults to false.\r\n * all other options defaults to true\r\n */\r\n protected _configDependencyTracking(\r\n handler: () => void,\r\n dependencies: Array<DOMNodeReference>,\r\n options: {\r\n clearValuesOnHide?: boolean;\r\n observeVisibility?: boolean;\r\n trackInputEvents?: boolean;\r\n trackRadioButtons?: boolean;\r\n } = {\r\n clearValuesOnHide: false,\r\n observeVisibility: true,\r\n trackInputEvents: true,\r\n trackRadioButtons: true,\r\n }\r\n ): void {\r\n const {\r\n clearValuesOnHide = false,\r\n observeVisibility = true,\r\n trackInputEvents = true,\r\n trackRadioButtons = true,\r\n } = options;\r\n\r\n if (!dependencies?.length) {\r\n console.warn(\r\n `powerpagestoolkit: No dependencies specified for ${this.element.id}. ` +\r\n \"Include all referenced nodes in the dependency array for proper tracking.\"\r\n );\r\n return;\r\n }\r\n\r\n dependencies.forEach((dep) => {\r\n if (!dep || !(dep 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 // Handle value changes\r\n const handleChange = () => {\r\n handler();\r\n\r\n // Handle clearing values if element becomes hidden\r\n if (\r\n clearValuesOnHide &&\r\n window.getComputedStyle(this.visibilityController).display === \"none\"\r\n ) {\r\n this.clearValue();\r\n }\r\n };\r\n\r\n this[s.registerEventListener](dep.element, \"change\", handleChange);\r\n\r\n if (trackInputEvents) {\r\n this[s.registerEventListener](dep.element, \"input\", handleChange);\r\n }\r\n\r\n // Handle visibility changes\r\n if (observeVisibility) {\r\n const observer = new MutationObserver(() => {\r\n const display = window.getComputedStyle(\r\n dep.visibilityController\r\n ).display;\r\n if (display !== \"none\") {\r\n handler();\r\n }\r\n });\r\n\r\n observer.observe(dep.visibilityController, {\r\n attributes: true,\r\n attributeFilter: [\"style\"],\r\n subtree: false,\r\n });\r\n\r\n this[s.observers].push(observer);\r\n }\r\n\r\n // Handle radio button changes if applicable\r\n if (trackRadioButtons && dep.yesRadio && dep.noRadio) {\r\n [dep.yesRadio, dep.noRadio].forEach((radio) => {\r\n radio.on(\"change\", handleChange) as DOMNodeReference;\r\n //make sure to track event listener for s.destroy()\r\n this[s.boundEventListeners].push({\r\n element: radio.element,\r\n event: \"change\",\r\n handler: handleChange,\r\n });\r\n });\r\n }\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 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 });\r\n\r\n observer.observe(document.body, {\r\n subtree: true,\r\n childList: true,\r\n });\r\n\r\n this[s.observers].push(observer);\r\n }\r\n}\r\n", "import type DOMNodeReference from \"./DOMNodeReference.ts\";\r\n\r\nexport default class DOMNodeReferenceArray extends Array<DOMNodeReference> {\r\n /**\r\n * Hides all the containers of the DOMNodeReference instances in the array.\r\n */\r\n hideAll(this: DOMNodeReferenceArray) {\r\n this.forEach((instance: DOMNodeReference) => instance.hide());\r\n return this;\r\n }\r\n\r\n /**\r\n * Shows all the containers of the DOMNodeReference instances in the array.\r\n */\r\n\r\n showAll(this: DOMNodeReferenceArray) {\r\n this.forEach((instance: DOMNodeReference) => instance.show());\r\n return this;\r\n }\r\n}\r\n", "import DOMNodeReferenceArray from \"../core/DOMNodeReferenceArray.ts\";\r\nimport type DOMNodeReference from \"../core/DOMNodeReference.ts\";\r\n\r\n/**\r\n *\r\n * @param array An array of DOMnodeReferences 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: DOMNodeReference[]\r\n): DOMNodeReferenceArray & Record<T, DOMNodeReference> {\r\n const enhancedArray = new DOMNodeReferenceArray(...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 DOMNodeReferenceArray & Record<T, DOMNodeReference>;\r\n}\r\n", "import DOMNodeReference from \"./DOMNodeReference.ts\";\r\nimport enhanceArray from \"../utils/enhanceArray.ts\";\r\nimport waitFor from \"./waitFor.ts\";\r\nimport { init } from \"../constants/symbols.ts\";\r\nimport type DOMNodeReferenceArray from \"./DOMNodeReferenceArray.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 DOMNodeReference 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 DOMNodeReference.\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 DOMNodeReference instance.\r\n *\r\n * @see {@link DOMNodeReference}\r\n * @see {@link DOMNodeReferenceArray}\r\n * @see {@link enhanceArray}\r\n */\r\nexport default async function createDOMNodeReference(\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<DOMNodeReference>;\r\nexport default async function createDOMNodeReference(\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<DOMNodeReference>;\r\n\r\nexport default async function createDOMNodeReference(\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<DOMNodeReference>;\r\n\r\nexport default async function createDOMNodeReference(\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<DOMNodeReferenceArray>;\r\n\r\nexport default async function createDOMNodeReference(\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<DOMNodeReference | DOMNodeReferenceArray> {\r\n try {\r\n if (typeof options !== \"object\") {\r\n throw new Error(\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 Error(\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 = <DOMNodeReferenceArray> await Promise.all(\r\n elements.map(async (element) => {\r\n const instance = new DOMNodeReference(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 DOMNodeReference(target, root, timeoutMs);\r\n await instance[init]();\r\n return new Proxy(instance, createProxyHandler());\r\n } catch (e) {\r\n throw new Error(<string> e);\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 Error(\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 Error(\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 Error(\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 Error(\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: DOMNodeReference, prop: string | symbol) => {\r\n if (prop.toString().startsWith(\"_\")) return undefined;\r\n\r\n const value = target[<keyof DOMNodeReference> 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 API from \"./API.ts\";\r\nimport createRef from \"./createDOMNodeReferences.ts\";\r\nimport enhanceArray from \"../utils/enhanceArray.ts\";\r\nimport type DOMNodeReference from \"./DOMNodeReference.ts\";\r\nimport type DOMNodeReferenceArray from \"./DOMNodeReferenceArray.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 DOMNodeReference}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 DOMNodeReference\r\n * @param formId - The string GUID of the form you want to bind to\r\n * @returns An array of DOMNodeReferences, accessible as properties of a Record<string, DOMNodeReference> 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 DOMNodeReference}\r\n */\r\nexport default async function bindForm(\r\n formId: string\r\n): Promise<DOMNodeReferenceArray & Record<string, DOMNodeReference>> {\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\r\n return enhanceArray(\r\n resolvedRefs.filter((ref): ref is DOMNodeReference => 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 createRef(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": ["debounceTime", "debounceTime", "rule", "instance", "element"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "powerpagestoolkit",
|
|
3
|
-
"version": "2.701.
|
|
3
|
+
"version": "2.701.213",
|
|
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",
|