modx.panel.user.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. /**
  2. * @class MODx.panel.User
  3. * @extends MODx.FormPanel
  4. * @param {Object} config An object of configuration properties
  5. * @xtype modx-panel-user
  6. */
  7. MODx.panel.User = function(config) {
  8. config = config || {};
  9. Ext.applyIf(config,{
  10. url: MODx.config.connector_url
  11. ,baseParams: {}
  12. ,id: 'modx-panel-user'
  13. ,cls: 'container'
  14. ,defaults: { collapsible: false ,autoHeight: true }
  15. ,bodyStyle: ''
  16. ,items: [{
  17. html: _('user_new')
  18. ,id: 'modx-user-header'
  19. ,xtype: 'modx-header'
  20. },{
  21. xtype: 'modx-tabs'
  22. ,id: 'modx-user-tabs'
  23. ,deferredRender: false
  24. ,defaults: {
  25. autoHeight: true
  26. ,layout: 'form'
  27. ,labelWidth: 150
  28. ,bodyCssClass: 'tab-panel-wrapper'
  29. ,layoutOnTabChange: true
  30. }
  31. ,items: this.getFields(config)
  32. }]
  33. ,useLoadingMask: true
  34. ,listeners: {
  35. 'setup': {fn:this.setup,scope:this}
  36. ,'success': {fn:this.success,scope:this}
  37. ,'beforeSubmit': {fn:this.beforeSubmit,scope:this}
  38. }
  39. });
  40. MODx.panel.User.superclass.constructor.call(this,config);
  41. Ext.getCmp('modx-user-panel-newpassword').getEl().dom.style.display = 'none';
  42. Ext.getCmp('modx-user-password-genmethod-s').on('check',this.showNewPassword,this);
  43. };
  44. Ext.extend(MODx.panel.User,MODx.FormPanel,{
  45. setup: function() {
  46. if (this.config.user === '' || this.config.user === 0) {
  47. this.fireEvent('ready');
  48. return false;
  49. }
  50. MODx.Ajax.request({
  51. url: this.config.url
  52. ,params: {
  53. action: 'security/user/get'
  54. ,id: this.config.user
  55. ,getGroups: true
  56. }
  57. ,listeners: {
  58. 'success': {fn:function(r) {
  59. this.getForm().setValues(r.object);
  60. var d = Ext.decode(r.object.groups);
  61. var g = Ext.getCmp('modx-grid-user-groups');
  62. if (g) {
  63. var s = g.getStore();
  64. if (s) { s.loadData(d); }
  65. }
  66. Ext.get('modx-user-header').update(_('user')+': '+r.object.username);
  67. this.fireEvent('ready',r.object);
  68. MODx.fireEvent('ready');
  69. },scope:this}
  70. }
  71. });
  72. }
  73. ,beforeSubmit: function(o) {
  74. var d = {};
  75. var g = Ext.getCmp('modx-grid-user-settings');
  76. if (g) { d.settings = g.encodeModified(); }
  77. var h = Ext.getCmp('modx-grid-user-groups');
  78. if (h) { d.groups = h.encode(); }
  79. var t = Ext.getCmp('modx-remote-tree');
  80. if (t) { d.remote_data = t.encode(); }
  81. var et = Ext.getCmp('modx-extended-tree');
  82. if (et) { d.extended = et.encode(); }
  83. Ext.apply(o.form.baseParams,d);
  84. }
  85. ,success: function(o) {
  86. var userId = this.config.user;
  87. if (Ext.getCmp('modx-user-passwordnotifymethod-s').getValue() === true && o.result.message != '') {
  88. Ext.Msg.hide();
  89. Ext.Msg.show({
  90. title: _('password_notification')
  91. ,msg: o.result.message
  92. ,buttons: Ext.Msg.OK
  93. ,fn: function(btn) {
  94. if (userId == 0) {
  95. MODx.loadPage('security/user/update', 'id='+o.result.object.id);
  96. }
  97. return false;
  98. }
  99. });
  100. this.clearDirty();
  101. } else if (userId == 0) {
  102. MODx.loadPage('security/user/update', 'id='+o.result.object.id);
  103. }
  104. }
  105. ,showNewPassword: function(cb,v) {
  106. var el = Ext.getCmp('modx-user-panel-newpassword').getEl();
  107. if (v) {
  108. el.slideIn('t',{useDisplay:true});
  109. } else {
  110. el.slideOut('t',{useDisplay:true});
  111. }
  112. }
  113. ,getFields: function(config) {
  114. var f = [{
  115. title: _('general_information')
  116. ,defaults: { msgTarget: 'side' ,autoHeight: true }
  117. ,cls: 'main-wrapper form-with-labels'
  118. ,labelAlign: 'top' // prevent default class of x-form-label-left
  119. ,items: this.getGeneralFields(config)
  120. }];
  121. if (config.user != 0) {
  122. f.push({
  123. title: _('settings')
  124. ,autoHeight: true
  125. ,defaults: { autoHeight: true }
  126. ,hideMode: 'offsets'
  127. ,items: [{
  128. html: '<h3>'+_('user_settings')+'</h3><p>'+_('user_settings_desc')+'</p>'
  129. ,xtype: 'modx-description'
  130. },{
  131. xtype: 'modx-grid-user-settings'
  132. ,cls: 'main-wrapper'
  133. ,preventRender: true
  134. ,user: config.user
  135. ,width: '97%'
  136. ,listeners: {
  137. 'afterAutoSave':{fn:this.markDirty,scope:this}
  138. }
  139. }]
  140. });
  141. }
  142. f.push({
  143. title: _('access_permissions')
  144. ,layout: 'form'
  145. ,defaults: { border: false ,autoHeight: true }
  146. ,hideMode: 'offsets'
  147. ,items: [{
  148. html: _('access_permissions_user_message')
  149. ,xtype: 'modx-description'
  150. },{
  151. xtype: 'modx-grid-user-groups'
  152. ,cls: 'main-wrapper'
  153. ,title: ''
  154. ,preventRender: true
  155. ,user: config.user
  156. ,width: '97%'
  157. ,listeners: {
  158. 'afterRemoveRow':{fn:this.markDirty,scope:this}
  159. ,'afterUpdateRole':{fn:this.markDirty,scope:this}
  160. ,'afterAddGroup':{fn:this.markDirty,scope:this}
  161. ,'afterReorderGroup':{fn:this.markDirty,scope:this}
  162. }
  163. }]
  164. });
  165. if (config.remoteFields && config.remoteFields.length) {
  166. f.push({
  167. title: _('remote_data')
  168. ,layout: 'form'
  169. ,defaults: { border: false ,autoHeight: true }
  170. ,hideMode: 'offsets'
  171. ,items: [{
  172. html: '<p>'+_('user_remote_data_msg')+'</p>'
  173. ,xtype: 'modx-description'
  174. },{
  175. layout: 'column'
  176. ,cls: 'main-wrapper'
  177. ,items: [{
  178. columnWidth: 0.4
  179. ,title: _('attributes')
  180. ,layout: 'fit'
  181. ,border: false
  182. ,items: {
  183. xtype: 'modx-orm-tree'
  184. ,id: 'modx-remote-tree'
  185. ,data: config.remoteFields
  186. ,formPanel: 'modx-panel-user'
  187. ,prefix: 'remote'
  188. }
  189. },{
  190. xtype: 'modx-orm-form'
  191. ,columnWidth: 0.6
  192. ,title: _('editing_form')
  193. ,id: 'modx-remote-form'
  194. ,prefix: 'remote'
  195. ,treePanel: 'modx-remote-tree'
  196. ,formPanel: 'modx-panel-user'
  197. }]
  198. }]
  199. });
  200. }
  201. config.extendedFields = config.extendedFields || [];
  202. f.push({
  203. title: _('extended_fields')
  204. ,layout: 'form'
  205. ,defaults: { border: false ,autoHeight: true }
  206. ,hideMode: 'offsets'
  207. ,items: [{
  208. html: '<p>'+_('extended_fields_msg')+'</p>'
  209. ,xtype: 'modx-description'
  210. },{
  211. layout: 'column'
  212. ,cls: 'main-wrapper'
  213. ,items: [{
  214. columnWidth: 0.4
  215. ,title: _('attributes')
  216. ,layout: 'fit'
  217. ,border: false
  218. ,items: {
  219. xtype: 'modx-orm-tree'
  220. ,id: 'modx-extended-tree'
  221. ,data: config.extendedFields
  222. ,formPanel: 'modx-panel-user'
  223. ,prefix: 'extended'
  224. ,enableDD: true
  225. ,listeners: {
  226. 'dragdrop': {fn:function() {
  227. this.markDirty();
  228. },scope:this}
  229. }
  230. }
  231. },{
  232. xtype: 'modx-orm-form'
  233. ,columnWidth: 0.6
  234. ,title: _('editing_form')
  235. ,id: 'modx-extended-form'
  236. ,prefix: 'extended'
  237. ,treePanel: 'modx-extended-tree'
  238. ,formPanel: 'modx-panel-user'
  239. }]
  240. }]
  241. });
  242. return f;
  243. }
  244. ,getGeneralFields: function(config) {
  245. var itemsRight = [{
  246. id: 'modx-user-newpassword'
  247. ,name: 'newpassword'
  248. ,xtype: 'hidden'
  249. ,value: false
  250. },{
  251. id: 'modx-user-primary-group'
  252. ,name: 'primary_group'
  253. ,xtype: 'hidden'
  254. },{
  255. id: 'modx-user-active'
  256. ,name: 'active'
  257. ,hideLabel: true
  258. ,boxLabel: _('active')
  259. ,description: _('user_active_desc')
  260. ,xtype: 'xcheckbox'
  261. ,inputValue: 1
  262. },{
  263. id: 'modx-user-blocked'
  264. ,name: 'blocked'
  265. ,hideLabel: true
  266. ,boxLabel: _('user_block')
  267. ,description: _('user_block_desc')
  268. ,xtype: 'xcheckbox'
  269. ,inputValue: 1
  270. }];
  271. if (MODx.perm.set_sudo) {
  272. itemsRight.push({
  273. id: 'modx-user-sudo'
  274. ,name: 'sudo'
  275. ,hideLabel: true
  276. ,boxLabel: _('user_sudo')
  277. ,description: _('user_sudo_desc')
  278. ,xtype: 'xcheckbox'
  279. ,inputValue: 1
  280. ,value: 0
  281. });
  282. }
  283. itemsRight.push({
  284. id: 'modx-user-blockeduntil'
  285. ,name: 'blockeduntil'
  286. ,fieldLabel: _('user_blockeduntil')
  287. ,description: _('user_blockeduntil_desc')
  288. ,xtype: 'xdatetime'
  289. ,width: 300
  290. ,timeWidth: 150
  291. ,dateWidth: 150
  292. ,allowBlank: true
  293. ,dateFormat: MODx.config.manager_date_format
  294. ,timeFormat: MODx.config.manager_time_format
  295. ,hiddenFormat: 'Y-m-d H:i:s'
  296. },{
  297. id: 'modx-user-blockedafter'
  298. ,name: 'blockedafter'
  299. ,fieldLabel: _('user_blockedafter')
  300. ,description: _('user_blockedafter_desc')
  301. ,xtype: 'xdatetime'
  302. ,width: 300
  303. ,timeWidth: 150
  304. ,dateWidth: 150
  305. ,allowBlank: true
  306. ,dateFormat: MODx.config.manager_date_format
  307. ,timeFormat: MODx.config.manager_time_format
  308. ,hiddenFormat: 'Y-m-d H:i:s'
  309. },{
  310. id: 'modx-user-logincount'
  311. ,name: 'logincount'
  312. ,fieldLabel: _('user_logincount')
  313. ,description: _('user_logincount_desc')
  314. ,xtype: 'statictextfield'
  315. },{
  316. id: 'modx-user-lastlogin'
  317. ,name: 'lastlogin'
  318. ,fieldLabel: _('user_prevlogin')
  319. ,description: _('user_prevlogin_desc')
  320. ,xtype: 'statictextfield'
  321. },{
  322. id: 'modx-user-failedlogincount'
  323. ,name: 'failedlogincount'
  324. ,fieldLabel: _('user_failedlogincount')
  325. ,description: _('user_failedlogincount_desc')
  326. ,xtype: 'textfield'
  327. },{
  328. id: 'modx-user-createdon'
  329. ,name: 'createdon'
  330. ,fieldLabel: _('user_createdon')
  331. ,description: _('user_createdon_desc')
  332. ,xtype: 'statictextfield'
  333. },{
  334. id: 'modx-user-class-key'
  335. ,name: 'class_key'
  336. ,fieldLabel: _('class_key')
  337. ,description: _('user_class_key_desc')
  338. ,xtype: 'textfield'
  339. ,anchor: '100%'
  340. ,value: 'modUser'
  341. },{
  342. id: 'modx-user-comment'
  343. ,name: 'comment'
  344. ,fieldLabel: _('comment')
  345. ,xtype: 'textarea'
  346. ,anchor: '100%'
  347. ,grow: true
  348. },{
  349. id: 'modx-user-fs-newpassword'
  350. ,title: _('password_new')
  351. ,xtype: 'fieldset'
  352. ,cls: 'x-fieldset-checkbox-toggle' // add a custom class for checkbox replacement
  353. ,checkboxToggle: true
  354. ,collapsed: (config.user ? true : false)
  355. ,forceLayout: true
  356. ,listeners: {
  357. 'expand': {fn:function(p) {
  358. Ext.getCmp('modx-user-newpassword').setValue(true);
  359. this.markDirty();
  360. },scope:this}
  361. ,'collapse': {fn:function(p) {
  362. Ext.getCmp('modx-user-newpassword').setValue(false);
  363. this.markDirty();
  364. },scope:this}
  365. }
  366. ,items: [{
  367. xtype: 'radiogroup'
  368. ,fieldLabel: _('password_method')
  369. ,columns: 1
  370. ,items: [{
  371. id: 'modx-user-passwordnotifymethod-e'
  372. ,name: 'passwordnotifymethod'
  373. ,boxLabel: _('password_method_email')
  374. ,xtype: 'radio'
  375. ,value: 'e'
  376. ,inputValue: 'e'
  377. },{
  378. id: 'modx-user-passwordnotifymethod-s'
  379. ,name: 'passwordnotifymethod'
  380. ,boxLabel: _('password_method_screen')
  381. ,xtype: 'radio'
  382. ,value: 's'
  383. ,inputValue: 's'
  384. ,checked: true
  385. }]
  386. },{
  387. xtype: 'radiogroup'
  388. ,fieldLabel: _('password_gen_method')
  389. ,columns: 1
  390. ,items: [{
  391. id: 'modx-user-password-genmethod-g'
  392. ,name: 'passwordgenmethod'
  393. ,boxLabel: _('password_gen_gen')
  394. ,xtype: 'radio'
  395. ,inputValue: 'g'
  396. ,value: 'g'
  397. ,checked: true
  398. },{
  399. id: 'modx-user-password-genmethod-s'
  400. ,name: 'passwordgenmethod'
  401. ,boxLabel: _('password_gen_specify')
  402. ,xtype: 'radio'
  403. ,inputValue: 'spec'
  404. ,value: 'spec'
  405. }]
  406. },{
  407. id: 'modx-user-panel-newpassword'
  408. ,xtype: 'panel'
  409. ,layout: 'form'
  410. ,border: false
  411. ,autoHeight: true
  412. ,style: 'padding-top: 15px' // nested form, add padding-top as the label will not have it
  413. ,items: [{
  414. id: 'modx-user-specifiedpassword'
  415. ,name: 'specifiedpassword'
  416. ,fieldLabel: _('change_password_new')
  417. ,xtype: 'textfield'
  418. ,inputType: 'password'
  419. ,anchor: '100%'
  420. },{
  421. id: 'modx-user-confirmpassword'
  422. ,name: 'confirmpassword'
  423. ,fieldLabel: _('change_password_confirm')
  424. ,xtype: 'textfield'
  425. ,inputType: 'password'
  426. ,anchor: '100%'
  427. }]
  428. }]
  429. });
  430. return [{
  431. layout: 'column'
  432. ,border: false
  433. ,defaults: {
  434. layout: 'form'
  435. ,labelAlign: 'top'
  436. ,labelSeparator: ''
  437. ,anchor: '100%'
  438. ,border: false
  439. }
  440. ,items: [{
  441. columnWidth: .5
  442. ,defaults: {
  443. msgTarget: 'under'
  444. }
  445. ,items: [{
  446. id: 'modx-user-id'
  447. ,name: 'id'
  448. ,xtype: 'hidden'
  449. ,value: config.user
  450. },{
  451. id: 'modx-user-username'
  452. ,name: 'username'
  453. ,fieldLabel: _('username')
  454. ,description: _('user_username_desc')
  455. ,xtype: 'textfield'
  456. ,anchor: '100%'
  457. },{
  458. id: 'modx-user-fullname'
  459. ,name: 'fullname'
  460. ,fieldLabel: _('user_full_name')
  461. ,xtype: 'textfield'
  462. ,anchor: '100%'
  463. ,maxLength: 255
  464. },{
  465. id: 'modx-user-email'
  466. ,name: 'email'
  467. ,fieldLabel: _('user_email')
  468. ,xtype: 'textfield'
  469. ,anchor: '100%'
  470. ,maxLength: 255
  471. ,allowBlank: false
  472. },{
  473. id: 'modx-user-phone'
  474. ,name: 'phone'
  475. ,fieldLabel: _('user_phone')
  476. ,xtype: 'textfield'
  477. ,width: 200
  478. ,maxLength: 255
  479. },{
  480. id: 'modx-user-mobilephone'
  481. ,name: 'mobilephone'
  482. ,fieldLabel: _('user_mobile')
  483. ,xtype: 'textfield'
  484. ,width: 200
  485. ,maxLength: 255
  486. },{
  487. id: 'modx-user-fax'
  488. ,name: 'fax'
  489. ,fieldLabel: _('user_fax')
  490. ,xtype: 'textfield'
  491. ,width: 200
  492. ,maxLength: 255
  493. },{
  494. id: 'modx-user-address'
  495. ,name: 'address'
  496. ,fieldLabel: _('address')
  497. ,xtype: 'textarea'
  498. ,anchor: '100%'
  499. ,grow: true
  500. },{
  501. id: 'modx-user-city'
  502. ,name: 'city'
  503. ,fieldLabel: _('city')
  504. ,xtype: 'textfield'
  505. ,anchor: '100%'
  506. ,maxLength: 255
  507. },{
  508. id: 'modx-user-state'
  509. ,name: 'state'
  510. ,fieldLabel: _('user_state')
  511. ,xtype: 'textfield'
  512. ,width: 100
  513. ,maxLength: 100
  514. },{
  515. id: 'modx-user-zip'
  516. ,name: 'zip'
  517. ,fieldLabel: _('user_zip')
  518. ,xtype: 'textfield'
  519. ,width: 100
  520. ,maxLength: 25
  521. },{
  522. id: 'modx-user-country'
  523. ,fieldLabel: _('user_country')
  524. ,xtype: 'modx-combo-country'
  525. ,value: ''
  526. },{
  527. id: 'modx-user-website'
  528. ,name: 'website'
  529. ,fieldLabel: _('user_website')
  530. ,xtype: 'textfield'
  531. ,anchor: '100%'
  532. ,maxLength: 255
  533. },{
  534. fieldLabel: _('user_photo')
  535. ,name: 'photo'
  536. ,xtype: 'modx-combo-browser'
  537. ,hideFiles: true
  538. ,source: MODx.config['photo_profile_source'] || MODx.config.default_media_source
  539. ,hideSourceCombo: true
  540. ,anchor: '100%'
  541. },{
  542. id: 'modx-user-dob'
  543. ,name: 'dob'
  544. ,fieldLabel: _('user_dob')
  545. ,xtype: 'datefield'
  546. ,width: 200
  547. ,allowBlank: true
  548. },{
  549. id: 'modx-user-gender'
  550. ,name: 'gender'
  551. ,hiddenName: 'gender'
  552. ,fieldLabel: _('user_gender')
  553. ,xtype: 'modx-combo-gender'
  554. ,width: 200
  555. }]
  556. },{
  557. columnWidth: .5
  558. ,defaults: {
  559. msgTarget: 'under'
  560. }
  561. ,items: itemsRight
  562. }]
  563. },{
  564. html: MODx.onUserFormRender
  565. ,border: false
  566. }];
  567. }
  568. });
  569. Ext.reg('modx-panel-user',MODx.panel.User);
  570. /**
  571. * Displays a gender combo
  572. *
  573. * @class MODx.combo.Gender
  574. * @extends Ext.form.ComboBox
  575. * @param {Object} config An object of configuration properties
  576. * @xtype modx-combo-gender
  577. */
  578. MODx.combo.Gender = function(config) {
  579. config = config || {};
  580. Ext.applyIf(config,{
  581. store: new Ext.data.SimpleStore({
  582. fields: ['d','v']
  583. ,data: [['',0],[_('user_male'),1],[_('user_female'),2],[_('user_other'),3]]
  584. })
  585. ,displayField: 'd'
  586. ,valueField: 'v'
  587. ,mode: 'local'
  588. ,triggerAction: 'all'
  589. ,editable: false
  590. ,selectOnFocus: false
  591. });
  592. MODx.combo.Gender.superclass.constructor.call(this,config);
  593. };
  594. Ext.extend(MODx.combo.Gender,Ext.form.ComboBox);
  595. Ext.reg('modx-combo-gender',MODx.combo.Gender);