%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/components/bitrix/main.ui.grid/templates/.default/js/ |
| Current File : //home/bitrix/www/bitrix/components/bitrix/main.ui.grid/templates/.default/js/action-panel.js |
;(function() {
'use strict';
BX.namespace('BX.Grid');
/**
* BX.Grid.ActionPanel
*
* @param {BX.Main.grid} parent
* @param {object} actions List of available actions Bitrix\Main\Grid\Panel\Actions::getList()
* @param {string} actions.CREATE
* @param {string} actions.SEND
* @param {string} actions.ACTIVATE
* @param {string} actions.SHOW
* @param {string} actions.HIDE
* @param {string} actions.REMOVE
* @param {string} actions.CALLBACK
* @param {string} actions.INLINE_EDIT
* @param {string} actions.HIDE_ALL_EXPECT
* @param {string} actions.SHOW_ALL
* @param {string} actions.RESET_CONTROLS
*
* @param {object} types List of available control types
* of the actions panel Bitrix\Main\Grid\Panel\Types::getList()
* @param {string} types.DROPDOWN
* @param {string} types.CHECKBOX
* @param {string} types.TEXT
* @param {string} types.BUTTON
* @param {string} types.LINK
* @param {string} types.CUSTOM
* @param {string} types.HIDDEN
*
* @constructor
*/
BX.Grid.ActionPanel = function(parent, actions, types)
{
this.parent = null;
this.rel = {};
this.actions = null;
this.types = null;
this.lastActivated = [];
this.init(parent, actions, types);
};
BX.Grid.ActionPanel.prototype = {
init: function(parent, actions, types)
{
this.parent = parent;
this.actions = eval(actions);
this.types = eval(types);
BX.addCustomEvent(window, 'Dropdown::change', BX.proxy(function(id, event, item, dataItem) {
this.isPanelControl(BX(id))&& this._dropdownChange(id, event, item, dataItem);
}, this));
BX.addCustomEvent(window, 'Dropdown::load', BX.proxy(function(id, event, item, dataItem) {
this.isPanelControl(BX(id)) && this._dropdownChange(id, event, item, dataItem);
}, this));
var panel = this.getPanel();
BX.bind(panel, 'change', BX.delegate(this._checkboxChange, this));
BX.bind(panel, 'click', BX.delegate(this._clickOnButton, this));
BX.addCustomEvent(window, 'Grid::updated', function() {
var cancelButton = BX('grid_cancel_button');
cancelButton && BX.fireEvent(BX.firstChild(cancelButton), 'click');
});
},
resetForAllCheckbox: function()
{
var checkbox = this.getForAllCheckbox();
if (BX.type.isDomNode(checkbox))
{
checkbox.checked = null;
}
},
getForAllCheckbox: function()
{
return BX.Grid.Utils.getByClass(this.getPanel(), this.parent.settings.get('classForAllCheckbox'), true);
},
getPanel: function()
{
return BX.Grid.Utils.getByClass(this.parent.getContainer(), this.parent.settings.get('classActionPanel'), true);
},
getApplyButton: function()
{
return BX.Grid.Utils.getByClass(this.getPanel(), this.parent.settings.get('classPanelApplyButton'), true);
},
isPanelControl: function(node)
{
return BX.hasClass(node, this.parent.settings.get('classPanelControl'));
},
getTextInputs: function()
{
return BX.Grid.Utils.getBySelector(this.getPanel(), 'input[type="text"]');
},
getHiddenInputs: function()
{
return BX.Grid.Utils.getBySelector(this.getPanel(), 'input[type="hidden"]');
},
getSelects: function()
{
return BX.Grid.Utils.getBySelector(this.getPanel(), 'select');
},
getDropdowns: function()
{
return BX.Grid.Utils.getByClass(this.getPanel(), this.parent.settings.get('classDropdown'));
},
getCheckboxes: function()
{
return BX.Grid.Utils.getByClass(this.getPanel(), this.parent.settings.get('classPanelCheckbox'));
},
getButtons: function()
{
return BX.Grid.Utils.getByClass(this.getPanel(), this.parent.settings.get('classPanelButton'));
},
isDropdown: function(node)
{
return BX.hasClass(node, this.parent.settings.get('classDropdown'));
},
isCheckbox: function(node)
{
return BX.hasClass(node, this.parent.settings.get('classPanelCheckbox'));
},
isTextInput: function(node)
{
return node.type === 'text';
},
isHiddenInput: function(node)
{
return node.type === 'hidden';
},
isSelect: function(node)
{
return node.tagName === 'SELECT';
},
createDropdown: function(data, relative)
{
var container = this.createContainer(data.ID, relative);
var dropdown = BX.create('div', {
props: {
className: 'main-dropdown main-grid-panel-control',
id: data.ID + '_control'
},
attrs: {
name: data.NAME,
'data-name': data.NAME,
'data-items': JSON.stringify(data.ITEMS),
'data-value': data.ITEMS[0].VALUE,
'data-popup-position': 'fixed'
},
children: [BX.create('span', {
props: {className: 'main-dropdown-inner'},
html: data.ITEMS[0].NAME
})]
});
container.appendChild(dropdown);
return container;
},
createCheckbox: function(data, relative)
{
var checkbox = this.createContainer(data.ID, relative);
var inner = BX.create('span', {
props: {
className: 'main-grid-checkbox-container'
}
});
var titleSpan = BX.create('span', {
props: {
className: 'main-grid-control-panel-content-title'
}
});
var input = BX.create('input', {
props: {
type: 'checkbox',
className: this.parent.settings.get('classPanelCheckbox') + ' main-grid-checkbox',
id: data.ID + '_control'
},
attrs: {
value: data.VALUE || '',
title: data.TITLE || '',
name: data.NAME || '',
'data-onchange': JSON.stringify(data.ONCHANGE)
}
});
input.checked = data.CHECKED || null;
checkbox.appendChild(inner);
checkbox.appendChild(titleSpan);
inner.appendChild(input);
inner.appendChild(BX.create('label', {
props: {
className: 'main-grid-checkbox'
},
attrs: {
for: data.ID + '_control',
title: data.TITLE
}
}));
titleSpan.appendChild(BX.create('label', {
attrs: {
for: data.ID + '_control',
title: data.TITLE
},
html: data.LABEL
}));
return checkbox;
},
/**
* @param {object} data
* @param {object} data.ID
* @param {object} data.TITLE
* @param {object} data.PLACEHOLDER
* @param {object} data.ONCHANGE
* @param {string} relative
* @returns {*}
*/
createText: function(data, relative)
{
var container = this.createContainer(data.ID, relative);
var title = BX.type.isNotEmptyString(data["TITLE"]) ? data["TITLE"] : "";
if(title !== "")
{
container.appendChild(
BX.create(
'label',
{
attrs: { title: title, for: data.ID + '_control' },
text: title
}
)
);
}
container.appendChild(
BX.create(
'input',
{
props:
{
className: 'main-grid-control-panel-input-text main-grid-panel-control',
id: data.ID + '_control'
},
attrs:
{
name: data.NAME,
title: title,
placeholder: data.PLACEHOLDER || '',
value: data.VALUE || '',
type: 'text',
'data-onchange': JSON.stringify(data.ONCHANGE || [])
}
}
)
);
return container;
},
createHidden: function(data, relative)
{
var container = this.createContainer(data.ID, relative);
container.appendChild(
BX.create(
'input',
{
props:
{
id: data.ID + '_control',
type: 'hidden'
},
attrs:
{
name: data.NAME,
value: data.VALUE || ''
}
}
)
);
return container;
},
createButton: function(data, relative)
{
var container = this.createContainer(data.ID, relative);
var button = BX.create('button', {
props: {
className: 'main-grid-buttons' + (data.CLASS ? ' ' + data.CLASS : ''),
id: data.id + '_control'
},
attrs: {
name: data.NAME || '',
'data-onchange': JSON.stringify(data.ONCHANGE || [])
},
html: data.TEXT
});
container.appendChild(button);
return container;
},
/**
* @param {object} data
* @param {object} data.ID
* @param {object} data.TITLE
* @param {object} data.PLACEHOLDER
* @param {object} data.ONCHANGE
* @param {object} data.CLASS
* @param {object} data.HREF
* @param {string} relative
* @returns {*}
*/
createLink: function(data, relative)
{
var container = this.createContainer(data.ID, relative);
var link = BX.create('a', {
props: {
className: 'main-grid-link' + (data.CLASS ? ' ' + data.CLASS : ''),
id: data.ID + '_control'
},
attrs: {
href: data.HREF || '',
'data-onchange': JSON.stringify(data.ONCHANGE || [])
},
html: data.TEXT
});
container.appendChild(link);
return container;
},
createCustom: function(data, relative)
{
var container = this.createContainer(data.ID, relative);
var custom = BX.create('div', {
props: {
className: 'main-grid-panel-custom' + (data.CLASS ? ' ' + data.CLASS : '')
},
html: data.VALUE
});
container.appendChild(custom);
return container;
},
createContainer: function(id, relative)
{
id = id.replace('_control', '');
relative = relative.replace('_control', '');
return BX.create('span', {
props: {
className: this.parent.settings.get('classPanelControlContainer'),
id: id
},
attrs: {
'data-relative': relative
}
});
},
removeItemsRelativeCurrent: function(node)
{
var element = node;
var relative = node.id;
var result = [];
var dataRelative;
while (element) {
dataRelative = BX.data(element, 'relative');
if (dataRelative === relative || dataRelative === node.id)
{
relative = element.id;
result.push(element);
}
element = element.nextElementSibling;
}
result.forEach(function(current) {
BX.remove(current);
});
},
validateData: function(data)
{
return (
('ONCHANGE' in data) &&
BX.type.isArray(data.ONCHANGE)
);
},
activateControl: function(id)
{
var element = BX(id);
if (BX.type.isDomNode(element))
{
BX.removeClass(element, this.parent.settings.get('classDisable'));
element.disabled = null;
}
},
deactivateControl: function(id)
{
var element = BX(id);
if (BX.type.isDomNode(element))
{
BX.addClass(element, this.parent.settings.get('classDisable'));
element.disabled = true;
}
},
showControl: function(id)
{
var control = BX(id);
control && BX.show(control);
},
hideControl: function(id)
{
var control = BX(id);
control && BX.hide(control);
},
validateActionObject: function(action)
{
return (
BX.type.isPlainObject(action) && ('ACTION' in action) && BX.type.isNotEmptyString(action.ACTION) && (
action.ACTION === this.actions.RESET_CONTROLS ||
('DATA' in action) && BX.type.isArray(action.DATA)
)
);
},
validateControlObject: function(controlObject)
{
return (
BX.type.isPlainObject(controlObject) &&
('TYPE' in controlObject) &&
('ID' in controlObject)
);
},
createDate: function(data, relative)
{
var container = this.createContainer(data.ID, relative);
var date = BX.decl({
block: 'main-ui-date',
mix: ['main-grid-panel-date'],
calendarButton: true,
valueDelete: true,
placeholder: 'PLACEHOLDER' in data ? data.PLACEHOLDER : '',
name: 'NAME' in data ? data.NAME + '_from' : '',
tabindex: 'TABINDEX' in data ? data.TABINDEX : '',
value: 'VALUE' in data ? data.VALUE : '',
enableTime: 'TIME' in data ? (data.TIME ? 'true' : 'false') : 'false'
});
container.appendChild(date);
return container;
},
createControl: function(controlObject, relativeId)
{
var newElement = null;
switch (controlObject.TYPE)
{
case this.types.DROPDOWN :
newElement = this.createDropdown(controlObject, relativeId);
break;
case this.types.CHECKBOX :
newElement = this.createCheckbox(controlObject, relativeId);
break;
case this.types.TEXT :
newElement = this.createText(controlObject, relativeId);
break;
case this.types.HIDDEN :
newElement = this.createHidden(controlObject, relativeId);
break;
case this.types.BUTTON :
newElement = this.createButton(controlObject, relativeId);
break;
case this.types.LINK :
newElement = this.createLink(controlObject, relativeId);
break;
case this.types.CUSTOM :
newElement = this.createCustom(controlObject, relativeId);
break;
case this.types.DATE :
newElement = this.createDate(controlObject, relativeId);
break;
}
return newElement;
},
onChangeHandler: function(container, actions, isPseudo)
{
var newElement, callback;
var self = this;
if (BX.type.isDomNode(container) && BX.type.isArray(actions))
{
actions.forEach(function(action) {
if (self.validateActionObject(action))
{
if (action.ACTION === self.actions.CREATE)
{
self.removeItemsRelativeCurrent(container);
action.DATA.reverse();
action.DATA.forEach(function(controlObject) {
if (self.validateControlObject(controlObject))
{
newElement = self.createControl(controlObject, BX.data(container, 'relative') || container.id);
if (BX.type.isDomNode(newElement))
{
BX.insertAfter(newElement, container);
if (('ONCHANGE' in controlObject) &&
controlObject.TYPE === self.types.CHECKBOX &&
('CHECKED' in controlObject) &&
controlObject.CHECKED)
{
self.onChangeHandler(newElement, controlObject.ONCHANGE);
}
if (controlObject.TYPE === self.types.DROPDOWN &&
BX.type.isArray(controlObject.ITEMS) &&
controlObject.ITEMS.length &&
('ONCHANGE' in controlObject.ITEMS[0]) &&
BX.type.isArray(controlObject.ITEMS[0].ONCHANGE))
{
self.onChangeHandler(newElement, controlObject.ITEMS[0].ONCHANGE);
}
}
}
});
}
if (action.ACTION === self.actions.ACTIVATE)
{
self.removeItemsRelativeCurrent(container);
if (BX.type.isArray(action.DATA))
{
action.DATA.forEach(function(currentId) {
self.lastActivated.push(currentId.ID);
self.activateControl(currentId.ID);
});
}
}
if (action.ACTION === self.actions.SHOW)
{
if (BX.type.isArray(action.DATA))
{
action.DATA.forEach(function(showCurrent) {
self.showControl(showCurrent.ID);
});
}
}
if (action.ACTION === self.actions.HIDE)
{
if (BX.type.isArray(action.DATA))
{
action.DATA.forEach(function(hideCurrent) {
self.hideControl(hideCurrent.ID);
});
}
}
if (action.ACTION === self.actions.HIDE_ALL_EXPECT)
{
if (BX.type.isArray(action.DATA))
{
(self.getControls() || []).forEach(function(current) {
if (!action.DATA.some(function(el) { return el.ID === current.id}))
{
self.hideControl(current.id);
}
});
}
}
if (action.ACTION === self.actions.SHOW_ALL)
{
(self.getControls() || []).forEach(function(current) {
self.showControl(current.id);
});
}
if (action.ACTION === self.actions.REMOVE)
{
if (BX.type.isArray(action.DATA))
{
action.DATA.forEach(function(removeCurrent) {
BX.remove(BX(removeCurrent.ID));
});
}
}
if (action.ACTION === self.actions.CALLBACK)
{
this.confirmDialog(action, BX.delegate(function() {
if (BX.type.isArray(action.DATA))
{
action.DATA.forEach(
function(currentCallback)
{
if (currentCallback.JS.indexOf('Grid.') !== -1)
{
callback = currentCallback.JS.replace('Grid', 'self.parent');
callback = callback.replace('()', '');
callback += '.apply(self.parent, [container])';
try
{
eval(callback); // jshint ignore:line
}
catch(err)
{
throw new Error(err);
}
}
else if(BX.type.isNotEmptyString(currentCallback.JS))
{
try
{
eval(currentCallback.JS);
}
catch(err)
{
throw new Error(err);
}
}
}
);
}
}, this));
}
if (action.ACTION === self.actions.RESET_CONTROLS)
{
this.removeItemsRelativeCurrent(container);
}
}
}, this);
}
else
{
if (!isPseudo)
{
this.removeItemsRelativeCurrent(container);
}
self.lastActivated.forEach(function(current) {
self.deactivateControl(current);
});
self.lastActivated = [];
}
},
confirmDialog: function(action, then, cancel)
{
this.parent.confirmDialog(action, then, cancel);
},
/**
* Dropdown value change handler
* @param {string} id Dropdown id
* @param {object} event
* @param item
* @param {object} dataItem
* @param {object} dataItem.ONCHANGE
* @param {boolean} dataItem.PSEUDO
* @private
*/
_dropdownChange: function(id, event, item, dataItem)
{
var dropdown = BX(id);
var container = dropdown.parentNode;
var onChange = dataItem && ('ONCHANGE' in dataItem) ? dataItem.ONCHANGE : null;
var isPseudo = dataItem && ('PSEUDO' in dataItem && dataItem.PSEUDO !== false);
this.onChangeHandler(container, onChange, isPseudo);
},
_checkboxChange: function(event)
{
var onChange;
try {
onChange = eval(BX.data(event.target, 'onchange'));
} catch(err) {
onChange = null;
}
this.onChangeHandler(
BX.findParent(event.target, {
className: this.parent.settings.get('classPanelContainer')
}, true, false),
event.target.checked || event.target.id.indexOf('actallrows_') !== -1 ? onChange : null
);
},
_clickOnButton: function(event)
{
var onChange;
if (this.isButton(event.target))
{
event.preventDefault();
try {
onChange = eval(BX.data(event.target, 'onchange'));
} catch(err) {
onChange = null;
}
this.onChangeHandler(
BX.findParent(event.target, {
className: this.parent.settings.get('classPanelContainer')
}, true, false),
onChange
);
}
},
isButton: function(node)
{
return BX.hasClass(node, this.parent.settings.get('classPanelButton'));
},
getSelectedIds: function()
{
var rows = this.parent.getRows().getSelected().filter(function(row) { return row.isShown(); });
return rows.map(function(current) {
return current.getId();
});
},
getControls: function()
{
return BX.findChild(this.getPanel(), {
className: this.parent.settings.get('classPanelControlContainer')
}, true, true);
},
getValues: function()
{
var data = {};
var self = this;
var controls = [].concat(
this.getDropdowns(),
this.getTextInputs(),
this.getHiddenInputs(),
this.getSelects(),
this.getCheckboxes(),
this.getButtons()
);
(controls || []).forEach(function(current) {
if (BX.type.isDomNode(current))
{
if (self.isDropdown(current))
{
var dropdownValue = BX.data(current, 'value');
dropdownValue = (dropdownValue !== null && dropdownValue !== undefined) ? dropdownValue : '';
data[BX.data(current, 'name')] = dropdownValue;
}
if (self.isSelect(current))
{
data[current.getAttribute('name')] = current.options[current.selectedIndex].value;
}
if (self.isCheckbox(current) && current.checked)
{
data[current.getAttribute('name')] = current.value;
}
if (self.isTextInput(current) || self.isHiddenInput(current))
{
data[current.getAttribute('name')] = current.value;
}
if (self.isButton(current))
{
var name = BX.data(current, 'name');
var value = BX.data(current, 'value');
value = (value !== null && value !== undefined) ? value : '';
if (name)
{
data[name] = value;
}
}
}
});
return data;
}
};
})();