manager/assets/modext/widgets/security/modx.panel.user.js
/**
* @class MODx.panel.User
* @extends MODx.FormPanel
* @param {Object} config An object of configuration properties
* @xtype modx-panel-user
*/
MODx.panel.User = function(config) {
config = config || {};
Ext.applyIf(config,{
url: MODx.config.connector_url
,baseParams: {}
,id: 'modx-panel-user'
,cls: 'container'
,defaults: { collapsible: false ,autoHeight: true }
,bodyStyle: ''
,items: [{
html: _('user_new')
,id: 'modx-user-header'
,xtype: 'modx-header'
},{
xtype: 'modx-tabs'
,id: 'modx-user-tabs'
,deferredRender: false
,defaults: {
autoHeight: true
,layout: 'form'
,labelWidth: 150
,bodyCssClass: 'tab-panel-wrapper'
,layoutOnTabChange: true
}
,items: this.getFields(config)
}]
,useLoadingMask: true
,listeners: {
'setup': {fn:this.setup,scope:this}
,'success': {fn:this.success,scope:this}
,'beforeSubmit': {fn:this.beforeSubmit,scope:this}
}
});
MODx.panel.User.superclass.constructor.call(this,config);
Ext.getCmp('modx-user-panel-newpassword').getEl().dom.style.display = 'none';
Ext.getCmp('modx-user-password-genmethod-s').on('check',this.showNewPassword,this);
};
Ext.extend(MODx.panel.User,MODx.FormPanel,{
setup: function() {
if (this.config.user === '' || this.config.user === 0) {
this.fireEvent('ready');
return false;
}
MODx.Ajax.request({
url: this.config.url
,params: {
action: 'security/user/get'
,id: this.config.user
,getGroups: true
}
,listeners: {
'success': {fn:function(r) {
this.getForm().setValues(r.object);
var d = Ext.decode(r.object.groups);
var g = Ext.getCmp('modx-grid-user-groups');
if (g) {
var s = g.getStore();
if (s) { s.loadData(d); }
}
Ext.get('modx-user-header').update(_('user')+': '+r.object.username);
this.fireEvent('ready',r.object);
MODx.fireEvent('ready');
},scope:this}
}
});
}
,beforeSubmit: function(o) {
var d = {};
var g = Ext.getCmp('modx-grid-user-settings');
if (g) { d.settings = g.encodeModified(); }
var h = Ext.getCmp('modx-grid-user-groups');
if (h) { d.groups = h.encode(); }
var t = Ext.getCmp('modx-remote-tree');
if (t) { d.remote_data = t.encode(); }
var et = Ext.getCmp('modx-extended-tree');
if (et) { d.extended = et.encode(); }
Ext.apply(o.form.baseParams,d);
}
,success: function(o) {
var userId = this.config.user;
if (Ext.getCmp('modx-user-passwordnotifymethod-s').getValue() === true && o.result.message != '') {
Ext.Msg.hide();
Ext.Msg.show({
title: _('password_notification')
,msg: o.result.message
,buttons: Ext.Msg.OK
,fn: function(btn) {
if (userId == 0) {
MODx.loadPage('security/user/update', 'id='+o.result.object.id);
}
return false;
}
});
this.clearDirty();
} else if (userId == 0) {
MODx.loadPage('security/user/update', 'id='+o.result.object.id);
}
}
,showNewPassword: function(cb,v) {
var el = Ext.getCmp('modx-user-panel-newpassword').getEl();
if (v) {
el.slideIn('t',{useDisplay:true});
} else {
el.slideOut('t',{useDisplay:true});
}
}
,getFields: function(config) {
var f = [{
title: _('general_information')
,defaults: { msgTarget: 'side' ,autoHeight: true }
,cls: 'main-wrapper form-with-labels'
,labelAlign: 'top' // prevent default class of x-form-label-left
,items: this.getGeneralFields(config)
}];
if (config.user != 0 && MODx.perm.user_settings) {
f.push({
title: _('settings')
,autoHeight: true
,defaults: { autoHeight: true }
,hideMode: 'offsets'
,items: [{
html: '<h3>'+_('user_settings')+'</h3><p>'+_('user_settings_desc')+'</p>'
,xtype: 'modx-description'
},{
xtype: 'modx-grid-user-settings'
,cls: 'main-wrapper'
,preventRender: true
,user: config.user
,width: '97%'
,listeners: {
'afterAutoSave':{fn:this.markDirty,scope:this}
}
}]
});
}
f.push({
title: _('access_permissions')
,layout: 'form'
,defaults: { border: false ,autoHeight: true }
,hideMode: 'offsets'
,items: [{
html: _('access_permissions_user_message')
,xtype: 'modx-description'
},{
xtype: 'modx-grid-user-groups'
,cls: 'main-wrapper'
,title: ''
,preventRender: true
,user: config.user
,width: '97%'
,listeners: {
'afterRemoveRow':{fn:this.markDirty,scope:this}
,'afterUpdateRole':{fn:this.markDirty,scope:this}
,'afterAddGroup':{fn:this.markDirty,scope:this}
,'afterReorderGroup':{fn:this.markDirty,scope:this}
}
}]
});
if (config.remoteFields && config.remoteFields.length) {
f.push({
title: _('remote_data')
,layout: 'form'
,defaults: { border: false ,autoHeight: true }
,hideMode: 'offsets'
,items: [{
html: '<p>'+_('user_remote_data_msg')+'</p>'
,xtype: 'modx-description'
},{
layout: 'column'
,cls: 'main-wrapper'
,items: [{
columnWidth: 0.4
,title: _('attributes')
,layout: 'fit'
,border: false
,items: {
xtype: 'modx-orm-tree'
,id: 'modx-remote-tree'
,data: config.remoteFields
,formPanel: 'modx-panel-user'
,prefix: 'remote'
}
},{
xtype: 'modx-orm-form'
,columnWidth: 0.6
,title: _('editing_form')
,id: 'modx-remote-form'
,prefix: 'remote'
,treePanel: 'modx-remote-tree'
,formPanel: 'modx-panel-user'
}]
}]
});
}
config.extendedFields = config.extendedFields || [];
f.push({
title: _('extended_fields')
,layout: 'form'
,defaults: { border: false ,autoHeight: true }
,hideMode: 'offsets'
,items: [{
html: '<p>'+_('extended_fields_msg')+'</p>'
,xtype: 'modx-description'
},{
layout: 'column'
,cls: 'main-wrapper'
,items: [{
columnWidth: 0.4
,title: _('attributes')
,layout: 'fit'
,border: false
,items: {
xtype: 'modx-orm-tree'
,id: 'modx-extended-tree'
,data: config.extendedFields
,formPanel: 'modx-panel-user'
,prefix: 'extended'
,enableDD: true
,listeners: {
'dragdrop': {fn:function() {
this.markDirty();
},scope:this}
}
}
},{
xtype: 'modx-orm-form'
,columnWidth: 0.6
,title: _('editing_form')
,id: 'modx-extended-form'
,prefix: 'extended'
,treePanel: 'modx-extended-tree'
,formPanel: 'modx-panel-user'
}]
}]
});
return f;
}
,getGeneralFields: function(config) {
var itemsRight = [{
id: 'modx-user-newpassword'
,name: 'newpassword'
,xtype: 'hidden'
,value: false
},{
id: 'modx-user-primary-group'
,name: 'primary_group'
,xtype: 'hidden'
},{
id: 'modx-user-active'
,name: 'active'
,hideLabel: true
,boxLabel: _('active')
,description: _('user_active_desc')
,xtype: 'xcheckbox'
,inputValue: 1
},{
id: 'modx-user-blocked'
,name: 'blocked'
,hideLabel: true
,boxLabel: _('user_block')
,description: _('user_block_desc')
,xtype: 'xcheckbox'
,inputValue: 1
}];
if (MODx.perm.set_sudo) {
itemsRight.push({
id: 'modx-user-sudo'
,name: 'sudo'
,hideLabel: true
,boxLabel: _('user_sudo')
,description: _('user_sudo_desc')
,xtype: 'xcheckbox'
,inputValue: 1
,value: 0
});
}
itemsRight.push({
id: 'modx-user-blockeduntil'
,name: 'blockeduntil'
,fieldLabel: _('user_blockeduntil')
,description: _('user_blockeduntil_desc')
,xtype: 'xdatetime'
,width: 300
,timeWidth: 150
,dateWidth: 150
,allowBlank: true
,dateFormat: MODx.config.manager_date_format
,timeFormat: MODx.config.manager_time_format
,hiddenFormat: 'Y-m-d H:i:s'
},{
id: 'modx-user-blockedafter'
,name: 'blockedafter'
,fieldLabel: _('user_blockedafter')
,description: _('user_blockedafter_desc')
,xtype: 'xdatetime'
,width: 300
,timeWidth: 150
,dateWidth: 150
,allowBlank: true
,dateFormat: MODx.config.manager_date_format
,timeFormat: MODx.config.manager_time_format
,hiddenFormat: 'Y-m-d H:i:s'
},{
id: 'modx-user-logincount'
,name: 'logincount'
,fieldLabel: _('user_logincount')
,description: _('user_logincount_desc')
,xtype: 'statictextfield'
},{
id: 'modx-user-lastlogin'
,name: 'lastlogin'
,fieldLabel: _('user_prevlogin')
,description: _('user_prevlogin_desc')
,xtype: 'statictextfield'
},{
id: 'modx-user-failedlogincount'
,name: 'failedlogincount'
,fieldLabel: _('user_failedlogincount')
,description: _('user_failedlogincount_desc')
,xtype: 'textfield'
},{
id: 'modx-user-createdon'
,name: 'createdon'
,fieldLabel: _('user_createdon')
,description: _('user_createdon_desc')
,xtype: 'statictextfield'
},{
id: 'modx-user-class-key'
,name: 'class_key'
,fieldLabel: _('class_key')
,description: _('user_class_key_desc')
,xtype: 'textfield'
,anchor: '100%'
,value: 'modUser'
},{
id: 'modx-user-comment'
,name: 'comment'
,fieldLabel: _('comment')
,xtype: 'textarea'
,anchor: '100%'
,grow: true
},{
id: 'modx-user-fs-newpassword'
,title: _('password_new')
,xtype: 'fieldset'
,cls: 'x-fieldset-checkbox-toggle' // add a custom class for checkbox replacement
,checkboxToggle: true
,collapsed: (config.user ? true : false)
,forceLayout: true
,listeners: {
'expand': {fn:function(p) {
Ext.getCmp('modx-user-newpassword').setValue(true);
this.markDirty();
},scope:this}
,'collapse': {fn:function(p) {
Ext.getCmp('modx-user-newpassword').setValue(false);
this.markDirty();
},scope:this}
}
,items: [{
xtype: 'radiogroup'
,fieldLabel: _('password_method')
,columns: 1
,items: [{
id: 'modx-user-passwordnotifymethod-e'
,name: 'passwordnotifymethod'
,boxLabel: _('password_method_email')
,xtype: 'radio'
,value: 'e'
,inputValue: 'e'
},{
id: 'modx-user-passwordnotifymethod-s'
,name: 'passwordnotifymethod'
,boxLabel: _('password_method_screen')
,xtype: 'radio'
,value: 's'
,inputValue: 's'
,checked: true
}]
},{
xtype: 'radiogroup'
,fieldLabel: _('password_gen_method')
,columns: 1
,items: [{
id: 'modx-user-password-genmethod-g'
,name: 'passwordgenmethod'
,boxLabel: _('password_gen_gen')
,xtype: 'radio'
,inputValue: 'g'
,value: 'g'
,checked: true
},{
id: 'modx-user-password-genmethod-s'
,name: 'passwordgenmethod'
,boxLabel: _('password_gen_specify')
,xtype: 'radio'
,inputValue: 'spec'
,value: 'spec'
}]
},{
id: 'modx-user-panel-newpassword'
,xtype: 'panel'
,layout: 'form'
,border: false
,autoHeight: true
,style: 'padding-top: 15px' // nested form, add padding-top as the label will not have it
,items: [{
id: 'modx-user-specifiedpassword'
,name: 'specifiedpassword'
,fieldLabel: _('change_password_new')
,xtype: 'textfield'
,inputType: 'password'
,anchor: '100%'
},{
id: 'modx-user-confirmpassword'
,name: 'confirmpassword'
,fieldLabel: _('change_password_confirm')
,xtype: 'textfield'
,inputType: 'password'
,anchor: '100%'
}]
}]
});
return [{
layout: 'column'
,border: false
,defaults: {
layout: 'form'
,labelAlign: 'top'
,labelSeparator: ''
,anchor: '100%'
,border: false
}
,items: [{
columnWidth: .5
,defaults: {
msgTarget: 'under'
}
,items: [{
id: 'modx-user-id'
,name: 'id'
,xtype: 'hidden'
,value: config.user
},{
id: 'modx-user-username'
,name: 'username'
,fieldLabel: _('username')
,description: _('user_username_desc')
,autoCreate: {tag: "input", type: "text", size: "20", autocomplete: "off", msgTarget: "under"}
,xtype: 'textfield'
,anchor: '100%'
},{
id: 'modx-user-fullname'
,name: 'fullname'
,fieldLabel: _('user_full_name')
,xtype: 'textfield'
,anchor: '100%'
,maxLength: 255
},{
id: 'modx-user-email'
,name: 'email'
,fieldLabel: _('user_email')
,xtype: 'textfield'
,anchor: '100%'
,maxLength: 255
,allowBlank: false
},{
id: 'modx-user-phone'
,name: 'phone'
,fieldLabel: _('user_phone')
,xtype: 'textfield'
,width: 200
,maxLength: 255
},{
id: 'modx-user-mobilephone'
,name: 'mobilephone'
,fieldLabel: _('user_mobile')
,xtype: 'textfield'
,width: 200
,maxLength: 255
},{
id: 'modx-user-fax'
,name: 'fax'
,fieldLabel: _('user_fax')
,xtype: 'textfield'
,width: 200
,maxLength: 255
},{
id: 'modx-user-address'
,name: 'address'
,fieldLabel: _('address')
,xtype: 'textarea'
,anchor: '100%'
,grow: true
},{
id: 'modx-user-city'
,name: 'city'
,fieldLabel: _('city')
,xtype: 'textfield'
,anchor: '100%'
,maxLength: 255
},{
id: 'modx-user-state'
,name: 'state'
,fieldLabel: _('user_state')
,xtype: 'textfield'
,width: 100
,maxLength: 100
},{
id: 'modx-user-zip'
,name: 'zip'
,fieldLabel: _('user_zip')
,xtype: 'textfield'
,width: 100
,maxLength: 25
},{
id: 'modx-user-country'
,fieldLabel: _('user_country')
,xtype: 'modx-combo-country'
,value: ''
},{
id: 'modx-user-website'
,name: 'website'
,fieldLabel: _('user_website')
,xtype: 'textfield'
,anchor: '100%'
,maxLength: 255
},{
fieldLabel: _('user_photo')
,name: 'photo'
,xtype: 'modx-combo-browser'
,hideFiles: true
,source: MODx.config['photo_profile_source'] || MODx.config.default_media_source
,hideSourceCombo: true
,anchor: '100%'
},{
id: 'modx-user-dob'
,name: 'dob'
,fieldLabel: _('user_dob')
,xtype: 'datefield'
,width: 200
,allowBlank: true
},{
id: 'modx-user-gender'
,name: 'gender'
,hiddenName: 'gender'
,fieldLabel: _('user_gender')
,xtype: 'modx-combo-gender'
,width: 200
}]
},{
columnWidth: .5
,defaults: {
msgTarget: 'under'
}
,items: itemsRight
}]
},{
html: MODx.onUserFormRender
,border: false
}];
}
});
Ext.reg('modx-panel-user',MODx.panel.User);
/**
* Displays a gender combo
*
* @class MODx.combo.Gender
* @extends Ext.form.ComboBox
* @param {Object} config An object of configuration properties
* @xtype modx-combo-gender
*/
MODx.combo.Gender = function(config) {
config = config || {};
Ext.applyIf(config,{
store: new Ext.data.SimpleStore({
fields: ['d','v']
,data: [['',0],[_('user_male'),1],[_('user_female'),2],[_('user_other'),3]]
})
,displayField: 'd'
,valueField: 'v'
,mode: 'local'
,triggerAction: 'all'
,editable: false
,selectOnFocus: false
});
MODx.combo.Gender.superclass.constructor.call(this,config);
};
Ext.extend(MODx.combo.Gender,Ext.form.ComboBox);
Ext.reg('modx-combo-gender',MODx.combo.Gender);