themes.grid.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. fred.grid.Themes = function (config) {
  2. config = config || {};
  3. config.permission = config.permission || {};
  4. if (config.permission.fred_themes_save) {
  5. config.save_action = 'mgr/themes/updatefromgrid';
  6. config.autosave = true;
  7. }
  8. if (!config.permission.fred_themes_save && !config.permission.fred_themes_build && !config.permission.fred_themes_delete) {
  9. config.showGear = false;
  10. }
  11. Ext.applyIf(config, {
  12. url: fred.config.connectorUrl,
  13. baseParams: {
  14. action: 'mgr/themes/getlist'
  15. },
  16. preventSaveRefresh: false,
  17. fields: ['id', 'name', 'description', 'config', 'latest_build', 'theme_folder', 'default_element'],
  18. paging: true,
  19. remoteSort: true,
  20. emptyText: _('fred.themes.none'),
  21. columns: [
  22. {
  23. header: _('id'),
  24. dataIndex: 'id',
  25. sortable: true,
  26. hidden: true
  27. },
  28. {
  29. header: _('fred.themes.name'),
  30. dataIndex: 'name',
  31. sortable: true,
  32. width: 80,
  33. editor: this.getEditor(config, {xtype: 'textfield'})
  34. },
  35. {
  36. header: _('fred.themes.description'),
  37. dataIndex: 'description',
  38. sortable: true,
  39. width: 80,
  40. editor: this.getEditor(config, {xtype: 'textfield'})
  41. },
  42. {
  43. header: _('fred.themes.theme_folder'),
  44. dataIndex: 'theme_folder',
  45. sortable: true,
  46. width: 80,
  47. editor: this.getEditor(config, {xtype: 'textfield'})
  48. },
  49. {
  50. header: _('fred.themes.default_element'),
  51. dataIndex: 'default_element',
  52. sortable: true,
  53. width: 80,
  54. editor: this.getEditor(config, {xtype: 'textfield'})
  55. },
  56. {
  57. header: _('fred.themes.latest_build'),
  58. dataIndex: 'latest_build',
  59. sortable: false,
  60. width: 80,
  61. renderer: function(value, metaData, record, rowIndex, colIndex, store) {
  62. if (value === false) return '';
  63. return '<a href="' + fred.getPageUrl('theme/download', {theme: record.id}) +'">' + value + '</a>';
  64. }
  65. }
  66. ],
  67. tbar: this.getTbar(config)
  68. });
  69. fred.grid.Themes.superclass.constructor.call(this, config);
  70. };
  71. Ext.extend(fred.grid.Themes, fred.grid.GearGrid, {
  72. getMenu: function () {
  73. var m = [];
  74. if (this.config.permission.fred_themes_build) {
  75. m.push({
  76. text: _('fred.themes.build'),
  77. handler: this.buildTheme
  78. });
  79. }
  80. if (this.config.permission.fred_themes_save) {
  81. if (m.length > 0) {
  82. m.push('-');
  83. }
  84. m.push({
  85. text: _('fred.themes.update'),
  86. handler: this.updateTheme
  87. });
  88. m.push('-');
  89. m.push({
  90. text: _('fred.themes.duplicate'),
  91. handler: this.duplicateTheme
  92. });
  93. }
  94. if (this.config.permission.fred_themes_delete) {
  95. if (m.length > 0) {
  96. m.push('-');
  97. }
  98. m.push({
  99. text: _('fred.themes.remove'),
  100. handler: this.removeTheme
  101. });
  102. }
  103. return m;
  104. },
  105. getTbar: function(config) {
  106. var output = [];
  107. if (config.permission.fred_themes_save) {
  108. output.push({
  109. text: _('fred.themes.create'),
  110. handler: this.createTheme
  111. });
  112. }
  113. output.push([
  114. '->',
  115. {
  116. xtype: 'textfield',
  117. emptyText: _('fred.themes.search_name'),
  118. listeners: {
  119. 'change': {
  120. fn: this.search,
  121. scope: this
  122. },
  123. 'render': {
  124. fn: function (cmp) {
  125. new Ext.KeyMap(cmp.getEl(), {
  126. key: Ext.EventObject.ENTER,
  127. fn: function () {
  128. this.blur();
  129. return true;
  130. },
  131. scope: cmp
  132. });
  133. },
  134. scope: this
  135. }
  136. }
  137. }
  138. ]);
  139. return output;
  140. },
  141. createTheme: function (btn, e) {
  142. var createTheme = MODx.load({
  143. xtype: 'fred-window-theme',
  144. listeners: {
  145. success: {
  146. fn: function (r,b,x) {
  147. this.refresh();
  148. if (r && r.a && r.a.result && r.a.result.object && r.a.result.object.theme_folder !== '') {
  149. MODx.msg.alert(_('fred.themes.theme_dir_msg_title'), _('fred.themes.theme_dir_msg', {theme_folder: r.a.result.object.theme_folder}));
  150. }
  151. },
  152. scope: this
  153. }
  154. }
  155. });
  156. createTheme.show(e.target);
  157. return true;
  158. },
  159. updateTheme: function (btn, e) {
  160. var updateTheme = MODx.load({
  161. xtype: 'fred-window-theme',
  162. title: _('fred.themes.update'),
  163. action: 'mgr/themes/update',
  164. isUpdate: true,
  165. record: this.menu.record,
  166. listeners: {
  167. success: {
  168. fn: function () {
  169. this.refresh();
  170. },
  171. scope: this
  172. }
  173. }
  174. });
  175. updateTheme.fp.getForm().reset();
  176. updateTheme.fp.getForm().setValues(this.menu.record);
  177. updateTheme.show(e.target);
  178. return true;
  179. },
  180. buildTheme: function (btn, e) {
  181. if ((this.menu.record.name.toLowerCase() === 'default') || (this.menu.record.theme_folder.toLowerCase() === 'default')) {
  182. MODx.msg.alert(_('fred.themes.build_default_title'), _('fred.themes.build_default_desc'));
  183. return;
  184. }
  185. if (!this.menu.record.config || (typeof this.menu.record.config !== 'object')) this.menu.record.config = {};
  186. this.menu.record.config.id = this.menu.record.id;
  187. this.menu.record.config.theme_folder = this.menu.record.theme_folder;
  188. this.menu.record.config.name = this.menu.record.config.name || this.menu.record.name.toLowerCase().replace(/ /g, '');
  189. this.menu.record.config.release = this.menu.record.config.release || 'pl';
  190. this.menu.record.config.version = this.menu.record.config.version || '1.0.0';
  191. this.menu.record.config['categories[]'] = (this.menu.record.config.categories && Array.isArray(this.menu.record.config.categories)) ? this.menu.record.config.categories.join() : '';
  192. var buildTheme = MODx.load({
  193. xtype: 'fred-window-theme-build',
  194. title: _('fred.themes.build'),
  195. action: 'mgr/themes/build',
  196. isUpdate: true,
  197. record: this.menu.record.config,
  198. listeners: {
  199. success: {
  200. fn: function () {
  201. this.refresh();
  202. },
  203. scope: this
  204. }
  205. }
  206. });
  207. buildTheme.fp.getForm().setValues(this.menu.record.config);
  208. buildTheme.show(e.target);
  209. return true;
  210. },
  211. duplicateTheme: function (btn, e) {
  212. var record = {
  213. id: this.menu.record.id,
  214. name: _('fred.themes.theme_duplicate_name', {theme: this.menu.record.name})
  215. };
  216. var duplicateTheme = MODx.load({
  217. xtype: 'fred-window-theme-duplicate',
  218. record: record,
  219. listeners: {
  220. success: {
  221. fn: function () {
  222. this.refresh();
  223. },
  224. scope: this
  225. }
  226. }
  227. });
  228. duplicateTheme.fp.getForm().reset();
  229. duplicateTheme.fp.getForm().setValues(record);
  230. duplicateTheme.show(e.target);
  231. return true;
  232. },
  233. removeTheme: function (btn, e) {
  234. if (!this.menu.record) return false;
  235. var removeTheme = MODx.load({
  236. xtype: 'fred-window-remove-theme',
  237. record: this.menu.record,
  238. listeners: {
  239. success: {
  240. fn: function () {
  241. this.refresh();
  242. fred.globalEvents.fireEvent('delete-theme', this.menu.record)
  243. },
  244. scope: this
  245. }
  246. }
  247. });
  248. removeTheme.fp.getForm().reset();
  249. removeTheme.fp.getForm().setValues(this.menu.record);
  250. removeTheme.show(e.target);
  251. return true;
  252. },
  253. search: function (field, value) {
  254. var s = this.getStore();
  255. s.baseParams.search = value;
  256. this.getBottomToolbar().changePage(1);
  257. },
  258. filterCombo: function (combo, record) {
  259. var s = this.getStore();
  260. s.baseParams[combo.filterName] = record.data.v;
  261. this.getBottomToolbar().changePage(1);
  262. },
  263. getEditor: function(config, editor) {
  264. if (config.permission.fred_themes_save) return editor;
  265. return false;
  266. }
  267. });
  268. Ext.reg('fred-grid-themes', fred.grid.Themes);