A hack for toolbar widget to get fixed existing toolbar preferences and keep working with new actions

This commit is contained in:
Hadi Nategh 2015-09-18 13:32:51 +00:00
parent 3f5107c4cb
commit 01ec6d0406

View File

@ -80,7 +80,7 @@ var et2_toolbar = et2_DOMWidget.extend([et2_IInput],
this.dropdowns = {}; this.dropdowns = {};
this.preference = {}; this.preference = {};
this._build_menu(this.default_toolbar); this._build_menu(this.default_toolbar, true);
}, },
destroy: function() { destroy: function() {
@ -94,13 +94,61 @@ var et2_toolbar = et2_DOMWidget.extend([et2_IInput],
this.actionbox.empty().remove(); this.actionbox.empty().remove();
this.actionlist.empty().remove(); this.actionlist.empty().remove();
}, },
/**
* Fix function in order to fix toolbar preferences with the new preference structure
* @param {action object} _action
* @todo ** SEE IMPORTANT TODO **
*/
_fix_preference: function (_action)
{
// ** IMPORTANT TODO: This switch case should be removed for new release **
// This is an ugly hack but we need to add this switch becuase to update and fix
// current users toolbar preferences with the new structure which is:
// - All actions should be stored in preference
// - Actions inside menu set as true
// - Actions outside menu set as false
// - if an action gets added to toolbar it would be undefined in
// the preference which we need to consider to add it to the preference
// according to its toolbarDefault option.
if (this.dom_id === 'mail-display_displayToolbar' || this.dom_id === 'mail-index_toolbar')
{
switch (_action.id)
{
// Actions newly added to mail index and display toolbar
case 'read':
case 'label1':
case 'label2':
case 'label3':
case 'label4':
case 'label5':
this.set_prefered(_action.id, !_action.toolbarDefault);
break;
default:
// Fix structure and add the actions not the preference
// into the preference with value false, as they're already
// outside of the menu.
this.set_prefered(_action.id, false);
}
}
else
{
//** IMPORTANT TODO: This line needs to stay and be fixed with !toolbarDefault after the if condition
// has been removed.
this.set_prefered(_action.id, false/*!toolbarDefault*/);
}
},
/** /**
* Go through actions and build buttons for the toolbar * Go through actions and build buttons for the toolbar
* *
* @param {Object} actions egw-actions to build menu from * @param {Object} actions egw-actions to build menu from
* @param {boolean} isDefault setting isDefault with true will
* avoid actions get into the preferences, for instandce, first
* time toolbar_default actions initialization.
*/ */
_build_menu: function(actions) _build_menu: function(actions, isDefault)
{ {
// Clear existing // Clear existing
this.div.empty(); this.div.empty();
@ -114,13 +162,28 @@ var et2_toolbar = et2_DOMWidget.extend([et2_IInput],
if (pref && !jQuery.isArray(pref)) this.preference = pref; if (pref && !jQuery.isArray(pref)) this.preference = pref;
//Set the default actions for the first time //Set the default actions for the first time
if (typeof pref === 'undefined') if (typeof pref === 'undefined' && !isDefault)
{ {
for (var name in actions) for (var name in actions)
{ {
if (!actions[name].toolbarDefault && if ((typeof actions[name].children === 'undefined' || !this.options.flat_list) && actions[name].id)
(typeof actions[name].children === 'undefined' || !this.options.flat_list)) {
this.set_prefered(actions[name].id,'add'); this.set_prefered(actions[name].id,!actions[name].toolbarDefault);
}
}
}
else if(!isDefault)
{
for (var name in actions)
{
// Check if the action is not in the preference, means it's an new added action
// therefore it needs to be added to the preference with taking its toolbarDefault
// option into account.
if ((typeof actions[name].children === 'undefined' || !this.options.flat_list)
&& typeof pref[name] === 'undefined')
{
this._fix_preference(actions[name]);
}
} }
} }
@ -158,8 +221,13 @@ var et2_toolbar = et2_DOMWidget.extend([et2_IInput],
} }
return totalCount; return totalCount;
}; };
var menuLen = 0;
this.countActions = countActions(actions) - Object.keys(this.preference).length; for (var key in this.preference)
{
if (this.preference[key]) menuLen++;
}
this.countActions = countActions(actions) - menuLen;
var last_group = false; var last_group = false;
var last_group_id = false; var last_group_id = false;
@ -206,11 +274,22 @@ var et2_toolbar = et2_DOMWidget.extend([et2_IInput],
if (that.flat_list) if (that.flat_list)
{ {
childaction = root.children[id]; childaction = root.children[id];
if (typeof pref === 'undefined') if (typeof pref === 'undefined' && !isDefault)
{ {
if (!childaction.toolbarDefault) if (!childaction.toolbarDefault)
{ {
that.set_prefered(childaction.id,'add'); that.set_prefered(childaction.id,true);
}
else
{
that.set_prefered(childaction.id,false);
}
}
else if(!isDefault)
{
if (typeof pref[childaction.id] === 'undefined')
{
that._fix_preference(childaction);
} }
} }
if (typeof root.children[id].group !== 'undefined' && if (typeof root.children[id].group !== 'undefined' &&
@ -322,7 +401,7 @@ var et2_toolbar = et2_DOMWidget.extend([et2_IInput],
toolbox.children().droppable({ toolbox.children().droppable({
accept:toolbar, accept:toolbar,
drop:function (event, ui) { drop:function (event, ui) {
that.set_prefered(ui.draggable.attr('id').replace(that.id+'-',''),"add"); that.set_prefered(ui.draggable.attr('id').replace(that.id+'-',''),true);
ui.draggable.appendTo(menulist); ui.draggable.appendTo(menulist);
if (that.actionlist.find(".ui-draggable").length == 0) if (that.actionlist.find(".ui-draggable").length == 0)
{ {
@ -336,7 +415,7 @@ var et2_toolbar = et2_DOMWidget.extend([et2_IInput],
this.actionlist.droppable({ this.actionlist.droppable({
tolerance:"pointer", tolerance:"pointer",
drop:function (event,ui) { drop:function (event,ui) {
that.set_prefered(ui.draggable.attr('id').replace(that.id+'-',''),"remove"); that.set_prefered(ui.draggable.attr('id').replace(that.id+'-',''),false);
ui.draggable.appendTo(that.actionlist); ui.draggable.appendTo(that.actionlist);
that._build_menu(actions); that._build_menu(actions);
} }
@ -370,21 +449,13 @@ var et2_toolbar = et2_DOMWidget.extend([et2_IInput],
* Add/Or remove an action from prefence * Add/Or remove an action from prefence
* *
* @param {string} _action name of the action which needs to be stored in pereference * @param {string} _action name of the action which needs to be stored in pereference
* @param {string} _do if set to "add" add the action to preference and "remove" remove one from preference * @param {boolean} _state if set to true action will be set to actionbox, false will set it to actionlist
* *
*/ */
set_prefered: function(_action,_do) set_prefered: function(_action,_state)
{ {
switch(_do) this.preference[_action] = _state;
{ egw.set_preference(this.egw().getAppName(),this.dom_id,this.preference);
case "add":
this.preference[_action] = true;
egw.set_preference(this.egw().getAppName(),this.dom_id,this.preference);
break;
case "remove":
delete this.preference[_action];
egw.set_preference(this.egw().getAppName(),this.dom_id,this.preference);
}
}, },
/** /**