elements.grid.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. fred.grid.Elements = function (config) {
  2. config = config || {};
  3. config.permission = config.permission || {};
  4. if (config.permission.fred_element_save) {
  5. config.ddGroup = 'FredElementsDDGroup';
  6. config.enableDragDrop = true;
  7. config.save_action = 'mgr/elements/updatefromgrid';
  8. config.autosave = true;
  9. }
  10. if (!config.permission.fred_element_save && !config.permission.fred_element_delete) {
  11. config.showGear = false;
  12. }
  13. Ext.applyIf(config, {
  14. url: fred.config.connectorUrl,
  15. baseParams: {
  16. action: 'mgr/elements/getlist',
  17. sort: 'rank',
  18. dir: 'asc'
  19. },
  20. preventSaveRefresh: false,
  21. fields: ['id', 'name', 'description', 'image', 'category', 'rank', 'category_name', 'option_set', 'content', 'has_override', 'option_set_name', 'theme_id', 'theme_name', 'theme_theme_folder'],
  22. paging: true,
  23. remoteSort: true,
  24. emptyText: _('fred.elements.none'),
  25. columns: [
  26. {
  27. header: _('id'),
  28. dataIndex: 'id',
  29. sortable: true,
  30. hidden: true
  31. },
  32. {
  33. header: _('fred.elements.image'),
  34. dataIndex: 'image',
  35. sortable: false,
  36. width: 80,
  37. renderer: function (value, metaData, record, rowIndex, colIndex, store) {
  38. if (value) {
  39. value = fred.prependBaseUrl(value, record.data.theme_theme_folder);
  40. metaData.attr = 'ext:qtip=\'<img src=\"' + value + '\">\'';
  41. return '<img src="' + value + '" style="max-width:200px;max-height:150px;">';
  42. }
  43. return value;
  44. }
  45. },
  46. {
  47. header: _('fred.elements.name'),
  48. dataIndex: 'name',
  49. sortable: true,
  50. width: 80,
  51. editor: this.getEditor(config, {xtype: 'textfield'})
  52. },
  53. {
  54. header: _('fred.elements.description'),
  55. dataIndex: 'description',
  56. width: 120,
  57. editor: {xtype: 'textfield'},
  58. hidden: document.body.clientWidth < 1550
  59. },
  60. {
  61. header: _('fred.elements.theme'),
  62. dataIndex: 'theme_name',
  63. sortable: true,
  64. width: 60
  65. },
  66. {
  67. header: _('fred.elements.category'),
  68. dataIndex: 'category_name',
  69. sortable: true,
  70. width: 60
  71. },
  72. {
  73. header: _('fred.elements.option_set'),
  74. dataIndex: 'option_set_name',
  75. width: 60,
  76. hidden: document.body.clientWidth < 1550
  77. },
  78. {
  79. header: _('fred.elements.has_override'),
  80. dataIndex: 'has_override',
  81. renderer: this.rendYesNo,
  82. width: 60,
  83. hidden: document.body.clientWidth < 1550
  84. },
  85. {
  86. header: _('fred.elements.rank'),
  87. dataIndex: 'rank',
  88. sortable: true,
  89. width: 40,
  90. editor: this.getEditor(config, {xtype: 'numberfield'})
  91. }
  92. ],
  93. tbar: this.getTbar(config)
  94. });
  95. fred.grid.Elements.superclass.constructor.call(this, config);
  96. this.on('render', this.registerGridDropTarget, this);
  97. this.on('beforedestroy', this.destroyScrollManager, this);
  98. fred.globalEvents.on('delete-element-category', function(category) {
  99. var categoryFilter = Ext.getCmp('fred-element-filter-category');
  100. if (categoryFilter.getValue() === category.id) {
  101. var record = categoryFilter.findRecord('id',0);
  102. categoryFilter.setValue(0);
  103. categoryFilter.fireEvent('select', categoryFilter, record);
  104. } else {
  105. this.getBottomToolbar().changePage(1);
  106. }
  107. }, this);
  108. fred.globalEvents.on('delete-theme', function(theme) {
  109. var themeFilter = Ext.getCmp('fred-element-filter-theme');
  110. if (themeFilter.getValue() !== theme.id) return;
  111. var record = themeFilter.findRecord('id',0);
  112. themeFilter.setValue(0);
  113. themeFilter.fireEvent('select', themeFilter, record);
  114. var categoryFilter = Ext.getCmp('fred-element-filter-category');
  115. var recordCategory = categoryFilter.findRecord('id',0);
  116. categoryFilter.setValue(0);
  117. categoryFilter.fireEvent('select', categoryFilter, recordCategory);
  118. }, this);
  119. };
  120. Ext.extend(fred.grid.Elements, fred.grid.GearGrid, {
  121. getMenu: function () {
  122. var m = [];
  123. if (this.config.permission.fred_element_save) {
  124. m.push({
  125. text: _('fred.elements.quick_update'),
  126. handler: this.quickUpdateElement
  127. });
  128. m.push({
  129. text: _('fred.elements.update'),
  130. handler: this.updateElement
  131. });
  132. m.push('-');
  133. m.push({
  134. text: _('fred.elements.duplicate'),
  135. handler: this.duplicateElement
  136. });
  137. }
  138. if (this.config.permission.fred_element_delete) {
  139. if (m.length > 0) {
  140. m.push('-');
  141. }
  142. m.push({
  143. text: _('fred.elements.remove')
  144. , handler: this.removeElement
  145. });
  146. }
  147. return m;
  148. },
  149. getTbar: function(config) {
  150. var output = [];
  151. if (config.permission.fred_element_save) {
  152. output.push({
  153. text: _('fred.elements.create'),
  154. handler: this.newElement
  155. });
  156. }
  157. output.push([[
  158. '->',
  159. {
  160. xtype: 'textfield',
  161. emptyText: _('fred.elements.search_name'),
  162. listeners: {
  163. 'change': {
  164. fn: this.search,
  165. scope: this
  166. },
  167. 'render': {
  168. fn: function (cmp) {
  169. new Ext.KeyMap(cmp.getEl(), {
  170. key: Ext.EventObject.ENTER,
  171. fn: function () {
  172. this.blur();
  173. return true;
  174. },
  175. scope: cmp
  176. });
  177. },
  178. scope: this
  179. }
  180. }
  181. },
  182. {
  183. id: 'fred-element-filter-category',
  184. xtype: 'fred-combo-element-categories',
  185. emptyText: _('fred.element_cateogries.all'),
  186. addAll: 1,
  187. filterName: 'category',
  188. listeners: {
  189. select: this.filterCombo,
  190. scope: this
  191. }
  192. },
  193. {
  194. id: 'fred-element-filter-theme',
  195. xtype: 'fred-combo-themes',
  196. emptyText: _('fred.themes.all'),
  197. addAll: 1,
  198. isUpdate: true,
  199. filterName: 'theme',
  200. syncFilter: function(combo, record) {
  201. var categoryFilter = Ext.getCmp('fred-element-filter-category');
  202. var s = this.getStore();
  203. if (record.data[combo.valueField] !== 0) {
  204. s.baseParams.category = 0;
  205. categoryFilter.setValue(0);
  206. }
  207. categoryFilter.baseParams.theme = record.data[combo.valueField];
  208. categoryFilter.store.load();
  209. combo.setValue(record.data[combo.valueField]);
  210. s.baseParams[combo.filterName] = record.data[combo.valueField];
  211. this.getBottomToolbar().changePage(1);
  212. }.bind(this),
  213. listeners: {
  214. select: this.filterCombo,
  215. scope: this
  216. }
  217. }
  218. ]]);
  219. return output;
  220. },
  221. removeElement: function (btn, e) {
  222. if (!this.menu.record) return false;
  223. MODx.msg.confirm({
  224. title: _('fred.elements.remove'),
  225. text: _('fred.elements.remove_confirm', {name: this.menu.record.name}),
  226. url: this.config.url,
  227. params: {
  228. action: 'mgr/elements/remove',
  229. id: this.menu.record.id
  230. },
  231. listeners: {
  232. 'success': {
  233. fn: function (r) {
  234. this.refresh();
  235. }, scope: this
  236. }
  237. }
  238. });
  239. return true;
  240. },
  241. filterCombo: function (combo, record) {
  242. var s = this.getStore();
  243. s.baseParams[combo.filterName] = record.data[combo.valueField];
  244. if (combo.filterName === 'theme') {
  245. var categoryFilter = Ext.getCmp('fred-element-filter-category');
  246. if (record.data[combo.valueField] !== 0) {
  247. s.baseParams.category = 0;
  248. categoryFilter.setValue();
  249. }
  250. categoryFilter.baseParams.theme = record.data[combo.valueField];
  251. categoryFilter.store.load();
  252. 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'];
  253. ids.forEach(function(id){
  254. if (id === combo.id) return true;
  255. var remoteCombo = Ext.getCmp(id);
  256. if (remoteCombo) {
  257. remoteCombo.syncFilter(remoteCombo, record);
  258. }
  259. });
  260. }
  261. this.getBottomToolbar().changePage(1);
  262. },
  263. search: function (field, value) {
  264. var s = this.getStore();
  265. s.baseParams.search = value;
  266. this.getBottomToolbar().changePage(1);
  267. },
  268. newElement: function(btn, e) {
  269. var options = {};
  270. var s = this.getStore();
  271. if (s.baseParams.theme) {
  272. options.theme = s.baseParams.theme;
  273. if (s.baseParams.category) {
  274. options.category = s.baseParams.category;
  275. }
  276. }
  277. fred.loadPage('element/create', options);
  278. },
  279. quickUpdateElement: function (btn, e) {
  280. var updateElement = MODx.load({
  281. xtype: 'fred-window-element',
  282. record: this.menu.record,
  283. isUpdate: true,
  284. listeners: {
  285. success: {
  286. fn: function () {
  287. this.refresh();
  288. },
  289. scope: this
  290. }
  291. }
  292. });
  293. var category = updateElement.find('name', 'category');
  294. if (category[0]) {
  295. category = category[0];
  296. category.baseParams.theme = this.menu.record.theme_id;
  297. }
  298. var optionSet = updateElement.find('name', 'option_set');
  299. if (optionSet[0]) {
  300. optionSet = optionSet[0];
  301. optionSet.baseParams.theme = this.menu.record.theme_id;
  302. }
  303. updateElement.fp.getForm().reset();
  304. updateElement.fp.getForm().setValues(this.menu.record);
  305. updateElement.show(e.target);
  306. return true;
  307. },
  308. duplicateElement: function (btn, e) {
  309. var duplicateElement = MODx.load({
  310. xtype: 'fred-window-element-duplicate',
  311. record: this.menu.record,
  312. isUpdate: true,
  313. listeners: {
  314. success: {
  315. fn: function () {
  316. this.refresh();
  317. },
  318. scope: this
  319. }
  320. }
  321. });
  322. var category = duplicateElement.find('name', 'category');
  323. if (category[0]) {
  324. category = category[0];
  325. category.baseParams.theme = this.menu.record.theme_id;
  326. }
  327. duplicateElement.fp.getForm().reset();
  328. duplicateElement.fp.getForm().setValues(this.menu.record);
  329. duplicateElement.show(e.target);
  330. return true;
  331. },
  332. updateElement: function (btn, e) {
  333. fred.loadPage('element/update', {id: this.menu.record.id});
  334. },
  335. isGridFiltered: function () {
  336. var search = this.getStore().baseParams.search;
  337. if (search && search != '') {
  338. return true;
  339. }
  340. var publicFilter = this.getStore().baseParams.public;
  341. if ((publicFilter !== undefined) && (publicFilter !== null) && (publicFilter !== '')) {
  342. return true;
  343. }
  344. var completeFilter = this.getStore().baseParams.complete;
  345. if ((completeFilter !== undefined) && (completeFilter !== null) && (completeFilter !== '')) {
  346. return true;
  347. }
  348. var categoryFilter = this.getStore().baseParams.category;
  349. if (!((categoryFilter !== undefined) && (categoryFilter !== null) && (categoryFilter !== '') && (categoryFilter !== 0))) {
  350. return true;
  351. }
  352. return false;
  353. },
  354. getDragDropText: function () {
  355. if (this.store.sortInfo && this.store.sortInfo.field != 'rank') {
  356. return _('fred.err.bad_sort_column', {column: 'rank'});
  357. }
  358. var categoryFilter = this.getStore().baseParams.category;
  359. if (!((categoryFilter !== undefined) && (categoryFilter !== null) && (categoryFilter !== '') && (categoryFilter !== 0))) {
  360. return _('fred.err.required_filter', {filter: 'category'});
  361. }
  362. if (this.isGridFiltered()) {
  363. return _('fred.err.clear_filter');
  364. }
  365. return _('fred.global.change_order', {name: this.selModel.selections.items[0].data.name});
  366. },
  367. registerGridDropTarget: function () {
  368. var ddrow = new Ext.ux.dd.GridReorderDropTarget(this, {
  369. copy: false,
  370. sortCol: 'rank',
  371. isGridFiltered: this.isGridFiltered.bind(this),
  372. listeners: {
  373. 'beforerowmove': function (objThis, oldIndex, newIndex, records) {
  374. },
  375. 'afterrowmove': function (objThis, oldIndex, newIndex, records) {
  376. var currentElement = records.pop();
  377. MODx.Ajax.request({
  378. url: fred.config.connectorUrl,
  379. params: {
  380. action: 'mgr/elements/ddreorder',
  381. elementId: currentElement.id,
  382. categoryId: currentElement.data.category,
  383. oldIndex: oldIndex,
  384. newIndex: newIndex
  385. },
  386. listeners: {
  387. success: {
  388. fn: function (r) {
  389. this.target.grid.refresh();
  390. },
  391. scope: this
  392. }
  393. }
  394. });
  395. },
  396. 'beforerowcopy': function (objThis, oldIndex, newIndex, records) {
  397. },
  398. 'afterrowcopy': function (objThis, oldIndex, newIndex, records) {
  399. }
  400. }
  401. });
  402. Ext.dd.ScrollManager.register(this.getView().getEditorParent());
  403. },
  404. destroyScrollManager: function () {
  405. Ext.dd.ScrollManager.unregister(this.getView().getEditorParent());
  406. },
  407. getEditor: function(config, editor) {
  408. if (config.permission.fred_element_save) return editor;
  409. return false;
  410. }
  411. });
  412. Ext.reg('fred-grid-elements', fred.grid.Elements);