From 08905eb9a9039b38c032275a87b4f5602e5a63dd Mon Sep 17 00:00:00 2001 From: Petr Vobornik Date: Fri, 5 Aug 2011 17:12:21 +0200 Subject: Fixed adding host without DNS reverse zone https://fedorahosted.org/freeipa/ticket/1481 Shows status dialog instead of error dialog (error 4304 is treated like success). Refactored error dialog. Added generic message dialog (IPA.message_dialog) Modified core tests to work with dialog. --- install/ui/add.js | 17 +++--- install/ui/dialog.js | 32 +++++++++++- install/ui/host.js | 42 +++++++++++++++ install/ui/ipa.js | 115 +++++++++++++++++++++++------------------ install/ui/test/ipa_tests.html | 1 + install/ui/test/ipa_tests.js | 23 +++++---- 6 files changed, 163 insertions(+), 67 deletions(-) (limited to 'install') diff --git a/install/ui/add.js b/install/ui/add.js index 988ea8ff1..b4f1228f0 100644 --- a/install/ui/add.js +++ b/install/ui/add.js @@ -31,6 +31,9 @@ IPA.add_dialog = function (spec) { that.method = spec.method || 'add'; that.pre_execute_hook = spec.pre_execute_hook; + that.on_error = spec.on_error ; + that.retry = typeof spec.retry !== 'undefined' ? spec.retry : true; + that.command = null; function show_edit_page(entity,result){ var pkey_name = entity.metadata.primary_key; @@ -51,9 +54,11 @@ IPA.add_dialog = function (spec) { var command = IPA.command({ entity: that.entity.name, method: that.method, + retry: that.retry, on_success: on_success, on_error: on_error }); + that.command = command; pkey_prefix = that.entity.get_primary_key_prefix(); @@ -127,8 +132,8 @@ IPA.add_dialog = function (spec) { var table = facet.table; table.refresh(); that.close(); - } - ); + }, + that.on_error); }); that.add_button(IPA.messages.buttons.add_and_add_another, function() { @@ -141,8 +146,8 @@ IPA.add_dialog = function (spec) { var table = facet.table; table.refresh(); that.reset(); - } - ); + }, + that.on_error); }); that.add_button(IPA.messages.buttons.add_and_edit, function() { @@ -154,8 +159,8 @@ IPA.add_dialog = function (spec) { that.close(); var result = data.result.result; that.show_edit_page(that.entity,result); - } - ); + }, + that.on_error); }); that.add_button(IPA.messages.buttons.cancel, function() { diff --git a/install/ui/dialog.js b/install/ui/dialog.js index 0a1d5428a..0ec84a786 100644 --- a/install/ui/dialog.js +++ b/install/ui/dialog.js @@ -32,6 +32,7 @@ IPA.dialog = function(spec) { that.entity = spec.entity; that.name = spec.name; + that.id = spec.id; that.title = spec.title; that.width = spec.width || 400; that.height = spec.height; @@ -194,7 +195,7 @@ IPA.dialog = function(spec) { */ that.open = function(container) { - that.container = $('
'); + that.container = $('
', { id : that.id }); if (container) { container.append(that.container); } @@ -257,6 +258,7 @@ IPA.dialog = function(spec) { that.dialog_create = that.create; that.dialog_open = that.open; + that.dialog_close = that.close; var fields = spec.fields || []; for (var i=0; i', { + 'text': that.message + }).appendTo(that.container); + }; + + that.add_button(IPA.messages.buttons.ok, function() { + that.close(); + if(that.on_ok) { + that.on_ok(); + } + }); + + init(); + + return that; +}; diff --git a/install/ui/host.js b/install/ui/host.js index b8e849211..743196b08 100644 --- a/install/ui/host.js +++ b/install/ui/host.js @@ -102,6 +102,7 @@ IPA.entity_factories.host = function () { }). standard_association_facets(). adder_dialog({ + factory: IPA.host_adder_dialog, width: 400, height: 250, fields:[ @@ -128,6 +129,47 @@ IPA.entity_factories.host = function () { build(); }; +IPA.host_adder_dialog = function(spec) +{ + spec = spec || {}; + spec.retry = typeof spec.retry !== 'undefined' ? spec.retry : false; + + var that = IPA.add_dialog(spec); + + that.on_error = function(xhr, text_status, error_thrown) + { + var command = that.command; + var data = error_thrown.data; + var dialog = null; + + if(data && data.error && data.error.code === 4304) { + dialog = IPA.message_dialog({ + message: data.error.message, + title: spec.title, + on_ok: function() { + data.result = { + result: { + fqdn: that.get_field('fqdn').save() + } + }; + command.on_success(data, text_status, xhr); + } + }); + } else { + dialog = IPA.error_dialog({ + xhr: xhr, + text_status: text_status, + error_thrown: error_thrown, + command: command + }); + } + + dialog.open(that.container); + }; + + return that; +}; + IPA.host_deleter_dialog = function(spec) { spec = spec || {}; diff --git a/install/ui/ipa.js b/install/ui/ipa.js index 2f1c6969c..d53ee7b12 100644 --- a/install/ui/ipa.js +++ b/install/ui/ipa.js @@ -243,57 +243,13 @@ IPA.command = function(spec) { that.execute = function() { function dialog_open(xhr, text_status, error_thrown) { - - IPA.error_dialog = $('
', { - id: 'error_dialog' - }); - - if (error_thrown.url) { - $('

', { - text: 'URL: '+error_thrown.url - }).appendTo(IPA.error_dialog); - } - - $('

', { - html: error_thrown.message - }).appendTo(IPA.error_dialog); - - function close() { - IPA.error_dialog.dialog('destroy'); - IPA.error_dialog.remove(); - IPA.error_dialog = null; - } - - var buttons = {}; - - /** - * When a user initially opens the Web UI without a Kerberos - * ticket, the messages including the button labels have not - * been loaded yet, so the button labels need default values. - */ - var label = IPA.messages.buttons ? IPA.messages.buttons.retry : 'Retry'; - buttons[label] = function() { - close(); - that.execute(); - }; - - label = IPA.messages.buttons ? IPA.messages.buttons.cancel : 'Cancel'; - buttons[label] = function() { - close(); - if (that.on_error) { - that.on_error.call(this, xhr, text_status, error_thrown); - } - }; - - IPA.error_dialog.dialog({ - modal: true, - title: error_thrown.name, - width: 400, - buttons: buttons, - close: function() { - close(); - } + var dialog = IPA.error_dialog({ + xhr: xhr, + text_status: text_status, + error_thrown: error_thrown, + command: that }); + dialog.open(); } function error_handler(xhr, text_status, error_thrown) { @@ -331,6 +287,7 @@ IPA.command = function(spec) { dialog_open.call(this, xhr, text_status, error_thrown); } else if (that.on_error) { + //custom error handling, maintaining AJAX call's context that.on_error.call(this, xhr, text_status, error_thrown); } } @@ -349,11 +306,13 @@ IPA.command = function(spec) { // error_handler() calls IPA.hide_activity_icon() error_handler.call(this, xhr, text_status, /* error_thrown */ { name: 'IPA Error '+data.error.code, - message: data.error.message + message: data.error.message, + data: data }); } else if (that.on_success) { IPA.hide_activity_icon(); + //custom success handling, maintaining AJAX call's context that.on_success.call(this, data, text_status, xhr); } } @@ -610,3 +569,57 @@ IPA.dirty_dialog = function(spec) { return that; }; + +IPA.error_dialog = function(spec) { + var that = IPA.dialog(spec); + + var init = function() { + spec = spec || {}; + + that.id = 'error_dialog'; + that.xhr = spec.xhr || {}; + that.text_status = spec.text_status || ''; + that.error_thrown = spec.error_thrown || {}; + that.command = spec.command; + that.title = spec.error_thrown.name; + }; + + that.create = function() { + if (that.error_thrown.url) { + $('

', { + text: 'URL: '+that.error_thrown.url + }).appendTo(that.container); + } + + $('

', { + html: that.error_thrown.message + }).appendTo(that.container); + }; + + that.create_buttons = function() { + /** + * When a user initially opens the Web UI without a Kerberos + * ticket, the messages including the button labels have not + * been loaded yet, so the button labels need default values. + */ + var label = IPA.messages.buttons ? IPA.messages.buttons.retry : 'Retry'; + + that.add_button(label, function() { + that.close(); + that.command.execute(); + }); + + label = IPA.messages.buttons ? IPA.messages.buttons.cancel : 'Cancel'; + that.add_button(label, function() { + that.close(); + if (that.command.retry && that.command.on_error) { + that.command.on_error(that.xhr, that.text_status, that.error_thrown); + } + }); + }; + + init(); + that.create_buttons(); + + return that; +}; diff --git a/install/ui/test/ipa_tests.html b/install/ui/test/ipa_tests.html index 8f8ab93ef..b3bf93b16 100644 --- a/install/ui/test/ipa_tests.html +++ b/install/ui/test/ipa_tests.html @@ -11,6 +11,7 @@ + diff --git a/install/ui/test/ipa_tests.js b/install/ui/test/ipa_tests.js index 72a32783f..079b022b3 100644 --- a/install/ui/test/ipa_tests.js +++ b/install/ui/test/ipa_tests.js @@ -162,8 +162,10 @@ test("Testing successful IPA.command().", function() { "Checking ajax invocation counter" ); + var dialog = $('#error_dialog'); + ok( - !IPA.error_dialog, + dialog.length == 0, "The dialog box is not created." ); @@ -237,7 +239,8 @@ test("Testing unsuccessful IPA.command().", function() { on_error: error_handler }).execute(); - var dialog = IPA.error_dialog.parent('.ui-dialog'); + var dialog = $('#error_dialog'); + var ui_dialog = dialog.parent('.ui-dialog'); equals( ajax_counter, 1, @@ -245,7 +248,7 @@ test("Testing unsuccessful IPA.command().", function() { ); ok( - dialog.length == 1 && IPA.error_dialog.dialog('isOpen'), + ui_dialog.length == 1 && dialog.dialog('isOpen'), "The dialog box is created and open." ); @@ -255,7 +258,7 @@ test("Testing unsuccessful IPA.command().", function() { ); // search the retry button from the beginning - var retry = $('button', dialog).first(); + var retry = $('button', ui_dialog).first(); retry.trigger('click'); equals( @@ -270,8 +273,8 @@ test("Testing unsuccessful IPA.command().", function() { // search the retry button from the beginning again because the dialog // has been recreated - dialog = IPA.error_dialog.parent('.ui-dialog'); - retry = $('button', dialog).first(); + ui_dialog = $('#error_dialog').parent('.ui-dialog'); + retry = $('button', ui_dialog).first(); retry.trigger('click'); equals( @@ -286,8 +289,8 @@ test("Testing unsuccessful IPA.command().", function() { // search the cancel button from the beginning because the dialog has // been recreated - dialog = IPA.error_dialog.parent('.ui-dialog'); - var cancel = $('button', dialog).first().next(); + ui_dialog = $('#error_dialog').parent('.ui-dialog'); + var cancel = $('button', ui_dialog).first().next(); cancel.trigger('click'); equals( @@ -295,8 +298,10 @@ test("Testing unsuccessful IPA.command().", function() { "Checking ajax invocation counter" ); + dialog = $('#error_dialog'); + ok( - !IPA.error_dialog, + dialog.length == 0, "After cancel, the dialog box is closed." ); -- cgit