{"version":3,"file":"event.mjs","sources":["../../../../src/lib/form/event.mts"],"sourcesContent":["import { createFieldExtract } from './extract.mjs';\nimport { createEnrichField } from './enrichment.mjs';\nimport type { FormElement } from '../shared/fields.mjs';\nimport type { FormulaStores, FieldValidity, FormValidatorFn, EnrichFields } from '../shared/types.mjs';\n\ninterface EventOptions {\n  formValidators?: Record<string, FormValidatorFn>;\n  enrich?: EnrichFields;\n  preChanges?: (extracted: FieldExtractResult) => void;\n  postChanges?: (values: Record<string, unknown>) => void;\n}\n\ninterface FieldExtractResult extends FieldValidity {\n  name: string;\n  value: unknown;\n}\n\n/**\n * Do validation on the form and set the form validity state\n */\nfunction formValidation(formValidators: Record<string, FormValidatorFn>, stores: FormulaStores): void {\n  const currentValues = stores.formValues.get();\n  stores.formValidity.set({});\n  const validators = Object.entries(formValidators);\n\n  const invalidStates: Record<string, string> = {};\n  for (const [name, validator] of validators) {\n    const invalid = validator(currentValues);\n    if (invalid !== null) {\n      invalidStates[name] = invalid;\n    }\n  }\n\n  if (Object.keys(invalidStates).length > 0) {\n    stores.formValidity.set(invalidStates);\n    stores.formValid.set(false);\n  }\n}\n\n/**\n * Update the value and error stores, also update form validity\n */\nexport function valueUpdate(\n  details: FieldExtractResult,\n  stores: FormulaStores,\n  options: EventOptions | undefined,\n  hiddenFields: Map<string, FormElement[]>,\n  enrich?: (value: unknown) => Record<string, unknown>,\n): void {\n  const { name, value, ...validity } = details;\n\n  stores.formValues.set({ ...stores.formValues.get(), [name]: value });\n\n  if (hiddenFields.size) {\n    const state = { ...stores.formValues.get() };\n    hiddenFields.forEach((group, name) => {\n      state[name] = group.length > 1 ? group.map((e) => e.value) : group[0].value;\n    });\n    stores.formValues.set(state);\n  }\n\n  stores.errors.set({ ...stores.errors.get(), [name]: validity });\n  stores.formValid.set(Object.values(stores.errors.get()).every((v: FieldValidity) => v.valid));\n\n  if (options?.formValidators) {\n    formValidation(options.formValidators, stores);\n  }\n\n  if (enrich) {\n    stores.enrichment.set({ ...stores.enrichment.get(), [name]: enrich(value) });\n  }\n\n  if (typeof options?.postChanges === 'function') {\n    options.postChanges(stores.formValues.get());\n  }\n}\n\n/**\n * Creates an event handler for the passed element with its data handler\n */\nfunction createHandlerForData(\n  extractor: (el: FormElement, isInit: boolean, isReset: boolean) => FieldExtractResult,\n  stores: FormulaStores,\n  options: EventOptions | undefined,\n  hiddenFields: Map<string, FormElement[]>,\n  enrich?: (value: unknown) => Record<string, unknown>,\n): (event: Event) => void {\n  return (event: Event) => {\n    const el = (event?.currentTarget ?? event?.target) as FormElement;\n    const extracted = extractor(el, false, false);\n    if (typeof options?.preChanges === 'function') {\n      options.preChanges(extracted);\n    }\n    valueUpdate(extracted, stores, options, hiddenFields, enrich);\n  };\n}\n\n/**\n * Creates an event handler for the passed element with its data handler\n */\nexport function createHandler(\n  name: string,\n  eventName: string,\n  element: FormElement,\n  groupElements: FormElement[],\n  stores: FormulaStores,\n  options: EventOptions | undefined,\n  hiddenGroups: Map<string, FormElement[]>,\n): () => void {\n  const extract = createFieldExtract(name, groupElements, stores, options);\n  let enrich: ((value: unknown) => Record<string, unknown>) | undefined;\n  if (options?.enrich?.[name]) {\n    enrich = createEnrichField(name, options);\n  }\n  const handler = createHandlerForData(extract, stores, options, hiddenGroups, enrich);\n  element.addEventListener(eventName, handler);\n  return () => element.removeEventListener(eventName, handler);\n}\n\n/**\n * Create a handler for a form element submission\n */\nexport function createSubmitHandler(stores: FormulaStores, form: HTMLFormElement): () => void {\n  return () => {\n    if (!form.noValidate) form.reportValidity();\n\n    stores.formValues.subscribe((v) => stores.submitValues.set(v))();\n  };\n}\n"],"names":["formValidation","formValidators","stores","currentValues","validators","invalidStates","name","validator","invalid","valueUpdate","details","options","hiddenFields","enrich","value","validity","state","group","e","v","createHandlerForData","extractor","event","el","extracted","createHandler","eventName","element","groupElements","hiddenGroups","extract","createFieldExtract","createEnrichField","handler","createSubmitHandler","form"],"mappings":";;AAoBA,SAASA,EAAeC,GAAiDC,GAA6B;AACpG,QAAMC,IAAgBD,EAAO,WAAW,IAAA;AACxC,EAAAA,EAAO,aAAa,IAAI,EAAE;AAC1B,QAAME,IAAa,OAAO,QAAQH,CAAc,GAE1CI,IAAwC,CAAA;AAC9C,aAAW,CAACC,GAAMC,CAAS,KAAKH,GAAY;AAC1C,UAAMI,IAAUD,EAAUJ,CAAa;AACvC,IAAIK,MAAY,SACdH,EAAcC,CAAI,IAAIE;AAAA,EAE1B;AAEA,EAAI,OAAO,KAAKH,CAAa,EAAE,SAAS,MACtCH,EAAO,aAAa,IAAIG,CAAa,GACrCH,EAAO,UAAU,IAAI,EAAK;AAE9B;AAKO,SAASO,EACdC,GACAR,GACAS,GACAC,GACAC,GACM;AACN,QAAM,EAAE,MAAAP,GAAM,OAAAQ,GAAO,GAAGC,MAAaL;AAIrC,MAFAR,EAAO,WAAW,IAAI,EAAE,GAAGA,EAAO,WAAW,OAAO,CAACI,CAAI,GAAGQ,GAAO,GAE/DF,EAAa,MAAM;AACrB,UAAMI,IAAQ,EAAE,GAAGd,EAAO,WAAW,MAAI;AACzC,IAAAU,EAAa,QAAQ,CAACK,GAAOX,MAAS;AACpC,MAAAU,EAAMV,CAAI,IAAIW,EAAM,SAAS,IAAIA,EAAM,IAAI,CAACC,MAAMA,EAAE,KAAK,IAAID,EAAM,CAAC,EAAE;AAAA,IACxE,CAAC,GACDf,EAAO,WAAW,IAAIc,CAAK;AAAA,EAC7B;AAEA,EAAAd,EAAO,OAAO,IAAI,EAAE,GAAGA,EAAO,OAAO,OAAO,CAACI,CAAI,GAAGS,GAAU,GAC9Db,EAAO,UAAU,IAAI,OAAO,OAAOA,EAAO,OAAO,IAAA,CAAK,EAAE,MAAM,CAACiB,MAAqBA,EAAE,KAAK,CAAC,GAExFR,GAAS,kBACXX,EAAeW,EAAQ,gBAAgBT,CAAM,GAG3CW,KACFX,EAAO,WAAW,IAAI,EAAE,GAAGA,EAAO,WAAW,IAAA,GAAO,CAACI,CAAI,GAAGO,EAAOC,CAAK,GAAG,GAGzE,OAAOH,GAAS,eAAgB,cAClCA,EAAQ,YAAYT,EAAO,WAAW,IAAA,CAAK;AAE/C;AAKA,SAASkB,EACPC,GACAnB,GACAS,GACAC,GACAC,GACwB;AACxB,SAAO,CAACS,MAAiB;AACvB,UAAMC,IAAMD,GAAO,iBAAiBA,GAAO,QACrCE,IAAYH,EAAUE,GAAI,IAAO,EAAK;AAC5C,IAAI,OAAOZ,GAAS,cAAe,cACjCA,EAAQ,WAAWa,CAAS,GAE9Bf,EAAYe,GAAWtB,GAAQS,GAASC,GAAcC,CAAM;AAAA,EAC9D;AACF;AAKO,SAASY,EACdnB,GACAoB,GACAC,GACAC,GACA1B,GACAS,GACAkB,GACY;AACZ,QAAMC,IAAUC,EAAmBzB,GAAMsB,GAAe1B,GAAQS,CAAO;AACvE,MAAIE;AACJ,EAAIF,GAAS,SAASL,CAAI,MACxBO,IAASmB,EAAkB1B,GAAMK,CAAO;AAE1C,QAAMsB,IAAUb,EAAqBU,GAAS5B,GAAQS,GAASkB,GAAchB,CAAM;AACnF,SAAAc,EAAQ,iBAAiBD,GAAWO,CAAO,GACpC,MAAMN,EAAQ,oBAAoBD,GAAWO,CAAO;AAC7D;AAKO,SAASC,EAAoBhC,GAAuBiC,GAAmC;AAC5F,SAAO,MAAM;AACX,IAAKA,EAAK,cAAYA,EAAK,eAAA,GAE3BjC,EAAO,WAAW,UAAU,CAACiB,MAAMjB,EAAO,aAAa,IAAIiB,CAAC,CAAC,EAAA;AAAA,EAC/D;AACF;"}