admintools.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. let AdminTools = function (config) {
  2. config = config || {};
  3. AdminTools.superclass.constructor.call(this, config);
  4. };
  5. Ext.extend(AdminTools, Ext.Component, {
  6. page: {}, window: {}, grid: {}, tree: {}, panel: {}, combo: {}, config: {}, view: {}, utils: {}, toolbar: {},
  7. lock: function () {
  8. MODx.Ajax.request({
  9. url: adminToolsSettings.config.connector_url,
  10. params: {
  11. action: 'mgr/system/lock'
  12. },
  13. listeners: {
  14. success: {
  15. fn: function(response) {
  16. document.location.reload();
  17. },
  18. scope: this
  19. }
  20. }
  21. });
  22. },
  23. setTimeout: function (time) {
  24. return setTimeout(function () {
  25. AdminTools.lock();
  26. }, time)
  27. },
  28. syncMessageCounter: function () {
  29. if (AdminTools.messageCounterEl === undefined) {
  30. AdminTools.messageCounterEl = document.getElementById('message-counter');
  31. }
  32. let counter = this.getMessageCounter();
  33. AdminTools.messageCounterEl.innerText = (counter == 0) ? '' : counter;
  34. },
  35. getMessageCounter: function () {
  36. return adminToolsSettings.config.messages;
  37. },
  38. increaseMessageCounter: function () {
  39. adminToolsSettings.config.messages++;
  40. this.syncMessageCounter();
  41. return adminToolsSettings.config.messages;
  42. },
  43. decreaseMessageCounter: function () {
  44. adminToolsSettings.config.messages--;
  45. if (adminToolsSettings.config.messages < 0) {
  46. adminToolsSettings.config.messages = 0;
  47. }
  48. this.syncMessageCounter();
  49. return adminToolsSettings.config.messages;
  50. },
  51. });
  52. Ext.reg('admintools', AdminTools);
  53. AdminTools = new AdminTools();
  54. AdminTools.utils.renderBoolean = function (value, props, row) {
  55. return value
  56. ? String.format('<span class="green">{0}</span>', _('yes'))
  57. : String.format('<span class="red">{0}</span>', _('no'));
  58. };
  59. AdminTools.utils.renderPrincipalType = function (value, props, row) {
  60. let output;
  61. switch (value) {
  62. case 'grp':
  63. output = '<i class="icon icon-group"></i>';
  64. break;
  65. case 'usr':
  66. output = '<i class="icon icon-user"></i>';
  67. break;
  68. default:
  69. output = '';
  70. break;
  71. }
  72. return output;
  73. };
  74. AdminTools.utils.getMenu = function (actions, grid, selected) {
  75. let menu = [];
  76. let cls, icon, title, action = '';
  77. for (let i in actions) {
  78. if (!actions.hasOwnProperty(i)) {
  79. continue;
  80. }
  81. let a = actions[i];
  82. if (!a['menu']) {
  83. if (a == '-') {
  84. menu.push('-');
  85. }
  86. continue;
  87. }
  88. else if (menu.length > 0 && /^remove/i.test(a['action'])) {
  89. menu.push('-');
  90. }
  91. if (selected.length > 1) {
  92. if (!a['multiple']) {
  93. continue;
  94. }
  95. else if (typeof(a['multiple']) == 'string') {
  96. a['title'] = a['multiple'];
  97. }
  98. }
  99. cls = a['cls'] ? a['cls'] : '';
  100. icon = a['icon'] ? a['icon'] : '';
  101. title = a['title'] ? a['title'] : a['title'];
  102. action = a['action'] ? grid[a['action']] : '';
  103. menu.push({
  104. handler: action,
  105. text: String.format(
  106. '<span class="{0}"><i class="x-menu-item-icon {1}"></i>{2}</span>',
  107. cls, icon, title
  108. ),
  109. });
  110. }
  111. return menu;
  112. };
  113. AdminTools.utils.renderActions = function (value, props, row) {
  114. let res = [];
  115. let cls, icon, title, action, item = '';
  116. for (let i in row.data.actions) {
  117. if (!row.data.actions.hasOwnProperty(i)) {
  118. continue;
  119. }
  120. let a = row.data.actions[i];
  121. if (!a['button']) {
  122. continue;
  123. }
  124. cls = a['cls'] ? a['cls'] : '';
  125. icon = a['icon'] ? a['icon'] : '';
  126. action = a['action'] ? a['action'] : '';
  127. title = a['title'] ? a['title'] : '';
  128. item = String.format(
  129. '<li class="{0}"><button class="btn btn-default {1}" action="{2}" title="{3}"></button></li>',
  130. cls, icon, action, title
  131. );
  132. res.push(item);
  133. }
  134. return String.format(
  135. '<ul class="admintools-row-actions">{0}</ul>',
  136. res.join('')
  137. );
  138. };
  139. // Status
  140. AdminTools.combo.SearchTypes = function(config) {
  141. config = config || {};
  142. Ext.applyIf(config,{
  143. triggerAction: 'all',
  144. typeAhead: true,
  145. mode: 'local',
  146. hideMode: 'offsets',
  147. autoScroll: true,
  148. maxHeight: 200,
  149. store: [[1,_('admintools_search_everywhere')],[2,_('admintools_search_in_titles')],[3,_('admintools_search_in_text')],[4,_('admintools_search_in_tags')]],
  150. hiddenName: 'wheresearch',
  151. editable: true
  152. });
  153. AdminTools.combo.SearchTypes.superclass.constructor.call(this,config);
  154. };
  155. Ext.extend(AdminTools.combo.SearchTypes,MODx.combo.ComboBox);
  156. Ext.reg('admintools-combo-wheresearch',AdminTools.combo.SearchTypes);
  157. Ext.onReady(function () {
  158. let theme = '', region = '';
  159. //let adminToolsSettings = adminToolsSettings || {config:{theme:'', region:'west'}};
  160. if (adminToolsSettings) {
  161. theme = adminToolsSettings.config.theme;
  162. region = adminToolsSettings.config.region;
  163. }
  164. if (theme) Ext.getBody().addClass(theme);
  165. if (region == 'east') {
  166. Ext.getBody().addClass('right-side-tree');
  167. let contentNode = Ext.get('modx-content'),
  168. actionButtonsNode = Ext.get('modx-action-buttons-container');
  169. if (actionButtonsNode) actionButtonsNode.appendTo(contentNode);
  170. }
  171. let Items = Ext.query('ul.modx-subsubnav');
  172. for (let i = 0; Items.length > i; i++) {
  173. Items[i].parentNode.classList.add('has-subnav');
  174. }
  175. // Lock
  176. if (adminToolsSettings.config.show_lockmenu > 0) {
  177. let userMenuList = document.querySelector('#limenu-user ul.modx-subnav');
  178. let newLi = document.createElement('li');
  179. newLi.id = 'admintools-lock';
  180. newLi.innerHTML = '<a href="javascript:AdminTools.lock()">' + _('admintools_lock') + ' <span class="description">' + _('admintools_lock_desc') + '</span></a>';
  181. setTimeout(function () {
  182. if (userMenuList) userMenuList.insertBefore(newLi, userMenuList.lastChild);
  183. }, 300);
  184. }
  185. if (adminToolsSettings.config.lock_timeout > 0) {
  186. let lockTimeout = AdminTools.setTimeout(adminToolsSettings.config.lock_timeout);
  187. ['mousemove','keydown','wheel','click','contextmenu'].forEach(function(event) {
  188. Ext.select('body').on(event, function(e) {
  189. clearTimeout(lockTimeout);
  190. lockTimeout = AdminTools.setTimeout(adminToolsSettings.config.lock_timeout);
  191. });
  192. });
  193. }
  194. // Messages
  195. if (adminToolsSettings.config.messages >= 0) {
  196. Ext.ComponentMgr.onAvailable('modx-grid-message', function () {
  197. this.getStore().on("update", function (g, p, o) {
  198. if (o == 'commit') {
  199. if (p.data.read) {
  200. AdminTools.decreaseMessageCounter();
  201. } else {
  202. AdminTools.increaseMessageCounter();
  203. }
  204. }
  205. }, this);
  206. this.on('afterRemoveRow', function (r) {
  207. AdminTools.decreaseMessageCounter();
  208. })
  209. });
  210. let userMenu = document.querySelector('#limenu-user > a');
  211. let newSpan = document.createElement('span');
  212. newSpan.id = 'message-counter';
  213. newSpan.className = 'badge';
  214. newSpan.innerText = AdminTools.getMessageCounter() ? AdminTools.getMessageCounter() : '';
  215. setTimeout(function () {
  216. if (userMenu) userMenu.appendChild(newSpan);
  217. }, 300);
  218. }
  219. // Package actions
  220. if (MODx.grid.Package) {
  221. Ext.override(MODx.grid.Package, {
  222. onClick: function (e) {
  223. let t = e.getTarget();
  224. let classes = t.className.split(' ');
  225. if (classes[0] == 'controlBtn') {
  226. let action = classes[1];
  227. let record = this.getSelectionModel().getSelected();
  228. let packageOptions = adminToolsPackageActions[record.data.name] || adminToolsPackageActions[record.data.name] || false;
  229. this.menu.record = record.data;
  230. if (packageOptions) {
  231. let message;
  232. [action, 'all'].every(function (item, i) {
  233. if (packageOptions[item] !== undefined) {
  234. if (Ext.isString(packageOptions[item])) {
  235. message = packageOptions[item];
  236. } else if (!packageOptions[item]) {
  237. message = packageOptions['message'] ? packageOptions['message'] : _('permission_denied');
  238. } else if (packageOptions[item]) {
  239. return false;
  240. }
  241. }
  242. if (message !== undefined) {
  243. Ext.MessageBox.alert(_('warning'), message);
  244. action = '';
  245. return false;
  246. }
  247. return true;
  248. });
  249. }
  250. switch (action) {
  251. case 'remove':
  252. this.remove(record, e);
  253. break;
  254. case 'install':
  255. case 'reinstall':
  256. this.install(record);
  257. break;
  258. case 'uninstall':
  259. this.uninstall(record, e);
  260. break;
  261. case 'update':
  262. case 'checkupdate':
  263. this.update(record, e);
  264. break;
  265. case 'details':
  266. this.viewPackage(record, e);
  267. break;
  268. default:
  269. break;
  270. }
  271. }
  272. }
  273. });
  274. }
  275. });