blueprints.grid.js 15 KB

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