Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/ui / src / forms / form / FormState.js
Size: Mime:
"use strict";

var __decorate = this && this.__decorate || function (decorators, target, key, desc) {
  var c = arguments.length,
      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
      d;
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  return c > 3 && r && Object.defineProperty(target, key, r), r;
};

Object.defineProperty(exports, "__esModule", {
  value: true
});

const mobx_1 = require("xmobx/mobx");

const deps_1 = require("../deps");

const isValidCreditCard_1 = require("../deps/isValidCreditCard");

const isValidExpiryDate_1 = require("../deps/isValidExpiryDate");

const deps_2 = require("./deps"); // const curriedDecorate = curry('_', decorate)


function curryDecorate(types) {
  return function (Klass) {
    mobx_1.decorate(Klass, types);
    return Klass;
  };
}

const decorations = {
  setInputsList: mobx_1.action.bound,
  setFormReference: mobx_1.action.bound,
  setProps: mobx_1.action.bound
}; // @todo + finish at the end removing validation duplication
// @curryDecorate(decorations)

class FormState {
  constructor(stateData = {}) {
    // super(stateData)
    // extendObservable(this, {
    //   // I think this has an issue - name
    //   // name: '',
    //   hasAllValidInputs: false,
    //   inputsList: [],
    // })
    this.hasAllValidInputs = false;
    this.inputsList = [];
    /**
     * @note added identifier check too
     * @param {String} name name of the input for this form
     * @return {InputState}
     */

    this.get = name => {
      /**
       * @todo convert this to a .find
       */
      let result;

      const isSameName = inputState => {
        console.info('[forms] input state get - recursing: ', inputState);

        if (inputState.type === 'groupElements') {
          inputState.elementList.forEach(isSameName);
        } else if (inputState.name === name || inputState.identifier === name) {
          result = inputState;
        }
      };

      this.inputsList.forEach(isSameName);
      return result;
    }; // ========= @todo - remove this duplication =========


    this.formValidation = () => {
      const isValidInput = item => {
        console.log('itemDetails', item);
        const {
          type,
          isHidden,
          isEnabled,
          validationType
        } = item;

        if (isEnabled && type !== 'label' && validationType !== 'none') {
          if (type === 'groupElements') {
            return item.elementList.every(isValidInput);
          } else {
            return this.isValidElement(item);
          }
        } else {
          return true;
        }
      };

      console.log('current input list', this.inputsList);
      const hasAllValidInputs = this.inputsList.every(isValidInput);
      console.log('hasAllValidInputs', hasAllValidInputs);
      return hasAllValidInputs;
    };
    /**
     * @todo @gnanaprabhu why is this duplicated
     */


    this.isValidElement = item => {
      const {
        validationType,
        value
      } = item;

      if (validationType === 'creditCard' || validationType === 'securityCode') {
        return this.validateCreditCard(item);
      }

      if (validationType === 'month' || validationType === 'year') {
        return this.validateExpiryDate(item);
      }

      if (validationType === 'confirmPassword') {
        if (this.validateConfirmPassword(item) === false) {
          return false;
        }
      }

      if (validationType === 'newPassword') {
        if (this.validateNewPassword(item) === false) {
          return false;
        }
      } else {
        const validationResult = deps_1.isValid(value, validationType);

        if (!validationResult) {
          return false;
        }
      }

      return true;
    };

    this.validateCreditCard = item => {
      const creditCard = this.get('cardNumber');
      const securityCode = this.get('SecurityCode');

      if (creditCard && creditCard.getValue()) {
        if (securityCode && securityCode.getValue()) {
          const isamexCard = isValidCreditCard_1.isAmexCard(creditCard.getValue());

          if (isamexCard && securityCode.getValue().length !== 4) {
            return false;
          } else if (!isamexCard && securityCode.getValue().length === 4) {
            return false;
          }
        }

        return isValidCreditCard_1.isValidCreditCard(creditCard.getValue());
      }

      return false;
    };

    this.validateExpiryDate = item => {
      const expiryMonth = this.get('expirationMonth');
      const expiryYear = this.get('expirationYear');

      if (expiryMonth.getValue() && expiryYear.getValue()) {
        if (isValidExpiryDate_1.isValidYear(expiryYear.getValue(), expiryMonth.getValue())) {
          return true;
        } else {
          return false;
        }
      }

      return false;
    };
    /**
     * @todo when setting inputs list, copy...
     * ORIGINAL_INPUTS_LIST
     */


    this.inputsList = mobx_1.observable([]); // no need to add another method, is an alias for specific usage

    this.toSerialized = this.toJSON.bind(this);
  }

  static init(state) {
    return new FormState(state);
  }

  setInputsList(list) {
    this.inputsList = list;
    return this;
  }

  setFormReference(dom) {
    this.form = dom;
  }

  setProps(props) {
    this.props = props;
  } // ========= protected read =========

  /**
   * @type {Computed}
   */


  toJSON() {
    const formData = {};

    const getInputValue = input => {
      // ignore labels
      if (input.type === 'label') {
        return;
      } // title says it all


      const {
        key,
        value
      } = deps_2.fromInputToSerializedKeyValue(input, getInputValue); // special place for radios

      if (input.type === 'radio') {
        if (value) {
          formData['selectedItem'] = key;
        }
      } else {
        // otherwise, default
        formData[key] = value;
        /**
         * @todo @fixme bad serialization - fixed in ui-component-library
         */

        if (formData['0'] === value) {
          delete formData['0'];
        }
      }
    }; // this is using `getInputValue` as a longhand `.reduce`


    this.inputsList.forEach(getInputValue);
    return formData;
  }

  validateForSamePassword(item, name, shouldBeSamePassword) {
    // if (isObj(item) === false) {
    //   console.error('@ganesh - it is being passed a string')
    //   return false
    // }
    const {
      value
    } = item;

    if (!deps_1.isValidPassword(value)) {
      item.setIsValidInput(false);
      item.errorMessage = deps_1.errorMessage('password');
      return false;
    }

    const password = this.get(name);
    const passwordValue = password.getValue();
    item.setIsValidInput(true);
    let isValid = passwordValue === '';
    isValid = shouldBeSamePassword ? passwordValue !== value : passwordValue === value;

    if (isValid) {
      item.setIsValidInput(false);
      item.errorMessage = deps_1.errorMessage(item.errorMessageFor);
      return false;
    }

    return true;
  }

  validateConfirmPassword(item) {
    this.validateForSamePassword(item, 'password', true);
  }

  validateNewPassword(item) {
    this.validateForSamePassword(item, 'oldPassword', false);
  }

}
/**
 * @example [].map(FormState.toInputState)
 */


FormState.toInputState = deps_2.toInputState;

__decorate([mobx_1.observable], FormState.prototype, "hasAllValidInputs", void 0);

__decorate([mobx_1.observable], FormState.prototype, "inputsList", void 0);

__decorate([mobx_1.action], FormState.prototype, "setInputsList", null);

__decorate([mobx_1.action.bound], FormState.prototype, "setFormReference", null);

__decorate([mobx_1.action.bound], FormState.prototype, "setProps", null);

__decorate([mobx_1.action.bound], FormState.prototype, "validateForSamePassword", null);

__decorate([mobx_1.action.bound], FormState.prototype, "validateConfirmPassword", null);

__decorate([mobx_1.action.bound], FormState.prototype, "validateNewPassword", null);

exports.FormState = FormState;
exports.default = FormState; //# sourceMappingURL=FormState.js.map