{"version":3,"sources":["Components/Forms.js"],"names":["xhr","Form","form","options","_form","addEventListener","submitForm","bind","_originalFormFieldStates","_options","idAttributeDotReplacement","htmlFieldPrefix","autoRedirect","event","Event","bubbles","cancelable","e","document","createEvent","initEvent","dispatchEvent","propertyName","undefined","indexOf","split","exec","i","elements","length","push","disabled","object","propertyValue","_isHierarchyProperty","arrayName","_testForArrayProperty","name","Array","isArray","hasOwnProperty","parentPropertyName","_getTopLevelProperty","results","_serializeFormProperties","substring","arrayIndex","toLowerCase","usePrefix","fullName","prefix","el","namedItem","getElement","data","element","type","checked","HTMLButtonElement","value","state","errors","console","log","errorFields","querySelectorAll","field","fieldName","attributes","error","innerText","errorMessage","preventDefault","onbeforesubmit","_callingSubmit","beforeSubmitResult","_captureOriginalFormFieldState","formData","serialize","clearValidation","setDisabled","method","JSON","stringify","then","path","window","location","done","status","err","parse","responseText","errorType","showValidationErrors","fail","always","action"],"mappings":";;;;;;;;;;;;;;;AAASA,e,WAAAA,G;;;;;;;;;;;;;;;;;;;;;4BAEHC,I;AACF,8BAAYC,IAAZ,EAAkBC,OAAlB,EAA2B;AAAA;;AACvB,yBAAKC,KAAL,GAAaF,IAAb;AACA,yBAAKE,KAAL,CAAWC,gBAAX,CAA4B,QAA5B,EAAsC,KAAKC,UAAL,CAAgBC,IAAhB,CAAqB,IAArB,CAAtC,EAAkE,IAAlE;;AAEA,yBAAKC,wBAAL,GAAgC,EAAhC;;AAEA,yBAAKC,QAAL,GAAgBN,WAAW,EAA3B;AACA,yBAAKM,QAAL,CAAcC,yBAAd,GAA0C,KAAKD,QAAL,CAAcC,yBAAd,IAA2C,GAArF;AACA,yBAAKD,QAAL,CAAcE,eAAd,GAAgC,KAAKF,QAAL,CAAcE,eAAd,IAAiC,EAAjE;AACA;AACA,yBAAKF,QAAL,CAAcG,YAAd,GAA6B,KAAKH,QAAL,CAAcG,YAAd,IAA8B,KAA3D;AACH;;;;6CAQQ;AACL,4BAAIC,cAAJ;AACA,4BAAI;AACAA,oCAAQ,IAAIC,KAAJ,CAAU,QAAV,EAAoB,EAAEC,SAAS,IAAX,EAAiBC,YAAY,IAA7B,EAApB,CAAR;AACH,yBAFD,CAEE,OAAOC,CAAP,EAAU;AACR;AACAJ,oCAAQK,SAASC,WAAT,CAAqB,OAArB,CAAR;AACAN,kCAAMO,SAAN,CAAgB,QAAhB,EAA0B,IAA1B,EAAgC,IAAhC;AACH;;AAED,6BAAKhB,KAAL,CAAWiB,aAAX,CAAyBR,KAAzB;AACH;;;yDAEoBS,Y,EAAc;AAC/B,+BAAOA,iBAAiBC,SAAjB,IAA8BD,iBAAiB,IAA/C,IAAuDA,aAAaE,OAAb,CAAqB,GAArB,MAA8B,CAAC,CAA7F;AACH;;;yDAEoBF,Y,EAAc;AAC/B,+BAAOA,aAAaG,KAAb,CAAmB,GAAnB,EAAwB,CAAxB,CAAP;AACH;;;0DAEqBH,Y,EAAc;AAChC,+BAAO,qBAAoBI,IAApB,CAAyBJ,YAAzB;AAAP;AACH;;;qEAEgC;AAC7B;AACA,6BAAKd,wBAAL,GAAgC,EAAhC;AACA,6BAAK,IAAImB,IAAI,CAAb,EAAgBA,IAAI,KAAKvB,KAAL,CAAWwB,QAAX,CAAoBC,MAAxC,EAAgD,EAAEF,CAAlD;AACI,iCAAKnB,wBAAL,CAA8BsB,IAA9B,CAAmC,EAAEC,UAAU,KAAK3B,KAAL,CAAWwB,QAAX,CAAoBD,CAApB,EAAuBI,QAAnC,EAAnC;AADJ;AAEH;;;6DAEwBC,M,EAAQV,Y,EAAcW,a,EAAe;AAC1D,4BAAI,CAAC,KAAKC,oBAAL,CAA0BZ,YAA1B,CAAL,EAA8C;AAC1C,gCAAMa,YAAY,KAAKC,qBAAL,CAA2Bd,YAA3B,CAAlB;AACA,gCAAIa,aAAa,IAAjB,EAAuB;AACnB,oCAAME,OAAOF,UAAU,CAAV,CAAb;AACA,oCAAI,CAACG,MAAMC,OAAN,CAAcP,OAAOK,IAAP,CAAd,CAAL,EAAkC;AAC9BL,2CAAOK,IAAP,IAAe,EAAf;AACH;;AAEDL,uCAAOK,IAAP,EAAaP,IAAb,CAAkBG,aAAlB;AACA,uCAAOD,MAAP;AACH;;AAED,gCAAI,CAACA,OAAOQ,cAAP,CAAsBlB,YAAtB,CAAL,EACIU,OAAOV,YAAP,IAAuBW,aAAvB;;AAEJ,mCAAOD,MAAP;AACH;;AAED,4BAAIS,qBAAqB,KAAKC,oBAAL,CAA0BpB,YAA1B,CAAzB;;AAEA,4BAAIqB,UAAU,KAAKP,qBAAL,CAA2BK,kBAA3B,CAAd;AACA,4BAAIE,YAAY,IAAhB,EAAsB;AAClBX,mCAAOS,kBAAP,IACI,KAAKG,wBAAL,CACIZ,OAAOS,kBAAP,KAA8B,EADlC,EAEInB,aAAauB,SAAb,CAAuBJ,mBAAmBZ,MAAnB,GAA4B,CAAnD,CAFJ,EAGII,aAHJ,CADJ;AAKH,yBAND,MAOK;AACDQ,iDAAqBE,QAAQ,CAAR,CAArB;AACA,gCAAIG,aAAaH,QAAQ,CAAR,CAAjB;;AAEA,gCAAI,CAACL,MAAMC,OAAN,CAAcP,OAAOS,kBAAP,CAAd,CAAL,EACIT,OAAOS,kBAAP,IAA6B,EAA7B;;AAEJnB,2CAAeA,aAAauB,SAAb,CAAuBF,QAAQ,CAAR,EAAWd,MAAX,GAAoB,CAA3C,CAAf;AACAI,4CAAgBX,aAAayB,WAAb,OAA+B,SAA/B,GAA4Cd,kBAAkB,MAAlB,IAA4BA,kBAAkB,IAA1F,GAAkGA,aAAlH;;AAEAD,mCAAOS,kBAAP,EAA2BK,UAA3B,IACI,KAAKF,wBAAL,CACIZ,OAAOS,kBAAP,EAA2BK,UAA3B,KAA0C,EAD9C,EAEIxB,YAFJ,EAGIW,aAHJ,CADJ;AAKH;AACJ;;;+CAEUI,I,EAAyB;AAAA,4BAAnBW,SAAmB,uEAAP,KAAO;;;AAEhC,4BAAIC,WAAWZ,IAAf;;AAEA,4BAAIW,SAAJ,EAAe;AACX,gCAAIE,SAAS,KAAKzC,QAAL,CAAcE,eAA3B;AACA,gCAAIuC,MAAJ,EAAYA,UAAU,KAAKzC,QAAL,CAAcC,yBAAxB;AACZuC,uCAAWC,SAASb,IAApB;AACH;;AAED;AACA,4BAAIc,KAAK,KAAK/C,KAAL,CAAWwB,QAAX,CAAoBwB,SAApB,CAA8BH,QAA9B,CAAT;;AAEA;AACA,4BAAI,CAACE,EAAD,IAAO,KAAK1C,QAAL,CAAcE,eAAzB,EACIwC,KAAK,KAAKE,UAAL,CAAgBhB,IAAhB,EAAsB,IAAtB,CAAL;;AAEJ,+BAAOc,EAAP;AACH;;;gDAEW;AACR,4BAAMvB,WAAW,KAAKxB,KAAL,CAAWwB,QAA5B;AACA,4BAAI0B,OAAO,EAAX;AACA,6BAAK,IAAI3B,IAAI,CAAb,EAAgBA,IAAIC,SAASC,MAA7B,EAAqCF,GAArC,EAA0C;AACtC,gCAAM4B,UAAU3B,SAASD,CAAT,CAAhB;;AAEA,gCAAI4B,QAAQxB,QAAR,IAAoB,CAACwB,QAAQlB,IAA7B,IAAqC,CAACkB,QAAQC,IAAR,KAAiB,UAAjB,IAA+BD,QAAQC,IAAR,KAAiB,OAAjD,KAA6D,CAACD,QAAQE,OAA/G,EAAwH;AACpH;AACH;;AAED,gCAAIF,mBAAmBG,iBAAvB,EAA0C;AACtC;AACH;;AAED,iCAAKd,wBAAL,CAA8BU,IAA9B,EAAoCC,QAAQlB,IAA5C,EAAkDkB,QAAQI,KAA1D;AACH;;AAED,+BAAOL,IAAP;AACH;;;gDAEWM,K,EAAO;AACfA,gCAAQ,CAAC,CAACA,KAAV;AACA,4BAAMhC,WAAW,KAAKxB,KAAL,CAAWwB,QAA5B;AACA,6BAAK,IAAID,IAAI,CAAb,EAAgBA,IAAIC,SAASC,MAA7B,EAAqCF,GAArC,EAA0C;AACtCC,qCAASD,CAAT,EAAYI,QAAZ,GAAuB6B,QAAQA,KAAR,GAAgB,CAAC,CAAC,CAAC,KAAKpD,wBAAL,CAA8BmB,CAA9B,KAAoC,EAArC,EAAyCI,QAAlF;AACH;AACJ;;;yDAEoB8B,M,EAAQ;AACzBC,gCAAQC,GAAR,CAAYF,MAAZ;;AAEA,4BAAIG,cAAc9C,SAAS+C,gBAAT,CAA0B,uBAA1B,CAAlB;AACA,6BAAK,IAAItC,IAAI,CAAb,EAAgBA,IAAIqC,YAAYnC,MAAhC,EAAwCF,GAAxC,EAA6C;AACzC,gCAAIuC,QAAQF,YAAYrC,CAAZ,CAAZ;AACA,gCAAMwC,YAAYD,MAAME,UAAN,CAAiB,iBAAjB,EAAoCT,KAAtD;;AAEA,gCAAIU,QAAQR,OAAOM,SAAP,CAAZ;AACA,gCAAIE,SAAS/B,MAAMC,OAAN,CAAc8B,MAAMR,MAApB,CAAT,IAAwCQ,MAAMR,MAAN,CAAahC,MAAb,GAAsB,CAAlE,EAAqE;AACjEqC,sCAAMI,SAAN,GAAkBD,MAAMR,MAAN,CAAa,CAAb,EAAgBU,YAAlC;AACH;AACJ;AACJ;;;sDAEiB;AACd,4BAAIP,cAAc,KAAK5D,KAAL,CAAW6D,gBAAX,CAA4B,uBAA5B,CAAlB;AACA,6BAAK,IAAItC,IAAI,CAAb,EAAgBA,IAAIqC,YAAYnC,MAAhC,EAAwCF,GAAxC,EAA6C;AACzCqC,wCAAYrC,CAAZ,EAAe2C,SAAf,GAA2B,EAA3B;AACH;AACJ;;;+CAEUrD,C,EAAG;AAAA;;AACVA,0BAAEuD,cAAF;;AAEA,4BAAI,KAAKC,cAAT,EAAyB;AACrB;AACA,gCAAI,KAAKC,cAAT,EAAyB;;AAEzB;AACA,iCAAKA,cAAL,GAAsB,IAAtB;AACA;AACA,gCAAIC,qBAAqB,KAAKF,cAAL,CAAoB,IAApB,CAAzB;AACA;AACA,iCAAKC,cAAL,GAAsB,KAAtB;;AAEA,gCAAG,CAACC,kBAAJ,EACI;AACP;;AAED,6BAAKC,8BAAL;;AAEA,4BAAIC,WAAW,KAAKC,SAAL,EAAf;;AAEA,6BAAKC,eAAL;;AAEA,6BAAKC,WAAL,CAAiB,IAAjB;;AAEA,4BAAM7E,UAAU;AACZ8E,oCAAQ,KAAK7E,KAAL,CAAWgE,UAAX,CAAsB,QAAtB,EAAgCT,KAD5B;AAEZL,kCAAM4B,KAAKC,SAAL,CAAeN,QAAf;AAFM,yBAAhB;;AAKA7E,4BAAI,KAAKI,KAAL,CAAWgE,UAAX,CAAsB,QAAtB,EAAgCT,KAApC,EAA2CxD,OAA3C,EACKiF,IADL,CACU,gBAAQ;AACV,gCAAI,MAAK3E,QAAL,CAAcG,YAAd,IAA8B0C,KAAK+B,IAAvC,EACIC,OAAOC,QAAP,GAAkBjC,KAAK+B,IAAvB;;AAEJ,gCAAI,MAAK5E,QAAL,CAAc+E,IAAlB,EACI,MAAK/E,QAAL,CAAc+E,IAAd,CAAmBlC,IAAnB;AACP,yBAPL,EAOO,UAACtD,GAAD,EAAS;AACR,gCAAIA,IAAIyF,MAAJ,KAAe,GAAnB,EAAwB;AACpB;AACA;AACH,6BAHD,MAGO,IAAIzF,IAAIyF,MAAJ,KAAe,GAAnB,EAAwB;AAC3B,oCAAMC,MAAMR,KAAKS,KAAL,CAAW3F,IAAI4F,YAAf,CAAZ;AACA,oCAAMC,YAAYH,IAAIlC,IAAtB;;AAEA,oCAAIqC,cAAc,YAAlB,EACI,MAAKC,oBAAL,CAA0BJ,IAAIrB,KAA9B;AACP,6BANM,MAMA;AACHP,wCAAQC,GAAR,CAAY,eAAZ,EAA6B/D,GAA7B;AACH;;AAED,gCAAI,MAAKS,QAAL,CAAcsF,IAAlB,EACI,MAAKtF,QAAL,CAAcsF,IAAd,CAAmB/F,GAAnB;AACP,yBAvBL,EAwBKoF,IAxBL,CAwBU,YAAM;AACR,kCAAKJ,WAAL,CAAiB,KAAjB;;AAEA,gCAAI,MAAKvE,QAAL,CAAcuF,MAAlB,EACI,MAAKvF,QAAL,CAAcuF,MAAd;AACP,yBA7BL;AA8BH;;;wCAxNY;AAAE,+BAAO,KAAK5F,KAAL,CAAW6F,MAAlB;AAA2B;;;wCAE7B;AAAE,+BAAO,KAAK7F,KAAL,CAAWgE,UAAX,CAAsB,QAAtB,EAAgCT,KAAvC;AAA+C;;;wCAEnD;AAAE,+BAAO,KAAKvD,KAAZ;AAAoB;;;;;;4BAuN5BH,I","file":"Forms.js","sourcesContent":["import { xhr } from \"./Ajax.js\";\r\n\r\nclass Form {\r\n    constructor(form, options) {\r\n        this._form = form;\r\n        this._form.addEventListener(\"submit\", this.submitForm.bind(this), true);\r\n\r\n        this._originalFormFieldStates = [];\r\n\r\n        this._options = options || {};\r\n        this._options.idAttributeDotReplacement = this._options.idAttributeDotReplacement || \"_\";\r\n        this._options.htmlFieldPrefix = this._options.htmlFieldPrefix || \"\";\r\n        // process JsonRedirect on successful request\r\n        this._options.autoRedirect = this._options.autoRedirect || false;\r\n    }\r\n\r\n    get action() { return this._form.action; }\r\n\r\n    get method() { return this._form.attributes[\"method\"].value; }\r\n\r\n    get form() { return this._form; }\r\n\r\n    submit() {\r\n        let event;\r\n        try {\r\n            event = new Event(\"submit\", { bubbles: true, cancelable: true });\r\n        } catch (e) {\r\n            // For IE support.\r\n            event = document.createEvent(\"Event\");\r\n            event.initEvent(\"submit\", true, true);\r\n        }\r\n\r\n        this._form.dispatchEvent(event);\r\n    }\r\n\r\n    _isHierarchyProperty(propertyName) {\r\n        return propertyName !== undefined && propertyName !== null && propertyName.indexOf(\".\") !== -1;\r\n    }\r\n\r\n    _getTopLevelProperty(propertyName) {\r\n        return propertyName.split(\".\")[0];\r\n    }\r\n\r\n    _testForArrayProperty(propertyName) {\r\n        return /(.+)\\[([0-9]*)\\]$/.exec(propertyName);\r\n    }\r\n\r\n    _captureOriginalFormFieldState() {\r\n        // Assumes we do not remove the form elements from the DOM\r\n        this._originalFormFieldStates = [];\r\n        for (let i = 0; i < this._form.elements.length; ++i)\r\n            this._originalFormFieldStates.push({ disabled: this._form.elements[i].disabled });\r\n    }\r\n\r\n    _serializeFormProperties(object, propertyName, propertyValue) {\r\n        if (!this._isHierarchyProperty(propertyName)) {\r\n            const arrayName = this._testForArrayProperty(propertyName);\r\n            if (arrayName != null) {\r\n                const name = arrayName[1];\r\n                if (!Array.isArray(object[name])) {\r\n                    object[name] = [];\r\n                }\r\n\r\n                object[name].push(propertyValue);\r\n                return object;\r\n            }\r\n\r\n            if (!object.hasOwnProperty(propertyName))\r\n                object[propertyName] = propertyValue;\r\n\r\n            return object;\r\n        }\r\n\r\n        let parentPropertyName = this._getTopLevelProperty(propertyName);\r\n\r\n        let results = this._testForArrayProperty(parentPropertyName);\r\n        if (results === null) {\r\n            object[parentPropertyName] =\r\n                this._serializeFormProperties(\r\n                    object[parentPropertyName] || {},\r\n                    propertyName.substring(parentPropertyName.length + 1),\r\n                    propertyValue);\r\n        }\r\n        else {\r\n            parentPropertyName = results[1];\r\n            let arrayIndex = results[2];\r\n\r\n            if (!Array.isArray(object[parentPropertyName]))\r\n                object[parentPropertyName] = [];\r\n\r\n            propertyName = propertyName.substring(results[0].length + 1);\r\n            propertyValue = propertyName.toLowerCase() === \"checked\" ? (propertyValue === \"true\" || propertyValue === \"on\") : propertyValue;\r\n\r\n            object[parentPropertyName][arrayIndex] =\r\n                this._serializeFormProperties(\r\n                    object[parentPropertyName][arrayIndex] || {},\r\n                    propertyName,\r\n                    propertyValue);\r\n        }\r\n    }\r\n\r\n    getElement(name, usePrefix = false) {\r\n\r\n        var fullName = name;\r\n\r\n        if (usePrefix) {\r\n            var prefix = this._options.htmlFieldPrefix;\r\n            if (prefix) prefix += this._options.idAttributeDotReplacement;\r\n            fullName = prefix + name;\r\n        }\r\n\r\n        // get the item\r\n        var el = this._form.elements.namedItem(fullName);\r\n\r\n        // try to get the element using the prefix if one exists\r\n        if (!el && this._options.htmlFieldPrefix)\r\n            el = this.getElement(name, true);\r\n\r\n        return el;\r\n    }\r\n\r\n    serialize() {\r\n        const elements = this._form.elements;\r\n        let data = {};\r\n        for (let i = 0; i < elements.length; i++) {\r\n            const element = elements[i];\r\n\r\n            if (element.disabled || !element.name || (element.type === \"checkbox\" || element.type === \"radio\") && !element.checked) {\r\n                continue;\r\n            }\r\n\r\n            if (element instanceof HTMLButtonElement) {\r\n                continue;\r\n            }\r\n\r\n            this._serializeFormProperties(data, element.name, element.value);\r\n        }\r\n\r\n        return data;\r\n    }\r\n\r\n    setDisabled(state) {\r\n        state = !!state;\r\n        const elements = this._form.elements;\r\n        for (let i = 0; i < elements.length; i++) {\r\n            elements[i].disabled = state ? state : !!(this._originalFormFieldStates[i] || {}).disabled;\r\n        }\r\n    }\r\n\r\n    showValidationErrors(errors) {\r\n        console.log(errors);\r\n\r\n        let errorFields = document.querySelectorAll(\"span[data-valmsg-for]\");\r\n        for (var i = 0; i < errorFields.length; i++) {\r\n            var field = errorFields[i];\r\n            const fieldName = field.attributes[\"data-valmsg-for\"].value;\r\n\r\n            let error = errors[fieldName];\r\n            if (error && Array.isArray(error.errors) && error.errors.length > 0) {\r\n                field.innerText = error.errors[0].errorMessage;\r\n            }\r\n        }\r\n    }\r\n\r\n    clearValidation() {\r\n        let errorFields = this._form.querySelectorAll(\"span[data-valmsg-for]\");\r\n        for (let i = 0; i < errorFields.length; i++) {\r\n            errorFields[i].innerText = \"\";\r\n        }\r\n    }\r\n\r\n    submitForm(e) {\r\n        e.preventDefault();\r\n\r\n        if (this.onbeforesubmit) {\r\n            // if already in a call\r\n            if (this._callingSubmit) return;\r\n\r\n            // signal a call has begun\r\n            this._callingSubmit = true;\r\n            // make the call\r\n            var beforeSubmitResult = this.onbeforesubmit(this);\r\n            // clear the call state\r\n            this._callingSubmit = false;\r\n          \r\n            if(!beforeSubmitResult)\r\n                return;\r\n        } \r\n\r\n        this._captureOriginalFormFieldState();\r\n\r\n        let formData = this.serialize();\r\n\r\n        this.clearValidation();\r\n\r\n        this.setDisabled(true);\r\n\r\n        const options = {\r\n            method: this._form.attributes[\"method\"].value,\r\n            data: JSON.stringify(formData)\r\n        };\r\n\r\n        xhr(this._form.attributes[\"action\"].value, options)\r\n            .then(data => {\r\n                if (this._options.autoRedirect && data.path)\r\n                    window.location = data.path;\r\n\r\n                if (this._options.done)\r\n                    this._options.done(data);\r\n            }, (xhr) => {\r\n                if (xhr.status === 401) {\r\n                    // They were unauthorized, maybe we should tell them.\r\n                    // Do nothing for now.\r\n                } else if (xhr.status === 400) {\r\n                    const err = JSON.parse(xhr.responseText);\r\n                    const errorType = err.type;\r\n\r\n                    if (errorType === \"validation\")\r\n                        this.showValidationErrors(err.error);\r\n                } else {\r\n                    console.log(\"Unknown Error\", xhr);\r\n                }\r\n\r\n                if (this._options.fail)\r\n                    this._options.fail(xhr);\r\n            })\r\n            .then(() => {\r\n                this.setDisabled(false);\r\n\r\n                if (this._options.always)\r\n                    this._options.always();\r\n            });\r\n    }\r\n}\r\n\r\nexport { Form };\r\n"]}