{"version":3,"file":"extract.mjs","sources":["../../../../src/lib/form/extract.mts"],"sourcesContent":["import { createValidationChecker } from './errors.mjs';\nimport { setAriaValue } from './aria.mjs';\nimport type { FormElement } from '../shared/fields.mjs';\nimport type { FormulaStores } from '../shared/types.mjs';\nimport type { FieldValidity, ValidationMessages, ValidationRules, EnrichFields } from '../shared/types.mjs';\n\ninterface ExtractOptions {\n  defaultValues?: Record<string, unknown>;\n  messages?: ValidationMessages;\n  validators?: ValidationRules;\n  enrich?: EnrichFields;\n}\n\ninterface FieldExtractResult extends FieldValidity {\n  name: string;\n  value: unknown;\n}\n\n/**\n * Get selected option values from a multi-select element\n */\nfunction getMultiSelectOptionValues(collection: HTMLCollectionOf<HTMLOptionElement>): string[] {\n  const selectedValues: string[] = [];\n  for (let i = 0; i < collection.length; i++) {\n    if (collection[i].selected) {\n      selectedValues.push(collection[i].value);\n    }\n  }\n  return selectedValues;\n}\n\n/**\n * Sets the value of the element\n */\nfunction setElementValue(element: FormElement, value: unknown, isMultiValue: boolean, elementGroup: FormElement[]): void {\n  if (isMultiValue) {\n    const valueArray = Array.isArray(value) ? value : [];\n    elementGroup.forEach((el, i) => {\n      if (el.type === 'checkbox') {\n        (el as HTMLInputElement).checked = valueArray.includes(el.value);\n      } else {\n        el.value = String(valueArray[i] ?? '');\n      }\n    });\n  } else {\n    if (element instanceof HTMLSelectElement) {\n      const valueArray = Array.isArray(value) ? value : [value];\n      Array.from(element.options).forEach((el) => {\n        el.selected = valueArray.includes(el.value);\n      });\n    } else if (element.type === 'checkbox') {\n      (element as HTMLInputElement).checked = Boolean(value);\n    } else if (element.type === 'radio') {\n      elementGroup.forEach((el) => ((el as HTMLInputElement).checked = value === el.value));\n    } else if (element.type === 'file') {\n      (element as HTMLInputElement).files = value instanceof FileList ? value : null;\n    } else {\n      element.value = String(value ?? '');\n    }\n  }\n}\n\n/**\n * Get the value or values from an element\n */\nfunction getElementValues(element: FormElement, isMultiValue: boolean, elementGroup: FormElement[]): unknown {\n  let elValue: unknown;\n\n  if (element instanceof HTMLSelectElement) {\n    elValue = element.multiple ? getMultiSelectOptionValues(element.options) : element.value || null;\n  } else {\n    switch (element.type) {\n      case 'number':\n      case 'range':\n        elValue = isMultiValue\n          ? elementGroup.map((v) => parseFloat(v.value)).filter((v) => !isNaN(v))\n          : (() => {\n              const val = parseFloat(element.value);\n              return !isNaN(val) ? val : null;\n            })();\n        break;\n      case 'checkbox':\n        elValue = isMultiValue ? elementGroup.filter((e) => (e as HTMLInputElement).checked).map((e) => e.value) : (element as HTMLInputElement).checked;\n        break;\n      case 'radio':\n        const foundElement = elementGroup.find((el) => (el as HTMLInputElement).checked);\n        elValue = foundElement ? foundElement.value : null;\n        break;\n      case 'file':\n        elValue = (element as HTMLInputElement).files;\n        break;\n      default:\n        elValue = isMultiValue ? elementGroup.map((v) => v.value) : element.value || null;\n    }\n  }\n\n  return elValue;\n}\n\n/**\n * Create a data handler for any type of input field\n */\nexport function createFieldExtract(\n  name: string,\n  elementGroup: FormElement[],\n  stores: FormulaStores,\n  options?: ExtractOptions,\n): (element: FormElement, isInit: boolean, isReset: boolean) => FieldExtractResult {\n  const values = stores.formValues.get();\n  const validator = createValidationChecker(name, elementGroup, values, options);\n\n  let isMultiValue = false;\n  if (elementGroup[0].type !== 'radio') {\n    isMultiValue = !(elementGroup[0] as HTMLSelectElement).multiple && elementGroup.length > 1;\n  }\n\n  /**\n   * Function called on every element update, can also be called at initial value\n   */\n  return (element: FormElement, isInit: boolean, isReset: boolean): FieldExtractResult => {\n    let value: unknown;\n    if (isInit && options?.defaultValues?.[name] !== undefined) {\n      value = isMultiValue ? options?.defaultValues?.[name] || [] : options?.defaultValues?.[name] || '';\n    } else {\n      value = stores.formValues.get()[name] ?? (isMultiValue ? [] : '');\n    }\n\n    if (!isReset) {\n      const elValue = getElementValues(element, isMultiValue, elementGroup);\n      // Handle empty value fields that return null\n      if (elValue === null && !isInit && (Array.isArray(value) ? value.length > 0 : value !== '')) {\n        value = '';\n      }\n      if (elValue !== null) {\n        value = isInit && isMultiValue && Array.isArray(elValue) && elValue.length === 0 ? value : elValue;\n      }\n    }\n\n    if (isInit || isReset) {\n      setElementValue(element, value, isMultiValue, elementGroup);\n    }\n\n    setAriaValue(element, elementGroup);\n\n    let fieldName = name;\n    if (element.dataset?.formulaName) {\n      fieldName = element.dataset.formulaName;\n    }\n\n    return {\n      name: fieldName,\n      value,\n      ...validator(element, value),\n    };\n  };\n}\n"],"names":["getMultiSelectOptionValues","collection","selectedValues","i","setElementValue","element","value","isMultiValue","elementGroup","valueArray","el","getElementValues","elValue","v","val","e","foundElement","createFieldExtract","name","stores","options","values","validator","createValidationChecker","isInit","isReset","setAriaValue","fieldName"],"mappings":";;AAqBA,SAASA,EAA2BC,GAA2D;AAC7F,QAAMC,IAA2B,CAAA;AACjC,WAASC,IAAI,GAAGA,IAAIF,EAAW,QAAQE;AACrC,IAAIF,EAAWE,CAAC,EAAE,YAChBD,EAAe,KAAKD,EAAWE,CAAC,EAAE,KAAK;AAG3C,SAAOD;AACT;AAKA,SAASE,EAAgBC,GAAsBC,GAAgBC,GAAuBC,GAAmC;AACvH,MAAID,GAAc;AAChB,UAAME,IAAa,MAAM,QAAQH,CAAK,IAAIA,IAAQ,CAAA;AAClD,IAAAE,EAAa,QAAQ,CAACE,GAAIP,MAAM;AAC9B,MAAIO,EAAG,SAAS,aACbA,EAAwB,UAAUD,EAAW,SAASC,EAAG,KAAK,IAE/DA,EAAG,QAAQ,OAAOD,EAAWN,CAAC,KAAK,EAAE;AAAA,IAEzC,CAAC;AAAA,EACH,WACME,aAAmB,mBAAmB;AACxC,UAAMI,IAAa,MAAM,QAAQH,CAAK,IAAIA,IAAQ,CAACA,CAAK;AACxD,UAAM,KAAKD,EAAQ,OAAO,EAAE,QAAQ,CAACK,MAAO;AAC1C,MAAAA,EAAG,WAAWD,EAAW,SAASC,EAAG,KAAK;AAAA,IAC5C,CAAC;AAAA,EACH,MAAA,CAAWL,EAAQ,SAAS,aACzBA,EAA6B,UAAU,EAAQC,IACvCD,EAAQ,SAAS,UAC1BG,EAAa,QAAQ,CAACE,MAASA,EAAwB,UAAUJ,MAAUI,EAAG,KAAM,IAC3EL,EAAQ,SAAS,SACzBA,EAA6B,QAAQC,aAAiB,WAAWA,IAAQ,OAE1ED,EAAQ,QAAQ,OAAOC,KAAS,EAAE;AAGxC;AAKA,SAASK,EAAiBN,GAAsBE,GAAuBC,GAAsC;AAC3G,MAAII;AAEJ,MAAIP,aAAmB;AACrB,IAAAO,IAAUP,EAAQ,WAAWL,EAA2BK,EAAQ,OAAO,IAAIA,EAAQ,SAAS;AAAA;AAE5F,YAAQA,EAAQ,MAAA;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AACH,QAAAO,IAAUL,IACNC,EAAa,IAAI,CAACK,MAAM,WAAWA,EAAE,KAAK,CAAC,EAAE,OAAO,CAACA,MAAM,CAAC,MAAMA,CAAC,CAAC,KACnE,MAAM;AACL,gBAAMC,IAAM,WAAWT,EAAQ,KAAK;AACpC,iBAAQ,MAAMS,CAAG,IAAU,OAANA;AAAA,QACvB,GAAA;AACJ;AAAA,MACF,KAAK;AACH,QAAAF,IAAUL,IAAeC,EAAa,OAAO,CAACO,MAAOA,EAAuB,OAAO,EAAE,IAAI,CAACA,MAAMA,EAAE,KAAK,IAAKV,EAA6B;AACzI;AAAA,MACF,KAAK;AACH,cAAMW,IAAeR,EAAa,KAAK,CAACE,MAAQA,EAAwB,OAAO;AAC/E,QAAAE,IAAUI,IAAeA,EAAa,QAAQ;AAC9C;AAAA,MACF,KAAK;AACH,QAAAJ,IAAWP,EAA6B;AACxC;AAAA,MACF;AACE,QAAAO,IAAUL,IAAeC,EAAa,IAAI,CAACK,MAAMA,EAAE,KAAK,IAAIR,EAAQ,SAAS;AAAA,IAAA;AAInF,SAAOO;AACT;AAKO,SAASK,EACdC,GACAV,GACAW,GACAC,GACiF;AACjF,QAAMC,IAASF,EAAO,WAAW,IAAA,GAC3BG,IAAYC,EAAwBL,GAAMV,GAAca,GAAQD,CAAO;AAE7E,MAAIb,IAAe;AACnB,SAAIC,EAAa,CAAC,EAAE,SAAS,YAC3BD,IAAe,CAAEC,EAAa,CAAC,EAAwB,YAAYA,EAAa,SAAS,IAMpF,CAACH,GAAsBmB,GAAiBC,MAAyC;AACtF,QAAInB;AAOJ,QANIkB,KAAUJ,GAAS,gBAAgBF,CAAI,MAAM,SAC/CZ,IAAQC,IAAea,GAAS,gBAAgBF,CAAI,KAAK,CAAA,IAAKE,GAAS,gBAAgBF,CAAI,KAAK,KAEhGZ,IAAQa,EAAO,WAAW,IAAA,EAAMD,CAAI,MAAMX,IAAe,CAAA,IAAK,KAG5D,CAACkB,GAAS;AACZ,YAAMb,IAAUD,EAAiBN,GAASE,GAAcC,CAAY;AAEpE,MAAII,MAAY,QAAQ,CAACY,MAAW,MAAM,QAAQlB,CAAK,IAAIA,EAAM,SAAS,IAAIA,MAAU,QACtFA,IAAQ,KAENM,MAAY,SACdN,IAAQkB,KAAUjB,KAAgB,MAAM,QAAQK,CAAO,KAAKA,EAAQ,WAAW,IAAIN,IAAQM;AAAA,IAE/F;AAEA,KAAIY,KAAUC,MACZrB,EAAgBC,GAASC,GAAOC,GAAcC,CAAY,GAG5DkB,EAAarB,GAASG,CAAY;AAElC,QAAImB,IAAYT;AAChB,WAAIb,EAAQ,SAAS,gBACnBsB,IAAYtB,EAAQ,QAAQ,cAGvB;AAAA,MACL,MAAMsB;AAAA,MACN,OAAArB;AAAA,MACA,GAAGgB,EAAUjB,GAASC,CAAK;AAAA,IAAA;AAAA,EAE/B;AACF;"}