theme.window.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. fred.window.Theme = function (config) {
  2. config = config || {};
  3. Ext.applyIf(config, {
  4. title: _('fred.themes.create'),
  5. closeAction: 'close',
  6. isUpdate: false,
  7. url: fred.config.connectorUrl,
  8. action: 'mgr/themes/create',
  9. modal: true,
  10. autoHeight: true,
  11. fields: this.getFields(config),
  12. keys: [
  13. {
  14. key: Ext.EventObject.ENTER,
  15. shift: true,
  16. fn: this.submit,
  17. scope: this
  18. }
  19. ]
  20. });
  21. fred.window.Theme.superclass.constructor.call(this, config);
  22. };
  23. Ext.extend(fred.window.Theme, MODx.Window, {
  24. getFields: function (config) {
  25. return [
  26. {
  27. xtype: 'textfield',
  28. name: 'id',
  29. anchor: '100%',
  30. hidden: true
  31. },
  32. {
  33. xtype: 'textfield',
  34. fieldLabel: _('fred.themes.name'),
  35. name: 'name',
  36. anchor: '100%',
  37. allowBlank: false
  38. },
  39. {
  40. xtype: 'textarea',
  41. fieldLabel: _('fred.themes.description'),
  42. name: 'description',
  43. anchor: '100%',
  44. allowBlank: true
  45. }
  46. ];
  47. }
  48. });
  49. Ext.reg('fred-window-theme', fred.window.Theme);
  50. fred.window.ThemeDuplicate = function (config) {
  51. config = config || {};
  52. Ext.applyIf(config, {
  53. title: _('fred.themes.duplicate'),
  54. closeAction: 'close',
  55. isUpdate: false,
  56. url: fred.config.connectorUrl,
  57. action: 'mgr/themes/duplicate',
  58. modal: true,
  59. fields: this.getFields(config),
  60. autoHeight: true,
  61. keys: [
  62. {
  63. key: Ext.EventObject.ENTER,
  64. shift: true,
  65. fn: this.submit,
  66. scope: this
  67. }
  68. ]
  69. });
  70. fred.window.ThemeDuplicate.superclass.constructor.call(this, config);
  71. };
  72. Ext.extend(fred.window.ThemeDuplicate, MODx.Window, {
  73. getFields: function (config) {
  74. return [
  75. {
  76. xtype: 'hidden',
  77. name: 'id'
  78. },
  79. {
  80. xtype: 'textfield',
  81. fieldLabel: _('fred.themes.new_name'),
  82. name: 'name',
  83. anchor: '100%',
  84. allowBlank: true
  85. },
  86. {
  87. xtype: 'xcheckbox',
  88. name: 'duplicate_theme_objects',
  89. boxLabel: _('fred.themes.duplicate_theme_objects'),
  90. hideLabel: true,
  91. labelSeparator: ''
  92. },
  93. {
  94. xtype: 'xcheckbox',
  95. name: 'duplicate_theme_folder',
  96. boxLabel: _('fred.themes.duplicate_theme_folder'),
  97. hideLabel: true,
  98. labelSeparator: ''
  99. },
  100. {
  101. xtype: 'xcheckbox',
  102. name: 'duplicate_templates',
  103. boxLabel: _('fred.themes.duplicate_templates'),
  104. hideLabel: true,
  105. labelSeparator: ''
  106. }
  107. ]
  108. }
  109. });
  110. Ext.reg('fred-window-theme-duplicate', fred.window.ThemeDuplicate);
  111. fred.window.ThemeBuild = function (config) {
  112. config = config || {};
  113. Ext.applyIf(config, {
  114. title: _('fred.themes.duplicate'),
  115. closeAction: 'close',
  116. isUpdate: false,
  117. url: fred.config.connectorUrl,
  118. action: 'mgr/themes/build',
  119. modal: true,
  120. fields: this.getFields(config),
  121. autoHeight: true,
  122. width: 800,
  123. keys: [
  124. {
  125. key: Ext.EventObject.ENTER,
  126. shift: true,
  127. fn: this.submit,
  128. scope: this
  129. }
  130. ],
  131. buttonAlign: 'left',
  132. buttons: [
  133. {
  134. xtype: 'fred-button-help',
  135. path: 'cmp/themes/#build'
  136. }, '->', {
  137. text: config.cancelBtnText || _('cancel'),
  138. scope: this,
  139. handler: function () {
  140. config.closeAction !== 'close' ? this.hide() : this.close();
  141. }
  142. },
  143. {
  144. text: _('fred.themes.build'),
  145. scope: this,
  146. handler: this.submit
  147. },
  148. {
  149. text: _('fred.themes.build_and_download'),
  150. cls: 'primary-button',
  151. scope: this,
  152. handler: function () {
  153. this.on('success', function () {
  154. fred.loadPage('theme/download', {theme: this.record.id});
  155. }, this, {single: true});
  156. this.submit();
  157. }
  158. }
  159. ]
  160. });
  161. fred.window.ThemeBuild.superclass.constructor.call(this, config);
  162. this.on('beforeSubmit', function () {
  163. var dependencies = this.find('name', 'dependencies')[0];
  164. dependencies.setValue(Ext.getCmp('fred-window-theme-build-dependencies').encode());
  165. }, this);
  166. this.on('failure', function(a) {
  167. try {
  168. var response = JSON.parse(a.a.response.responseText);
  169. var msg = [];
  170. if (response.data && Array.isArray(response.data)) {
  171. response.data.forEach(function(item) {
  172. msg.push(item.msg);
  173. });
  174. }
  175. if (msg.length > 0) {
  176. msg = msg.join('<br>');
  177. } else {
  178. msg = _('error');
  179. }
  180. Ext.Msg.alert(_('error'), msg);
  181. } catch (err) {
  182. Ext.Msg.alert(_('error'), _('error'));
  183. }
  184. });
  185. };
  186. Ext.extend(fred.window.ThemeBuild, MODx.Window, {
  187. getFields: function (config) {
  188. return [
  189. {
  190. xtype: 'hidden',
  191. name: 'id'
  192. },
  193. {
  194. html: '<br/><p>' + _('fred.themes.theme_build_desc') + '</p>'
  195. },
  196. {
  197. xtype: 'modx-tabs',
  198. deferredRender: false,
  199. defaults: {
  200. border: false,
  201. autoHeight: true,
  202. labelSeparator: '',
  203. layout: 'form',
  204. msgTarget: 'under'
  205. },
  206. border: false,
  207. hideMode: 'offsets',
  208. items: [
  209. {
  210. title: _('fred.themes.overview'),
  211. items: [
  212. {
  213. xtype: 'textfield',
  214. fieldLabel: _('fred.themes.name'),
  215. name: 'name',
  216. anchor: '100%',
  217. regex: /^[a-z_]+$/,
  218. regexText: _('fred.err.theme_name_invalid_format'),
  219. allowBlank: false,
  220. msgTarget: 'under'
  221. },
  222. {
  223. layout: 'column',
  224. border: false,
  225. anchor: '100%',
  226. defaults: {
  227. layout: 'form',
  228. labelAlign: 'top',
  229. labelSeparator: '',
  230. anchor: '100%',
  231. border: false
  232. },
  233. items: [
  234. {
  235. columnWidth: .5,
  236. border: false,
  237. defaults: {
  238. msgTarget: 'under',
  239. anchor: '100%'
  240. },
  241. items: [
  242. {
  243. xtype: 'textfield',
  244. fieldLabel: _('fred.themes.version'),
  245. name: 'version',
  246. anchor: '100%',
  247. allowBlank: false,
  248. regex: /^[0-9]+\.[0-9]+\.[0-9]+$/,
  249. regexText: _('fred.err.themes_version_number_format')
  250. }
  251. ]
  252. },
  253. {
  254. columnWidth: .5,
  255. border: false,
  256. defaults: {
  257. msgTarget: 'under',
  258. anchor: '100%'
  259. },
  260. items: [
  261. {
  262. xtype: 'textfield',
  263. fieldLabel: _('fred.themes.release'),
  264. name: 'release',
  265. anchor: '100%',
  266. allowBlank: false,
  267. regex: /^(pl|beta|alpha)[0-9]*$/,
  268. regexText: _('fred.err.themes_release_format')
  269. }
  270. ]
  271. },
  272. ]
  273. },
  274. {
  275. xtype: 'fred-combo-root-category',
  276. fieldLabel: _('fred.themes.categories'),
  277. name: 'categories',
  278. hiddenName: 'categories[]',
  279. anchor: '100%'
  280. },
  281. {
  282. xtype: 'statictextfield',
  283. fieldLabel: _('fred.themes.included_theme_folder'),
  284. anchor: '100%',
  285. value: ('/assets/themes/' + config.record.theme_folder + '/') || ''
  286. }
  287. ]
  288. },
  289. {
  290. title: _('fred.themes.dependencies'),
  291. items: [
  292. {
  293. html: '<p>' + _('fred.themes.theme_build_dependencies_desc') + '</p>'
  294. },
  295. {
  296. xtype: 'hidden',
  297. name: 'dependencies'
  298. },
  299. {
  300. id: 'fred-window-theme-build-dependencies',
  301. xtype: 'fred-grid-dependencies',
  302. initValue: (config.record && config.record.dependencies) ? config.record.dependencies : [{
  303. name: "fred",
  304. version: '*'
  305. }]
  306. }
  307. ]
  308. },
  309. {
  310. title: _('fred.themes.changelog'),
  311. items: [
  312. {
  313. html: '<p>' + _('fred.themes.theme_build_changelog_desc') + '</p>'
  314. },
  315. {
  316. xtype: Ext.ComponentMgr.isRegistered('modx-texteditor') ? 'modx-texteditor' : 'textarea',
  317. fieldLabel: _('fred.themes.changelog'),
  318. name: 'docs_changelog',
  319. anchor: '100%',
  320. grow: true,
  321. growMax: 300,
  322. growMin: 200,
  323. allowBlank: false
  324. }
  325. ]
  326. },
  327. {
  328. title: _('fred.themes.readme'),
  329. items: [
  330. {
  331. html: '<p>' + _('fred.themes.theme_build_readme_desc') + '</p>'
  332. },
  333. {
  334. xtype: Ext.ComponentMgr.isRegistered('modx-texteditor') ? 'modx-texteditor' : 'textarea',
  335. fieldLabel: _('fred.themes.readme'),
  336. name: 'docs_readme',
  337. anchor: '100%',
  338. grow: true,
  339. growMax: 300,
  340. growMin: 200,
  341. allowBlank: false
  342. }
  343. ]
  344. },
  345. {
  346. title: _('fred.themes.license'),
  347. items: [
  348. {
  349. html: '<p>' + _('fred.themes.theme_build_license_desc') + '</p>'
  350. },
  351. {
  352. xtype: Ext.ComponentMgr.isRegistered('modx-texteditor') ? 'modx-texteditor' : 'textarea',
  353. fieldLabel: _('fred.themes.license'),
  354. name: 'docs_license',
  355. anchor: '100%',
  356. grow: true,
  357. growMax: 300,
  358. growMin: 200,
  359. allowBlank: false
  360. }
  361. ]
  362. }
  363. ]
  364. }
  365. ]
  366. }
  367. });
  368. Ext.reg('fred-window-theme-build', fred.window.ThemeBuild);
  369. fred.window.RemoveTheme = function (config) {
  370. config = config || {};
  371. Ext.applyIf(config, {
  372. title: _('fred.themes.remove'),
  373. closeAction: 'close',
  374. isUpdate: false,
  375. url: fred.config.connectorUrl,
  376. action: 'mgr/themes/remove',
  377. modal: true,
  378. autoHeight: true,
  379. animCollapse: false,
  380. cls: 'x-window-dlg',
  381. fields: this.getFields(config),
  382. buttonAlign: 'center',
  383. buttons: [
  384. {
  385. text: _('yes'),
  386. scope: this,
  387. handler: this.submit
  388. },
  389. {
  390. text: _('no'),
  391. scope: this,
  392. handler: function () {
  393. config.closeAction !== 'close' ? this.hide() : this.close();
  394. }
  395. }
  396. ]
  397. });
  398. fred.window.RemoveTheme.superclass.constructor.call(this, config);
  399. };
  400. Ext.extend(fred.window.RemoveTheme, MODx.Window, {
  401. getFields: function (config) {
  402. return [
  403. {
  404. xtype: 'hidden',
  405. name: 'id'
  406. },
  407. {
  408. html: '<div class=" x-dlg-icon"><div class="ext-mb-icon ext-mb-question"></div><div class="ext-mb-content"><span class="ext-mb-text">' + _('fred.themes.remove_confirm', {name: config.record.name}) + '</span><br></div></div>'
  409. },
  410. {
  411. xtype: 'xcheckbox',
  412. name: 'delete_theme_folder',
  413. boxLabel: _('fred.themes.delete_theme_folder'),
  414. hideLabel: true,
  415. labelSeparator: ''
  416. }
  417. ];
  418. },
  419. animShow: function () {
  420. this.afterShow();
  421. }
  422. });
  423. Ext.reg('fred-window-remove-theme', fred.window.RemoveTheme);