{"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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"}