@forter/form-section
Version:
form-section from Forter Components
1 lines • 18 kB
Source Map (JSON)
{"version":3,"file":"FcFormSection.js","sources":["src/FcFormSection.js"],"sourcesContent":["import { LitElement, html, property } from 'lit-element';\nimport style from './fc-form-section.css';\nimport bound from 'bound-decorator';\nimport { FcFormMixin } from '@forter/mixins/src/fc-form-mixin';\nimport { LifecycleEventsMixin } from '@forter/mixins/src/lifecycle-event-mixin';\nimport { set, clear, isEmpty, removeItemFromArray } from './fc-form-section-helper';\nimport { ifDefined } from 'lit-html/directives/if-defined';\n\nconst isRequired = elm => elm.required;\nconst isFormField = elm => elm.nodeName === 'FC-FORM-FIELD';\nconst hasValue = value => value || value === 0;\nconst isEmptyArray = arr => (arr || []).length === 0;\nconst hasNoValue = elm => !hasValue(elm.value) && isEmptyArray(elm.values);\n\n\nexport const ALIGNMENTS = {\n ROW: 'row',\n COLUMN: 'column',\n};\n\n/**\n * An element by Forter\n * <!-- Author: oweingart <oweingart@forter.com> -->\n *\n * ## Usage\n *\n * ```html\n * <script>\n * import '@forter/form-section';\n * </script>\n *\n * <fc-form-section>\n * <fc-form-field></fc-form-field>\n * </fc-form-section>\n * ```\n *\n * @element fc-form-section\n * @cssprop --fc-form-section-color - section font color. default: \"balck\"\n * @cssprop --fc-form-section-padding-left - section padding left. default: \"5px\"\n * @cssprop --fc-form-section-margin-right-item - section margin right of each field (row alignment only). default: \"20px\"\n * @cssprop --fc-form-section-label-invalid-color - section label color when the section is invalid. default: \"var(--fc-red-900)\"\n * @cssprop --fc-form-section-label-font-size - section label font size. default: \"12px\"\n * @cssprop --fc-form-section-label-font-weight - section label font weight. default: \"normal\"\n * @cssprop --fc-form-section-label-margin-bottom - section label margin bottom. default: \"0px\"\n * @cssprop --fc-form-section-arrow-color - section label arrow color (when section is collapsable) . default: \"var(--fc-gray-700)\"\n */\nexport class FcFormSection extends LifecycleEventsMixin(FcFormMixin(LitElement)) {\n /**\n * Alignment of the form section (row/column)\n * @type {string}\n */\n @property({ type: String }) align = ALIGNMENTS.ROW;\n\n /**\n * If the section is collapsable\n * @type {boolean}\n */\n @property({ type: Boolean }) collapsable = false;\n\n /**\n * If the section is currently collapsed\n * @type {boolean}\n */\n @property({ type: Boolean }) collapse = false;\n\n /**\n * Section label\n */\n @property({ type: String }) label;\n\n /**\n *\n * Internal Observables\n *\n */\n\n /**\n * If the section is disabled\n * @type {Boolean}\n * @attr\n */\n @property({ type: Boolean }) disabled = false;\n\n /**\n * If the section is valid\n * @type {Boolean}\n * @attr\n */\n @property({ type: Boolean }) valid = false;\n\n /**\n * If the section is dirty\n * @type {Boolean}\n * @attr\n */\n @property({ type: Boolean }) dirty = false;\n\n /**\n * If the section was touched\n * @type {Boolean}\n * @attr\n */\n @property({ type: Boolean }) touched = false;\n\n\n /** @inheritdoc */\n static is = 'fc-form-section';\n\n /** @inheritdoc */\n static styles = [style];\n\n constructor() {\n super();\n this.invalidFields = []; // holds the invalid fields\n this.missingRequiredFields = []; // holds the fields that are required and has no data\n this.model = {}; // holds the files path and it's data\n }\n\n /**\n * If section is valid\n * @return {Boolean|boolean}\n */\n get isValid() {\n if (!this.dirty) return true;\n return this.valid;\n }\n\n @bound onPressLabel(e) {\n e.preventDefault();\n const { key, target } = e;\n if (key === 'Enter') {\n target.click();\n }\n }\n\n /**\n * on click collapse\n */\n @bound onCollapse() {\n this.collapse = !this.collapse;\n }\n\n /**\n * Disable the section if section is hidden after the collapse has ended\n */\n @bound onFinishCollapse() {\n if (this.collapsable) {\n this.disabled = !this.collapse;\n }\n }\n\n /**\n * Fire event to parent when one of the field had change\n * @param {String} eventName\n * @param {HTMLElement} field\n * @param {Object} changedDetails\n */\n @bound fireEventOnChange(eventName, field, changedDetails) {\n const { invalidFields, dirty, model, valid } = this;\n this.dispatchEvent(new CustomEvent(eventName, {\n detail: { valid, dirty, invalidFields, model, field, changedDetails },\n }));\n }\n\n /**\n * Update section model after change\n */\n @bound updateModel() {\n this.childNodes.forEach(field => {\n const value = field.value || field.values;\n const { path } = field;\n if (path) {\n if (isEmpty(value)) {\n clear(this.model, path);\n } else {\n set(this.model, path, value);\n }\n }\n });\n }\n\n /** @inheritdoc */\n firstUpdated() {\n this.updateModel();\n }\n\n /**\n * Update invalidFields after change\n * @param {Boolean} isPathValid\n * @param {String} changedPath\n */\n @bound updateInvalidFields(isPathValid, changedPath) {\n if (isPathValid) {\n removeItemFromArray(this.invalidFields, changedPath);\n } else {\n changedPath\n && !this.invalidFields.includes(changedPath)\n && this.invalidFields.push(changedPath);\n }\n }\n\n /**\n * Update missing required fields after change\n */\n updateMissingRequiredFields() {\n const emptyRequiredFields = this.requiredFields.filter(hasNoValue);\n if (emptyRequiredFields.length === this.requiredFields.length && !this.required) {\n this.missingRequiredFields = []; // in case all fields were cleared, so section is valid\n } else {\n this.missingRequiredFields = emptyRequiredFields.map(e => e.path);\n }\n }\n\n @bound onFieldRemoved({ target, detail: { path } }) {\n clear(this.model, path); // remove form model\n this.requiredFields = this.childNodes.filter(isRequired);\n this.fieldsToPathMap = this.buildFieldToPathsMap();\n this.updateInvalidFields(true, path); // remove path from invalid paths if it's there\n this.updateMissingRequiredFields(); // re-build list of missing required fields\n this.updateDirty(); // re-build dirty filed\n this.updateValid(); // re-build valid field\n this.fireEventOnChange('change', target, { path });\n }\n\n /**\n * All the updates perform when something changes\n * @param {Boolean} valid\n * @param {String} path\n */\n @bound updateSectionData(valid, path) {\n this.updateModel(); // re-build the model\n this.updateInvalidFields(valid, path); // re-build list of invalid fields\n this.updateMissingRequiredFields(); // re-build list of missing required fields\n this.updateDirty(); // re-build dirty filed\n this.updateValid(); // re-build valid field\n }\n\n /**\n * On change field with list of values\n * @param {HTMLElement} target\n * @param {Object} detail\n */\n @bound onChangeFieldWithListOfValues({ target, detail }) {\n const { valid, path } = detail;\n this.updateSectionData(valid, path);\n this.fireEventOnChange('change', target, detail);\n }\n\n /**\n * On change field single value\n * @param {HTMLElement} target\n * @param {Object} detail\n */\n @bound onChangeFieldWithSingleValue({ target, detail }) {\n const { valid, path } = detail;\n this.updateSectionData(valid, path);\n this.fireEventOnChange('change', target, detail);\n }\n\n @bound onFieldRequiredChange({ target, detail }) {\n const { valid, path } = detail;\n this.requiredFields = this.childNodes.filter(isRequired);\n this.updateSectionData(valid, path);\n this.fireEventOnChange('change', target, detail);\n }\n\n /**\n * Build a map with the fields path and the field DOM object\n * @return {{}}\n */\n @bound buildFieldToPathsMap() {\n const map = {};\n this.childNodes.filter(isFormField)\n .forEach(fieldElement => set(map, fieldElement.path, fieldElement));\n return map;\n }\n\n @bound onSlotChange() {\n this.passPropsToSlots();\n this.childNodes\n .forEach(child => child.addEventListener('change-values',\n this.onChangeFieldWithListOfValues));\n this.childNodes\n .forEach(child => child.addEventListener('change-value',\n this.onChangeFieldWithSingleValue));\n this.childNodes\n .forEach(child => child.addEventListener('field-removed',\n this.onFieldRemoved));\n this.childNodes\n .forEach(child => child.addEventListener('required-change',\n this.onFieldRequiredChange));\n this.requiredFields = this.childNodes.filter(isRequired);\n this.fieldsToPathMap = this.buildFieldToPathsMap();\n this.dispatchEvent(new CustomEvent('field-added'));\n }\n\n\n /**\n * Render the label\n * @return {*}\n */\n @bound renderLabel() {\n const { collapsable, collapse, isValid, label } = this;\n const isSlottedLabel = this.querySelector('label');\n const labelTemplate = html`\n ${isSlottedLabel ? html`<slot name=\"label\" ?invalid=\"${!isValid}\"></slot>` : ''}\n ${label ? html`<label ?invalid=\"${!isValid}\">${label}</label>` : ''}`;\n if (collapsable) {\n // Collapsed label\n const isCollapsed = collapsable && !collapse;\n const arrowDirection = isCollapsed ? 'right' : 'down';\n const invalid = !isValid ? 'invalid' : '';\n return html`\n <div class=\"collapsable-label-container\"\n @click=\"${this.onCollapse}\"\n @keyup=\"${this.onPressLabel}\"\n tabindex=\"0\">\n <div class=\"arrow ${arrowDirection} ${invalid}\"></div>\n ${labelTemplate}\n </div>`;\n } else {\n return html`${labelTemplate}`;\n }\n }\n\n updated() {\n const { align } = this;\n const children = Array.from(this.children);\n children.forEach(child => {\n child.setAttribute('align', align);\n });\n }\n\n /** @inheritdoc */\n render() {\n const { align, collapsable, collapse } = this;\n let tabIndex = '0';\n if (collapsable && !collapse) {\n tabIndex = '-1';\n }\n return html`\n ${this.renderLabel()}\n <section\n align=\"${align}\"\n ?collapsed=\"${collapse}\"\n ?collapsable=\"${collapsable}\"\n @animationend=\"${this.onFinishCollapse}\"\n @transitionend=\"${this.onFinishCollapse}\">\n <slot @slotchange=\"${this.onSlotChange}\"\n .tabIndex=\"${ifDefined(tabIndex)}\">\n </slot>\n </section>\n `;\n }\n}\n"],"names":["isRequired","elm","required","isFormField","nodeName","hasValue","value","isEmptyArray","arr","length","hasNoValue","values","ALIGNMENTS","ROW","COLUMN","FcFormSection","constructor","invalidFields","missingRequiredFields","model","property","type","String","Boolean","style","dirty","valid","bound","e","preventDefault","key","target","click","collapse","collapsable","disabled","eventName","field","changedDetails","dispatchEvent","CustomEvent","detail","childNodes","forEach","path","isEmpty","clear","set","updateModel","isPathValid","changedPath","removeItemFromArray","includes","push","emptyRequiredFields","requiredFields","filter","map","fieldsToPathMap","buildFieldToPathsMap","updateInvalidFields","updateMissingRequiredFields","updateDirty","updateValid","fireEventOnChange","updateSectionData","fieldElement","passPropsToSlots","child","addEventListener","onChangeFieldWithListOfValues","onChangeFieldWithSingleValue","onFieldRemoved","onFieldRequiredChange","isValid","label","isSlottedLabel","querySelector","labelTemplate","html","isCollapsed","arrowDirection","invalid","onCollapse","onPressLabel","align","children","Array","from","setAttribute","tabIndex","renderLabel","onFinishCollapse","onSlotChange","ifDefined","LifecycleEventsMixin","FcFormMixin","LitElement"],"mappings":"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"}