modx.panel.user.group.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. MODx.panel.UserGroup = function(config) {
  2. config = config || {};
  3. Ext.applyIf(config,{
  4. id: 'modx-panel-user-group'
  5. ,cls: 'container form-with-labels'
  6. ,url: MODx.config.connector_url
  7. ,baseParams: {
  8. action: 'security/group/update'
  9. }
  10. ,defaults: { collapsible: false ,autoHeight: true }
  11. ,items: [{
  12. html: _('user_group_new')
  13. ,id: 'modx-user-group-header'
  14. ,xtype: 'modx-header'
  15. },{
  16. xtype: 'modx-tabs'
  17. ,defaults: {
  18. autoHeight: true
  19. ,border: true
  20. ,bodyCssClass: 'tab-panel-wrapper'
  21. }
  22. ,id: 'modx-usergroup-tabs'
  23. ,forceLayout: true
  24. ,deferredRender: false
  25. ,stateful: true
  26. ,stateId: 'modx-usergroup-tabpanel'
  27. ,stateEvents: ['tabchange']
  28. ,getState:function() {
  29. return {activeTab:this.items.indexOf(this.getActiveTab())};
  30. }
  31. ,items: [{
  32. title: _('general_information')
  33. ,defaults: { border: false ,msgTarget: 'side' }
  34. ,layout: 'form'
  35. ,id: 'modx-usergroup-form'
  36. ,labelAlign: 'top'
  37. ,labelSeparator: ''
  38. ,items: [{
  39. xtype: 'panel'
  40. ,border: false
  41. ,cls:'main-wrapper'
  42. ,layout: 'form'
  43. ,items: [{
  44. layout: 'column'
  45. ,border: false
  46. ,defaults: {
  47. layout: 'form'
  48. ,labelAlign: 'top'
  49. ,labelSeparator: ''
  50. ,anchor: '100%'
  51. ,border: false
  52. }
  53. ,items: [{
  54. columnWidth: .6
  55. ,items: [{
  56. xtype: 'hidden'
  57. ,name: 'id'
  58. ,id: 'modx-usergroup-id'
  59. ,value: config.record.id
  60. },{
  61. name: 'name'
  62. ,id: 'modx-usergroup-name'
  63. ,xtype: config.record && (config.record.name == 'Administrator' || config.record.id == 0) ? 'statictextfield' : 'textfield'
  64. ,fieldLabel: _('name')+'<span class="required">*</span>'
  65. ,allowBlank: false
  66. ,enableKeyEvents: true
  67. ,disabled: config.record.id === 0
  68. ,anchor: '100%'
  69. ,listeners: {
  70. 'keyup': {scope:this,fn:function(f,e) {
  71. Ext.getCmp('modx-user-group-header').getEl().update('<h2>'+_('user_group')+': '+Ext.util.Format.htmlEncode(f.getValue())+'</h2>');
  72. }}
  73. }
  74. },{
  75. xtype: MODx.expandHelp ? 'label' : 'hidden'
  76. ,forId: 'modx-usergroup-name'
  77. ,html: _('user_group_desc_name')
  78. ,cls: 'desc-under'
  79. },{
  80. name: 'description'
  81. ,id: 'modx-usergroup-description'
  82. ,xtype: 'textarea'
  83. ,fieldLabel: _('description')
  84. ,anchor: '100%'
  85. ,grow: true
  86. },{
  87. xtype: MODx.expandHelp ? 'label' : 'hidden'
  88. ,forId: 'modx-usergroup-description'
  89. ,html: _('user_group_desc_description')
  90. ,cls: 'desc-under'
  91. }]
  92. },{
  93. columnWidth: .4
  94. ,items: [{
  95. name: 'parent'
  96. ,hiddenName: 'parent'
  97. ,id: 'modx-usergroup-parent'
  98. ,xtype: 'modx-combo-usergroup'
  99. ,fieldLabel: _('user_group_parent')
  100. ,editable: false
  101. ,anchor: '100%'
  102. ,disabled: config.record.id === 0
  103. ,baseParams: {
  104. action: 'security/group/getList'
  105. ,addNone: true
  106. ,exclude: config.record.id
  107. }
  108. },{
  109. xtype: MODx.expandHelp ? 'label' : 'hidden'
  110. ,forId: 'modx-usergroup-parent'
  111. ,html: _('user_group_desc_parent')
  112. ,cls: 'desc-under'
  113. },{
  114. name: 'dashboard'
  115. ,id: 'modx-usergroup-dashboard'
  116. ,xtype: 'modx-combo-dashboard'
  117. ,fieldLabel: _('dashboard')
  118. ,anchor: '100%'
  119. },{
  120. xtype: MODx.expandHelp ? 'label' : 'hidden'
  121. ,forId: 'modx-usergroup-dashboard'
  122. ,html: _('user_group_desc_dashboard')
  123. ,cls: 'desc-under'
  124. }]
  125. }]
  126. }]
  127. }]
  128. },{
  129. title: _('users')
  130. ,hideMode: 'offsets'
  131. ,layout: 'form'
  132. ,id: 'modx-usergroup-users-panel'
  133. ,items: [{
  134. html: '<p>'+_('user_group_user_access_msg')+'</p>'
  135. ,xtype: 'modx-description'
  136. },{
  137. xtype: 'modx-grid-user-group-users'
  138. ,cls:'main-wrapper'
  139. ,preventRender: true
  140. ,usergroup: config.record.id
  141. ,autoHeight: true
  142. ,width: '97%'
  143. ,listeners: {
  144. 'afterRemoveRow': {fn:this.markDirty,scope:this}
  145. ,'updateRole': {fn:this.markDirty,scope:this}
  146. ,'addMember': {fn:this.markDirty,scope:this}
  147. }
  148. }]
  149. },{
  150. title: _('settings')
  151. ,forceLayout: true
  152. ,hideMode: 'offsets'
  153. ,layout: 'form'
  154. ,items: [{
  155. html: '<p>'+_('user_group_settings_desc')+'</p>'
  156. ,xtype: 'modx-description'
  157. },{
  158. xtype: 'modx-grid-group-settings'
  159. ,cls: 'main-wrapper'
  160. ,preventRender: true
  161. ,group: config.record.id
  162. ,autoHeight: true
  163. ,width: '97%'
  164. // ,listeners: {
  165. // 'afterAutoSave':{fn:this.markDirty,scope:this}
  166. // }
  167. }]
  168. },{
  169. title: _('permissions')
  170. ,hidden: config.record.id === 0
  171. ,forceLayout: true
  172. ,hideMode: 'offsets'
  173. ,items: [{
  174. xtype: 'modx-vtabs'
  175. ,items: [{
  176. title: _('user_group_context_access')
  177. ,forceLayout: true
  178. ,hideMode: 'offsets'
  179. ,layout: 'form'
  180. ,items: [{
  181. html: '<p>'+_('user_group_context_access_msg')+'</p>'
  182. ,xtype: 'modx-description'
  183. },{
  184. xtype: 'modx-grid-user-group-context'
  185. ,preventRender: true
  186. ,usergroup: config.record.id
  187. ,autoHeight: true
  188. ,cls:'main-wrapper'
  189. ,listeners: {
  190. 'afterRemoveRow': {fn:this.markDirty,scope:this}
  191. ,'afteredit': {fn:this.markDirty,scope:this}
  192. ,'updateAcl': {fn:this.markDirty,scope:this}
  193. ,'createAcl': {fn:this.markDirty,scope:this}
  194. }
  195. }]
  196. },{
  197. title: _('user_group_resourcegroup_access')
  198. ,hidden: config.record.id === 0
  199. ,hideMode: 'offsets'
  200. ,layout: 'form'
  201. ,items: [{
  202. html: '<p>'+_('user_group_resourcegroup_access_msg')+'</p>'
  203. ,xtype: 'modx-description'
  204. },{
  205. xtype: 'modx-grid-user-group-resource-group'
  206. ,cls:'main-wrapper'
  207. ,preventRender: true
  208. ,usergroup: config.record.id
  209. ,autoHeight: true
  210. ,width: '97%'
  211. ,listeners: {
  212. 'afterRemoveRow': {fn:this.markDirty,scope:this}
  213. ,'afteredit': {fn:this.markDirty,scope:this}
  214. ,'updateAcl': {fn:this.markDirty,scope:this}
  215. ,'createAcl': {fn:this.markDirty,scope:this}
  216. }
  217. }]
  218. },{
  219. title: _('user_group_category_access')
  220. ,hidden: config.record.id === 0
  221. ,hideMode: 'offsets'
  222. ,layout: 'form'
  223. ,items: [{
  224. html: '<p>'+_('user_group_category_access_msg')+'</p>'
  225. ,xtype: 'modx-description'
  226. },{
  227. xtype: 'modx-grid-user-group-category'
  228. ,cls:'main-wrapper'
  229. ,preventRender: true
  230. ,usergroup: config.record.id
  231. ,autoHeight: true
  232. ,width: '97%'
  233. ,listeners: {
  234. 'afterRemoveRow': {fn:this.markDirty,scope:this}
  235. ,'afteredit': {fn:this.markDirty,scope:this}
  236. ,'updateAcl': {fn:this.markDirty,scope:this}
  237. ,'createAcl': {fn:this.markDirty,scope:this}
  238. }
  239. }]
  240. },{
  241. title: _('user_group_source_access')
  242. ,hidden: config.record.id === 0
  243. ,hideMode: 'offsets'
  244. ,layout: 'form'
  245. ,items: [{
  246. html: '<p>'+_('user_group_source_access_msg')+'</p>'
  247. ,xtype: 'modx-description'
  248. },{
  249. xtype: 'modx-grid-user-group-source'
  250. ,cls:'main-wrapper'
  251. ,preventRender: true
  252. ,usergroup: config.record.id
  253. ,autoHeight: true
  254. ,width: '97%'
  255. ,listeners: {
  256. 'afterRemoveRow': {fn:this.markDirty,scope:this}
  257. ,'afteredit': {fn:this.markDirty,scope:this}
  258. ,'updateAcl': {fn:this.markDirty,scope:this}
  259. ,'createAcl': {fn:this.markDirty,scope:this}
  260. }
  261. }]
  262. },{
  263. title: _('user_group_namespace_access')
  264. ,hidden: config.record.id === 0
  265. ,hideMode: 'offsets'
  266. ,layout: 'form'
  267. ,items: [{
  268. html: '<p>' + _('user_group_namespace_access_desc') + '</p>'
  269. ,xtype: 'modx-description'
  270. },{
  271. xtype: 'modx-grid-user-group-namespace'
  272. ,cls:'main-wrapper'
  273. ,preventRender: true
  274. ,usergroup: config.record.id
  275. ,autoHeight: true
  276. ,width: '97%'
  277. //,listeners: {
  278. // 'afterRemoveRow': {fn:this.markDirty,scope:this}
  279. // ,'afteredit': {fn:this.markDirty,scope:this}
  280. // ,'updateAcl': {fn:this.markDirty,scope:this}
  281. // ,'createAcl': {fn:this.markDirty,scope:this}
  282. //}
  283. }]
  284. }]
  285. }]
  286. }]
  287. }]
  288. ,useLoadingMask: false
  289. ,listeners: {
  290. 'setup': {fn:this.setup,scope:this}
  291. ,'success': {fn:this.success,scope:this}
  292. ,'beforeSubmit': {fn:this.beforeSubmit,scope:this}
  293. }
  294. });
  295. MODx.panel.UserGroup.superclass.constructor.call(this,config);
  296. if (config.record.id == 0 || MODx.perm.usergroup_user_list == 0) {
  297. var tbs = Ext.getCmp('modx-usergroup-tabs');
  298. tbs.hideTabStripItem('modx-usergroup-users-panel');
  299. }
  300. };
  301. Ext.extend(MODx.panel.UserGroup,MODx.FormPanel,{
  302. initialized: false
  303. ,setup: function() {
  304. if (this.initialized || this.config.usergroup === '' || this.config.usergroup == undefined) {
  305. this.fireEvent('ready');
  306. return false;
  307. }
  308. var r = this.config.record;
  309. this.getForm().setValues(r);
  310. Ext.defer(function() {
  311. Ext.get('modx-user-group-header').update('<h2>'+_('user_group')+': '+Ext.util.Format.htmlEncode(r.name)+'</h2>');
  312. }, 250, this);
  313. this.fireEvent('ready',r);
  314. MODx.fireEvent('ready');
  315. this.initialized = true;
  316. }
  317. ,beforeSubmit: function(o) {}
  318. ,success: function(o) {}
  319. });
  320. Ext.reg('modx-panel-user-group',MODx.panel.UserGroup);
  321. MODx.grid.UserGroupUsers = function(config) {
  322. config = config || {};
  323. Ext.applyIf(config,{
  324. title: ''
  325. ,id: 'modx-grid-user-group-users'
  326. ,url: MODx.config.connector_url
  327. ,baseParams: {
  328. action: 'security/group/user/getList'
  329. ,usergroup: config.usergroup
  330. }
  331. ,paging: true
  332. ,grouping: true
  333. ,remoteSort: true
  334. ,groupBy: 'role_name'
  335. ,singleText: _('user')
  336. ,pluralText: _('users')
  337. ,sortBy: 'authority'
  338. ,sortDir: 'ASC'
  339. ,fields: ['id','username','role','role_name','authority']
  340. ,columns: [{
  341. header: _('username')
  342. ,dataIndex: 'username'
  343. ,width: 175
  344. ,sortable: true
  345. },{
  346. header: _('role')
  347. ,dataIndex: 'role_name'
  348. ,width: 175
  349. ,sortable: true
  350. }]
  351. ,tbar: [{
  352. text: _('user_group_user_add')
  353. ,cls:'primary-button'
  354. ,handler: this.addMember
  355. ,hidden: MODx.perm.usergroup_user_edit == 0
  356. },'->',{
  357. xtype: 'textfield'
  358. ,id: 'modx-ugu-filter-username'
  359. ,cls: 'x-form-filter'
  360. ,listeners: {
  361. 'change': {fn:this.searchUser,scope:this}
  362. ,'render': {fn: function(cmp) {
  363. new Ext.KeyMap(cmp.getEl(), {
  364. key: Ext.EventObject.ENTER
  365. ,fn: function() {
  366. this.fireEvent('change',this.getValue());
  367. this.blur();
  368. return true; }
  369. ,scope: cmp
  370. });
  371. }}
  372. }
  373. ,emptyText: _('search')
  374. ,scope: this
  375. },{
  376. text: _('clear_filter')
  377. ,id: 'modx-ugu-clear-filter'
  378. ,cls: 'x-form-filter-clear'
  379. ,handler: this.clearFilter
  380. ,scope: this
  381. }]
  382. });
  383. MODx.grid.UserGroupUsers.superclass.constructor.call(this,config);
  384. this.addEvents('updateRole','addMember');
  385. };
  386. Ext.extend(MODx.grid.UserGroupUsers,MODx.grid.Grid,{
  387. getMenu: function() {
  388. var m = [];
  389. if (MODx.perm.usergroup_user_edit) {
  390. m.push({
  391. text: _('user_role_update')
  392. ,handler: this.updateRole
  393. });
  394. m.push('-');
  395. m.push({
  396. text: _('user_group_user_remove')
  397. ,handler: this.removeUser
  398. });
  399. }
  400. return m;
  401. }
  402. ,searchUser: function(tf,nv,ov) {
  403. this.getStore().baseParams['username'] = Ext.getCmp('modx-ugu-filter-username').getValue();
  404. this.getBottomToolbar().changePage(1);
  405. //this.refresh();
  406. }
  407. ,clearFilter: function(btn,e) {
  408. Ext.getCmp('modx-ugu-filter-username').setValue('');
  409. this.getStore().baseParams['username'] = '';
  410. this.getBottomToolbar().changePage(1);
  411. //this.refresh();
  412. }
  413. ,updateRole: function(btn,e) {
  414. var r = this.menu.record;
  415. r.usergroup = this.config.usergroup;
  416. r.user = r.id;
  417. this.loadWindow(btn,e,{
  418. xtype: 'modx-window-user-group-role-update'
  419. ,record: r
  420. ,listeners: {
  421. 'success': {fn:function(r) {
  422. this.refresh();
  423. this.fireEvent('updateRole',r);
  424. },scope:this}
  425. }
  426. });
  427. }
  428. ,addMember: function(btn,e) {
  429. var r = {usergroup:this.config.usergroup};
  430. if (!this.windows['modx-window-user-group-adduser']) {
  431. this.windows['modx-window-user-group-adduser'] = Ext.ComponentMgr.create({
  432. xtype: 'modx-window-user-group-adduser'
  433. ,record: r
  434. ,grid: this
  435. ,listeners: {
  436. 'success': {fn:function(r) {
  437. this.refresh();
  438. this.fireEvent('addMember',r);
  439. },scope:this}
  440. }
  441. });
  442. }
  443. this.windows['modx-window-user-group-adduser'].setValues(r);
  444. this.windows['modx-window-user-group-adduser'].show(e.target);
  445. }
  446. ,removeUser: function(btn,e) {
  447. var r = this.menu.record;
  448. MODx.msg.confirm({
  449. title: _('warning')
  450. ,text: _('user_group_user_remove_confirm') || _('confirm_remove')
  451. ,url: this.config.url
  452. ,params: {
  453. action: 'security/group/user/remove'
  454. ,user: r.id
  455. ,usergroup: this.config.usergroup
  456. }
  457. ,listeners: {
  458. 'success': {fn:this.refresh,scope:this}
  459. }
  460. });
  461. }
  462. });
  463. Ext.reg('modx-grid-user-group-users',MODx.grid.UserGroupUsers);
  464. MODx.window.UpdateUserGroupRole = function(config) {
  465. config = config || {};
  466. Ext.applyIf(config,{
  467. id: 'modx-window-user-group-role-update'
  468. ,title: _('user_group_user_update_role')
  469. ,url: MODx.config.connector_url
  470. ,action: 'security/group/user/update'
  471. ,fields: [{
  472. xtype: 'hidden'
  473. ,name: 'usergroup'
  474. ,value: config.usergroup
  475. },{
  476. xtype: 'hidden'
  477. ,name: 'user'
  478. ,value: config.user
  479. },{
  480. xtype: 'modx-combo-usergrouprole'
  481. ,id: 'modx-uugr-role'
  482. ,name: 'role'
  483. ,fieldLabel: _('role')
  484. }]
  485. });
  486. MODx.window.UpdateUserGroupRole.superclass.constructor.call(this,config);
  487. };
  488. Ext.extend(MODx.window.UpdateUserGroupRole,MODx.Window);
  489. Ext.reg('modx-window-user-group-role-update',MODx.window.UpdateUserGroupRole);
  490. MODx.window.AddUserToUserGroup = function(config) {
  491. config = config || {};
  492. this.ident = config.ident || 'auug'+Ext.id();
  493. Ext.applyIf(config,{
  494. title: _('user_group_user_add')
  495. // ,height: 150
  496. // ,width: 500
  497. ,url: MODx.config.connector_url
  498. ,action: 'security/group/user/create'
  499. ,fields: [{
  500. fieldLabel: _('user')
  501. ,description: MODx.expandHelp ? '' : _('user_group_user_add_user_desc')
  502. ,name: 'user'
  503. ,hiddenName: 'user'
  504. ,id: 'modx-auug-user'
  505. ,xtype: 'modx-combo-user'
  506. ,editable: true
  507. ,typeAhead: true
  508. ,allowBlank: false
  509. ,anchor: '100%'
  510. },{
  511. xtype: MODx.expandHelp ? 'label' : 'hidden'
  512. ,forId: 'modx-'+this.ident+'-user'
  513. ,html: _('user_group_user_add_user_desc')
  514. ,cls: 'desc-under'
  515. },{
  516. fieldLabel: _('role')
  517. ,description: MODx.expandHelp ? '' : _('user_group_user_add_role_desc')
  518. ,name: 'role'
  519. ,hiddenName: 'role'
  520. ,id: 'modx-auug-role'
  521. ,xtype: 'modx-combo-role'
  522. ,allowBlank: false
  523. ,anchor: '100%'
  524. },{
  525. xtype: MODx.expandHelp ? 'label' : 'hidden'
  526. ,forId: 'modx-'+this.ident+'-role'
  527. ,html: _('user_group_user_add_role_desc')
  528. ,cls: 'desc-under'
  529. },{
  530. name: 'usergroup'
  531. ,xtype: 'hidden'
  532. }]
  533. });
  534. MODx.window.AddUserToUserGroup.superclass.constructor.call(this,config);
  535. };
  536. Ext.extend(MODx.window.AddUserToUserGroup,MODx.Window);
  537. Ext.reg('modx-window-user-group-adduser',MODx.window.AddUserToUserGroup);