diff options
author | Petr Vobornik <pvoborni@redhat.com> | 2012-11-26 14:28:32 +0100 |
---|---|---|
committer | Petr Vobornik <pvoborni@redhat.com> | 2013-01-18 15:10:36 +0100 |
commit | b9ef6ab0c412913234f05f788b3fcd3c3277eb69 (patch) | |
tree | 2af9ef49ce74fd152c4c7b6f0aad543b4793ba59 /install/ui/src/freeipa/dialog.js | |
parent | 8f8e790d9468245c031320d6a506a420f486638f (diff) | |
download | freeipa-b9ef6ab0c412913234f05f788b3fcd3c3277eb69.tar.gz freeipa-b9ef6ab0c412913234f05f788b3fcd3c3277eb69.tar.xz freeipa-b9ef6ab0c412913234f05f788b3fcd3c3277eb69.zip |
Move of core Web UI files to AMD directory
SSIA
https://fedorahosted.org/freeipa/ticket/112
Diffstat (limited to 'install/ui/src/freeipa/dialog.js')
-rw-r--r-- | install/ui/src/freeipa/dialog.js | 849 |
1 files changed, 849 insertions, 0 deletions
diff --git a/install/ui/src/freeipa/dialog.js b/install/ui/src/freeipa/dialog.js new file mode 100644 index 000000000..4e603155a --- /dev/null +++ b/install/ui/src/freeipa/dialog.js @@ -0,0 +1,849 @@ +/*jsl:import ipa.js */ +/* Authors: + * Endi Sukma Dewata <edewata@redhat.com> + * Petr Vobornik <pvoborni@redhat.com> + * + * Copyright (C) 2010 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* REQUIRES: widget.js, details.js */ + +IPA.opened_dialogs = { + + dialogs: [], + + top_dialog: function() { + var top = null; + if (this.dialogs.length) top = this.dialogs[this.dialogs.length - 1]; + return top; + }, + + focus_top: function() { + var top = this.top_dialog(); + if (top) { + top.container.dialog('moveToTop'); //make sure the last dialog is top dialog + top.focus_first_element(); + } + }, + + add_dialog: function(dialog) { + this.dialogs.push(dialog); + }, + + remove_dialog: function(dialog) { + var index = this.dialogs.indexOf(dialog); + if (index > -1) this.dialogs.splice(index, 1); + } +}; + +IPA.dialog_button = function(spec) { + + spec = spec || {}; + + var that = {}; + + that.name = spec.name; + that.label = spec.label || spec.name; + that.click = spec.click || click; + that.visible = spec.visible !== undefined ? spec.visible : true; + + function click() { + } + + that.set_enabled = function(enabled) { + if (enabled) { + that.element.removeClass('ui-state-disabled'); + } else { + that.element.addClass('ui-state-disabled'); + } + }; + + that.is_enabled = function() { + return !that.element.hasClass('ui-state-disabled'); + }; + + return that; +}; + +/** + * This is a base class for dialog boxes. + */ +IPA.dialog = function(spec) { + + spec = spec || {}; + + var that = {}; + + that.entity = IPA.get_entity(spec.entity); + that.name = spec.name || 'dialog'; + that.id = spec.id; + that.title = spec.title; + that.width = spec.width || 500; + that.height = spec.height; + that.close_on_escape = spec.close_on_escape !== undefined ? + spec.close_on_escape : true; + + that.widgets = IPA.widget_container(); + that.fields = IPA.field_container({ container: that }); + that.buttons = $.ordered_map(); + that.policies = IPA.facet_policies({ + container: that, + policies: spec.policies + }); + + that.create_button = function(spec) { + var factory = spec.factory || IPA.dialog_button; + var button = factory(spec); + that.add_button(button); + return button; + }; + + that.add_button = function(button) { + that.buttons.put(button.name, button); + }; + + that.get_button = function(name) { + return that.buttons.get(name); + }; + + that.field = function(field) { + that.fields.add_field(field); + return that; + }; + + that.validate = function() { + var valid = true; + var fields = that.fields.get_fields(); + for (var i=0; i<fields.length; i++) { + var field = fields[i]; + valid = field.validate() && field.validate_required() && valid; + } + return valid; + }; + + that.get_id = function() { + if (that.id) return that.id; + if (that.name) return that.name; + return null; + }; + + + /** + * Create content layout + */ + that.create = function() { + + that.message_container = $('<div/>', { + style: 'display: none', + 'class': 'dialog-message ui-state-highlight ui-corner-all' + }).appendTo(that.container); + + var widgets = that.widgets.get_widgets(); + for (var i=0; i<widgets.length; i++) { + var widget = widgets[i]; + + var div = $('<div/>', { + name: widget.name, + 'class': 'dialog-section' + }).appendTo(that.container); + + widget.create(div); + } + + that.policies.post_create(); + }; + + that.show_message = function(message) { + that.message_container.text(message); + that.message_container.css('display', ''); + }; + + that.hide_message = function() { + that.message_container.css('display', 'none'); + }; + + /** + * Open dialog + */ + that.open = function(container) { + + that.container = $('<div/>', { + id : that.get_id(), + 'data-name': that.name + }); + + if (container) { + container.append(that.container); + } + + that.create(); + that.reset(); + + that.container.dialog({ + title: that.title, + modal: true, + closeOnEscape: that.close_on_escape, + width: that.width, + minWidth: that.width, + height: that.height, + minHeight: that.height, + close: function(event, ui) { + that.close(); + } + }); + + that.set_buttons(); + that.register_listeners(); + IPA.opened_dialogs.add_dialog(that); + that.focus_first_element(); + }; + + that.focus_first_element = function() { + // set focus to the first tabbable element in the content area or the first button + // if there are no tabbable elements, set focus on the dialog itself + + var element = that.container; + var ui_dialog = that.container.parent('.ui-dialog'); // jq dialog div + + // code taken from jquery dialog source code + $(element.find(':tabbable').get().concat( + ui_dialog.find('.ui-dialog-buttonpane :tabbable').get().concat( + ui_dialog.get()))).eq(0).focus(); + }; + + that.option = function(name, value) { + that.container.dialog('option', name, value); + }; + + that.set_buttons = function() { + + // create a map of button labels and handlers + var dialog_buttons = {}; + for (var i=0; i<that.buttons.values.length; i++) { + var button = that.buttons.values[i]; + if (!button.visible) continue; + dialog_buttons[button.label] = button.click; + } + + //set buttons to dialog + that.option('buttons', dialog_buttons); + + // find button elements + var parent = that.container.parent(); + var buttons = $('.ui-dialog-buttonpane .ui-dialog-buttonset button', parent); + + buttons.each(function(index) { + var button = that.buttons.values[index]; + button.element = $(this); + }); + }; + + that.display_buttons = function(names) { + + for (var i=0; i<that.buttons.values.length; i++) { + var button = that.buttons.values[i]; + + button.visible = names.indexOf(button.name) > -1; + } + that.set_buttons(); + }; + + that.save = function(record) { + var fields = that.fields.get_fields(); + for (var i=0; i<fields.length; i++) { + var field = fields[i]; + field.save(record); + } + }; + + that.close = function() { + that.container.dialog('destroy'); + that.container.remove(); + that.remove_listeners(); + IPA.opened_dialogs.remove_dialog(that); + IPA.opened_dialogs.focus_top(); + }; + + that.reset = function() { + var fields = that.fields.get_fields(); + for (var i=0; i<fields.length; i++) { + fields[i].reset(); + } + }; + + that.register_listeners = function() {}; + that.remove_listeners = function() {}; + + that.create_builder = function() { + + var widget_builder = IPA.widget_builder({ + widget_options: { + entity: that.entity, + facet: that + } + }); + var field_builder = IPA.field_builder({ + field_options: { + undo: false, + entity: that.entity, + facet: that + } + }); + var section_builder = IPA.section_builder({ + container: that, + section_factory: IPA.details_table_section_nc, + widget_builder: widget_builder, + field_builder: field_builder + }); + + that.builder = IPA.details_builder({ + container: that, + widget_builder: widget_builder, + field_builder: field_builder, + section_builder: section_builder + }); + }; + + that.init = function() { + + that.create_builder(); + that.builder.build(spec); + that.fields.widgets_created(); + that.policies.init(); + }; + + that.init(); + + that.dialog_create = that.create; + that.dialog_open = that.open; + that.dialog_close = that.close; + that.dialog_save = that.save; + that.dialog_reset = that.reset; + that.dialog_validate = that.validate; + + return that; +}; + +/** + * This dialog provides an interface for searching and selecting + * values from the available results. + */ +IPA.adder_dialog = function(spec) { + + spec = spec || {}; + + spec.name = spec.name || 'adder_dialog'; + + var that = IPA.dialog(spec); + + IPA.confirm_mixin().apply(that); + + that.external = spec.external; + that.width = spec.width || 600; + that.height = spec.height || 360; + + if (!that.entity) { + var except = { + expected: false, + message:'Adder dialog created without entity.' + }; + throw except; + } + + var init = function() { + that.available_table = IPA.table_widget({ + entity: that.entity, + name: 'available', + scrollable: true + }); + + that.selected_table = IPA.table_widget({ + entity: that.entity, + name: 'selected', + scrollable: true + }); + + if (spec.columns) { + for (var i=0; i<spec.columns.length; i++) { + that.create_column(spec.columns[i]); + } + } + }; + + that.get_column = function(name) { + return that.available_table.get_column(name); + }; + + that.get_columns = function() { + return that.available_table.get_columns(); + }; + + that.add_column = function(column) { + that.available_table.add_column(column); + that.selected_table.add_column(column); + }; + + that.set_columns = function(columns) { + that.clear_columns(); + for (var i=0; i<columns.length; i++) { + that.add_column(columns[i]); + } + }; + + that.clear_columns = function() { + that.available_table.clear_columns(); + that.selected_table.clear_columns(); + }; + + that.create_column = function(spec) { + spec.entity = that.entity; + var column = IPA.column(spec); + that.add_column(column); + return column; + }; + + that.create = function() { + + // do not call that.dialog_create(); + + var container = $('<div/>', { + 'class': 'adder-dialog' + }).appendTo(that.container); + + var top_panel = $('<div/>', { + 'class': 'adder-dialog-top' + }).appendTo(container); + + $('<input/>', { + type: 'text', + name: 'filter', + keyup: function(event) { + if (event.keyCode === $.ui.keyCode.ENTER) { + that.search(); + return false; + } + } + }).appendTo(top_panel); + + top_panel.append(' '); + + that.find_button = IPA.button({ + name: 'find', + label: IPA.messages.buttons.find, + click: function() { + that.search(); + return false; + } + }).appendTo(top_panel); + + top_panel.append(IPA.create_network_spinner()); + + var left_panel = $('<div/>', { + 'class': 'adder-dialog-left' + }).appendTo(container); + + var available_panel = $('<div/>', { + name: 'available', + 'class': 'adder-dialog-available' + }).appendTo(left_panel); + + $('<div/>', { + html: IPA.messages.dialogs.available, + 'class': 'adder-dialog-header ui-widget-header' + }).appendTo(available_panel); + + var available_content = $('<div/>', { + 'class': 'adder-dialog-content' + }).appendTo(available_panel); + + that.available_table.create(available_content); + + + var right_panel = $('<div/>', { + 'class': 'adder-dialog-right' + }).appendTo(container); + + var selected_panel = $('<div/>', { + name: 'selected', + 'class': 'adder-dialog-selected' + }).appendTo(right_panel); + + $('<div/>', { + html: IPA.messages.dialogs.prospective, + 'class': 'adder-dialog-header ui-widget-header' + }).appendTo(selected_panel); + + var selected_content = $('<div/>', { + 'class': 'adder-dialog-content' + }).appendTo(selected_panel); + + that.selected_table.create(selected_content); + + + var buttons_panel = $('<div/>', { + name: 'buttons', + 'class': 'adder-dialog-buttons' + }).appendTo(container); + + var div = $('<div/>').appendTo(buttons_panel); + IPA.button({ + name: 'add', + label: '>>', + click: function() { + that.add(); + that.update_buttons(); + return false; + } + }).appendTo(div); + + div = $('<div/>').appendTo(buttons_panel); + IPA.button({ + name: 'remove', + label: '<<', + click: function() { + that.remove(); + that.update_buttons(); + return false; + } + }).appendTo(div); + + that.filter_field = $('input[name=filter]', that.container); + + if (that.external) { + container.addClass('adder-dialog-with-external'); + + var external_panel = $('<div/>', { + name: 'external', + 'class': 'adder-dialog-external' + }).appendTo(left_panel); + + $('<div/>', { + html: IPA.messages.objects.sudorule.external, + 'class': 'adder-dialog-header ui-widget-header' + }).appendTo(external_panel); + + var external_content = $('<div/>', { + 'class': 'adder-dialog-content' + }).appendTo(external_panel); + + that.external_field = $('<input/>', { + type: 'text', + name: 'external' + }).appendTo(external_content); + } + + that.search(); + }; + + that.open = function(container) { + + var add_button = that.create_button({ + name: 'add', + label: IPA.messages.buttons.add, + click: function() { + if (!add_button.is_enabled()) return; + that.execute(); + } + }); + + that.create_button({ + name: 'cancel', + label: IPA.messages.buttons.cancel, + click: function() { + that.close(); + } + }); + + that.dialog_open(container); + + that.update_buttons(); + }; + + that.add = function() { + var rows = that.available_table.remove_selected_rows(); + that.selected_table.add_rows(rows); + }; + + that.remove = function() { + var rows = that.selected_table.remove_selected_rows(); + that.available_table.add_rows(rows); + }; + + that.update_buttons = function() { + + var values = that.selected_table.save(); + + var button = that.get_button('add'); + button.set_enabled(values && values.length); + }; + + that.get_filter = function() { + return that.filter_field.val(); + }; + + that.clear_available_values = function() { + that.available_table.empty(); + }; + + that.clear_selected_values = function() { + that.selected_table.empty(); + }; + + that.add_available_value = function(record) { + that.available_table.add_record(record); + }; + + that.get_selected_values = function() { + return that.selected_table.save(); + }; + + that.execute = function() { + }; + + that.on_confirm = function() { + + var add_button = that.get_button('add'); + if (add_button.is_enabled()) { + that.execute(); + } + }; + + init(); + + that.adder_dialog_create = that.create; + + return that; +}; + +/** + * This dialog displays the values to be deleted. + */ +IPA.deleter_dialog = function (spec) { + + spec = spec || {}; + + spec.title = spec.title || IPA.messages.buttons.remove; + spec.name = spec.name || 'deleter_dialog'; + spec.message = spec.message || IPA.messages.search.delete_confirm; + spec.ok_label = spec.ok_label || IPA.messages.buttons.remove; + + var that = IPA.confirm_dialog(spec); + that.values = spec.values || []; + that.on_ok = spec.on_ok || function() { + that.execute(); + }; + + that.add_value = function(value) { + that.values.push(value); + }; + + that.set_values = function(values) { + that.values = values; + }; + + that.create = function() { + + $('<p/>', { + 'text': that.message + }).appendTo(that.container); + + var div = $('<div/>', { + style: 'overflow:auto; max-height: 100px' + }).appendTo(that.container); + + var ul = $('<ul/>'); + ul.appendTo(div); + + for (var i=0; i<that.values.length; i++) { + var value = that.values[i]; + if (value instanceof Object){ + var first = true; + var str_value = ""; + for (var key in value){ + if (value.hasOwnProperty(key)){ + if (!first){ + str_value += ','; + } + str_value += (key + ':' +value[key]); + first = false; + } + } + value = str_value; + } + + $('<li/>',{ + 'text': value + }).appendTo(ul); + } + }; + + that.deleter_dialog_create = that.create; + + return that; +}; + +IPA.message_dialog = function(spec) { + + spec = spec || {}; + + spec.name = spec.name || 'message_dialog'; + + var that = IPA.confirm_dialog(spec); + + that.open = function(container) { + + that.confirm_dialog_open(container); + that.confirmed = true; // there are no options to confirm + }; + + that.buttons.remove('cancel'); + + that.message_dialog_create = that.create; + + return that; +}; + +IPA.confirm_dialog = function(spec) { + + spec = spec || {}; + spec.name = spec.name || 'confirm_dialog'; + spec.title = spec.title || IPA.messages.dialogs.confirmation; + + var that = IPA.dialog(spec); + IPA.confirm_mixin().apply(that); + + that.message = spec.message || ''; + that.on_ok = spec.on_ok; + that.on_cancel = spec.on_cancel; + that.ok_label = spec.ok_label || IPA.messages.buttons.ok; + that.cancel_label = spec.cancel_label || IPA.messages.buttons.cancel; + that.confirmed = false; + that.confirm_on_enter = spec.confirm_on_enter !== undefined ? spec.confirm_on_enter : true; + + that.create = function() { + $('<p/>', { + 'text': that.message + }).appendTo(that.container); + }; + + that.close = function() { + + that.dialog_close(); + + if (that.confirmed) { + if (that.on_ok) { + that.on_ok(); + } + } else { + if (that.on_cancel) { + that.on_cancel(); + } + } + }; + + that.open = function(container) { + + that.confirmed = false; + that.dialog_open(container); + }; + + that.on_confirm = function() { + that.confirmed = true; + that.close(); + }; + + that.create_buttons = function() { + + that.create_button({ + name: 'ok', + label: that.ok_label, + click: function() { + that.confirmed = true; + that.close(); + } + }); + + that.create_button({ + name: 'cancel', + label: that.cancel_label, + click: function() { + that.confirmed = false; + that.close(); + } + }); + }; + + that.create_buttons(); + + that.confirm_dialog_close = that.close; + that.confirm_dialog_open = that.open; + + return that; +}; + +IPA.confirm_mixin = function() { + + return { + mixin: { + + ignore_enter_rules: { + src_elements: ['a', 'button'], + src_types: ['textarea', 'select-one'] + }, + + test_ignore: function(event) { + + var ir = this.ignore_enter_rules, + t = event.target, + + ignore = ir.src_elements.indexOf(t.tagName.toLowerCase()) > -1 || + ir.src_types.indexOf(t.type) > -1; + + return ignore; + }, + + register_listeners: function() { + var self = this; + this._on_key_up_listener = function(e) { self.on_key_up(e); }; + var dialog_container = this.container.parent('.ui-dialog'); + dialog_container.bind('keyup', this._on_key_up_listener); + }, + + remove_listeners: function() { + var dialog_container = this.container.parent('.ui-dialog'); + dialog_container.unbind('keyup', this._on_key_up_listener); + }, + + on_key_up: function(event) { + if (event.keyCode === $.ui.keyCode.ENTER && + !this.test_ignore(event) && + !!this.on_confirm) { + event.preventDefault(); + this.on_confirm(); + } else if (event.keyCode === $.ui.keyCode.ESCAPE && + !!this.on_cancel) { + event.preventDefault(); + this.on_cancel(); + } + } + }, + + apply: function(obj) { + $.extend(obj, this.mixin); + } + }; +}; |