panel.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. fred.panel.Blueprint = function (config) {
  2. config = config || {};
  3. config.permission = config.permission || {};
  4. config.id = config.id || 'fred-panel-blueprint';
  5. Ext.applyIf(config, {
  6. border: false,
  7. cls: 'container',
  8. url: fred.config.connectorUrl,
  9. baseParams: {
  10. action: 'mgr/blueprints/update'
  11. },
  12. useLoadingMask: true,
  13. items: this.getItems(config),
  14. listeners: {
  15. 'setup': {
  16. fn: this.setup,
  17. scope: this
  18. },
  19. 'success': {
  20. fn: this.success,
  21. scope: this
  22. }
  23. }
  24. });
  25. this.theme_folder = '';
  26. fred.panel.Blueprint.superclass.constructor.call(this, config);
  27. };
  28. Ext.extend(fred.panel.Blueprint, MODx.FormPanel, {
  29. setup: function () {
  30. if (this.config.isUpdate) {
  31. MODx.Ajax.request({
  32. url: this.config.url,
  33. params: {
  34. action: 'mgr/blueprints/get',
  35. id: MODx.request.id
  36. },
  37. listeners: {
  38. 'success': {
  39. fn: function (r) {
  40. if (Array.isArray(r.object.data) && r.object.data.length === 0) {
  41. r.object.data = '';
  42. } else {
  43. if (typeof r.object.data === 'object') {
  44. r.object.data = JSON.stringify(r.object.data, null, 2);
  45. }
  46. }
  47. this.getForm().setValues(r.object);
  48. if (r.object.image) {
  49. this.theme_folder = r.object.theme_folder;
  50. r.object.image = fred.prependBaseUrl(r.object.image, r.object.theme_folder);
  51. } else {
  52. r.object.image = "https://via.placeholder.com/300x150?text=No+image";
  53. }
  54. Ext.getCmp('image_preview').el.dom.querySelector('img').src = r.object.image;
  55. this.fireEvent('ready', r.object);
  56. MODx.fireEvent('ready');
  57. },
  58. scope: this
  59. }
  60. }
  61. });
  62. } else {
  63. this.fireEvent('ready');
  64. MODx.fireEvent('ready');
  65. }
  66. },
  67. success: function (o, r) {
  68. if (this.config.isUpdate == false) {
  69. fred.loadPage('blueprint/update', {id: o.result.object.id});
  70. }
  71. },
  72. getItems: function (config) {
  73. return [
  74. {
  75. html: '<h2>' + ((config.isUpdate == true) ? _('fred.blueprints.update') : _('fred.blueprints.create')) + '</h2>',
  76. border: false,
  77. cls: 'modx-page-header'
  78. },
  79. {
  80. name: 'id',
  81. xtype: 'hidden'
  82. },
  83. this.getGeneralFields(config),
  84. {
  85. html: '<br />',
  86. bodyCssClass: 'transparent-background'
  87. },
  88. this.getColumnsGrid(config)
  89. ];
  90. },
  91. getGeneralFields: function (config) {
  92. return [
  93. {
  94. deferredRender: false,
  95. border: true,
  96. defaults: {
  97. autoHeight: true,
  98. layout: 'form',
  99. labelWidth: 150,
  100. bodyCssClass: 'main-wrapper',
  101. layoutOnTabChange: true
  102. },
  103. items: [
  104. {
  105. defaults: {
  106. msgTarget: 'side',
  107. autoHeight: true
  108. },
  109. cls: 'form-with-labels',
  110. border: false,
  111. items: [
  112. {
  113. layout: 'column',
  114. border: false,
  115. height: 100,
  116. defaults: {
  117. layout: 'form',
  118. labelAlign: 'top',
  119. labelSeparator: '',
  120. anchor: '100%',
  121. border: false
  122. },
  123. items: [
  124. {
  125. columnWidth: 0.7,
  126. border: false,
  127. defaults: {
  128. msgTarget: 'under'
  129. },
  130. items: [
  131. {
  132. xtype: 'textfield',
  133. fieldLabel: _('fred.blueprints.name'),
  134. name: 'name',
  135. anchor: '100%',
  136. allowBlank: false
  137. },
  138. {
  139. xtype: 'textarea',
  140. fieldLabel: _('fred.blueprints.description'),
  141. name: 'description',
  142. anchor: '100%',
  143. height: 100
  144. },
  145. {
  146. id: 'fred-blueprint-image-field',
  147. xtype: 'modx-combo-browser',
  148. fieldLabel: _('fred.blueprints.image'),
  149. triggerClass: 'x-form-image-trigger',
  150. name: 'image',
  151. anchor: '100%',
  152. allowBlank: true,
  153. updatePreview: function (theme_folder = '') {
  154. var value = this.getValue();
  155. if (value) {
  156. value = fred.prependBaseUrl(value, theme_folder);
  157. } else {
  158. value = "https://via.placeholder.com/300x150?text=No+image";
  159. }
  160. Ext.getCmp('image_preview').el.dom.querySelector('img').src = value;
  161. },
  162. listeners: {
  163. 'select': {
  164. fn: function (data) {
  165. this.setValue(data.fullRelativeUrl);
  166. this.updatePreview('');
  167. }
  168. },
  169. 'change': {
  170. fn: function (cb, nv) {
  171. cb.updatePreview(this.theme_folder);
  172. },
  173. scope: this
  174. }
  175. }
  176. }
  177. ]
  178. },
  179. {
  180. columnWidth: 0.3,
  181. border: false,
  182. defaults: {
  183. msgTarget: 'under'
  184. },
  185. items: [
  186. {
  187. xtype: 'fred-combo-themes',
  188. fieldLabel: _('fred.blueprints.theme'),
  189. name: 'theme',
  190. hiddenName: 'theme',
  191. anchor: '100%',
  192. listeners: {
  193. select: function(combo, record) {
  194. var category = this.find('name', 'category');
  195. if (!category[0]) return;
  196. this.theme_folder = record.data.theme_folder;
  197. category = category[0];
  198. category.setValue();
  199. category.enable();
  200. category.baseParams.theme = record.id;
  201. category.store.load();
  202. var image = Ext.getCmp('fred-blueprint-image-field');
  203. if (image) {
  204. image.updatePreview(this.theme_folder);
  205. }
  206. },
  207. scope: this
  208. },
  209. allowBlank: false,
  210. isUpdate: config.isUpdate
  211. },
  212. {
  213. xtype: 'fred-combo-blueprint-categories',
  214. fieldLabel: _('fred.blueprints.category'),
  215. name: 'category',
  216. hiddenName: 'category',
  217. anchor: '100%',
  218. allowBlank: false
  219. },
  220. {
  221. xtype: 'fred-combo-boolean',
  222. useInt: true,
  223. fieldLabel: _('fred.blueprints.public'),
  224. name: 'public',
  225. hiddenName: 'public',
  226. anchor: '100%',
  227. disabled: !config.permission.fred_blueprints_create_public,
  228. value: config.permission.fred_blueprints_create_public ? 1 : 0
  229. },
  230. {
  231. xtype: 'numberfield',
  232. allowDecimals: false,
  233. allowNegative: false,
  234. fieldLabel: _('fred.blueprints.rank'),
  235. name: 'rank',
  236. anchor: '100%',
  237. allowBlank: true
  238. }
  239. ]
  240. }
  241. ]
  242. },
  243. {
  244. layout: 'column',
  245. border: false,
  246. anchor: '100%',
  247. defaults: {
  248. layout: 'form',
  249. labelAlign: 'top',
  250. labelSeparator: '',
  251. anchor: '100%',
  252. border: false
  253. },
  254. items: [
  255. {
  256. columnWidth: 1,
  257. border: false,
  258. defaults: {
  259. msgTarget: 'under',
  260. anchor: '100%'
  261. },
  262. items: [
  263. {
  264. id: 'image_preview',
  265. html: '<img src="' + "https://via.placeholder.com/800x100?text=No+image" + '" style="max-height: 800px;max-width: 100%;margin-top: 15px;">',
  266. listeners: {
  267. render: function () {
  268. this.el.dom.style.textAlign = 'center';
  269. }
  270. }
  271. }
  272. ]
  273. }
  274. ]
  275. }
  276. ]
  277. }
  278. ]
  279. }
  280. ];
  281. },
  282. getColumnsGrid: function (config) {
  283. var items = [
  284. {
  285. html: '<br />',
  286. bodyCssClass: 'transparent-background'
  287. }
  288. ];
  289. items.push([
  290. {
  291. deferredRender: false,
  292. border: true,
  293. defaults: {
  294. autoHeight: true,
  295. layout: 'form',
  296. labelWidth: 150,
  297. bodyCssClass: 'main-wrapper',
  298. layoutOnTabChange: true
  299. },
  300. items: [
  301. {
  302. defaults: {
  303. msgTarget: 'side',
  304. autoHeight: true
  305. },
  306. cls: 'form-with-labels',
  307. border: false,
  308. items: [
  309. {
  310. layout: 'column',
  311. border: false,
  312. height: 100,
  313. defaults: {
  314. layout: 'form',
  315. labelAlign: 'top',
  316. labelSeparator: '',
  317. anchor: '100%',
  318. border: false
  319. },
  320. items: [
  321. {
  322. columnWidth: 1,
  323. border: false,
  324. defaults: {
  325. msgTarget: 'under'
  326. },
  327. items: [
  328. {
  329. xtype: Ext.ComponentMgr.isRegistered('modx-texteditor') ? 'modx-texteditor' : 'textarea',
  330. mimeType: 'application/json',
  331. name: 'data',
  332. id: 'data',
  333. hideLabel: true,
  334. anchor: '100%',
  335. height: 400,
  336. grow: false,
  337. value: ''
  338. }
  339. ]
  340. }
  341. ]
  342. }
  343. ]
  344. }
  345. ]
  346. }
  347. ]);
  348. return items;
  349. }
  350. });
  351. Ext.reg('fred-panel-blueprint', fred.panel.Blueprint);