Your IP : 18.219.40.177


Current Path : /usr/local/mgr5/skins/orion/src/
Upload File :
Current File : //usr/local/mgr5/skins/orion/src/App.FormDependFields.js

/**
 * Модуль обработки скрытия полей на форме
 * @param {object} window глобальный объект
 * @param {object} $ jQuery глобальный объект
 * @param {object} EventMgr менеджер событий
 * @param {object} formUtils утилиты для манипуляции с формой
 * @param {object} commonUtils общие утилиты
 */
App.FormDependFields = function(window, $, EventMgr, formUtils, commonUtils) {
  /** селектор контролов управляющих скрытием полей  */
  const dependFieldSlistSelector = '.control-field input[type="hidden"],' +
      ' .control-field .b-input,' +
      ' .control-field .b-input_type_file,' +
      ' .control-field .b-textarea';

  /**
   * Получаем ссылку на ноду формы
   * @return {object} jQuery объект
   */
  function $content() {
    return commonUtils.selectorCache('.i-form-wr');
  }

  //hide/show field by select, radio and checkbox
  /**
   * Обработчик скрытия зависимых полей от данного контрола
   */
  function dependFieldsSlistHandler() {
    let handlerValue = this.getAttribute('data-handler-val');
    const name = this.getAttribute('name');
    const type = this.getAttribute('type');
    const tabId = this.getAttribute('data-tabid');
    let rowIsHidden = false,
        shadowShowElems, shadowHideElems, HideElems, shadowedRow;
    if (!name) { return; }
    //show hidden fields by "hide"
    shadowHideElems = $('.hidden-shadow-' + name);
    HideElems = $('.hidden-' + name);
    //unshadow shadow elems
    formUtils.changeReadOnly(shadowHideElems, false);
    shadowHideElems.removeClass('hidden-shadow-' + name);
    HideElems.removeClass('hidden-' + name);
    //hide field by else
    $('.showed-' + name)
      .addClass('depended-hidden-s')
      .addClass('l-form__row_hidden_yes')
      .removeClass('showed-' + name);
    //check row if already shadowed by else or 1st start
    shadowedRow = $('.depended-shadow-s');
    if (!shadowedRow.hasClass('row-shadow')) {
      shadowedRow.addClass('row-shadow');
      formUtils.changeReadOnly(shadowedRow, true);
    }
    //shadow field by else
    shadowShowElems = $('.showed-shadow-' + name)
      .removeClass('showed-shadow-' + name)
      .addClass('depended-shadow-s')
      .addClass('row-shadow');
    //add readonly from shadow
    formUtils.changeReadOnly(shadowShowElems, true);

    rowIsHidden = $(this).parents('.l-form__row, .filter-item').hasClass('l-form__row_hidden_yes');
    // если поле не скрыто, то оно учавствует в скрытие полей
    if (!rowIsHidden) {
      //for text and native hidden
      if (type === 'text' || type === 'textarea' || !handlerValue) {
        const value = this.value;
        if (value === '') {
          //hide field by "hide" (empty = "yes")
          $('#frm-' + tabId +
              ' [data-hide-' + name + '-' + hash('empty-yes') + ' = "yes"]')
            .addClass('hidden-' + name)
            .addClass('l-form__row_hidden_yes');
          //shadow field by "hide" (empty = "yes")
          shadowHideElems = $('#frm-' + tabId +
              ' [data-shadow-' + name + '-' + hash('empty-yes') + ' = "yes"]')
            .addClass('hidden-shadow-' + name)
            .addClass('row-shadow');
          formUtils.changeReadOnly(shadowHideElems, true);
        } else {
          //hide fields by "hide" (empty = no)
          $('#frm-' + tabId + ' [data-hide-' + name +
              '-' + hash('empty-no') + ' = "yes"]')
            .addClass('hidden-' + name)
            .addClass('l-form__row_hidden_yes');
          //shadow fields by "hide" (empty = no)
          shadowHideElems = $('#frm-' + tabId +
              ' [data-shadow-' + name + '-' + hash('empty-no') + ' = "yes"]')
            .addClass('hidden-shadow-' + name)
            .addClass('row-shadow');
          formUtils.changeReadOnly(shadowHideElems, true);
        }
      // для селектов и радиобаттонов
      } else {
        //show field by "show"
        $(`#frm-${tabId} [data-show-${name}-${handlerValue} = "yes"]`)
          .addClass('showed-' + name)
          .removeClass('depended-hidden-s')
          .removeClass('l-form__row_hidden_yes');
        //unshadow field by "show"
        shadowShowElems = $(`#frm-${tabId} [data-show-shadow-${name}-${handlerValue} = "yes"]`)
          .addClass('showed-shadow-' + name)
          .removeClass('depended-shadow-s')
          .removeClass('row-shadow');
        formUtils.changeReadOnly(shadowShowElems, false);
        //hide field by "hide"
        $(`#frm-${tabId} [data-hide-${name}-${handlerValue} = "yes"]`)
          .addClass('hidden-' + name)
          .addClass('l-form__row_hidden_yes');
        //shadow field by "hide"
        shadowHideElems = $('#frm-' + tabId +
            ' [data-shadow-' + name + '-' + handlerValue + ' = "yes"]')
          .addClass('hidden-shadow-' + name)
          .addClass('row-shadow');
        formUtils.changeReadOnly(shadowHideElems, true);
      }
    }
  }


  /**
   * Вызываем обработчик if/else скрытия полей
   * @param {string} tabId id таба
   */
  function dependSlistHandlerRun(tabId) {
    $('#cont-' + tabId + ' tr:not(".row-error") .control-field' +
        ' input[type="hidden"],' +
      ' #cont-' + tabId + ' tr:not(".row-error") .control-field' +
        ' input[type="text"],' +
      ' #cont-' + tabId + ' tr:not(".row-error") .control-field' +
        ' input[type="password"],' +
      ' #cont-' + tabId + ' tr:not(".row-error") .control-field' +
        ' .b-input_type_file,' +
      ' #cont-' + tabId + ' .control-field.filter-item input[type="hidden"],' +
      ' #cont-' + tabId + ' .control-field .b-textarea,' +
      ' #cont-' + tabId + ' .control-field.filter-item input[type="text"]').
        each(function() {
          dependFieldsSlistHandler.apply(this);
        });
  }

  /**
   * Hide page if no visible fields
   * @param {String} tabId
   */
  function checkEmptyPage(tabId) {
    $('#form-wrapper-' + tabId + ' .b-form-page').each(function() {
      var id = this.getAttribute('id');
      if ($('#' + id + ' .l-form__row:not(.l-form__row_hidden_yes):not(.depended-hidden-s)').length > 0) {
        this.style.display = '';
      } else {
        this.style.display = 'none';
      }
    });
  }


  /**
   * Handler for changed control fields
   *
   * every contol field runs hide/show function from up to down from
   * @param {object} e event object
   * @param {object} data
   * @this {object} HTML node
   */
  function firstDependFieldsSlistHandler(e, data) {
    //проверяем на тип boolean для проверки на setvalue=once/final 
    var tabId = (!!data && typeof data !== 'boolean') ? data.tabId : this.getAttribute('data-tabid');
    // сбрасываем все правила скрытия
    $(`#cont-${tabId} .l-form__row_hidden_yes`)
        .removeClass('l-form__row_hidden_yes');
    $(`#cont-${tabId} .row-shadow`).removeClass('row-shadow');

    dependSlistHandlerRun(tabId);

    checkEmptyPage(tabId);

    EventMgr.trigger('updFormHeight', { tabId: tabId });
    EventMgr.trigger('reloadSlider', { tabId: tabId });
    EventMgr.trigger('upPrefixField', { tabId: tabId });
  }



  function init() {
    EventMgr.bind('appendForm,appendReport,appendedFilter,initFuncRun',
        firstDependFieldsSlistHandler);
    EventMgr.on($content(), dependFieldSlistSelector,
        'change', firstDependFieldsSlistHandler);
  }

  var api = {
    init: init
  };

  return api;

}(window, $, EventMgr, App.FormUtils, App.Common);