fred.grid.Elements = function (config) {
config = config || {};
config.permission = config.permission || {};
if (config.permission.fred_element_save) {
config.ddGroup = 'FredElementsDDGroup';
config.enableDragDrop = true;
config.save_action = 'mgr/elements/updatefromgrid';
config.autosave = true;
}
if (!config.permission.fred_element_save && !config.permission.fred_element_delete) {
config.showGear = false;
}
Ext.applyIf(config, {
url: fred.config.connectorUrl,
baseParams: {
action: 'mgr/elements/getlist',
sort: 'rank',
dir: 'asc'
},
preventSaveRefresh: false,
fields: ['id', 'name', 'description', 'image', 'category', 'rank', 'category_name', 'option_set', 'content', 'has_override', 'option_set_name', 'theme_id', 'theme_name', 'theme_theme_folder'],
paging: true,
remoteSort: true,
emptyText: _('fred.elements.none'),
columns: [
{
header: _('id'),
dataIndex: 'id',
sortable: true,
hidden: true
},
{
header: _('fred.elements.image'),
dataIndex: 'image',
sortable: false,
width: 80,
renderer: function (value, metaData, record, rowIndex, colIndex, store) {
if (value) {
value = fred.prependBaseUrl(value, record.data.theme_theme_folder);
metaData.attr = 'ext:qtip=\'
\'';
return '
';
}
return value;
}
},
{
header: _('fred.elements.name'),
dataIndex: 'name',
sortable: true,
width: 80,
editor: this.getEditor(config, {xtype: 'textfield'})
},
{
header: _('fred.elements.description'),
dataIndex: 'description',
width: 120,
editor: {xtype: 'textfield'},
hidden: document.body.clientWidth < 1550
},
{
header: _('fred.elements.theme'),
dataIndex: 'theme_name',
sortable: true,
width: 60
},
{
header: _('fred.elements.category'),
dataIndex: 'category_name',
sortable: true,
width: 60
},
{
header: _('fred.elements.option_set'),
dataIndex: 'option_set_name',
width: 60,
hidden: document.body.clientWidth < 1550
},
{
header: _('fred.elements.has_override'),
dataIndex: 'has_override',
renderer: this.rendYesNo,
width: 60,
hidden: document.body.clientWidth < 1550
},
{
header: _('fred.elements.rank'),
dataIndex: 'rank',
sortable: true,
width: 40,
editor: this.getEditor(config, {xtype: 'numberfield'})
}
],
tbar: this.getTbar(config)
});
fred.grid.Elements.superclass.constructor.call(this, config);
this.on('render', this.registerGridDropTarget, this);
this.on('beforedestroy', this.destroyScrollManager, this);
fred.globalEvents.on('delete-element-category', function(category) {
var categoryFilter = Ext.getCmp('fred-element-filter-category');
if (categoryFilter.getValue() === category.id) {
var record = categoryFilter.findRecord('id',0);
categoryFilter.setValue(0);
categoryFilter.fireEvent('select', categoryFilter, record);
} else {
this.getBottomToolbar().changePage(1);
}
}, this);
fred.globalEvents.on('delete-theme', function(theme) {
var themeFilter = Ext.getCmp('fred-element-filter-theme');
if (themeFilter.getValue() !== theme.id) return;
var record = themeFilter.findRecord('id',0);
themeFilter.setValue(0);
themeFilter.fireEvent('select', themeFilter, record);
var categoryFilter = Ext.getCmp('fred-element-filter-category');
var recordCategory = categoryFilter.findRecord('id',0);
categoryFilter.setValue(0);
categoryFilter.fireEvent('select', categoryFilter, recordCategory);
}, this);
};
Ext.extend(fred.grid.Elements, fred.grid.GearGrid, {
getMenu: function () {
var m = [];
if (this.config.permission.fred_element_save) {
m.push({
text: _('fred.elements.quick_update'),
handler: this.quickUpdateElement
});
m.push({
text: _('fred.elements.update'),
handler: this.updateElement
});
m.push('-');
m.push({
text: _('fred.elements.duplicate'),
handler: this.duplicateElement
});
}
if (this.config.permission.fred_element_delete) {
if (m.length > 0) {
m.push('-');
}
m.push({
text: _('fred.elements.remove')
, handler: this.removeElement
});
}
return m;
},
getTbar: function(config) {
var output = [];
if (config.permission.fred_element_save) {
output.push({
text: _('fred.elements.create'),
handler: this.newElement
});
}
output.push([[
'->',
{
xtype: 'textfield',
emptyText: _('fred.elements.search_name'),
listeners: {
'change': {
fn: this.search,
scope: this
},
'render': {
fn: function (cmp) {
new Ext.KeyMap(cmp.getEl(), {
key: Ext.EventObject.ENTER,
fn: function () {
this.blur();
return true;
},
scope: cmp
});
},
scope: this
}
}
},
{
id: 'fred-element-filter-category',
xtype: 'fred-combo-element-categories',
emptyText: _('fred.element_cateogries.all'),
addAll: 1,
filterName: 'category',
listeners: {
select: this.filterCombo,
scope: this
}
},
{
id: 'fred-element-filter-theme',
xtype: 'fred-combo-themes',
emptyText: _('fred.themes.all'),
addAll: 1,
isUpdate: true,
filterName: 'theme',
syncFilter: function(combo, record) {
var categoryFilter = Ext.getCmp('fred-element-filter-category');
var s = this.getStore();
if (record.data[combo.valueField] !== 0) {
s.baseParams.category = 0;
categoryFilter.setValue(0);
}
categoryFilter.baseParams.theme = record.data[combo.valueField];
categoryFilter.store.load();
combo.setValue(record.data[combo.valueField]);
s.baseParams[combo.filterName] = record.data[combo.valueField];
this.getBottomToolbar().changePage(1);
}.bind(this),
listeners: {
select: this.filterCombo,
scope: this
}
}
]]);
return output;
},
removeElement: function (btn, e) {
if (!this.menu.record) return false;
MODx.msg.confirm({
title: _('fred.elements.remove'),
text: _('fred.elements.remove_confirm', {name: this.menu.record.name}),
url: this.config.url,
params: {
action: 'mgr/elements/remove',
id: this.menu.record.id
},
listeners: {
'success': {
fn: function (r) {
this.refresh();
}, scope: this
}
}
});
return true;
},
filterCombo: function (combo, record) {
var s = this.getStore();
s.baseParams[combo.filterName] = record.data[combo.valueField];
if (combo.filterName === 'theme') {
var categoryFilter = Ext.getCmp('fred-element-filter-category');
if (record.data[combo.valueField] !== 0) {
s.baseParams.category = 0;
categoryFilter.setValue();
}
categoryFilter.baseParams.theme = record.data[combo.valueField];
categoryFilter.store.load();
var ids = ['fred-element-filter-theme', 'fred-rte-config-filter-theme', 'fred-option-set-filter-theme', 'fred-element-category-filter-theme', 'fred-blueprint-filter-theme', 'fred-blueprint-category-filter-theme'];
ids.forEach(function(id){
if (id === combo.id) return true;
var remoteCombo = Ext.getCmp(id);
if (remoteCombo) {
remoteCombo.syncFilter(remoteCombo, record);
}
});
}
this.getBottomToolbar().changePage(1);
},
search: function (field, value) {
var s = this.getStore();
s.baseParams.search = value;
this.getBottomToolbar().changePage(1);
},
newElement: function(btn, e) {
var options = {};
var s = this.getStore();
if (s.baseParams.theme) {
options.theme = s.baseParams.theme;
if (s.baseParams.category) {
options.category = s.baseParams.category;
}
}
fred.loadPage('element/create', options);
},
quickUpdateElement: function (btn, e) {
var updateElement = MODx.load({
xtype: 'fred-window-element',
record: this.menu.record,
isUpdate: true,
listeners: {
success: {
fn: function () {
this.refresh();
},
scope: this
}
}
});
var category = updateElement.find('name', 'category');
if (category[0]) {
category = category[0];
category.baseParams.theme = this.menu.record.theme_id;
}
var optionSet = updateElement.find('name', 'option_set');
if (optionSet[0]) {
optionSet = optionSet[0];
optionSet.baseParams.theme = this.menu.record.theme_id;
}
updateElement.fp.getForm().reset();
updateElement.fp.getForm().setValues(this.menu.record);
updateElement.show(e.target);
return true;
},
duplicateElement: function (btn, e) {
var duplicateElement = MODx.load({
xtype: 'fred-window-element-duplicate',
record: this.menu.record,
isUpdate: true,
listeners: {
success: {
fn: function () {
this.refresh();
},
scope: this
}
}
});
var category = duplicateElement.find('name', 'category');
if (category[0]) {
category = category[0];
category.baseParams.theme = this.menu.record.theme_id;
}
duplicateElement.fp.getForm().reset();
duplicateElement.fp.getForm().setValues(this.menu.record);
duplicateElement.show(e.target);
return true;
},
updateElement: function (btn, e) {
fred.loadPage('element/update', {id: this.menu.record.id});
},
isGridFiltered: function () {
var search = this.getStore().baseParams.search;
if (search && search != '') {
return true;
}
var publicFilter = this.getStore().baseParams.public;
if ((publicFilter !== undefined) && (publicFilter !== null) && (publicFilter !== '')) {
return true;
}
var completeFilter = this.getStore().baseParams.complete;
if ((completeFilter !== undefined) && (completeFilter !== null) && (completeFilter !== '')) {
return true;
}
var categoryFilter = this.getStore().baseParams.category;
if (!((categoryFilter !== undefined) && (categoryFilter !== null) && (categoryFilter !== '') && (categoryFilter !== 0))) {
return true;
}
return false;
},
getDragDropText: function () {
if (this.store.sortInfo && this.store.sortInfo.field != 'rank') {
return _('fred.err.bad_sort_column', {column: 'rank'});
}
var categoryFilter = this.getStore().baseParams.category;
if (!((categoryFilter !== undefined) && (categoryFilter !== null) && (categoryFilter !== '') && (categoryFilter !== 0))) {
return _('fred.err.required_filter', {filter: 'category'});
}
if (this.isGridFiltered()) {
return _('fred.err.clear_filter');
}
return _('fred.global.change_order', {name: this.selModel.selections.items[0].data.name});
},
registerGridDropTarget: function () {
var ddrow = new Ext.ux.dd.GridReorderDropTarget(this, {
copy: false,
sortCol: 'rank',
isGridFiltered: this.isGridFiltered.bind(this),
listeners: {
'beforerowmove': function (objThis, oldIndex, newIndex, records) {
},
'afterrowmove': function (objThis, oldIndex, newIndex, records) {
var currentElement = records.pop();
MODx.Ajax.request({
url: fred.config.connectorUrl,
params: {
action: 'mgr/elements/ddreorder',
elementId: currentElement.id,
categoryId: currentElement.data.category,
oldIndex: oldIndex,
newIndex: newIndex
},
listeners: {
success: {
fn: function (r) {
this.target.grid.refresh();
},
scope: this
}
}
});
},
'beforerowcopy': function (objThis, oldIndex, newIndex, records) {
},
'afterrowcopy': function (objThis, oldIndex, newIndex, records) {
}
}
});
Ext.dd.ScrollManager.register(this.getView().getEditorParent());
},
destroyScrollManager: function () {
Ext.dd.ScrollManager.unregister(this.getView().getEditorParent());
},
getEditor: function(config, editor) {
if (config.permission.fred_element_save) return editor;
return false;
}
});
Ext.reg('fred-grid-elements', fred.grid.Elements);