%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/dropdown.js |
;(function() {
'use strict';
BX.namespace('BX.Main');
/**
* BX.Main.dropdown
* @param dropdown
*/
BX.Main.dropdown = function(dropdown)
{
this.id = null;
this.dropdown = null;
this.items = null;
this.value = null;
this.menuId = null;
this.menu = null;
this.menuItems = null;
this.dataItems = 'items';
this.dataValue = 'value';
this.dataPseudo = 'pseudo';
this.dropdownItemClass = 'main-dropdown-item';
this.activeClass = 'main-dropdown-active';
this.selectedClass = 'main-dropdown-item-selected';
this.notSelectedClass = 'main-dropdown-item-not-selected';
this.menuItemClass = 'menu-popup-item';
this.init(dropdown);
};
BX.Main.dropdown.prototype = {
init: function(dropdown)
{
this.id = dropdown.id;
this.dropdown = dropdown;
this.items = this.getItems();
this.value = this.getValue();
this.menuId = this.getMenuId();
this.menu = this.createMenu();
this.menu.popupWindow.show();
this.adjustPosition();
BX.bind(this.dropdown, 'click', BX.delegate(this.showMenu, this));
},
getMenuId: function()
{
return this.id + '_menu';
},
getItems: function()
{
var result;
try {
var str = BX.data(this.dropdown, this.dataItems);
result = eval(str);
} catch (err) {
result = [];
}
return result;
},
getValue: function()
{
return BX.data(this.dropdown, this.dataValue);
},
prepareMenuItems: function()
{
var self = this;
var attrs, subItem;
var currentValue = this.getValue();
function prepareItems(items)
{
return items.map(function(item) {
attrs = {};
attrs['data-'+self.dataValue] = item.VALUE;
attrs['data-'+self.dataPseudo] = 'PSEUDO' in item && item.PSEUDO ? 'true' : 'false';
subItem = BX.create('div', {children: [
BX.create('span', {
props: {
className: self.dropdownItemClass
},
attrs: attrs,
text: item.NAME
})
]});
return {
text: subItem.innerHTML,
className: currentValue === item.VALUE ? self.selectedClass : self.notSelectedClass,
delimiter: item.DELIMITER,
items: 'ITEMS' in item ? prepareItems(item.ITEMS) : null
};
});
}
return prepareItems(this.getItems());
},
createMenu: function()
{
var self = this;
return BX.PopupMenu.create(
this.getMenuId(),
this.dropdown,
this.prepareMenuItems(),
{
'autoHide': true,
'offsetTop': -8,
'offsetLeft': 40,
'maxHeight': 208,
'angle': {
'position': 'bottom',
'offset': 0
},
'events': {
'onPopupClose': BX.delegate(this._onCloseMenu, this),
'onPopupShow': function() {
self._onShowMenu();
}
}
}
);
},
showMenu: function()
{
this.menu = BX.PopupMenu.getMenuById(this.menuId);
if (!this.menu)
{
this.menu = this.createMenu();
this.menu.popupWindow.show();
}
this.adjustPosition();
},
adjustPosition: function()
{
if (this.dropdown.dataset.popupPosition === 'fixed')
{
var container = this.menu.popupWindow.popupContainer;
container.style.setProperty('top', 'auto');
container.style.setProperty('bottom', '45px');
container.style.setProperty('left', '0px');
this.dropdown.appendChild(container);
}
},
getSubItem: function(node)
{
return BX.Grid.Utils.getByClass(node, this.dropdownItemClass, true);
},
refresh: function(item)
{
var subItem = this.getSubItem(item);
var value = BX.data(subItem, this.dataValue);
BX.firstChild(this.dropdown).innerText = subItem.innerText;
this.dropdown.dataset[this.dataValue] = value;
},
selectItem: function(node)
{
var self = this;
(this.menu.menuItems || []).forEach(function(current) {
BX.removeClass(current.layout.item, self.selectedClass);
if (node !== current.layout.item)
{
BX.addClass(current.layout.item, self.notSelectedClass);
}
else
{
BX.removeClass(current.layout.item, self.notSelectedClass);
}
});
BX.addClass(node, this.selectedClass);
},
getDataItemIndexByValue: function(items, value)
{
var result;
if (BX.type.isArray(items))
{
items.map(function(current, index) {
if (current.VALUE === value)
{
result = index;
return false;
}
});
}
return false;
},
getDataItemByValue: function(value)
{
var result = this.getItems().filter(function(current) {
return current.VALUE === value;
});
return result.length > 0 ? result[0] : null;
},
_onShowMenu: function()
{
var self = this;
BX.addClass(this.dropdown, this.activeClass);
(this.menu.menuItems || []).forEach(function(current) {
BX.bind(current.layout.item, 'click', BX.delegate(self._onItemClick, self));
});
},
_onCloseMenu: function()
{
BX.removeClass(this.dropdown, this.activeClass);
BX.PopupMenu.destroy(this.menuId);
},
_onItemClick: function(event)
{
var item = this.getMenuItem(event.target);
var value, dataItem;
var subItem = this.getSubItem(item);
var isPseudo = BX.data(subItem, 'pseudo');
if (!(isPseudo === 'true'))
{
this.refresh(item);
this.selectItem(item);
this.menu.popupWindow.close();
value = this.getValue();
dataItem = this.getDataItemByValue(value);
}
else
{
value = BX.data(subItem, 'value');
dataItem = this.getDataItemByValue(value);
}
BX.onCustomEvent(window, 'Dropdown::change', [this.dropdown.id, event, item, dataItem, value]);
},
getMenuItem: function(node)
{
var item = node;
if (!BX.hasClass(item, this.menuItemClass))
{
item = BX.findParent(item, {class: this.menuItemClass});
}
return item;
}
};
})();