{"version":3,"sources":["../src/AjaxForm.ts","../src/manager.ts","../src/index.ts"],"sourcesContent":["import {cErr, cLog} from '@dpsys/js-utils/misc';\nimport {elCreate} from \"@dpsys/js-utils/el\";\nimport { isEmpty } from '@dpsys/js-utils/is';\n\n\nexport class AjaxForm\n{\t\t\t\t\n    #formEl: HTMLFormElement;\n    #submitCallback: (axForm: AjaxForm, formData: FormData) => void = () => {};\n    \n\tconstructor(form: HTMLFormElement)\n\t{\n\t\tthis.#formEl = form;                 //cLog('AjaxForm :: Initialized', this.#formEl);\n\t\tthis.#formEl.addEventListener('submit', this.#submit);\n        this.#formEl.ajaxFormInstance = this; // Prevent multiple instances/eventListeners on the same form\n\t}\n\n\t#submit = async (e: SubmitEvent) =>\n\t{\n\t\te.preventDefault();\t                //cLog('AjaxForm :: Submit intercepted', this.#submit);\n\t\tif (!this.#isValid()) {return;}\n\t\tvar formData = this.#getFormData();\t//cLog('AjaxForm :: Form data collected', formData);\n\t\tif (e.submitter && !isEmpty((e.submitter as HTMLButtonElement).name)) {formData.append((e.submitter as HTMLButtonElement).name, 'true');}\t// Which button was used to submit\t\n\t\tawait this.#removeErrors();\t\n\n\t\tthis.#submitCallback(this, formData);\n\t}\n\t\n\t#isValid ()\n\t{\n\t\tif ( !this.#formEl.checkValidity() ) {this.#formEl.reportValidity(); return false;}\n\t\n\t\treturn true;\n\t}\n\n    setSubmitCallback(clb: (axForm: AjaxForm, formData: FormData) => void)\n    {\n        if (typeof clb !== 'function')\n        {\n            throw new Error('AjaxForm :: submitCallback is not a function');\n        }\n\n        this.#submitCallback = clb;\n    }\n\n    /**\n     * @deprecated submitCallback property is deprecated and will be removed in the next major release. Use setSubmitCallback() method instead.\n     */\n    set submitCallback(clb: (axForm: AjaxForm, formData: FormData) => void)\n    {\n        this.setSubmitCallback(clb);\n    }\n    \n\t/**\n\t * Inserts a span element containing the error message after the input field, or at the beginning of the form to show form-level errors (field_id is the id of the form).\n\t */\n\tasync showErrors (errors: {field_id: string, message: string}[]): Promise<void>\n\t{\t\t\t\t\t\t\t\t\n\t\tawait this.#removeErrors();\t\n\t\t\n\t\terrors.forEach( (err) =>\n\t\t{\t\t\t\n\t\t\tlet field_form = document.querySelector('[id=\"'+err.field_id+'\"]');\t\n\t\t\tif (!field_form) \n\t\t\t{\n\t\t\t\tcErr('AjaxForm :: Field/Form ID not found:', err.field_id, this.showErrors);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\t\t\n\t\t\tlet el_err = elCreate ('span', {class: 'error'}, err.message);\t\t\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\n            if (field_form.tagName === 'FORM')\n            {\n                field_form.insertAdjacentElement('afterbegin', el_err);\n            }\n            else\n            {\n                field_form.insertAdjacentElement('afterend', el_err);\n            }\n\n\t\t\tfield_form.scrollIntoView({behavior: \"smooth\", block: \"center\", inline: \"center\"});\n\t\t});\n\t}\t\n\t\n\tasync #removeErrors(): Promise<void>\n\t{\n\t\tlet errs = [...this.#formEl.querySelectorAll('.error')];\n\t\tawait Promise.all(errs.map(async (ch) => ch.remove()));\n\t}\t\n\t\n\t#getFormData(): FormData\n\t{\t\t\t\t\t\n\t\treturn new FormData(this.#formEl);\n\t}\n\n    getForm(): HTMLFormElement\n\t{\t\t\t\t\t\n\t\treturn this.#formEl;\n\t}\n\t\n\treset = (): void =>\n\t{\n\t\tthis.#formEl.reset();\n\t}\n\n\tresetFileInputs = (): void =>\n\t{\n\t\tthis.#formEl.querySelectorAll('input[type=\"file\"]').forEach((inp) => {(inp as HTMLInputElement).value = '';});\n\t}\n}\n\n\n","import {AjaxForm} from './AjaxForm.js';\nimport {isString} from '@dpsys/js-utils/is';\n\n\n/** \n * @param formOrSelector - Form element, CSS selector or name of the form\n */\t\nexport function getAjaxForm(formOrSelector:  HTMLFormElement|string): AjaxForm\n{\n    let formEl: HTMLFormElement|null = null;\n    \n    if (isString(formOrSelector)) \n    {\n        // Try CSS selector first\n        formEl = document.querySelector(formOrSelector as string);\n        if (!formEl)\n        {\n            // Try form name next\n            formEl = document.querySelector('form[name=\"'+formOrSelector+'\"]');\n        }\n    }\n    else if (formOrSelector instanceof HTMLFormElement) {formEl = formOrSelector;}\n    \n    if (!formEl) \n    {\n        throw new Error('AjaxForm :: Form element not found');\n    }\n\n    if (formEl.ajaxFormInstance instanceof AjaxForm) \n    {\n        return formEl.ajaxFormInstance;\n    }\n    else\n    {\n        return new AjaxForm(formEl);\n    }\n}\n\n\n\n","import { AjaxForm } from './AjaxForm';\nimport { getAjaxForm } from './manager';\n\ntype AjaxFormCallable = ((formOrSelector: HTMLFormElement | string) => AjaxForm | null) & \n{\n  /** @deprecated Use ajaxForm(form) instead: ajaxForm.get(form) */\n  get: (formOrSelector: HTMLFormElement | string) => AjaxForm | null;\n};\n\nconst ajaxForm: AjaxFormCallable = (formOrSelector: HTMLFormElement | string) => getAjaxForm(formOrSelector);\n\n// expose deprecated alias that calls the same function\najaxForm.get = ajaxForm;\n\nexport default ajaxForm;"],"mappings":"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","names":[]}