modx.grid.element.properties.js 39 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175
  1. MODx.panel.ElementProperties = function(config) {
  2. config = config || {};
  3. Ext.applyIf(config,{
  4. id: 'modx-panel-element-properties'
  5. ,title: _('properties')
  6. ,header: false
  7. ,defaults: { collapsible: false ,autoHeight: true ,border: false }
  8. ,layout: 'form'
  9. ,items: [{
  10. html: '<p>'+_('element_properties_desc')+'</p>'
  11. ,itemId: 'desc-properties'
  12. ,xtype: 'modx-description'
  13. },{
  14. xtype: 'modx-grid-element-properties'
  15. ,cls:'main-wrapper'
  16. ,id: 'modx-grid-element-properties'
  17. ,itemId: 'grid-properties'
  18. ,autoHeight: true
  19. ,border: true
  20. ,panel: config.elementPanel
  21. ,elementId: config.elementId
  22. ,elementType: config.elementType
  23. },{
  24. layout: 'form'
  25. ,labelAlign: 'top'
  26. ,border: false
  27. ,cls: 'main-wrapper'
  28. ,items: [{
  29. xtype: 'xcheckbox'
  30. ,boxLabel: _('property_preprocess')
  31. ,description: MODx.expandHelp ? '' : _('property_preprocess_msg')
  32. ,name: 'property_preprocess'
  33. ,id: 'modx-element-property-preprocess'
  34. ,inputValue: true
  35. ,hideLabel: true
  36. ,checked: config.record.property_preprocess || 0
  37. ,listeners: {
  38. 'check':{fn:function() {Ext.getCmp(this.config.elementPanel).markDirty();},scope:this}
  39. }
  40. },{
  41. xtype: MODx.expandHelp ? 'label' : 'hidden'
  42. ,forId: 'modx-element-property-preprocess'
  43. ,html: _('property_preprocess_msg')
  44. ,cls: 'desc-under'
  45. }]
  46. }]
  47. });
  48. MODx.panel.ElementProperties.superclass.constructor.call(this,config);
  49. };
  50. Ext.extend(MODx.panel.ElementProperties,MODx.Panel);
  51. Ext.reg('modx-panel-element-properties',MODx.panel.ElementProperties);
  52. MODx.grid.ElementProperties = function(config) {
  53. config = config || {};
  54. this.exp = new Ext.grid.RowExpander({
  55. tpl : new Ext.Template(
  56. '<p class="modx-property-description"><i>{desc_trans}</i></p>'
  57. )
  58. });
  59. Ext.applyIf(config,{
  60. title: _('properties')
  61. ,id: 'modx-grid-element-properties'
  62. ,maxHeight: 300
  63. ,fields: ['name','desc','xtype','options','value','lexicon','overridden','desc_trans','area','area_trans']
  64. ,autoExpandColumn: 'value'
  65. ,sortBy: 'name'
  66. ,anchor: '100%'
  67. ,sm: new Ext.grid.RowSelectionModel({singleSelect:false})
  68. ,loadMask: true
  69. ,lockProperties: true
  70. ,plugins: [this.exp]
  71. ,grouping: true
  72. ,groupBy: 'area_trans'
  73. ,singleText: _('property')
  74. ,pluralText: _('properties')
  75. ,columns: [this.exp,{
  76. header: _('name')
  77. ,dataIndex: 'name'
  78. ,width: 200
  79. ,sortable: true
  80. ,renderer: this._renderName
  81. },{
  82. header: _('type')
  83. ,dataIndex: 'xtype'
  84. ,width: 100
  85. ,renderer: this._renderType
  86. ,sortable: true
  87. },{
  88. header: _('value')
  89. ,dataIndex: 'value'
  90. ,id: 'value'
  91. ,width: 250
  92. ,renderer: this.renderDynField.createDelegate(this,[this],true)
  93. ,sortable: true
  94. },{
  95. header: _('area')
  96. ,dataIndex: 'area_trans'
  97. ,id: 'area'
  98. ,width: 150
  99. ,sortable: true
  100. ,hidden: true
  101. }]
  102. ,tbar: [{
  103. text: _('property_create')
  104. ,id: 'modx-btn-property-create'
  105. ,handler: this.create
  106. ,scope: this
  107. ,disabled: true
  108. },{
  109. text: _('properties_default_locked')
  110. ,id: 'modx-btn-propset-lock'
  111. ,handler: this.togglePropertiesLock
  112. ,enableToggle: true
  113. ,pressed: true
  114. ,disabled: MODx.perm.unlock_element_properties ? false : true
  115. ,scope: this
  116. },'->',{
  117. xtype: 'modx-combo-property-set'
  118. ,id: 'modx-combo-property-set'
  119. ,baseParams: {
  120. action: 'element/propertyset/getList'
  121. ,showAssociated: true
  122. ,elementId: config.elementId
  123. ,elementType: config.elementType
  124. }
  125. ,value: 0
  126. ,listeners: {
  127. 'select': {fn:this.changePropertySet,scope:this}
  128. }
  129. },{
  130. text: _('propertyset_add')
  131. ,handler: this.addPropertySet
  132. ,scope: this
  133. },{
  134. text: _('propertyset_save')
  135. ,cls: 'primary-button'
  136. ,handler: this.save
  137. ,scope: this
  138. ,hidden: MODx.request.id ? false : true
  139. }]
  140. ,bbar: [{
  141. text: _('property_revert_all')
  142. ,id: 'modx-btn-property-revert-all'
  143. ,handler: this.revertAll
  144. ,scope:this
  145. ,disabled: true
  146. },{
  147. text: _('properties_import')
  148. ,handler: this.importProperties
  149. ,scope: this
  150. },{
  151. text: _('properties_export')
  152. ,handler: this.exportProperties
  153. ,scope: this
  154. }]
  155. ,collapseFirst: false
  156. ,tools: [{
  157. id: 'plus'
  158. ,qtip: _('expand_all')
  159. ,handler: this.expandAll
  160. ,scope: this
  161. },{
  162. id: 'minus'
  163. ,hidden: true
  164. ,qtip: _('collapse_all')
  165. ,handler: this.collapseAll
  166. ,scope: this
  167. }]
  168. });
  169. MODx.grid.ElementProperties.superclass.constructor.call(this,config);
  170. this.on('afteredit', this.propertyChanged, this);
  171. this.on('afterRemoveRow', this.propertyChanged, this);
  172. this.on('render',function() {
  173. this.mask = new Ext.LoadMask(this.getEl());
  174. },this);
  175. if (this.config.lockProperties) {
  176. this.on('render',function() {
  177. this.lockMask = MODx.load({
  178. xtype: 'modx-lockmask'
  179. ,el: this.getGridEl()
  180. ,msg: _('properties_default_locked')
  181. });
  182. this.lockMask.toggle();
  183. },this);
  184. }
  185. };
  186. Ext.extend(MODx.grid.ElementProperties,MODx.grid.LocalProperty,{
  187. defaultProperties: []
  188. ,onDirty: function() {
  189. if (this.config.panel) {
  190. Ext.getCmp(this.config.panel).fireEvent('fieldChange');
  191. }
  192. }
  193. ,_renderType: function(v,md,rec,ri) {
  194. switch (v) {
  195. case 'combo-boolean': return _('yesno'); break;
  196. case 'datefield': return _('date'); break;
  197. case 'numberfield': return _('integer'); break;
  198. case 'file': return _('file'); break;
  199. case 'color': return _('color'); break;
  200. }
  201. return _(v);
  202. }
  203. ,_renderName: function(v,md,rec,ri) {
  204. switch (rec.data.overridden) {
  205. case 1:
  206. return '<span style="color: green;">'+v+'</span>'; break;
  207. case 2:
  208. return '<span style="color: purple;">'+v+'</span>';
  209. default:
  210. return '<span>'+v+'</span>';
  211. }
  212. }
  213. ,save: function() {
  214. var d = this.encode();
  215. var cb = Ext.getCmp('modx-combo-property-set');
  216. if (!cb) {
  217. this.getStore().commitChanges();
  218. this.onDirty();
  219. return true;
  220. }
  221. var p = {
  222. action: 'element/propertyset/updatefromelement'
  223. ,id: cb.getValue()
  224. ,data: d
  225. };
  226. if (this.config.elementId) {
  227. Ext.apply(p,{
  228. elementId: this.config.elementId
  229. ,elementType: this.config.elementType
  230. });
  231. }
  232. try {
  233. if (!this.mask) {
  234. this.mask = new Ext.LoadMask(this.getEl());
  235. }
  236. if (this.mask) { this.mask.show(); }
  237. } catch (e) { }
  238. MODx.Ajax.request({
  239. url: MODx.config.connector_url
  240. ,params: p
  241. ,listeners: {
  242. 'success': {fn:function(r) {
  243. this.getStore().commitChanges();
  244. this.changePropertySet(cb);
  245. this.onDirty();
  246. if (this.mask) { this.mask.hide(); }
  247. MODx.msg.status({
  248. title: _('success')
  249. ,message: _('save_successful')
  250. ,dontHide: r.message != '' ? true : false
  251. });
  252. },scope:this}
  253. }
  254. });
  255. }
  256. ,addPropertySet: function(btn,e) {
  257. this.loadWindow(btn,e,{
  258. xtype: 'modx-window-element-property-set-add'
  259. ,record: {
  260. elementId: this.config.elementId != 0 ? this.config.elementId : ''
  261. ,elementType: this.config.elementType
  262. }
  263. ,listeners: {
  264. 'success': {fn:function(o) {
  265. var cb = Ext.getCmp('modx-combo-property-set');
  266. cb.store.reload({
  267. callback: function() {
  268. cb.setValue(o.a.result.object.id);
  269. this.changePropertySet(cb);
  270. }
  271. ,scope: this
  272. });
  273. this.onDirty();
  274. },scope:this}
  275. }
  276. });
  277. }
  278. ,togglePropertiesLock: function() {
  279. var ps = Ext.getCmp('modx-combo-property-set').getValue();
  280. if (ps == 0 || ps == _('default')) {
  281. Ext.getCmp('modx-btn-propset-lock').setText(this.lockMask.locked ? _('properties_default_unlocked') : _('properties_default_locked'));
  282. this.lockMask.toggle();
  283. this.toggleButtons(this.lockMask.locked);
  284. }
  285. }
  286. ,toggleButtons: function(v) {
  287. var btn = Ext.getCmp('modx-btn-property-create');
  288. if (btn) {
  289. Ext.getCmp('modx-btn-property-create').setDisabled(v);
  290. Ext.getCmp('modx-btn-property-revert-all').setDisabled(v);
  291. }
  292. }
  293. ,changePropertySet: function(cb) {
  294. var ps = cb.getValue();
  295. var lockbtn = Ext.getCmp('modx-btn-propset-lock');
  296. if (ps == 0 || ps == _('default')) {
  297. if (MODx.perm.unlock_element_properties) {
  298. if (lockbtn) { lockbtn.setDisabled(false); }
  299. }
  300. if (this.lockMask && this.lockMask.locked) {
  301. this.lockMask.show();
  302. this.toggleButtons(true);
  303. }
  304. } else {
  305. if (lockbtn) { lockbtn.setDisabled(true); }
  306. if (this.lockMask) this.lockMask.hide();
  307. this.toggleButtons(false);
  308. }
  309. MODx.Ajax.request({
  310. url: MODx.config.connector_url
  311. ,params: {
  312. action: 'element/propertyset/get'
  313. ,id: ps
  314. ,elementId: this.config.elementId
  315. ,elementType: this.config.elementType
  316. }
  317. ,listeners: {
  318. 'success': {fn:function(r) {
  319. var s = this.getStore();
  320. var data = Ext.decode(r.object.data);
  321. s.removeAll();
  322. s.loadData(data);
  323. },scope:this}
  324. }
  325. });
  326. }
  327. ,create: function(btn,e) {
  328. this.loadWindow(btn,e,{
  329. xtype: 'modx-window-element-property-create'
  330. ,blankValues: true
  331. ,listeners: {
  332. 'success': {fn:function(r) {
  333. var rec = new this.propRecord({
  334. name: r.name
  335. ,desc: r.desc
  336. ,desc_trans: r.desc
  337. ,xtype: r.xtype
  338. ,options: r.options
  339. ,value: r.value
  340. ,lexicon: r.lexicon
  341. ,overridden: this.isDefaultPropSet() ? 0 : 2
  342. ,area: r.area
  343. ,area_trans: r.area
  344. });
  345. this.getStore().add(rec);
  346. this.propertyChanged();
  347. this.onDirty();
  348. },scope:this}
  349. }
  350. });
  351. }
  352. ,update: function(btn,e) {
  353. this.loadWindow(btn,e,{
  354. xtype: 'modx-window-element-property-update'
  355. ,record: this.menu.record
  356. ,listeners: {
  357. 'success': {fn:function(r) {
  358. var def = this.isDefaultPropSet();
  359. var s = this.getStore();
  360. var rec = s.getAt(this.menu.recordIndex);
  361. rec.set('name',r.name);
  362. rec.set('desc',r.desc);
  363. rec.set('desc_trans', r.desc);
  364. rec.set('xtype',r.xtype);
  365. rec.set('options',r.options);
  366. rec.set('value',r.value);
  367. rec.set('lexicon',r.lexicon);
  368. rec.set('overridden',r.overridden == 2 ? 2 : (!def ? 1 : 0));
  369. rec.set('area',r.area);
  370. rec.set('area_trans',r.area);
  371. this.getView().refresh();
  372. this.onDirty();
  373. },scope:this}
  374. }
  375. });
  376. }
  377. ,revert: function(btn,e) {
  378. Ext.Msg.confirm(_('warning'),_('property_revert_confirm'),function(e) {
  379. if (e == 'yes') {
  380. var ri = this.menu.recordIndex;
  381. var d = this.defaultProperties[ri];
  382. if (d) {
  383. var rec = this.getStore().getAt(ri);
  384. rec.set('name',d[0]);
  385. rec.set('desc',d[1]);
  386. rec.set('desc_trans',d[1]);
  387. rec.set('xtype',d[2]);
  388. rec.set('options',d[3]);
  389. rec.set('value',d[4]);
  390. rec.set('overridden',0);
  391. rec.set('area',d[5]);
  392. rec.set('area_trans',d[5]);
  393. rec.commit();
  394. }
  395. }
  396. },this);
  397. }
  398. ,revertAll: function(btn,e) {
  399. Ext.Msg.confirm(_('warning'),_('property_revert_all_confirm'),function(e) {
  400. if (e == 'yes') {
  401. this.getStore().loadData(this.defaultProperties);
  402. }
  403. },this);
  404. }
  405. ,removeMultiple: function(btn,e) {
  406. var rows = this.getSelectionModel().getSelections();
  407. var rids = [];
  408. for (var i=0;i<rows.length;i=i+1) {
  409. rids.push(rows[i].data.id);
  410. }
  411. Ext.Msg.confirm(_('warning'),_('properties_remove_confirm'),function(e) {
  412. if (e == 'yes') {
  413. for (var f=0;f<rows.length;f=f+1) {
  414. this.store.remove(rows[f]);
  415. }
  416. }
  417. },this);
  418. }
  419. ,exportProperties: function (btn,e) {
  420. var id = Ext.getCmp('modx-combo-property-set').getValue();
  421. location.href = MODx.config.connector_url+'?action=element/exportProperties&download=1&id='+id+'&data='+this.encode()+'&HTTP_MODAUTH='+MODx.siteId;
  422. }
  423. ,importProperties: function (btn,e) {
  424. this.loadWindow(btn,e,{
  425. xtype: 'modx-window-properties-import'
  426. ,record: this.menu.record
  427. ,listeners: {
  428. 'success': {fn:function(o) {
  429. var s = this.getStore();
  430. var data = o.a.result.object;
  431. /* handle <> in values, desc */
  432. for (var i in data) {
  433. if (data[i][4]) { data[i][4] = data[i][4].replace(/&gt;/g,'>').replace(/&lt;/g,'<'); }
  434. if (data[i][5]) { data[i][5] = data[i][5].replace(/&gt;/g,'>').replace(/&lt;/g,'<'); }
  435. if (data[i][1]) { data[i][1] = data[i][1].replace(/&gt;/g,'>').replace(/&lt;/g,'<'); }
  436. }
  437. s.loadData(data);
  438. /* mark fields dirty */
  439. var recs = s.getRange(0,s.getTotalCount());
  440. for (var i=0;i<recs.length;i++) {
  441. recs[i].markDirty();
  442. }
  443. this.getView().refresh();
  444. },scope:this}
  445. }
  446. });
  447. }
  448. ,_showMenu: function(g,ri,e) {
  449. var sm = this.getSelectionModel();
  450. if (sm.getSelections().length > 1) {
  451. e.stopEvent();
  452. e.preventDefault();
  453. this.menu.removeAll();
  454. this.addContextMenuItem([{
  455. text: _('properties_remove')
  456. ,handler: this.removeMultiple
  457. ,scope: this
  458. }]);
  459. this.menu.show(e.target);
  460. } else {
  461. MODx.grid.ElementProperties.superclass._showMenu.call(this,g,ri,e);
  462. }
  463. }
  464. ,isDefaultPropSet: function() {
  465. var ps = Ext.getCmp('modx-combo-property-set').getValue();
  466. return (ps == 0 || ps == _('default'));
  467. }
  468. ,getMenu: function() {
  469. var def = this.isDefaultPropSet();
  470. var r = this.menu.record;
  471. var m = [];
  472. m.push({
  473. text: _('property_update')
  474. ,scope: this
  475. ,handler: this.update
  476. });
  477. if (r.overridden) {
  478. m.push({
  479. text: _('property_revert')
  480. ,scope: this
  481. ,handler: this.revert
  482. });
  483. }
  484. if ((r.overridden == 2 && !def) || (r.overridden != 1 && def) || (!r.overridden && !def)) {
  485. m.push({
  486. text: _('property_remove')
  487. ,scope: this
  488. ,handler: this.remove.createDelegate(this,[{
  489. title: _('warning')
  490. ,text: _('property_remove_confirm')
  491. }])
  492. });
  493. }
  494. return m;
  495. }
  496. ,propertyChanged: function() {
  497. var ep = Ext.getCmp(this.config.panel);
  498. if (!ep) return false;
  499. var hf = this.config.hiddenPropField || 'props';
  500. ep.getForm().findField(hf).setValue('1');
  501. ep.fireEvent('fieldChange',{
  502. field: hf
  503. ,form: ep.getForm()
  504. });
  505. return true;
  506. }
  507. });
  508. Ext.reg('modx-grid-element-properties',MODx.grid.ElementProperties);
  509. MODx.grid.ElementPropertyOption = function(config) {
  510. config = config || {};
  511. Ext.applyIf(config,{
  512. title: _('property_options')
  513. ,id: 'modx-grid-element-property-options'
  514. ,autoHeight: true
  515. ,maxHeight: 300
  516. ,width: '100%'
  517. ,fields: ['text','value','name']
  518. ,data: []
  519. ,columns: [{
  520. header: _('name')
  521. ,dataIndex: 'text'
  522. ,width: 150
  523. ,editor: { xtype: 'textfield' ,allowBlank: false }
  524. },{
  525. header: _('value')
  526. ,dataIndex: 'value'
  527. ,id: 'value'
  528. ,width: 250
  529. ,editor: { xtype: 'textfield' ,allowBlank: true }
  530. }]
  531. ,tbar: [{
  532. text: _('property_option_create')
  533. ,cls: 'primary-button'
  534. ,handler: this.create
  535. ,scope: this
  536. }]
  537. });
  538. MODx.grid.ElementPropertyOption.superclass.constructor.call(this,config);
  539. this.optRecord = Ext.data.Record.create([{name: 'text'},{name: 'value'}]);
  540. };
  541. Ext.extend(MODx.grid.ElementPropertyOption,MODx.grid.LocalGrid,{
  542. create: function(btn,e) {
  543. this.loadWindow(btn,e,{
  544. xtype: 'modx-window-element-property-option-create'
  545. ,listeners: {
  546. 'success': {fn:function(r) {
  547. var rec = new this.optRecord({
  548. text: r.text
  549. ,value: r.value
  550. });
  551. this.getStore().add(rec);
  552. },scope:this}
  553. }
  554. });
  555. }
  556. ,getMenu: function() {
  557. return [{
  558. text: _('property_option_remove')
  559. ,scope: this
  560. ,handler: this.remove.createDelegate(this,[{
  561. title: _('warning')
  562. ,text: _('property_option_remove_confirm')
  563. }])
  564. }];
  565. }
  566. });
  567. Ext.reg('modx-grid-element-property-options',MODx.grid.ElementPropertyOption);
  568. /**
  569. * @class MODx.window.CreateElementProperty
  570. * @extends MODx.Window
  571. * @param {Object} config An object of configuration properties
  572. * @xtype modx-window-element-property-create
  573. */
  574. MODx.window.CreateElementProperty = function(config) {
  575. config = config || {};
  576. Ext.applyIf(config,{
  577. title: _('property_create')
  578. ,id: 'modx-window-element-property-create'
  579. // ,height: 250
  580. ,width: 600
  581. ,saveBtnText: _('done')
  582. ,fields: [{
  583. layout: 'column'
  584. ,border: false
  585. ,defaults: {
  586. layout: 'form'
  587. ,labelAlign: 'top'
  588. ,anchor: '100%'
  589. ,border: false
  590. }
  591. ,items: [{
  592. columnWidth: .6
  593. ,items: [{
  594. fieldLabel: _('name')
  595. ,description: MODx.expandHelp ? '' : _('property_name_desc')
  596. ,name: 'name'
  597. ,id: 'modx-cep-name'
  598. ,xtype: 'textfield'
  599. ,anchor: '100%'
  600. ,allowBlank: false
  601. },{
  602. xtype: MODx.expandHelp ? 'label' : 'hidden'
  603. ,forId: 'modx-cep-name'
  604. ,html: _('property_name_desc')
  605. ,cls: 'desc-under'
  606. },{
  607. fieldLabel: _('description')
  608. ,description: MODx.expandHelp ? '' : _('property_description_desc')
  609. ,name: 'desc'
  610. ,id: 'modx-cep-desc'
  611. ,xtype: 'textarea'
  612. ,anchor: '100%'
  613. ,height: 120
  614. },{
  615. xtype: MODx.expandHelp ? 'label' : 'hidden'
  616. ,forId: 'modx-cep-description'
  617. ,html: _('property_description_desc')
  618. ,cls: 'desc-under'
  619. }]
  620. },{
  621. columnWidth: .4
  622. ,items: [{
  623. fieldLabel: _('type')
  624. ,description: MODx.expandHelp ? '' : _('property_xtype_desc')
  625. ,name: 'xtype'
  626. ,id: 'modx-cep-xtype'
  627. ,xtype: 'modx-combo-xtype'
  628. ,anchor: '100%'
  629. ,listeners: {
  630. 'select': {fn:function(cb) {
  631. var g = Ext.getCmp('modx-cep-grid-element-property-options');
  632. if (!g) return;
  633. if (cb.getValue() == 'list' || cb.getValue() == 'color') {
  634. g.show();
  635. } else {
  636. g.hide();
  637. }
  638. this.syncSize();
  639. },scope:this}
  640. }
  641. },{
  642. xtype: MODx.expandHelp ? 'label' : 'hidden'
  643. ,forId: 'modx-cep-xtype'
  644. ,html: _('property_xtype_desc')
  645. ,cls: 'desc-under'
  646. },{
  647. xtype: 'textfield'
  648. ,fieldLabel: _('lexicon')
  649. ,description: MODx.expandHelp ? '' : _('property_lexicon_desc')
  650. ,name: 'lexicon'
  651. ,id: 'modx-cep-lexicon'
  652. ,anchor: '100%'
  653. ,allowBlank: true
  654. },{
  655. xtype: MODx.expandHelp ? 'label' : 'hidden'
  656. ,forId: 'modx-cep-lexicon'
  657. ,html: _('property_lexicon_desc')
  658. ,cls: 'desc-under'
  659. },{
  660. xtype: 'textfield'
  661. ,fieldLabel: _('area')
  662. ,description: MODx.expandHelp ? '' : _('property_area_desc')
  663. ,name: 'area'
  664. ,id: 'modx-cep-area'
  665. ,anchor: '100%'
  666. ,allowBlank: true
  667. },{
  668. xtype: MODx.expandHelp ? 'label' : 'hidden'
  669. ,forId: 'modx-cep-area'
  670. ,html: _('property_area_desc')
  671. ,cls: 'desc-under'
  672. }]
  673. }]
  674. },{
  675. xtype: 'modx-element-value-field'
  676. ,xtypeField: 'modx-cep-xtype'
  677. ,id: 'modx-cep-value'
  678. ,anchor: '100%'
  679. },{
  680. xtype: 'modx-grid-element-property-options'
  681. ,id: 'modx-cep-grid-element-property-options'
  682. ,anchor: '100%'
  683. }]
  684. ,keys: []
  685. });
  686. MODx.window.CreateElementProperty.superclass.constructor.call(this,config);
  687. this.on('show',this.onShow,this);
  688. };
  689. Ext.extend(MODx.window.CreateElementProperty,MODx.Window,{
  690. submit: function() {
  691. var v = this.fp.getForm().getValues();
  692. var g = Ext.getCmp('modx-cep-grid-element-property-options');
  693. var opt = eval(g.encode());
  694. Ext.apply(v,{
  695. options: opt
  696. });
  697. if (this.fp.getForm().isValid()) {
  698. if (this.fireEvent('success',v)) {
  699. this.fp.getForm().reset();
  700. this.hide();
  701. return true;
  702. }
  703. }
  704. return false;
  705. }
  706. ,onShow: function() {
  707. var g = Ext.getCmp('modx-cep-grid-element-property-options');
  708. g.getStore().removeAll();
  709. g.hide();
  710. this.syncSize();
  711. this.center();
  712. }
  713. });
  714. Ext.reg('modx-window-element-property-create',MODx.window.CreateElementProperty);
  715. /**
  716. * @class MODx.window.UpdateElementProperty
  717. * @extends MODx.Window
  718. * @param {Object} config An object of configuration properties
  719. * @xtype modx-window-element-property-update
  720. */
  721. MODx.window.UpdateElementProperty = function(config) {
  722. config = config || {};
  723. Ext.applyIf(config,{
  724. title: _('property_update')
  725. ,id: 'modx-window-element-property-update'
  726. // ,height: 250
  727. ,width: 600
  728. ,saveBtnText: _('done')
  729. ,forceLayout: true
  730. ,fields: [{
  731. layout: 'column'
  732. ,border: false
  733. ,defaults: {
  734. layout: 'form'
  735. ,labelAlign: 'top'
  736. ,anchor: '100%'
  737. ,border: false
  738. }
  739. ,items: [{
  740. columnWidth: .6
  741. ,items: [{
  742. fieldLabel: _('name')
  743. ,description: MODx.expandHelp ? '' : _('property_name_desc')
  744. ,name: 'name'
  745. ,id: 'modx-uep-name'
  746. ,xtype: 'textfield'
  747. ,anchor: '100%'
  748. },{
  749. xtype: MODx.expandHelp ? 'label' : 'hidden'
  750. ,forId: 'modx-uep-name'
  751. ,html: _('property_name_desc')
  752. ,cls: 'desc-under'
  753. },{
  754. fieldLabel: _('description')
  755. ,description: MODx.expandHelp ? '' : _('property_description_desc')
  756. ,name: 'desc'
  757. ,id: 'modx-uep-desc'
  758. ,xtype: 'textarea'
  759. ,anchor: '100%'
  760. ,height: 120
  761. },{
  762. xtype: MODx.expandHelp ? 'label' : 'hidden'
  763. ,forId: 'modx-uep-description'
  764. ,html: _('property_description_desc')
  765. ,cls: 'desc-under'
  766. }]
  767. },{
  768. columnWidth: .4
  769. ,items: [{
  770. fieldLabel: _('type')
  771. ,description: MODx.expandHelp ? '' : _('property_xtype_desc')
  772. ,name: 'xtype'
  773. ,xtype: 'modx-combo-xtype'
  774. ,id: 'modx-uep-xtype'
  775. ,anchor: '100%'
  776. ,listeners: {
  777. 'select': {fn:function(cb) {
  778. var g = Ext.getCmp('modx-uep-grid-element-property-options');
  779. if (!g) return;
  780. var v = cb.getValue();
  781. if (v == 'list' || v == 'color') {
  782. g.show();
  783. } else {
  784. g.hide();
  785. }
  786. this.syncSize();
  787. },scope:this}
  788. }
  789. },{
  790. xtype: MODx.expandHelp ? 'label' : 'hidden'
  791. ,forId: 'modx-uep-xtype'
  792. ,html: _('property_xtype_desc')
  793. ,cls: 'desc-under'
  794. },{
  795. xtype: 'textfield'
  796. ,fieldLabel: _('lexicon')
  797. ,description: MODx.expandHelp ? '' : _('property_lexicon_desc')
  798. ,name: 'lexicon'
  799. ,id: 'modx-uep-lexicon'
  800. ,anchor: '100%'
  801. ,allowBlank: true
  802. },{
  803. xtype: MODx.expandHelp ? 'label' : 'hidden'
  804. ,forId: 'modx-uep-lexicon'
  805. ,html: _('property_lexicon_desc')
  806. ,cls: 'desc-under'
  807. },{
  808. xtype: 'textfield'
  809. ,fieldLabel: _('area')
  810. ,description: MODx.expandHelp ? '' : _('property_area_desc')
  811. ,name: 'area'
  812. ,id: 'modx-uep-area'
  813. ,anchor: '100%'
  814. ,allowBlank: true
  815. },{
  816. xtype: MODx.expandHelp ? 'label' : 'hidden'
  817. ,forId: 'modx-uep-area'
  818. ,html: _('property_area_desc')
  819. ,cls: 'desc-under'
  820. }]
  821. }]
  822. },{
  823. xtype: 'hidden'
  824. ,name: 'overridden'
  825. ,id: 'modx-uep-overridden'
  826. },{
  827. xtype: 'modx-element-value-field'
  828. ,xtypeField: 'modx-uep-xtype'
  829. ,name: 'value'
  830. ,id: 'modx-uep-value'
  831. ,anchor: '100%'
  832. },{
  833. id: 'modx-uep-grid-element-property-options'
  834. ,xtype: 'modx-grid-element-property-options'
  835. ,autoHeight: true
  836. }]
  837. ,keys: []
  838. });
  839. MODx.window.UpdateElementProperty.superclass.constructor.call(this,config);
  840. this.on('show',this.onShow,this);
  841. };
  842. Ext.extend(MODx.window.UpdateElementProperty,MODx.Window,{
  843. submit: function() {
  844. var v = this.fp.getForm().getValues();
  845. var g = Ext.getCmp('modx-uep-grid-element-property-options');
  846. var opt = eval(g.encode());
  847. Ext.apply(v,{
  848. options: opt
  849. });
  850. if (this.fp.getForm().isValid()) {
  851. if (this.fireEvent('success',v)) {
  852. this.fp.getForm().reset();
  853. this.hide();
  854. return true;
  855. }
  856. }
  857. return false;
  858. }
  859. ,onShow: function() {
  860. var g = Ext.getCmp('modx-uep-grid-element-property-options');
  861. if (!g) return;
  862. if (this.fp.getForm().findField('xtype').getValue() == 'list' || this.fp.getForm().findField('xtype').getValue() == 'color') {
  863. g.show();
  864. } else {
  865. g.hide();
  866. }
  867. g.getStore().removeAll();
  868. var gp = Ext.getCmp('modx-grid-element-properties');
  869. var rec = gp.getSelectionModel().getSelected();
  870. if (rec) {
  871. var opt = rec.data.options;
  872. var opts = [];
  873. for (var x in opt) {
  874. if (opt.hasOwnProperty(x)) {
  875. opts.push([opt[x].text,opt[x].value]);
  876. }
  877. }
  878. g.getStore().loadData(opts);
  879. }
  880. this.syncSize();
  881. this.center();
  882. }
  883. });
  884. Ext.reg('modx-window-element-property-update',MODx.window.UpdateElementProperty);
  885. /**
  886. * @class MODx.window.CreateElementPropertyOption
  887. * @extends MODx.Window
  888. * @param {Object} config An object of configuration properties
  889. * @xtype modx-window-element-property-option-create
  890. */
  891. MODx.window.CreateElementPropertyOption = function(config) {
  892. config = config || {};
  893. Ext.applyIf(config,{
  894. title: _('property_option_create')
  895. ,id: 'modx-window-element-property-option-create'
  896. // ,height: 250
  897. // ,width: 450
  898. ,saveBtnText: _('done')
  899. ,fields: [{
  900. fieldLabel: _('name')
  901. ,name: 'text'
  902. ,id: 'modx-cepo-text'
  903. ,xtype: 'textfield'
  904. ,anchor: '100%'
  905. },{
  906. fieldLabel: _('value')
  907. ,name: 'value'
  908. ,id: 'modx-cepo-value'
  909. ,xtype: 'textfield'
  910. ,anchor: '100%'
  911. }]
  912. });
  913. MODx.window.CreateElementPropertyOption.superclass.constructor.call(this,config);
  914. };
  915. Ext.extend(MODx.window.CreateElementPropertyOption,MODx.Window,{
  916. submit: function() {
  917. if (this.fp.getForm().isValid()) {
  918. if (this.fireEvent('success',this.fp.getForm().getValues())) {
  919. this.fp.getForm().reset();
  920. this.hide();
  921. return true;
  922. }
  923. }
  924. return false;
  925. }
  926. });
  927. Ext.reg('modx-window-element-property-option-create',MODx.window.CreateElementPropertyOption);
  928. /**
  929. * Displays a xtype combobox
  930. *
  931. * @class MODx.combo.xType
  932. * @extends Ext.form.ComboBox
  933. * @param {Object} config An object of configuration properties
  934. * @xtype modx-combo-xtype
  935. */
  936. MODx.combo.xType = function(config) {
  937. config = config || {};
  938. Ext.applyIf(config,{
  939. store: new Ext.data.SimpleStore({
  940. fields: ['d','v']
  941. ,data: [
  942. [_('textfield'),'textfield']
  943. ,[_('textarea'),'textarea']
  944. ,[_('yesno'),'combo-boolean']
  945. ,[_('date'),'datefield']
  946. ,[_('list'),'list']
  947. ,[_('integer'),'numberfield']
  948. ,[_('file'),'file']
  949. ,[_('color'),'color']
  950. ]
  951. })
  952. ,displayField: 'd'
  953. ,valueField: 'v'
  954. ,mode: 'local'
  955. ,name: 'xtype'
  956. ,hiddenName: 'xtype'
  957. ,triggerAction: 'all'
  958. ,editable: false
  959. ,selectOnFocus: false
  960. ,value: 'textfield'
  961. });
  962. MODx.combo.xType.superclass.constructor.call(this,config);
  963. };
  964. Ext.extend(MODx.combo.xType,Ext.form.ComboBox);
  965. Ext.reg('modx-combo-xtype',MODx.combo.xType);
  966. MODx.form.ElementValueField = function(config) {
  967. config = config || {};
  968. Ext.applyIf(config,{
  969. fieldLabel: _('value')
  970. ,name: 'value'
  971. ,xtype: 'textfield'
  972. });
  973. MODx.form.ElementValueField.superclass.constructor.call(this,config);
  974. this.config = config;
  975. this.on('change',this.checkValue,this);
  976. };
  977. Ext.extend(MODx.form.ElementValueField,Ext.form.TextField,{
  978. checkValue: function(fld,nv,ov) {
  979. var t = Ext.getCmp(this.config.xtypeField).getValue();
  980. var v = fld.getValue();
  981. if (t == 'combo-boolean') {
  982. v = (v == '1' || v == 'true' || v == 1 || v == true || v == _('yes') || v == 'yes') ? 1 : 0;
  983. fld.setValue(v);
  984. }
  985. }
  986. });
  987. Ext.reg('modx-element-value-field',MODx.form.ElementValueField);
  988. MODx.combo.PropertySet = function(config) {
  989. config = config || {};
  990. Ext.applyIf(config,{
  991. name: 'propertyset'
  992. ,hiddenName: 'propertyset'
  993. ,url: MODx.config.connector_url
  994. ,baseParams: {
  995. action: 'element/propertyset/getList'
  996. }
  997. ,displayField: 'name'
  998. ,valueField: 'id'
  999. ,fields: ['id','name','description','properties']
  1000. ,editable: false
  1001. ,value: 0
  1002. ,pageSize: 10
  1003. });
  1004. MODx.combo.PropertySet.superclass.constructor.call(this,config);
  1005. };
  1006. Ext.extend(MODx.combo.PropertySet,MODx.combo.ComboBox);
  1007. Ext.reg('modx-combo-property-set',MODx.combo.PropertySet);
  1008. /**
  1009. * @class MODx.window.AddPropertySet
  1010. * @extends MODx.Window
  1011. * @param {Object} config An object of configuration properties
  1012. * @xtype modx-window-element-property-set-add
  1013. */
  1014. MODx.window.AddPropertySet = function(config) {
  1015. config = config || {};
  1016. Ext.applyIf(config,{
  1017. title: _('propertyset_add')
  1018. ,id: 'modx-window-element-property-set-add'
  1019. ,url: MODx.config.connector_url
  1020. ,action: 'element/propertyset/associate'
  1021. ,autoHeight: true // makes window grow when the fieldset is toggled
  1022. ,fields: [{
  1023. xtype: 'hidden'
  1024. ,name: 'elementId'
  1025. ,id: 'modx-aps-elementId'
  1026. },{
  1027. xtype: 'hidden'
  1028. ,name: 'elementType'
  1029. ,id: 'modx-aps-elementType'
  1030. },{
  1031. html: _('propertyset_panel_desc')
  1032. ,xtype: 'modx-description'
  1033. },MODx.PanelSpacer,{
  1034. xtype: 'modx-combo-property-set'
  1035. ,fieldLabel: _('propertyset')
  1036. ,name: 'propertyset'
  1037. ,id: 'modx-aps-propertyset'
  1038. ,anchor: '100%'
  1039. ,baseParams: {
  1040. action: 'element/propertyset/getList'
  1041. ,showNotAssociated: true
  1042. ,elementId: config.record.elementId
  1043. ,elementType: config.record.elementType
  1044. }
  1045. },{
  1046. xtype: 'hidden'
  1047. ,name: 'propertyset_new'
  1048. ,id: 'modx-aps-propertyset-new'
  1049. ,value: false
  1050. },{
  1051. xtype: 'fieldset'
  1052. ,title: _('propertyset_create_new')
  1053. ,autoHeight: true
  1054. ,checkboxToggle: true
  1055. ,collapsed: true
  1056. ,forceLayout: true
  1057. ,id: 'modx-aps-propertyset-new-fs'
  1058. ,listeners: {
  1059. 'expand': {fn:function(p) {
  1060. Ext.getCmp('modx-aps-propertyset-new').setValue(true);
  1061. this.center(); // re-centers window on screen after height changed
  1062. },scope:this}
  1063. ,'collapse': {fn:function(p) {
  1064. Ext.getCmp('modx-aps-propertyset-new').setValue(false);
  1065. this.center(); // re-centers window on screen after height changed
  1066. },scope:this}
  1067. }
  1068. ,items: [{
  1069. xtype: 'textfield'
  1070. ,fieldLabel: _('name')
  1071. ,name: 'name'
  1072. ,id: 'modx-aps-name'
  1073. ,anchor: '100%'
  1074. },{
  1075. xtype: 'textarea'
  1076. ,fieldLabel: _('description')
  1077. ,name: 'description'
  1078. ,id: 'modx-aps-description'
  1079. ,anchor: '100%'
  1080. ,grow: true
  1081. }]
  1082. }]
  1083. });
  1084. MODx.window.AddPropertySet.superclass.constructor.call(this,config);
  1085. };
  1086. Ext.extend(MODx.window.AddPropertySet,MODx.Window);
  1087. Ext.reg('modx-window-element-property-set-add',MODx.window.AddPropertySet);
  1088. MODx.window.ImportProperties = function(config) {
  1089. config = config || {};
  1090. Ext.applyIf(config,{
  1091. title: _('properties_import')
  1092. ,id: 'modx-window-properties-import'
  1093. ,url: MODx.config.connector_url
  1094. ,action: 'element/importProperties'
  1095. ,fileUpload: true
  1096. ,saveBtnText: _('import')
  1097. ,fields: [{
  1098. html: _('properties_import_msg')
  1099. ,id: 'modx-impp-desc'
  1100. ,style: 'margin-bottom: 10px;'
  1101. ,xtype: 'modx-description'
  1102. },{
  1103. xtype: 'fileuploadfield'
  1104. ,fieldLabel: _('file')
  1105. ,buttonText: _('upload.buttons.upload')
  1106. ,name: 'file'
  1107. ,id: 'modx-impp-file'
  1108. ,anchor: '100%'
  1109. // ,inputType: 'file'
  1110. }]
  1111. });
  1112. MODx.window.ImportProperties.superclass.constructor.call(this,config);
  1113. // Trigger "fileselected" event
  1114. var fp = Ext.getCmp('modx-impp-file');
  1115. var onFileUploadFieldFileSelected = function(fp, fakeFilePath) {
  1116. var fileApi = fp.fileInput.dom.files;
  1117. fp.el.dom.value = (typeof fileApi != 'undefined') ? fileApi[0].name : fakeFilePath.replace("C:\\fakepath\\", "");
  1118. };
  1119. fp.on('fileselected', onFileUploadFieldFileSelected);
  1120. };
  1121. Ext.extend(MODx.window.ImportProperties,MODx.Window);
  1122. Ext.reg('modx-window-properties-import',MODx.window.ImportProperties);