Your IP : 18.219.40.177
/**
* Модуль обработки скрытия полей на форме
* @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);