/* Authors: * Pavel Zuna * Adam Young * Endi S. Dewata * * 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 . */ /* IPA Object Details - populating definiton lists from entry data */ /* REQUIRES: ipa.js */ IPA.expand_icon = 'ui-icon-minus'; IPA.collapse_icon = 'ui-icon-plus'; IPA.is_field_writable = function(rights){ if (!rights){ alert('no right'); } return rights.indexOf('w') > -1; }; function ipa_details_field(spec) { spec = spec || {}; var that = ipa_widget(spec); that.load = spec.load || load; that.save = spec.save || save; function load(record) { that.record = record; that.values = record[that.name]; that.reset(); } that.update = function() { if (!that.record) return; /* remove all
tags i.e. all attribute values */ $('dd', that.container).remove(); var multivalue = false; var hint_span = null; var dd; var param_info = ipa_get_param_info(that.entity_name, that.name); if (param_info) { if (param_info['multivalue'] || param_info['class'] == 'List') multivalue = true; var hint = param_info['doc']; if (hint){ hint_span = $('',{ 'class': 'attrhint', 'html': 'Hint: ' + hint}); } } var rights = 'rsc'; if (that.record.attributelevelrights){ rights = that.record.attributelevelrights[this.name] || rights ; } if (that.values) { /* Too much logic currently assumes an array. This is true everywhere but ACIs. */ if (!(that.values instanceof Array)){ that.values = [that.values]; } dd = ipa_create_first_dd(that.name); dd.append(ipa_details_field_create_input.call(that, that.values[0], hint_span, rights, 0)); dd.appendTo(that.container); for (var i = 1; i < that.values.length; ++i) { dd = ipa_create_other_dd(that.name); dd.append(ipa_details_field_create_input.call(that, that.values[i], hint_span, rights, i)); dd.appendTo(that.container); } if (multivalue && IPA.is_field_writable(rights) ) { dd = ipa_create_other_dd(that.name); dd.append(ipa_details_field_create_add_link.call(that, that.name, rights, that.values.length)); dd.appendTo(that.container); } } else { if (multivalue && IPA.is_field_writable(rights)) { dd = ipa_create_first_dd(that.name); dd.append(ipa_details_field_create_add_link.call(that, that.name, rights, 0)); dd.appendTo(that.container); } else { dd = ipa_create_first_dd(that.name); dd.append(ipa_details_field_create_input.call(that, '', hint_span, rights, 0)); dd.appendTo(that.container); } } }; function save() { var values = []; $('dd', that.container).each(function () { var input = $('input', $(this)); if (!input.length) return; if (input.is('.strikethrough')) return; var value = $.trim(input.val()); if (!value) value = ''; values.push(value); }); return values; } return that; } function ipa_details_section(spec){ spec = spec || {}; var that = {}; that.name = spec.name || ''; that.label = spec.label || ''; that.template = spec.template; that._entity_name = spec.entity_name; that.fields = []; that.fields_by_name = {}; that.__defineGetter__("entity_name", function(){ return that._entity_name; }); that.__defineSetter__("entity_name", function(entity_name){ that._entity_name = entity_name; for (var i=0; i', { 'name': field.name }).appendTo(container); field.create(span); } }; that.setup = function(container) { that.container = container; if (that.template) return; var fields = that.fields; for (var i = 0; i < fields.length; ++i) { var field = fields[i]; var span = $('span[name='+field.name+']', this.container).first(); field.setup(span); } }; that.load = function(record) { var fields = that.fields; if (that.template) { var template = IPA.get_template(that.template); this.container.load( template, function(data, text_status, xhr) { for (var i = 0; i < fields.length; ++i) { var field = fields[i]; var span = $('span[name='+field.name+']', this.container).first(); field.setup(span); field.load(record); } } ); return; } for (var j=0; j tag. * The attribute name is defined inside a
tag. The attribute * value is defined using a
tag inside a tag. If the * attribute has multiple values the content inside will * be duplicated to display each value. * * Example: *
* *
First Name:
* *
*
* *
Telephone Number:
* *
*
*
* *
*/ function ipa_details_list_section(spec){ spec = spec || {}; var that = ipa_details_section(spec); that.create = function(container) { // do not call section_create() here if (that.template) return; var dl = $('
', { 'id': that.name, 'class': 'entryattrs' }).appendTo(container); var fields = that.fields; for (var i = 0; i < fields.length; ++i) { var field = fields[i]; var label = field.label; if (label !== ''){ label += ':'; } var param_info = ipa_get_param_info(that.entity_name, field.name); if (param_info && param_info['label']) label = param_info['label']; $('
', { html: label }).appendTo(dl); var span = $('', { 'name': field.name }).appendTo(dl); field.create(span); } }; return that; } // shorthand notation used for declarative definitions of details pages function ipa_stanza(spec) { spec = spec || {}; var that = ipa_details_list_section(spec); // This is to allow declarative style programming for details that.input = function(spec) { that.create_field(spec); return that; }; that.custom_input = function(input) { that.add_field(input); return that; }; return that; } function ipa_details_facet(spec) { spec = spec || {}; var that = ipa_facet(spec); that.is_dirty = spec.is_dirty || is_dirty; that.create = spec.create || create; that.setup = spec.setup || setup; that.load = spec.load || load; that.update = spec.update || ipa_details_update; that.reset = spec.reset || reset; that.refresh = spec.refresh || ipa_details_refresh; that.sections = []; that.sections_by_name = {}; that.__defineGetter__("entity_name", function(){ return that._entity_name; }); that.__defineSetter__("entity_name", function(entity_name){ that._entity_name = entity_name; for (var i=0; i'; } else { return ''; } }; function create(container) { container.attr('title', that.entity_name); var details = $('
', { 'class': 'content' }).appendTo(container); var action_panel = that.get_action_panel(); var ul = $('ul', action_panel); var buttons = $('.action-controls',action_panel); $('', { 'type': 'text', 'name': 'reset' }).appendTo(buttons); $('', { 'type': 'text', 'name': 'update' }).appendTo(buttons); details.append('
'); details.append('
'); for (var i = 0; i < that.sections.length; ++i) { var section = that.sections[i]; $('

', { name: section.name, title: section.label, html: that.get_section_header_prefix(true) + ' ' + section.label }).appendTo(details); var div = $('
', { 'id': that.entity_name+'-'+that.name+'-'+section.name, 'class': 'details-section' }).appendTo(details); section.create(div); details.append('
'); } } function setup(container) { that.facet_setup(container); var button = $('input[name=reset]', that.container); that.reset_button = IPA.action_button({ 'label': 'Reset', 'icon': 'ui-icon-refresh', 'class': 'details-reset', 'click': function() { that.reset(); return false; } }); button.replaceWith(that.reset_button); button = $('input[name=update]', that.container); that.update_button = IPA.action_button({ 'label': 'Update', 'icon': 'ui-icon-check', 'class': 'details-update', 'click': function() { that.update(); return false; } }); button.replaceWith(that.update_button); for (var i = 0; i < that.sections.length; ++i) { var section = that.sections[i]; var header = $('h2[name='+section.name+']', that.container); var div = $('#'+that.entity_name+'-'+that.name+'-'+section.name, that.container); header.click(function(section, header, div) { return function() { var visible = div.is(":visible"); header.html(that.get_section_header_prefix(!visible) + ' ' + section.label); div.slideToggle(); }; }(section, header, div)); section.setup(div); } } function is_dirty() { var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || ''; return pkey != that.pkey; } function load(record) { that.record = record; for (var i=0; i', { id: spec.id, html: spec.label, title: spec.title || spec.label, 'class': 'ui-state-default ui-corner-all input_link' }); if (spec.click) button.click(spec.click); if (spec['class']) button.addClass(spec['class']); if (spec.icon) button.append(' '); return button; } function ipa_details_refresh() { var that = this; that.pkey = $.bbq.getState(that.entity_name + '-pkey', true) || ''; function on_success(data, text_status, xhr) { that.load(data.result.result); } function on_failure(xhr, text_status, error_thrown) { var details = $('.details', that.container).empty(); details.append('

Error: '+error_thrown.name+'

'); details.append('

'+error_thrown.title+'

'); details.append('

'+error_thrown.message+'

'); } var params = []; if (that.pkey) params.push(that.pkey); ipa_cmd( 'show', params, {all: true, rights: true}, on_success, on_failure, that.entity_name ); } function ipa_details_update(on_win, on_fail) { var that = this; var entity_name = that.entity_name; var pkey = that.get_primary_key(); function update_on_win(data, text_status, xhr) { if (on_win) on_win(data, text_status, xhr); if (data.error) return; var result = data.result.result; that.load(result); } function update_on_fail(xhr, text_status, error_thrown) { if (on_fail) on_fail(xhr, text_status, error_thrown); } /* The check if (!pkey) { return; } used to happen here, but it breaks krbtpolicy, which allows a null pkey and usually requires it. */ var values; var modlist = {'all': true, 'setattr': [], 'addattr': [], 'rights': true}; var attrs_wo_option = {}; for (var i=0; i 1){ modlist[field.name] = values; } else if (param_info['multivalue']){ modlist[field.name] = []; } } else { if (values.length) attrs_wo_option[field.name] = values; } } } for (attr in attrs_wo_option) { values = attrs_wo_option[attr]; modlist['setattr'].push(attr + '=' + values[0]); for (var k = 1; k < values.length; ++k){ modlist['addattr'].push(attr + '=' + values[k]); } } ipa_cmd('mod', [pkey], modlist, update_on_win, null, entity_name); } /* HTML templates for ipa_details_display() */ var _ipa_span_doc_template = 'Hint: D'; var _ipa_span_hint_template = 'Hint: D'; function ipa_create_first_dd(field_name, content){ var dd = $('
', { 'class': 'first', 'title': field_name }); if (content) dd.append(content); return dd; } function ipa_create_other_dd(field_name, content){ return $('
', { 'class': 'other', 'title': field_name }).append(content); } function ipa_insert_first_dd(jobj, content){ ipa_insert_dd(jobj, content, "first"); } function ipa_insert_dd(jobj, content, dd_class){ jobj.after( $('
',{ "class": dd_class }).append(content)); } /* mapping of parameter types to handlers used to create inputs */ var _ipa_param_type_2_handler_map = { 'Str': _ipa_create_text_input, 'IA5Str': _ipa_create_text_input, 'Int': _ipa_create_text_input, 'Bool': _ipa_create_text_input, 'List': _ipa_create_text_input }; /* create an HTML element for displaying/editing an attribute * arguments: * attr - LDAP attribute name * value - the attributes value */ function ipa_details_field_create_input(value,hint,rights, index) { var that = this; var input = $("