{"version":3,"file":"dirty.mjs","sources":["../../../../src/lib/form/dirty.mts"],"sourcesContent":["import type { FormElement } from '../shared/fields.mjs';\nimport type { FormulaStores } from '../shared/types.mjs';\n\n/**\n * Check if two arrays have the same elements, regardless of the order\n * @param array1 The first array to compare\n * @param array2 The second array to compare\n *\n * @returns boolean indicating if the arrays match\n */\nconst matchingArrays = (array1: unknown[], array2: unknown[]): boolean => array1.length === array2.length && array1.every((e) => array2.includes(e));\n\n/**\n * Creates a handler to set the dirty state for a group of elements\n * @param name The name of the form field group\n * @param elements The group of form elements to monitor\n * @param stores The formula stores containing the dirty and formValues stores\n *\n * @returns A function to destroy the handlers and stop monitoring\n */\nexport function createDirtyHandler(name: string, elements: FormElement[], stores: FormulaStores): () => void {\n  const elementHandlers = new Map<FormElement, () => void>();\n  const initialValues = new Map<string, unknown>();\n  let subscriptionUnsub: (() => void) | undefined;\n\n  const setDirtyAndStopListening = () => {\n    for (const [el, handler] of elementHandlers) {\n      el.setAttribute('data-formula-dirty', 'true');\n      el.removeEventListener('blur', handler);\n    }\n    elementHandlers.clear();\n    if (subscriptionUnsub) {\n      subscriptionUnsub();\n      subscriptionUnsub = undefined;\n    }\n  };\n\n  // Set initial dirty state and initial value\n  stores.dirty.set({ ...stores.dirty.get(), [name]: false });\n  // Capture initial value once and unsubscribe immediately\n  const unsubInitial = stores.formValues.subscribe((v) => initialValues.set(name, v[name]));\n  unsubInitial();\n  subscriptionUnsub = undefined; // No ongoing subscription needed for initial values\n\n  /**\n   * Creates an event handler for a form element to check if it is dirty\n   * @param groupName The name of the form field group\n   *\n   * @returns A function to handle the blur event\n   */\n  function createElementHandler(groupName: string): () => void {\n    return () => {\n      const startValue = initialValues.get(groupName);\n      const currentValues = stores.formValues.get();\n\n      const isDirty = Array.isArray(currentValues[groupName])\n        ? !matchingArrays(currentValues[groupName] as unknown[], startValue as unknown[])\n        : currentValues[groupName] !== startValue;\n\n      if (isDirty) {\n        stores.dirty.set({ ...stores.dirty.get(), [groupName]: true });\n        setDirtyAndStopListening();\n      }\n    };\n  }\n\n  for (const el of elements) {\n    const handler = createElementHandler(name);\n    el.addEventListener('blur', handler);\n    elementHandlers.set(el, handler);\n  }\n\n  return setDirtyAndStopListening;\n}\n"],"names":["matchingArrays","array1","array2","createDirtyHandler","name","elements","stores","elementHandlers","initialValues","subscriptionUnsub","setDirtyAndStopListening","el","handler","v","createElementHandler","groupName","startValue","currentValues"],"mappings":"AAUA,MAAMA,IAAiB,CAACC,GAAmBC,MAA+BD,EAAO,WAAWC,EAAO,UAAUD,EAAO,MAAM,CAAC,MAAMC,EAAO,SAAS,CAAC,CAAC;AAU5I,SAASC,EAAmBC,GAAcC,GAAyBC,GAAmC;AAC3G,QAAMC,wBAAsB,IAAA,GACtBC,wBAAoB,IAAA;AAC1B,MAAIC;AAEJ,QAAMC,IAA2B,MAAM;AACrC,eAAW,CAACC,GAAIC,CAAO,KAAKL;AAC1B,MAAAI,EAAG,aAAa,sBAAsB,MAAM,GAC5CA,EAAG,oBAAoB,QAAQC,CAAO;AAExC,IAAAL,EAAgB,MAAA,GACZE,MACFA,EAAA,GACAA,IAAoB;AAAA,EAExB;AAGA,EAAAH,EAAO,MAAM,IAAI,EAAE,GAAGA,EAAO,MAAM,OAAO,CAACF,CAAI,GAAG,IAAO,GAEpCE,EAAO,WAAW,UAAU,CAACO,MAAML,EAAc,IAAIJ,GAAMS,EAAET,CAAI,CAAC,CAAC,EACxF,GACAK,IAAoB;AAQpB,WAASK,EAAqBC,GAA+B;AAC3D,WAAO,MAAM;AACX,YAAMC,IAAaR,EAAc,IAAIO,CAAS,GACxCE,IAAgBX,EAAO,WAAW,IAAA;AAMxC,OAJgB,MAAM,QAAQW,EAAcF,CAAS,CAAC,IAClD,CAACf,EAAeiB,EAAcF,CAAS,GAAgBC,CAAuB,IAC9EC,EAAcF,CAAS,MAAMC,OAG/BV,EAAO,MAAM,IAAI,EAAE,GAAGA,EAAO,MAAM,OAAO,CAACS,CAAS,GAAG,IAAM,GAC7DL,EAAA;AAAA,IAEJ;AAAA,EACF;AAEA,aAAWC,KAAMN,GAAU;AACzB,UAAMO,IAAUE,EAAqBV,CAAI;AACzC,IAAAO,EAAG,iBAAiB,QAAQC,CAAO,GACnCL,EAAgB,IAAII,GAAIC,CAAO;AAAA,EACjC;AAEA,SAAOF;AACT;"}