From 6b19b2dc895b862d00eaf1eb4f047282418f598c Mon Sep 17 00:00:00 2001 From: Petr Vobornik Date: Tue, 30 Aug 2011 13:39:53 +0200 Subject: Enable update and reset button only if dirty https://fedorahosted.org/freeipa/ticket/1697 Original problem: WEBUI: Update automount location refer to unknown command Update name of the automount location (Policy -> Automount -> custom_location -> Settings -> Update) in the WEBUI refer to an unknown command. Solution: Tracking dirty state in field -> section -> details facet. 'Reset' and 'Updates' in details facet are enabled only if facet is dirty. Removes the problem above and 'no modification to be performed' annoyance. --- install/ui/widget.js | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'install/ui/widget.js') diff --git a/install/ui/widget.js b/install/ui/widget.js index f3559a35..1a068354 100644 --- a/install/ui/widget.js +++ b/install/ui/widget.js @@ -62,6 +62,8 @@ IPA.widget = function(spec) { that.dirty = false; that.valid = true; + that.dirty_changed = IPA.observer(); + function set_param_info(){ if (!that.param_info && that.entity){ @@ -296,6 +298,7 @@ IPA.widget = function(spec) { }; that.set_dirty = function(dirty) { + var old = that.dirty; that.dirty = dirty; if (that.undo) { if (dirty) { @@ -304,6 +307,10 @@ IPA.widget = function(spec) { that.hide_undo(); } } + + if(old !== dirty) { + that.dirty_changed.notify([], that); + } }; that.get_undo = function() { @@ -496,6 +503,7 @@ IPA.multivalued_text_widget = function(spec) { }; that.set_dirty = function(dirty, index) { + var old = that.dirty; that.dirty = dirty; if (that.undo) { @@ -510,6 +518,10 @@ IPA.multivalued_text_widget = function(spec) { that.set_dirty(that.test_dirty()); } } + + if(old !== dirty) { + that.dirty_changed.notify([], that); + } }; that.show_undo = function(index) { @@ -1939,3 +1951,33 @@ IPA.button = function(spec) { return button; }; +IPA.observer = function(spec) { + + var that = {}; + + that.listeners = []; + + that.attach = function(callback) { + that.listeners.push(callback); + }; + + that.detach = function(callback) { + for(var i=0; i < that.listeners.length; i++) { + if(callback === that.listeners[i]) { + that.listeners.splice(i,1); + break; + } + } + }; + + that.notify = function(args, context) { + args = args || []; + context = context || this; + + for(var i=0; i < that.listeners.length; i++) { + that.listeners[i].apply(context, args); + } + }; + + return that; +}; -- cgit