diff --git a/admin/js/app.js b/admin/js/app.js
index ee4cabbe14..10bdedc234 100644
--- a/admin/js/app.js
+++ b/admin/js/app.js
@@ -35,6 +35,11 @@ app.classes.admin = AppJS.extend(
*/
nm: null,
+ /**
+ * Reference to ACL edit dialog (not the list)
+ */
+ acl_dialog: null,
+
/**
* Constructor
*
@@ -52,6 +57,8 @@ app.classes.admin = AppJS.extend(
destroy: function()
{
this.iframe = null;
+ this.nm = null;
+ this.acl_dialog = null;
// call parent
this._super.apply(this, arguments);
@@ -324,30 +331,72 @@ app.classes.admin = AppJS.extend(
{
ids.push(_senders[i].id.split('::').pop()); // remove "admin::" prefix
}
+
+ // For edit, set some data from the list since it's already there
+ var content = _senders[0].id ? jQuery.extend({}, egw.dataGetUIDdata(_senders[0].id).data) : {};
+
+ switch(_action.id)
+ {
+ case 'delete':
+ var app = egw.app_name(); // can be either admin or preferences!
+ if (app != 'admin') app = 'preferences';
+ var className = app+'_acl';
+ var request = egw.json(className+'::ajax_change_acl', [ids], this._acl_callback,this,false,this)
+ .sendRequest();
+ break;
+
+ case 'add':
+ // No content, even if they clicked on a row
+ // Defaults set by _acl_content() based on nm values
+ content = {};
+ // Fall through
+ case 'edit':
+ this._acl_dialog(content);
+ break;
+ }
+ },
+
+ /**
+ * Create the ACL edit dialog, including defaults & fetching what can be found
+ *
+ * @param content List of content for the dialog template
+ * @param sel_options optional select options
+ */
+ _acl_dialog: function(content, sel_options)
+ {
+ if(typeof content == 'undefined') content = {};
+
+ // Determine which application we're running as
var app = egw.app_name(); // can be either admin or preferences!
if (app != 'admin') app = 'preferences';
var className = app+'_acl';
+ var acl_rights = {};
+ var readonlys = {acl: {}};
// Select options are already here, just pull them and pass along
- var sel_options = jQuery.extend({}, this.et2.getArrayMgr('sel_options').data||{}, {
+ sel_options = jQuery.extend({}, this.et2.getArrayMgr('sel_options').data||{}, {
'apps': this.et2.getArrayMgr('sel_options').getEntry('acl_appname')
- });
+ },sel_options);
- // For add and edit, set some data from the list since it's already there
- var acl_rights = this.et2.getWidgetById('nm').getArrayMgr('content').getEntry('acl_rights')||{};
- var content = _senders[0].id ? jQuery.extend({}, egw.dataGetUIDdata(_senders[0].id).data) : {};
- if(!content.acl_appname)
+ // Some defaults
+ if(this.et2 && this.et2.getWidgetById('nm'))
{
- // Pre-set appname to currently selected
- content.acl_appname = this.et2.getWidgetById('filter2').getValue();
- }
- if(!content.acl_location)
- {
- content.acl_location = this.et2.getWidgetById('filter2').getValue() == 'run' ? 'run' : null;
- }
- if(!content.acl_account)
- {
- content.acl_account = this.et2.getWidgetById('nm').getArrayMgr('content').getEntry('account_id');
+ // This is which checkboxes are available for each app
+ var acl_rights = this.et2.getWidgetById('nm').getArrayMgr('content').getEntry('acl_rights')||{};
+
+ if(!content.acl_appname)
+ {
+ // Pre-set appname to currently selected
+ content.acl_appname = this.et2.getWidgetById('filter2').getValue()||"";
+ }
+ if(!content.acl_location)
+ {
+ content.acl_location = this.et2.getWidgetById('filter2').getValue() == 'run' ? 'run' : null;
+ }
+ if(!content.acl_account)
+ {
+ content.acl_account = this.et2.getWidgetById('nm').getArrayMgr('content').getEntry('account_id');
+ }
}
if(content.acl_appname)
{
@@ -356,56 +405,66 @@ app.classes.admin = AppJS.extend(
jQuery.extend(content, {acl:[],right:[],label:[]});
for( var right in acl_rights[content.acl_appname])
{
+ if(right == '16' && content['acl_account'] != egw.user('account_id'))
+ {
+ // only user himself is allowed to grant private (16) rights
+ readonlys.acl[content.acl.length] = true;
+ }
content.acl.push(content.acl_rights & right);
content.right.push(right);
content.label.push(egw.lang(acl_rights[content.acl_appname][right]));
}
- // These aren't actually there
- if(content.acl_account)
- {
- sel_options.acl_account = {};
- this.egw.link_title('home-accounts', content.acl_account, function(title) {sel_options.acl_account[content.acl_account] = title;});
- }
- if(content.acl_location)
- {
- sel_options.acl_location = {};
- this.egw.link_title('home-accounts', content.acl_location, function(title) {sel_options.acl_location[content.acl_location] = title;});
- }
+
}
- switch(_action.id)
+ // Create the dialog
+ this.acl_dialog = et2_createWidget("dialog", {
+ callback: jQuery.proxy(function(_button_id, _value) {
+ this.acl_dialog = null;
+ if(_button_id != et2_dialog.OK_BUTTON) return;
+
+ // Only send the request if they entered everything
+ if(_value.acl_appname && _value.acl_account && _value.acl_location)
+ {
+ var id = _value.acl_appname+':'+_value.acl_account+':'+_value.acl_location;
+ var rights = 0;
+ for(var i in _value.acl)
+ {
+ rights += parseInt(_value.acl[i]);
+ }
+ this.egw.json(className+'::ajax_change_acl', [id, rights], this._acl_callback,this,false,this)
+ .sendRequest();
+ }
+ },this),
+ title: egw.lang('Access control'),
+ buttons: et2_dialog.BUTTONS_OK_CANCEL,
+ value: {
+ content: content,
+ sel_options: sel_options,
+ readonlys: readonlys
+ },
+ template: egw.webserverUrl+'/admin/templates/default/acl.edit.xet'
+ }, et2_dialog._create_parent(app));
+ },
+
+ /**
+ * Change handler for ACL edit dialog application selectbox.
+ * Re-creates the dialog with the current values
+ */
+ acl_change_application: function(input, widget)
+ {
+ var content = {};
+ if(this.acl_dialog != null)
{
- case 'delete':
- var request = egw.json(className+'::ajax_change_acl', [ids], this._acl_callback,this,false,this)
- .sendRequest();
- break;
+ content = this.acl_dialog.get_value() || {};
- case 'edit':
- case 'add':
- return et2_createWidget("dialog", {
- callback: jQuery.proxy(function(_button_id, _value) {
- if(_button_id != et2_dialog.OK_BUTTON) return;
-
- var id = _value.acl_appname+':'+_value.acl_account+':'+_value.acl_location;
- var rights = 0;
- for(var i in _value.acl)
- {
- rights += parseInt(_value.acl[i]);
- }
- this.egw.json(className+'::ajax_change_acl', [id, rights], this._acl_callback,this,false,this)
- .sendRequest();
- },this),
- title: egw.lang('Access control'),
- buttons: et2_dialog.BUTTONS_OK_CANCEL,
- value: {
- content: content,
- sel_options: sel_options
- },
- template: egw.webserverUrl+'/admin/templates/default/acl.edit.xet'
- }, et2_dialog._create_parent(app));
- break;
+ // Destroy the dialog
+ this.acl_dialog.free();
+ this.acl_dialog = null;
}
+ // Re-open the dialog
+ this._acl_dialog(content);
},
/**
diff --git a/admin/templates/default/acl.edit.xet b/admin/templates/default/acl.edit.xet
index 079bbbfc06..36347bbdc4 100644
--- a/admin/templates/default/acl.edit.xet
+++ b/admin/templates/default/acl.edit.xet
@@ -11,7 +11,7 @@
-
+