powerpagestoolkit 2.7.1414 → 2.7.1422

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,6 @@
1
+ /**
2
+ * For use in setting up event management in the instances of DOMNodeReference
3
+ * @see {@link DOMNodeReference}
4
+ */
1
5
  declare const eventMapping: Record<string, keyof HTMLElementEventMap>;
2
6
  export default eventMapping;
@@ -1,7 +1,9 @@
1
1
  /**
2
- * @module API
3
- * Provides an abstract class API that allows basic create, read, and update operations
4
- * via the PowerPages API
2
+ * Provides abstract class `API` that allows basic create, read, and update operations in DataVerse via the PowerPages API
3
+ * @method `createRecord` - Create a record in DataVerse
4
+ * @method `getRecord<T>` - Get a record by ID from DataVerse
5
+ * @method `getMultiple` - Get multiple records from DataVerse; with optional OData filtering
6
+ * @method `updateRecord` - Update a record by ID in DataVerse
5
7
  */
6
8
  declare abstract class API {
7
9
  /**
@@ -1,28 +1,31 @@
1
1
  /**
2
2
  * @module
3
- * This module provides the bindForm function. When loading into a page in PowerPages that has a form,
4
- * you can use this function by passing in the GUID of the form, and you will receive an array/record
5
- * of DOMNodeReferences that represent all fields, sections, sub-grids, and tabs of the given form.
6
- * @see {@link DOMNodeReference}
7
- * Access these properties of the BoundForm {@link BoundForm} using the logical name of the control you need to access: form['logical_name']
8
- * you can then execute all the methods available from DOMNodeReference
3
+
9
4
  */
5
+ import type DOMNodeReference from "./DOMNodeReference.d.ts";
6
+ import DOMNodeReferenceArray from "./DOMNodeReferenceArray.d.ts";
10
7
  /**
11
- * Get all controls related to the form for manipulating with the
12
- * DOMNodeReference class. Rather than having to instantiate each fields that you need manually,
13
- * you can call this method once with the form ID and gain access to all fields
8
+ * When loading into a page in PowerPages that has a form,
9
+ * you can use this function by passing in the GUID of the form, and you will receive an array/record
10
+ * of {@link DOMNodeReference}s that represent all fields, sections, sub-grids, and tabs of the given form.
11
+ * Access these properties of the {@link BoundForm} using the logical name of the control you need to access: form['logical_name']
12
+ * you can then execute all the methods available from DOMNodeReference
14
13
  * @param formId - The string GUID of the form you want to bind to
15
- * @callback `callbackFn` - Function to execute after the form has been retrieved and bound; the form itself is provided as the argument
16
14
  * @returns An array of DOMNodeReferences, accessible as properties of a Record<string, DOMNodeReference> i.e. formProp = form["some_logicalName"]
17
15
  * @example
18
16
  * ```js
19
- * bindForm("some-guid-0000", (form) => {
17
+ * bindForm("form-guid-0000").then((form) => {
20
18
  * //...use the form
21
19
  * const field = form["field_logical_name"]
22
20
  * // or
23
21
  * form["other_logical_name"].someMethod()
24
22
  * })
23
+ *
24
+ * // or
25
+ *
26
+ * const form = await bindForm("form-guid-0000")
25
27
  * ```
26
28
  * @see {@link BoundForm}
29
+ * @see {@link DOMNodeReference}
27
30
  */
28
- export default function bindForm(formId: string, callbackFn: (form: BoundForm) => void): Promise<BoundForm>;
31
+ export default function bindForm(formId: string): Promise<DOMNodeReferenceArray & Record<string, DOMNodeReference>>;
@@ -14,6 +14,10 @@ import type DOMNodeReferenceArray from "./DOMNodeReferenceArray.d.ts";
14
14
  * @param **options.root** - Optionally specify the element within to search for the element targeted by 'target'. Defaults to `document.body`
15
15
  * @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.
16
16
  * @returns A promise that resolves to a Proxy of the initialized DOMNodeReference instance.
17
+ *
18
+ * @see {@link DOMNodeReference}
19
+ * @see {@link DOMNodeReferenceArray}
20
+ * @see {@link enhanceArray}
17
21
  */
18
22
  export default function createDOMNodeReference(target: string | HTMLElement, options?: {
19
23
  /**
@@ -1,6 +1,8 @@
1
1
  /**
2
- * @module waitFor
3
2
  * Provides an async way to capture DOM elements; for when querySelector cannot capture the target due to async DOM content loading
3
+ * @param **target** - basic querySelector syntax to select an element
4
+ * @param **root** - optional parameter to replace document as the root from which to perform the node search
5
+ * @returns the element(s) targeted by the `querySelector` string
4
6
  */
5
- export default function waitFor(target: Element | string, root: Element | Document, multiple: false, debounceTime: number): Promise<HTMLElement>;
6
- export default function waitFor(target: Element | string, root: Element | Document, multiple: true, debounceTime: number): Promise<HTMLElement[]>;
7
+ export default function waitFor(target: string, root: Element | Document, multiple: false, debounceTime: number): Promise<HTMLElement>;
8
+ export default function waitFor(target: string, root: Element | Document, multiple: true, debounceTime: number): Promise<HTMLElement[]>;
package/dist/src/index.js CHANGED
@@ -35,7 +35,7 @@ var API = class {
35
35
  url: `/_api/${tableSetName}`,
36
36
  data: JSON.stringify(data),
37
37
  contentType: "application/json",
38
- success: function(response, status, xhr) {
38
+ success: function(_response, _status, xhr) {
39
39
  resolve(xhr.getResponseHeader("entityid"));
40
40
  },
41
41
  error: (error) => {
@@ -159,10 +159,6 @@ function waitFor(target, root = document, multiple = false, debounceTime2) {
159
159
  )
160
160
  );
161
161
  }, debounceTime2);
162
- if (target instanceof HTMLElement) {
163
- clearTimeout(timeout);
164
- return resolve(target);
165
- }
166
162
  const element = root.querySelector(target);
167
163
  if (element) {
168
164
  clearTimeout(timeout);
@@ -458,13 +454,14 @@ var DOMNodeReference = class _DOMNodeReference {
458
454
  return {
459
455
  value: input.value !== "" ? Number(input.value) : null
460
456
  };
461
- default:
457
+ default: {
462
458
  let cleanValue = input.value;
463
459
  if (this.element.classList.contains("decimal") || this.element.classList.contains("money"))
464
460
  cleanValue = input.value.replace(/[$,]/g, "");
465
461
  return {
466
462
  value: this.element.classList.contains("decimal") || this.element.classList.contains("money") ? parseFloat(cleanValue) : cleanValue
467
463
  };
464
+ }
468
465
  }
469
466
  }
470
467
  [attachVisibilityController]() {
@@ -722,7 +719,7 @@ var DOMNodeReference = class _DOMNodeReference {
722
719
  enable() {
723
720
  try {
724
721
  this.element.disabled = false;
725
- } catch (e) {
722
+ } catch (_error) {
726
723
  throw new Error(
727
724
  `There was an error trying to disable the target: ${this.target}`
728
725
  );
@@ -1285,7 +1282,7 @@ function createProxyHandler() {
1285
1282
  }
1286
1283
 
1287
1284
  // src/core/bindForm.ts
1288
- async function bindForm(formId, callbackFn) {
1285
+ async function bindForm(formId) {
1289
1286
  try {
1290
1287
  const form = await API_default.getRecord("systemforms", formId);
1291
1288
  const { formxml } = form;
@@ -1295,11 +1292,6 @@ async function bindForm(formId, callbackFn) {
1295
1292
  const sections = processElements(xmlDoc.getElementsByTagName("section"));
1296
1293
  const tabs = processElements(xmlDoc.getElementsByTagName("tab"));
1297
1294
  const resolvedRefs = await Promise.all([...controls, ...sections, ...tabs]);
1298
- callbackFn(
1299
- enhanceArray(
1300
- resolvedRefs.filter((ref) => ref !== null)
1301
- )
1302
- );
1303
1295
  return enhanceArray(
1304
1296
  resolvedRefs.filter((ref) => ref !== null)
1305
1297
  );
@@ -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\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", "/**\r\n * @module API\r\n * Provides an abstract class API that allows basic create, read, and update operations\r\n * via the PowerPages API\r\n */\r\n\r\n//@ts-nocheck\r\nimport safeAjax from \"../utils/safeAjax.ts\";\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: object): 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 * @module waitFor\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 */\r\n\r\nexport default function waitFor(\r\n target: Element | 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: Element | string,\r\n root: Element | Document,\r\n multiple: true,\r\n debounceTime: number\r\n): Promise<HTMLElement[]>;\r\n\r\n/**\r\n *\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\r\n */\r\nexport default function waitFor(\r\n target: Element | 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 // Check if target is already in DOM\r\n if (target instanceof HTMLElement) {\r\n clearTimeout(timeout);\r\n return resolve(target);\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 DOMNodeInitializationError,\r\n DOMNodeNotFoundError,\r\n ConditionalRenderingError,\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,\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 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 return {\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 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) {\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 * 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 *\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 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 (e) {\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 *\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 *\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, clearValuesOnHide = true] = rule.setVisibility;\r\n const initialState = condition.bind(this)();\r\n this.toggleVisibility(initialState);\r\n\r\n if (dependencies.length) {\r\n this._configDependencyTracking(\r\n () => this.toggleVisibility(condition.bind(this)()),\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\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 return new Error(\r\n `There was an error accessing the label for this element: ${String(\r\n this.target\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.bind(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.bind(this)(isFieldRequired)\r\n );\r\n },\r\n });\r\n\r\n Page_Validators.push(newValidator);\r\n this.setRequiredLevel(isRequired.bind(this)());\r\n\r\n // Track dependencies\r\n this._configDependencyTracking(\r\n () => this.setRequiredLevel(isRequired.bind(this)()),\r\n dependencies,\r\n { clearValuesOnHide: false }\r\n );\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.bind(this)()) {\r\n this.setValue.bind(this)(value);\r\n }\r\n\r\n if (dependencies.length) {\r\n this._configDependencyTracking(\r\n () => {\r\n if (condition.bind(this)()) {\r\n this.setValue.bind(this)(value);\r\n }\r\n },\r\n dependencies,\r\n { clearValuesOnHide: false }\r\n );\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.bind(this)() ? this.disable() : this.enable();\r\n\r\n if (dependencies.length) {\r\n this._configDependencyTracking(\r\n () => {\r\n condition.bind(this)() ? this.enable() : this.disable();\r\n },\r\n dependencies,\r\n {\r\n clearValuesOnHide: false,\r\n observeVisibility: true,\r\n trackInputEvents: true,\r\n trackRadioButtons: true,\r\n }\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 * Configures conditional rendering for the target element based on a condition\r\n * and the visibility of one or more trigger elements.\r\n * @deprecated Use the new 'applyBusinessRule Method\r\n * @param condition A function that returns a boolean to determine\r\n * the visibility of the target element. If `condition()` returns true, the element is shown;\r\n * otherwise, it is hidden.\r\n * @param dependencies - An array of `DOMNodeReference` instances. Event listeners are\r\n * registered on each to toggle the visibility of the target element based on the `condition` and the visibility of\r\n * the target node.\r\n * @throws When there's an error in setting up conditional rendering\r\n * @returns Instance of this [provides option to method chain]\r\n */\r\n public configureConditionalRendering(\r\n condition: () => boolean,\r\n dependencies?: Array<DOMNodeReference>,\r\n clearValuesOnHide: boolean = true\r\n ): DOMNodeReference {\r\n try {\r\n // Validate inputs\r\n if (typeof condition !== \"function\") {\r\n throw new TypeError(\"Condition must be a function\");\r\n }\r\n\r\n // bind this to the condition function\r\n condition = condition.bind(this);\r\n\r\n // Initialize state\r\n const initialState = condition();\r\n this.toggleVisibility(initialState);\r\n\r\n // Early return if no dependencies\r\n if (!dependencies?.length) {\r\n console.warn(\r\n `powerpagestoolkit: No dependencies provided for conditional rendering of ${this}. ` +\r\n \"Include referenced nodes in the dependency array if using them in rendering logic.\"\r\n );\r\n return this;\r\n }\r\n\r\n this._configDependencyTracking(\r\n () => this.toggleVisibility(condition()),\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 return this;\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error);\r\n throw new ConditionalRenderingError(this, errorMessage);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up validation and requirement rules for the field with enhanced error handling and dynamic updates.\r\n * @deprecated Use the new 'applyBusinessRule Method\r\n * @param isRequired Function determining if field is required\r\n * @param isValid Function validating field input\r\n * @param fieldDisplayName Display name for error messages\r\n * @param dependencies Fields that trigger requirement/validation updates\r\n * @returns Instance of this\r\n * @throws If validation setup fails\r\n */\r\n public configureValidationAndRequirements(\r\n isRequired: () => boolean,\r\n isValid: () => boolean,\r\n fieldDisplayName: string,\r\n dependencies: Array<DOMNodeReference>\r\n ): DOMNodeReference {\r\n // Input validation\r\n if (!fieldDisplayName?.trim()) {\r\n throw new ValidationConfigError(this, \"Field display name is required\");\r\n }\r\n\r\n if (!Array.isArray(dependencies)) {\r\n throw new ValidationConfigError(this, \"Dependencies must be an array\");\r\n }\r\n\r\n // Create and configure validator\r\n try {\r\n //make sure to bind 'this' to the methods for proper access to consumer\r\n isRequired = isRequired.bind(this);\r\n isValid = isValid.bind(this);\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 // Create new validator\r\n const newValidator = document.createElement(\"span\");\r\n newValidator.style.display = \"none\";\r\n newValidator.id = validatorId;\r\n\r\n // Configure validator properties\r\n const validatorConfig = {\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 // Only validate if the field is required and visible\r\n const isFieldRequired = isRequired();\r\n const isFieldVisible =\r\n window.getComputedStyle(this.visibilityController).display !==\r\n \"none\";\r\n\r\n if (!isFieldRequired || !isFieldVisible) {\r\n return true;\r\n }\r\n\r\n return isValid();\r\n },\r\n };\r\n\r\n // Apply configuration\r\n Object.assign(newValidator, validatorConfig);\r\n\r\n // Add to page validators\r\n Page_Validators.push(newValidator);\r\n\r\n // Initial required state\r\n this.setRequiredLevel(isRequired());\r\n\r\n // Set up dependency tracking\r\n this._configDependencyTracking(\r\n () => this.setRequiredLevel(isRequired()),\r\n dependencies\r\n );\r\n } catch (error: any) {\r\n throw new ValidationConfigError(\r\n this,\r\n `Failed to configure validation: ${error}`\r\n );\r\n }\r\n\r\n return this;\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// Separate array enhancement for cleaner code\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", "/**\r\n * @module createRef\r\n * Provides a factory function for creating new DOMNodeReferences\r\n * @see {@link DOMNodeReference}\r\n */\r\nimport 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\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\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", "/**\r\n * @module\r\n * This module provides the bindForm function. 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 DOMNodeReferences that represent all fields, sections, sub-grids, and tabs of the given form.\r\n * @see {@link DOMNodeReference}\r\n * Access these properties of the BoundForm {@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 */\r\n\r\nimport 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\n\r\n/**\r\n * Get all controls related to the form for manipulating with the\r\n * DOMNodeReference class. Rather than having to instantiate each fields that you need manually,\r\n * you can call this method once with the form ID and gain access to all fields\r\n * @param formId - The string GUID of the form you want to bind to\r\n * @callback `callbackFn` - Function to execute after the form has been retrieved and bound; the form itself is provided as the argument\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(\"some-guid-0000\", (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 * @see {@link BoundForm}\r\n */\r\nexport default async function bindForm(\r\n formId: string,\r\n callbackFn: (form: BoundForm) => void\r\n): Promise<BoundForm> {\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 callbackFn(\r\n enhanceArray(\r\n resolvedRefs.filter((ref): ref is DOMNodeReference => ref !== null)\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 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: object): 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 DOMNodeInitializationError,\r\n DOMNodeNotFoundError,\r\n ConditionalRenderingError,\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 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 return {\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\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) {\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 * 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 *\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 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 *\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 *\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, clearValuesOnHide = true] = rule.setVisibility;\r\n const initialState = condition.bind(this)();\r\n this.toggleVisibility(initialState);\r\n\r\n if (dependencies.length) {\r\n this._configDependencyTracking(\r\n () => this.toggleVisibility(condition.bind(this)()),\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\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 return new Error(\r\n `There was an error accessing the label for this element: ${String(\r\n this.target\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.bind(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.bind(this)(isFieldRequired)\r\n );\r\n },\r\n });\r\n\r\n Page_Validators.push(newValidator);\r\n this.setRequiredLevel(isRequired.bind(this)());\r\n\r\n // Track dependencies\r\n this._configDependencyTracking(\r\n () => this.setRequiredLevel(isRequired.bind(this)()),\r\n dependencies,\r\n { clearValuesOnHide: false }\r\n );\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.bind(this)()) {\r\n this.setValue.bind(this)(value);\r\n }\r\n\r\n if (dependencies.length) {\r\n this._configDependencyTracking(\r\n () => {\r\n if (condition.bind(this)()) {\r\n this.setValue.bind(this)(value);\r\n }\r\n },\r\n dependencies,\r\n { clearValuesOnHide: false }\r\n );\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.bind(this)() ? this.disable() : this.enable();\r\n\r\n if (dependencies.length) {\r\n this._configDependencyTracking(\r\n () => {\r\n condition.bind(this)() ? this.enable() : this.disable();\r\n },\r\n dependencies,\r\n {\r\n clearValuesOnHide: false,\r\n observeVisibility: true,\r\n trackInputEvents: true,\r\n trackRadioButtons: true,\r\n }\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 * Configures conditional rendering for the target element based on a condition\r\n * and the visibility of one or more trigger elements.\r\n * @deprecated Use the new 'applyBusinessRule Method\r\n * @param condition A function that returns a boolean to determine\r\n * the visibility of the target element. If `condition()` returns true, the element is shown;\r\n * otherwise, it is hidden.\r\n * @param dependencies - An array of `DOMNodeReference` instances. Event listeners are\r\n * registered on each to toggle the visibility of the target element based on the `condition` and the visibility of\r\n * the target node.\r\n * @throws When there's an error in setting up conditional rendering\r\n * @returns Instance of this [provides option to method chain]\r\n */\r\n public configureConditionalRendering(\r\n condition: () => boolean,\r\n dependencies?: Array<DOMNodeReference>,\r\n clearValuesOnHide: boolean = true\r\n ): DOMNodeReference {\r\n try {\r\n // Validate inputs\r\n if (typeof condition !== \"function\") {\r\n throw new TypeError(\"Condition must be a function\");\r\n }\r\n\r\n // bind this to the condition function\r\n condition = condition.bind(this);\r\n\r\n // Initialize state\r\n const initialState = condition();\r\n this.toggleVisibility(initialState);\r\n\r\n // Early return if no dependencies\r\n if (!dependencies?.length) {\r\n console.warn(\r\n `powerpagestoolkit: No dependencies provided for conditional rendering of ${this}. ` +\r\n \"Include referenced nodes in the dependency array if using them in rendering logic.\"\r\n );\r\n return this;\r\n }\r\n\r\n this._configDependencyTracking(\r\n () => this.toggleVisibility(condition()),\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 return this;\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : String(error);\r\n throw new ConditionalRenderingError(this, errorMessage);\r\n }\r\n }\r\n\r\n /**\r\n * Sets up validation and requirement rules for the field with enhanced error handling and dynamic updates.\r\n * @deprecated Use the new 'applyBusinessRule Method\r\n * @param isRequired Function determining if field is required\r\n * @param isValid Function validating field input\r\n * @param fieldDisplayName Display name for error messages\r\n * @param dependencies Fields that trigger requirement/validation updates\r\n * @returns Instance of this\r\n * @throws If validation setup fails\r\n */\r\n public configureValidationAndRequirements(\r\n isRequired: () => boolean,\r\n isValid: () => boolean,\r\n fieldDisplayName: string,\r\n dependencies: Array<DOMNodeReference>\r\n ): DOMNodeReference {\r\n // Input validation\r\n if (!fieldDisplayName?.trim()) {\r\n throw new ValidationConfigError(this, \"Field display name is required\");\r\n }\r\n\r\n if (!Array.isArray(dependencies)) {\r\n throw new ValidationConfigError(this, \"Dependencies must be an array\");\r\n }\r\n\r\n // Create and configure validator\r\n try {\r\n //make sure to bind 'this' to the methods for proper access to consumer\r\n isRequired = isRequired.bind(this);\r\n isValid = isValid.bind(this);\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 // Create new validator\r\n const newValidator = document.createElement(\"span\");\r\n newValidator.style.display = \"none\";\r\n newValidator.id = validatorId;\r\n\r\n // Configure validator properties\r\n const validatorConfig = {\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 // Only validate if the field is required and visible\r\n const isFieldRequired = isRequired();\r\n const isFieldVisible =\r\n window.getComputedStyle(this.visibilityController).display !==\r\n \"none\";\r\n\r\n if (!isFieldRequired || !isFieldVisible) {\r\n return true;\r\n }\r\n\r\n return isValid();\r\n },\r\n };\r\n\r\n // Apply configuration\r\n Object.assign(newValidator, validatorConfig);\r\n\r\n // Add to page validators\r\n Page_Validators.push(newValidator);\r\n\r\n // Initial required state\r\n this.setRequiredLevel(isRequired());\r\n\r\n // Set up dependency tracking\r\n this._configDependencyTracking(\r\n () => this.setRequiredLevel(isRequired()),\r\n dependencies\r\n );\r\n } catch (error: any) {\r\n throw new ValidationConfigError(\r\n this,\r\n `Failed to configure validation: ${error}`\r\n );\r\n }\r\n\r\n return this;\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", "/**\r\n * @module createRef\r\n * Provides a factory function for creating new DOMNodeReferences\r\n * @see {@link DOMNodeReference}\r\n */\r\nimport 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\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", "/**\r\n * @module\r\n\r\n */\r\n\r\nimport 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 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 return null; // Explicitly return null instead of undefined\r\n}\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["debounceTime", "debounceTime", "instance", "element"]
7
7
  }
@@ -1,3 +1,12 @@
1
1
  import DOMNodeReferenceArray from "../core/DOMNodeReferenceArray.d.ts";
2
2
  import type DOMNodeReference from "../core/DOMNodeReference.d.ts";
3
+ /**
4
+ *
5
+ * @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
6
+ * @example
7
+ * ```javascript
8
+ * const enhanced = enhanceArray(basicArray)
9
+ * const someProp = enhanced['some_prop_logical_name']
10
+ * ```
11
+ */
3
12
  export default function enhanceArray<T extends string>(array: DOMNodeReference[]): DOMNodeReferenceArray & Record<T, DOMNodeReference>;
@@ -1 +1,4 @@
1
+ /**
2
+ * 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}
3
+ */
1
4
  export default function safeAjax(ajaxOptions: any): any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "powerpagestoolkit",
3
- "version": "2.7.1414",
3
+ "version": "2.7.1422",
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",
@@ -40,10 +40,8 @@
40
40
  "build:all": "npm run build && deno run build:all",
41
41
  "dev": "tsc --watch"
42
42
  },
43
- "dependencies": {
44
- "esbuild-plugin-copy": "^2.1.1"
45
- },
46
43
  "devDependencies": {
44
+ "esbuild-plugin-copy": "^2.1.1",
47
45
  "@babel/preset-env": "^7.25.8",
48
46
  "@types/node": "^22.8.6",
49
47
  "@typescript-eslint/parser": "^8.20.0",
package/dist/README.md DELETED
@@ -1,508 +0,0 @@
1
- # PowerPages Tool Kit
2
-
3
- A TypeScript/JavaScript utility package for seamless DOM manipulation and DataVerse API interactions in PowerPages applications. This toolkit provides robust DOM element management and standardized DataVerse CRUD operations with full TypeScript support.
4
-
5
- ## Features
6
-
7
- - Powerful DOM element manipulation and reference management
8
- - Type-safe DataVerse API operations
9
- - Automatic value synchronization for form elements
10
- - Advanced conditional rendering and validation
11
- - Radio button and checkbox handling
12
- - Event management with proper TypeScript typing
13
- - Mutation observer integration for dynamic content
14
- - Tooltip and label management utilities
15
-
16
- ## Installation
17
-
18
- ```bash
19
- npm install powerpagestoolkit
20
- ```
21
-
22
- # Core Modules
23
-
24
- ### DOMNodeReference
25
-
26
- A powerful class for managing DOM elements with automatic value synchronization and event handling.
27
-
28
- #### Basic Usage
29
-
30
- DOMNodeReferences are instantiated with the help of the following factory function: `createRef`
31
-
32
- ```typescript
33
- createRef(
34
- target: HTMLElement | string,
35
- options: {
36
- multiple: (() => boolean) | boolean = false,
37
- root: HTMLElement,
38
- timeoutMs:number
39
- }
40
- ): Promise<DOMNodeReference | DOMNodeReference[]>;
41
- ```
42
-
43
- createRef takes two main arguments:
44
-
45
- <table style="width: 100%; border-collapse: collapse;">
46
- <thead>
47
- <tr>
48
- <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Property</th>
49
- <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Type</th>
50
- <th style="border: 1px solid #ddd; padding: 8px; text-align: left;">Details</th>
51
- </tr>
52
- </thead>
53
- <tbody>
54
- <tr>
55
- <td style="border: 1px solid #ddd; padding: 8px;">target</td>
56
- <td style="border: 1px solid #ddd; padding: 8px;">
57
- <pre><code class="language-javascript">string | HTMLElement</code></pre>
58
- </td>
59
- <td style="border: 1px solid #ddd; padding: 8px;">
60
- Use standard <code>querySelector</code> syntax to target an element, or elements in the DOM, or pass in an instance of the element itself to create a reference.
61
- </td>
62
- </tr>
63
- <tr>
64
- <td style="border: 1px solid #ddd; padding: 8px;">options</td>
65
- <td style="border: 1px solid #ddd; padding: 8px;">
66
- <pre><code class="language-javascript">{
67
- multiple: () => boolean | boolean,
68
- root: HTMLElement,
69
- timeoutMs:number
70
- }</code></pre>
71
- </td>
72
- <td style="border: 1px solid #ddd; padding: 8px;">
73
- Provides advanced configurations for niche scenarios, such as async DOM element loading, returning arrays of elements, or specifying the parent to search within for the target node.
74
- </td>
75
- </tr>
76
- </tbody>
77
- </table>
78
-
79
- Import the utility function for creating DOMNodeReference(s)
80
-
81
- ```typescript
82
- import { createRef } from "powerpagestoolkit";
83
- ```
84
-
85
- Instantiate one, or multiple instances of a DOMNodeReference, and optionally configure advanced options
86
-
87
- ```javascript
88
- // Create a single reference (i.e. 'querySelector')
89
- const node = await createRef("#myElement");
90
-
91
- // Create multiple references (i.e. 'querySelectorAll')
92
- const nodes = await createRef(".my-class", { multiple: true });
93
-
94
- /******************/
95
- // ADVANCED OPTIONS
96
- // in the event that you need to be more granular with how you are targeting
97
- // and retrieving elements, there are additional options
98
-
99
- // If the node you are targeting is not available at the initial execution
100
- // of the script, set a timeout for 2 seconds
101
- const node2 = await createRef("#target", { timeoutMs:2000 });
102
-
103
- // need to target a node within a specific node? use that node as the root
104
- const otherElement = document.getElementById("id");
105
- const node3 = await createRef("#target", { root: otherElement });
106
-
107
- // implement all options:
108
- const nodes2 = await createRef("#target", {
109
- multiple: true,
110
- timeoutMs:4000,
111
- root: otherElement,
112
- });
113
- ```
114
-
115
- #### Properties
116
-
117
- | Property | Type | Description |
118
- | -------- | ------------------------ | --------------------------------------------- |
119
- | element | HTMLElement | The referenced DOM element |
120
- | value | any | Current synchronized value of the element |
121
- | isLoaded | boolean | Element load status |
122
- | target | HTMLElement \| string | Original target selector or element |
123
- | yesRadio | DOMNodeReference \| null | Reference to 'yes' radio (for boolean fields) |
124
- | noRadio | DOMNodeReference \| null | Reference to 'no' radio (for boolean fields) |
125
- | checked | boolean | Checkbox/radio checked state |
126
-
127
- #### Key Methods
128
-
129
- ##### Event Handling
130
-
131
- ```typescript
132
- // Add event listener with proper 'this' context
133
- // uses standard eventListener API, and so supports all DOM events
134
- node.on("change", function (e) {
135
- console.log("Current value:", this.value);
136
- });
137
-
138
- node.on("click", function (e) {
139
- console.log(this, " has been clicked");
140
- });
141
-
142
- ...
143
- ```
144
-
145
- ##### Business Rule Application
146
-
147
- This utility provides a flexible way to dynamically control field visibility, requirement status, values, and enabled states based on dependencies within PowerPages forms.
148
-
149
- _Method Signature:_
150
-
151
- ```typescript
152
- applyBusinessRule(
153
- rule: BusinessRule,
154
- dependencies: DOMNodeReference[]
155
- ): DOMNodeReference; /* Instance of this is returned for optional
156
- method chaining */
157
- ```
158
-
159
- **BusinessRule Definition**
160
-
161
- ```typescript
162
- interface BusinessRule {
163
- setVisibility?: [
164
- condition: () => boolean,
165
- clearValuesOnHide?: boolean = true
166
- ];
167
- setRequired?: [
168
- isRequired: () => boolean,
169
- isValid: () => boolean
170
- ];
171
- setValue?: [
172
- condition: () => boolean,
173
- value: () => any | any
174
- ];
175
- setDisabled?: () => boolean;
176
- }
177
- ```
178
-
179
- ##### Visibility Control
180
-
181
- ```typescript
182
- // Show the 'taxIdField' only when
183
- // 'businessTypeField' is set to 'Corporation' or 'LLC'
184
- taxIdField.applyBusinessRule(
185
- {
186
- setVisibility: [
187
- () =>
188
- businessTypeField.value === "Corporation" ||
189
- businessTypeField.value === "LLC",
190
- ],
191
- },
192
- [businessTypeField] // Re-evaluate when businessTypeField changes
193
- );
194
-
195
- // Optionally disable 'clearValuesOnHide':
196
- taxIdField.applyBusinessRule(
197
- {
198
- setVisibility: [
199
- () =>
200
- businessTypeField.value === "Corporation" ||
201
- businessTypeField.value === "LLC",
202
- false, // defaults to true. False will prevent the fields from losing it's value if it is hidden
203
- ],
204
- },
205
- [businessTypeField] // Re-evaluate when businessTypeField changes
206
- );
207
- ```
208
-
209
- ##### Validation and Requirements
210
-
211
- ```typescript
212
- // Require 'taxIdField' when 'businessTypeField' is 'Corporation' or 'LLC'
213
- taxIdField.applyBusinessRule(
214
- {
215
- setRequired: [
216
- function () {
217
- return (
218
- businessTypeField.value === "Corporation" ||
219
- businessTypeField.value === "LLC"
220
- );
221
- },
222
- function () {
223
- return this.value != null && this.value !== "";
224
- },
225
- ],
226
- },
227
- [businessTypeField] // Revalidate when businessTypeField changes
228
- );
229
- ```
230
-
231
- ##### Setting Field Values Conditionally
232
-
233
- ```typescript
234
- // Set default industry value when 'businessTypeField' is 'Corporation'
235
- industryField.applyBusinessRule(
236
- {
237
- setValue: [
238
- () => businessTypeField.value === "Corporation",
239
- "Corporate"
240
- ],
241
- },
242
- [businessTypeField] // Apply value when businessTypeField changes
243
- );
244
- ```
245
-
246
- ##### Enabling and Disabling Fields
247
-
248
- ```typescript
249
- // Disable 'taxIdField' when 'businessTypeField' is 'Individual'
250
- taxIdField.applyBusinessRule(
251
- {
252
- setDisabled: () => businessTypeField.value === "Individual",
253
- },
254
- [businessTypeField] // Enable/disable when businessTypeField changes
255
- );
256
- ```
257
-
258
- ##### Element Manipulation
259
-
260
- _Value management_
261
-
262
- ```typescript
263
- // set a static value
264
- node.setValue("new value");
265
-
266
- // or set a value by using some sort of logic
267
- node.setValue(() => {
268
- if (true) {
269
- return "value";
270
- } else return "default";
271
- });
272
-
273
- // Sync with DOM
274
- node.updateValue();
275
-
276
- // Clear the value for both the instance and the target element
277
- node.clearValue();
278
- ```
279
-
280
- _Content manipulation_
281
-
282
- ```typescript
283
- node.setInnerHTML("<span>New content</span>");
284
- node.append(childElement);
285
- node.prepend(headerElement);
286
- node.after(siblingElement);
287
- node.before(labelElement);
288
- ```
289
-
290
- _Styling_
291
-
292
- ```typescript
293
- node.setStyle({
294
- display: "block",
295
- color: "red",
296
- });
297
- ```
298
-
299
- _Enabling/Disabling inputs_
300
-
301
- ```typescript
302
- node.disable();
303
- node.enable();
304
- ```
305
-
306
- ##### Label and Tooltip Management
307
-
308
- ```typescript
309
- // LABEL AND INFO OPERATIONS
310
- const label = node.getLabel();
311
- // appends a tooltip to the label associated with the element targeted by 'this'
312
- node.addLabelTooltip(
313
- "Helper text",
314
- /* Optionally pass in css styles to customize the tooltip icon*/
315
- { color: "orange", fontSize: "30px" }
316
- );
317
- // appends a tooltip directly to the element targeted by 'this'
318
- node.addTooltip(
319
- "Inline helper",
320
- /* Optionally pass in css styles to customize the tooltip icon*/
321
- { color: "orange", fontSize: "30px" }
322
- );
323
- ```
324
-
325
- _Example:_
326
-
327
- ```typescript
328
- import { createRef } from "powerpagestoolkit";
329
-
330
- const title = await createRef("#myTitle");
331
-
332
- title.addTooltip("This is an Example of a tooltip!", { color: "red" });
333
- ```
334
-
335
- ![Example](./assets//infoIconExample.gif)
336
-
337
- Here's an improved markdown documentation with more comprehensive details:
338
-
339
- ### BindForm Method
340
-
341
- The `bindForm` method simplifies form element management in DataVerse by providing a semantic and efficient way to access form controls, sections, and tabs.
342
-
343
- ##### Key Features
344
-
345
- - Retrieves form definition directly from DataVerse
346
- - Automatically generates references for:
347
- - Controls
348
- - Sections
349
- - Tabs
350
-
351
- ##### Element Types
352
-
353
- | Element Type | Description | Accessibility |
354
- | ------------ | ------------------------------------------- | ------------------------- |
355
- | `control` | Includes all form fields and sub-grids | Accessed via logical name |
356
- | `section` | Standard PowerApps form sections | Accessed via logical name |
357
- | `tab` | Form tabs corresponding to PowerApps layout | Accessed via logical name |
358
-
359
- ##### Usage Example
360
-
361
- ```javascript
362
- import { bindForm } from "powerpagestoolkit";
363
-
364
- // Basic form binding
365
- bindForm("form-guid").then((form) => {
366
- // Access elements by their logical name
367
- const nameField = form["name"];
368
-
369
- // execute custom methods
370
- nameField.applyBusinessRule(
371
- {
372
- setVisibility: [() => someNode.value === "desired value"],
373
- },
374
- [someNode]
375
- );
376
-
377
- // Or executes methods immediately upon accessing
378
- form["phonenumber"].addTooltip("Example tooltip text");
379
- });
380
- ```
381
-
382
- ##### Method Signature
383
-
384
- ```typescript
385
- /**
386
- * Binds a form by its GUID and returns a collection of form elements
387
- * @param formGuid Unique identifier for the form
388
- * @returns Promise resolving to form element references
389
- */
390
- function bindForm(formGuid: string): Promise<DOMNodeReferenceArray & Record<string: DOMNodeReference>>;
391
- ```
392
-
393
- ##### Benefits
394
-
395
- - Reduces code complexity
396
- - Improves readability
397
- - Provides type-safe access to form elements
398
- - Supports flexible form interactions
399
-
400
- ##### Best Practices
401
-
402
- - Use logical names consistently
403
- - Handle async nature of form binding
404
- - Leverage TypeScript for enhanced type checking
405
-
406
- ##### Error Handling
407
-
408
- Ensure proper error handling for form binding:
409
-
410
- ```javascript
411
- bindForm("form-guid")
412
- .then((form) => {
413
- // Form processing
414
- })
415
- .catch((error) => {
416
- console.error("Form binding failed", error);
417
- });
418
- ```
419
-
420
- ### DataVerse API
421
-
422
- Perform secure API calls to DataVerse from your PowerPages site. This method implements the shell deferred token to send requests with `__RequestVerificationToken`
423
-
424
- #### Create Records
425
-
426
- ```typescript
427
- await API.createRecord("accounts", {
428
- name: "Gypsum LLC",
429
- type: "Vendor",
430
- })
431
- .then((recordId) => {
432
- console.log("Created record:", recordId);
433
- })
434
- .catch((error) => {
435
- console.error("Creation failed:", error);
436
- });
437
- ```
438
-
439
- #### Get Records
440
-
441
- ```typescript
442
- // Single record
443
- const record = await API.getRecord(
444
- "accounts",
445
- "record-guid",
446
- "select=name,accountnumber"
447
- );
448
-
449
- // Multiple records
450
- const records = await API.getMultiple(
451
- "contacts",
452
- '$filter=firstname eq "Jane"&$select=firstname,lastname'
453
- );
454
- ```
455
-
456
- #### Update Record
457
-
458
- ```typescript
459
- await API.updateRecord("contacts", "record-guid", {
460
- name: "Jane Smith",
461
- email: "jane@example.com",
462
- });
463
- ```
464
-
465
- ## Best Practices
466
-
467
- 1. Always await DOMNodeReference creation:
468
-
469
- ```typescript
470
- const node = await createRef("#element");
471
- ```
472
-
473
- 2. Include all referenced nodes in dependency arrays:
474
-
475
- ```typescript
476
- node.configureConditionalRendering(
477
- () => dependentNode.value === "test",
478
- [dependentNode] // Required!
479
- );
480
- ```
481
-
482
- 3. Use TypeScript for better type safety and IntelliSense support.
483
-
484
- 4. Use proper error handling with API operations:
485
-
486
- ```typescript
487
- /* optionally await */ API.createRecord(/*...*/)
488
- .then((recordId) => {})
489
- .catch((error) => {
490
- // handle your errors appropriately
491
- });
492
- ```
493
-
494
- ## TypeScript Support
495
-
496
- The package includes full TypeScript definitions and type safety. Use TypeScript for the best development experience and catch potential errors at compile time.
497
-
498
- ## Contributing
499
-
500
- Contributions are welcome, feel free to create a pull request with enhancements. Please include an explanation of the changes made. All pull requests will be reviewed by the project owner.
501
-
502
- ## License
503
-
504
- This project is licensed under the AGPL-3.0 License - see the [LICENSE](LICENSE) file for details.
505
-
506
- ## Funding
507
-
508
- If you like this project, found it useful, or would like to help support the long-term support of this package, please feel free to contribute via GitHub Sponsors: [Keaton-Brewster](https://github.com/sponsors/Keaton-Brewster)