package.panels.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. /**
  2. * The panel who shows before package installation
  3. *
  4. * @class MODx.panel.PackageMetaPanel
  5. * @extends MODx.Tabs
  6. * @param {Object} config An object of options.
  7. * @xtype modx-package-metapanel
  8. */
  9. MODx.panel.PackageMetaPanel = function(config) {
  10. config = config || {};
  11. Ext.applyIf(config,{
  12. cls: 'vertical-tabs-panel wrapped'
  13. // same as in parent class
  14. // ,headerCfg: { tag: 'div', cls: 'x-tab-panel-header vertical-tabs-header' }
  15. // ,bwrapCfg: { tag: 'div', cls: 'x-tab-panel-bwrap vertical-tabs-bwrap' }
  16. // ,defaults: {
  17. // bodyCssClass: 'vertical-tabs-body'
  18. // ,autoScroll: true
  19. // ,autoHeight: true
  20. // ,autoWidth: true
  21. // }
  22. // ,layoutOnTabChange: true
  23. // ,listeners:{
  24. // tabchange: function(tb, pnl){
  25. // w = this.bwrap.getWidth();
  26. // this.body.setWidth(w);
  27. // this.doLayout();
  28. // }
  29. // ,scope: this
  30. // }
  31. ,items: []
  32. });
  33. MODx.panel.PackageMetaPanel.superclass.constructor.call(this,config);
  34. };
  35. Ext.extend(MODx.panel.PackageMetaPanel,MODx.VerticalTabs,{
  36. updatePanel: function(meta, record){
  37. if(meta.changelog != undefined){
  38. this.addTab(_('changelog'), 'changelog', meta);
  39. }
  40. if(meta.requires != undefined){
  41. this.addDependenciesTab(_('dependencies'), 'dependencies', meta, record);
  42. }
  43. if(meta.readme != undefined){
  44. this.addTab(_('readme'), 'readme', meta);
  45. }
  46. if(meta.license != undefined){
  47. this.addTab(_('license'), 'license', meta);
  48. }
  49. this.setActiveTab(0);
  50. Ext.getCmp('modx-content').doLayout();
  51. }
  52. ,addTab: function(title, id, data){
  53. var tab = this.getItem(id);
  54. if (!tab) {
  55. this.add({
  56. title: title
  57. ,xtype:'modx-template-panel'
  58. ,id: id +'-tab'
  59. ,markup: '{'+id+'}'
  60. ,bodyCssClass: 'meta-wrapper'
  61. ,listeners: {
  62. afterrender: function() {
  63. this.updateDetail( data );
  64. }
  65. }
  66. });
  67. } else {
  68. tab.updateDetail(data);
  69. }
  70. }
  71. ,addDependenciesTab: function(title, id, data, pkgInfo){
  72. var tab = this.getItem(id);
  73. if (!tab) {
  74. this.add({
  75. title: title
  76. ,xtype:'modx-panel-package-dependencies'
  77. ,metaPanel: this
  78. ,pkgInfo: pkgInfo
  79. ,id: id +'-tab'
  80. ,height: '1000px'
  81. ,width: 500
  82. });
  83. } else {
  84. Ext.getCmp('modx-grid-package-dependencies').refresh();
  85. }
  86. }
  87. });
  88. Ext.reg('modx-package-meta-panel',MODx.panel.PackageMetaPanel);
  89. /**
  90. * The panel who shows before package installation
  91. *
  92. * @class MODx.panel.PackageBeforeInstall
  93. * @extends MODx.panel.PackageMetaPanel
  94. * @param {Object} config An object of options.
  95. * @xtype modx-package-beforeinstall
  96. */
  97. MODx.panel.PackageBeforeInstall = function(config) {
  98. config = config || {};
  99. this.setupOptions = null;
  100. Ext.applyIf(config,{});
  101. MODx.panel.PackageBeforeInstall.superclass.constructor.call(this,config);
  102. };
  103. Ext.extend(MODx.panel.PackageBeforeInstall, MODx.panel.PackageMetaPanel,{
  104. activate: function(){
  105. Ext.getCmp(this.ownerCt.id).getLayout().setActiveItem(this.id);
  106. this.removeAll();
  107. }
  108. ,updateBreadcrumbs: function(msg, rec){
  109. var bc = Ext.getCmp('packages-breadcrumbs');
  110. var bd = bc.getData();
  111. bd.text = msg;
  112. bd.trail.shift();
  113. if (bd.trail.length > 0) {
  114. bd.trail[bd.trail.length - 1].install = true;
  115. }
  116. /* Get the package name. By default it's stored in data.name,
  117. but in case of package update, the name is stored in data.package_name. */
  118. var name = rec.data.name;
  119. if (name === undefined) {
  120. name = rec.data.package_name
  121. }
  122. var newBcItem = {
  123. text : _('install') + ' ' + name
  124. ,rec: rec
  125. };
  126. bd.trail.push(newBcItem);
  127. bc.updateDetail(bd);
  128. }
  129. ,updatePanel: function(meta, record){
  130. var installBtn = Ext.getCmp('package-install-btn');
  131. var setupoptionsBtn = Ext.getCmp('package-show-setupoptions-btn');
  132. this.updateBreadcrumbs(_('license_agreement_desc'), record);
  133. Ext.getCmp('package-list-reset').show();
  134. installBtn.hide().signature = '';
  135. setupoptionsBtn.hide();
  136. if(meta.changelog != undefined){
  137. this.addTab(_('changelog'), 'changelog', meta);
  138. }
  139. if(meta.requires != undefined){
  140. this.addDependenciesTab('Dependencies', 'dependencies', meta, record);
  141. } else {
  142. setupoptionsBtn.enable().setText(_('setup_options')).syncSize();
  143. installBtn.enable().setText(_('continue')).syncSize();
  144. }
  145. if(meta.readme != undefined){
  146. this.addTab(_('readme'), 'readme', meta);
  147. }
  148. if(meta.license != undefined){
  149. this.addTab(_('license'), 'license', meta);
  150. }
  151. if(meta['setup-options'] != null && meta['setup-options'] != ''){
  152. setupoptionsBtn.show().signature = record.data.signature;
  153. this.setupOptions = meta['setup-options'];
  154. } else {
  155. installBtn.show().signature = record.data.signature;
  156. }
  157. this.setActiveTab(0);
  158. Ext.getCmp('modx-content').doLayout();
  159. }
  160. ,getOptions: function(){
  161. return this.setupOptions;
  162. }
  163. });
  164. Ext.reg('modx-package-beforeinstall',MODx.panel.PackageBeforeInstall);
  165. /**
  166. * The panel to view package detail
  167. *
  168. * @class MODx.panel.PackageDetails
  169. * @extends MODx.Panel
  170. * @param {Object} config An object of options.
  171. * @xtype modx-package-browser-details
  172. */
  173. MODx.panel.PackageDetails = function(config) {
  174. config = config || {};
  175. Ext.applyIf(config,{
  176. layout: 'column'
  177. ,border: false
  178. ,autoHeight: true
  179. ,items:[{
  180. xtype: 'modx-template-panel'
  181. ,id: 'modx-package-details-metas'
  182. ,columnWidth: 1
  183. ,markup: '<div class="details">'
  184. +'<tpl for=".">'
  185. +'<tpl if="readme">'
  186. +'<div class="item">'
  187. +'<h4>'+_('readme')+'</h4>'
  188. +'{readme}'
  189. +'</div>'
  190. +'</tpl>'
  191. +'<tpl if="changelog">'
  192. +'<div class="item">'
  193. +'<h4>'+_('changelog')+'</h4>'
  194. +'{changelog}'
  195. +'</div>'
  196. +'</tpl>'
  197. +'<tpl if="license">'
  198. +'<div class="item">'
  199. +'<h4>'+_('license')+'</h4>'
  200. +'{license}'
  201. +'</div>'
  202. +'</tpl>'
  203. +'</tpl>'
  204. +'</div>'
  205. },{
  206. xtype: 'modx-template-panel'
  207. ,id: 'modx-package-details-aside'
  208. ,cls: 'aside-details'
  209. ,width: 250
  210. ,markup: '<div class="details">'
  211. +'<tpl for=".">'
  212. +'<div class="selected">'
  213. +'<h5>{package_name}</h5>'
  214. +'</div>'
  215. +'<div class="infos description">'
  216. +'<h4>'+_('information')+'</h4>'
  217. +'<ul>'
  218. +'<li>'
  219. +'<span class="infoname">'+_('signature')+':</span>'
  220. +'<span class="infovalue">{signature}</span>'
  221. +'</li>'
  222. +'<li>'
  223. +'<span class="infoname">'+_('uploaded_on')+':</span>'
  224. +'<span class="infovalue">{created}</span>'
  225. +'</li>'
  226. +'<li>'
  227. +'<span class="infoname">'+_('installed')+':</span>'
  228. +'<span class="infovalue">{installed}</span>'
  229. +'</li>'
  230. +'<li>'
  231. +'<span class="infoname">'+_('last_updated')+':</span>'
  232. +'<span class="infovalue">{updated}</span>'
  233. +'</li>'
  234. +'<li>'
  235. +'<span class="infoname">'+_('provider')+':</span>'
  236. +'<span class="infovalue">{provider}</span>'
  237. +'</li>'
  238. +'</ul>'
  239. +'</div>'
  240. +'</tpl>'
  241. +'</div>'
  242. }]
  243. });
  244. MODx.panel.PackageDetails.superclass.constructor.call(this,config);
  245. };
  246. Ext.extend(MODx.panel.PackageDetails,MODx.Panel,{
  247. activate: function(){
  248. Ext.getCmp(this.ownerCt.id).getLayout().setActiveItem(this.id);
  249. }
  250. ,updateBreadcrumbs: function(msg){
  251. Ext.getCmp('packages-breadcrumbs').updateDetail({
  252. text : msg
  253. ,trail : [{ text : _('package_details') }]
  254. });
  255. }
  256. ,updateDetail: function(rec){
  257. this.updateBreadcrumbs(_('package_details_for',{'package': rec.package_name}));
  258. Ext.getCmp('modx-package-details-metas').updateDetail(rec);
  259. Ext.getCmp('modx-package-details-aside').updateDetail(rec);
  260. }
  261. });
  262. Ext.reg('modx-package-details',MODx.panel.PackageDetails);
  263. MODx.panel.PackageDependencies = function(config) {
  264. config = config || {};
  265. Ext.apply(config,{
  266. border: false
  267. ,baseCls: 'modx-formpanel'
  268. ,cls: 'auto-width'
  269. ,bodyCssClass: 'vertical-tabs-body auto-width auto-height'
  270. ,items: [{
  271. html: _('dependencies')
  272. ,xtype: 'modx-header'
  273. },{
  274. xtype: 'modx-grid-package-dependencies'
  275. ,preventRender: true
  276. ,metaPanel: config.metaPanel
  277. ,pkgInfo: config.pkgInfo
  278. ,dependenciesPanel: this
  279. }]
  280. });
  281. MODx.panel.PackageDependencies.superclass.constructor.call(this,config);
  282. };
  283. Ext.extend(MODx.panel.PackageDependencies,MODx.Panel);
  284. Ext.reg('modx-panel-package-dependencies',MODx.panel.PackageDependencies);
  285. MODx.grid.PackageDependencies = function(config) {
  286. config = config || {};
  287. var cols = [];
  288. cols.push({ header: _('name') ,dataIndex: 'name' ,id:'main-installed' ,renderer: { fn: this.mainColumnRenderer, scope: this } });
  289. cols.push({ header: _('constraints') ,dataIndex: 'constraints', id: 'meta-col', fixed:true, width:160 });
  290. cols.push({ header: _('installed') ,dataIndex: 'installed', id: 'info-col', fixed:true, width: 160 ,renderer: this.installColumnRenderer });
  291. Ext.applyIf(config,{
  292. id: 'modx-grid-package-dependencies'
  293. ,baseParams: {
  294. action: 'workspace/packages/getdependencies'
  295. ,signature: config.pkgInfo.data.signature
  296. }
  297. ,fields: ['name', 'constraints', 'installed', 'parentSignature', 'signature', 'downloaded', 'actions']
  298. ,paging: false
  299. ,loadMask: true
  300. ,tbar: []
  301. ,columns: cols
  302. });
  303. MODx.grid.PackageDependencies.superclass.constructor.call(this,config);
  304. this.store.on('load', function () {
  305. if (!this.checkDependencies()) {
  306. Ext.getCmp('package-show-setupoptions-btn').disable().setText(_('install_dependencies_first')).syncSize();
  307. Ext.getCmp('package-install-btn').disable().setText(_('install_dependencies_first')).syncSize();
  308. config.metaPanel.setActiveTab(1);
  309. }
  310. }, this);
  311. };
  312. Ext.extend(MODx.grid.PackageDependencies,MODx.grid.Package, {
  313. mainColumnRenderer: function (value, metaData, record, rowIndex, colIndex, store) {
  314. var rec = record.data;
  315. var state = (rec.installed !== null) ? ' installed' : ' not-installed';
  316. var values = {name: value, state: state, actions: null, message: null};
  317. var h = [];
  318. if (value === 'php' || value === 'modx') {
  319. values.name = _(value);
  320. if (!rec.installed) {
  321. values.message = [{
  322. className: 'actions red',
  323. text: _(value + '_constraints')
  324. }];
  325. metaData.id = 'main-constraint';
  326. }
  327. } else {
  328. if (rec.downloaded === false && rec.installed === false) {
  329. h.push({className: 'download primary-button', text: _('download')});
  330. metaData.id = 'main'
  331. } else {
  332. if (rec.installed === false) {
  333. h.push({className: 'install primary-button', text: _('install')});
  334. metaData.id = 'main'
  335. }
  336. }
  337. values.actions = h;
  338. }
  339. return this.mainColumnTpl.apply(values);
  340. }
  341. ,installColumnRenderer: function (value, metaData, record, rowIndex, colIndex, store) {
  342. switch (value) {
  343. case '':
  344. case false:
  345. metaData.css = 'not-installed';
  346. if (record.data.name === 'php' || record.data.name === 'modx') {
  347. return _('not_available');
  348. } else {
  349. return _('not_installed');
  350. }
  351. default:
  352. metaData.css = '';
  353. if (record.data.name === 'php' || record.data.name === 'modx') {
  354. return _('available');
  355. } else {
  356. return _('installed');
  357. }
  358. }
  359. }
  360. ,downloadPackage: function(rec) {
  361. this.loadMask.show();
  362. Ext.Ajax.request({
  363. url: MODx.config.connector_url
  364. ,params: {
  365. action: 'workspace/packages/dependency/download'
  366. ,signature: rec.data.parentSignature
  367. ,name: rec.data.name
  368. ,constraints: rec.data.constraints
  369. }
  370. ,method: 'GET'
  371. ,scope: this
  372. ,success: function(result,request) {
  373. this.store.reload();
  374. }
  375. ,failure: function(result,request) {
  376. this.loadMask.hide();
  377. Ext.MessageBox.alert(_('failed'), result.responseText);
  378. }
  379. });
  380. }
  381. ,onClick: function(e){
  382. var t = e.getTarget();
  383. var elm = t.className.split(' ')[0];
  384. if(elm == 'controlBtn'){
  385. var act = t.className.split(' ')[1];
  386. var record = this.getSelectionModel().getSelected();
  387. this.menu.record = record.data;
  388. switch (act) {
  389. case 'install':
  390. case 'reinstall':
  391. this.install(record);
  392. break;
  393. case 'download':
  394. this.downloadPackage(record);
  395. break;
  396. default:
  397. break;
  398. }
  399. }
  400. }
  401. ,checkDependencies: function() {
  402. var installed = this.store.collect('installed', true);
  403. return installed.indexOf(false) == -1;
  404. }
  405. });
  406. Ext.reg('modx-grid-package-dependencies',MODx.grid.PackageDependencies);