diff options
author | Adam Young <ayoung@redhat.com> | 2010-08-06 10:01:44 -0400 |
---|---|---|
committer | Adam Young <ayoung@redhat.com> | 2010-08-06 11:55:38 -0400 |
commit | 125bd09faf21411fafda01e76989b4856bbd267c (patch) | |
tree | b9e2ad70165154f95463f6a69dc5d62de5821f87 /install/static/details.js | |
parent | a63fd83e890ed4f2ec3f0cd0f96f0a329698796a (diff) | |
download | freeipa-125bd09faf21411fafda01e76989b4856bbd267c.tar.gz freeipa-125bd09faf21411fafda01e76989b4856bbd267c.tar.xz freeipa-125bd09faf21411fafda01e76989b4856bbd267c.zip |
The Javascript code for the new web UI
Now with whitespace cleanup.
Diffstat (limited to 'install/static/details.js')
-rw-r--r-- | install/static/details.js | 559 |
1 files changed, 559 insertions, 0 deletions
diff --git a/install/static/details.js b/install/static/details.js new file mode 100644 index 000000000..7d0e7846f --- /dev/null +++ b/install/static/details.js @@ -0,0 +1,559 @@ +/* Authors: + * Pavel Zuna <pzuna@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; version 2 only + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* IPA Object Details - populating definiton lists from entry data */ + +/* REQUIRES: ipa.js */ + +var IPA_DETAILS_POPULATE = 1; +var IPA_DETAILS_UPDATE = 2; + +/* name of IPA object, that we're populating the lists for */ +var _ipa_obj_name = ''; + +/* initialize the IPA Object Details library */ +function ipa_details_init(obj_name, url) +{ + ipa_init(url); + _ipa_obj_name = obj_name; +} + +var _ipa_load_on_win_callback = null; +var _ipa_load_on_fail_callback = null; + +var ipa_details_cache = null; + +function ipa_details_load(pkey, on_win, on_fail) +{ + if (!pkey) + return; + + _ipa_load_on_win_callback = on_win; + _ipa_load_on_fail_callback = on_fail; + + ipa_cmd( + 'show', [pkey], {all: true}, _ipa_load_on_win, _ipa_load_on_fail, + _ipa_obj_name + ); +} + +function _ipa_load_on_win(data, text_status, xhr) +{ + if (_ipa_load_on_win_callback) + _ipa_load_on_win_callback(data, text_status, xhr); + + if (data['error']) + return; + + var result = data.result.result; + + ipa_details_cache = $.extend(true, {}, result); + ipa_details_display(result); +} + +function _ipa_load_on_fail(xhr, text_status, error_thrown) +{ + if (_ipa_load_on_fail_callback) + _ipa_load_on_fail_callback(xhr, text_status, error_thrown); +} + +var _ipa_update_on_win_callback = null; +var _ipa_update_on_fail_callback = null; + +function ipa_details_update(pkey, on_win, on_fail) +{ + if (!pkey) + return; + + var modlist = {'all': true, 'setattr': [], 'addattr': []}; + var attrs_wo_option = {}; + + $('.entryattrs input').each(function () { + var jobj = $(this); + + var dt = jobj.parent().prevAll('dt').slice(0, 1); + if (!dt) + return; + + var attr = dt.attr('title'); + if (!attr) + return; + + if (attr.indexOf('call_') == 0) { + var func = window[attr.substr(5)]; + if (!func) + return; + func(dt, modlist, IPA_DETAILS_UPDATE); + return; + } + + var param_info = ipa_get_param_info(attr); + if (param_info) { + modlist[attr] = jobj.val(); + return; + } + + if (!attrs_wo_option[attr]) + attrs_wo_option[attr] = []; + attrs_wo_option[attr].push(jobj.val()); + }); + + $('.entryattrs dt').each(function () { + var jobj = $(this); + + var attr = jobj.attr('title'); + if (!attr || attr.indexOf('call_') == 0) + return; + + var next = jobj.next('dd'); + if ((!next.length) || (!next.children('input').length)) + attrs_wo_option[attr] = ['']; + }); + + for (attr in attrs_wo_option) { + var values = attrs_wo_option[attr]; + modlist['setattr'].push(attr + '=' + values[0]); + for (var i = 1; i < values.length; ++i) + modlist['addattr'].push(attr + '=' + values[i]); + } + + _ipa_update_on_win_callback = on_win; + _ipa_update_on_fail_callback = on_fail; + + ipa_cmd( + 'mod', [pkey], modlist, _ipa_update_on_win, _ipa_update_on_fail, + _ipa_obj_name + ); +} + +function _ipa_update_on_win(data, text_status, xhr) +{ + if (_ipa_update_on_win_callback) + _ipa_update_on_win_callback(data, text_status, xhr); + + if (data['error']) + return; + + var result = data.result.result; + ipa_details_cache = $.extend(true, {}, result); + ipa_details_display(result); +} + +function _ipa_update_on_fail(xhr, text_status, error_thrown) +{ + if (_ipa_update_on_fail_callback) + _ipa_update_on_fail_callback(xhr, text_status, error_thrown); +} + +function ipa_details_create(dls) +{ + for (var i = 0; i < def_lists.length; ++i) { + var d = dls[i]; + ipa_generate_dl($('hr').last(), d[0], d[1], d[2]); + } +} + +var _ipa_h2_template = '<h2 onclick="_h2_on_click(this)">− I</h2>'; +var _ipa_dl_template = '<dl id="I" class="entryattrs"></dl>'; +var _ipa_dt_template = '<dt title="T">N:</dt>'; + +function ipa_generate_dl(jobj, id, name, dts) +{ + if (!dts) + return; + + jobj.after(_ipa_h2_template.replace('I', name)); + jobj = jobj.next(); + jobj.after(_ipa_dl_template.replace('I', id)); + jobj = jobj.next(); + jobj.after('<hr />'); + + for (var i = 0; i < dts.length; ++i) { + var label = ''; + if (dts[i][0].indexOf('call_') != 0) { + var param_info = ipa_get_param_info(dts[i][0]); + if (param_info) + label = param_info['label']; + } + if ((!label) && (dts[i].length > 1)) + label = dts[i][1]; + jobj.append( + _ipa_dt_template.replace('T', dts[i][0]).replace('N', label) + ); + } +} + +/* HTML templates for ipa_details_display() */ +var _ipa_a_add_template = + '<a href="jslink" onclick="return (_ipa_add_on_click(this))" title="A">Add</a>'; + +/* populate definition lists with the class 'entryattrs' with entry attributes + * + * The list has to be specially crafted for this function to work properly: + * <dt> tags should have the 'title' attribute set to an LDAP attribute name + * OR to a javascript function name prefixed with 'call_', which will be given + * the <dt> object and entry_attrs as arguments. + * Example: + * <dl class="entryattrs"> + * <dt title="givenname">First Name:</dt> + * <dt title="call_some_callback">Some Attribute:</dt> + * </dl> + * + * arguments: + * entry_attrs - 'result' field as returned by ipa *-show commnads + * (basically an associative array with attr:value pairs) */ +function ipa_details_display(entry_attrs) +{ + /* remove all <dd> tags i.e. all attribute values */ + $('.entryattrs dd').remove(); + + /* go through all <dt> tags and pair them with newly created <dd>s */ + $('.entryattrs dt').each(function () { + var jobj = $(this); + + var attr = jobj.attr('title'); + if (attr.indexOf('call_') == 0) { + /* title contains callback instead of attribute name */ + var func = window[attr.substr(5)]; + if (func) + func(jobj, entry_attrs, IPA_DETAILS_POPULATE); + else + jobj.after(_ipa_dd_first_template.replace('I', '-')); + } else { + /* title contains attribute name - default behaviour */ + var value = entry_attrs[attr]; + if (value) { + ipa_insert_first_dd(jobj, ipa_create_input(attr, value[0])); + for (var i = 1; i < value.length; ++i) { + jobj = jobj.next(); + ipa_insert_other_dd(jobj, ipa_create_input(attr, value[i])); + } + } else { + ipa_insert_first_dd(jobj, _ipa_a_add_template.replace('A', attr)); + } + } + }); +} + +var _ipa_dd_first_template = '<dd class="first">I</dd>'; + +function ipa_insert_first_dd(jobj, content) +{ + jobj.after(_ipa_dd_first_template.replace('I', content)); +} + +var _ipa_dd_other_template = '<dd class="other">I</dd>'; + +function ipa_insert_other_dd(jobj, content) +{ + jobj.after(_ipa_dd_other_template.replace('I', content)); +} + + +/* mapping of parameter types to handlers used to create inputs */ +var _ipa_param_type_2_handler_map = { + 'Str': _ipa_create_text_input, + 'Int': _ipa_create_text_input, + 'Bool': _ipa_create_text_input, +}; + +/* create an HTML element for displaying/editing an attribute + * arguments: + * attr - LDAP attribute name + * value - the attributes value */ +function ipa_create_input(attr, value) +{ + var param_info = ipa_get_param_info(attr); + if (!param_info) { + /* no information about the param is available, default to text input */ + return ( + _ipa_create_text_input(attr, value, null) + + _ipa_create_remove_link(attr, null) + ); + } + + /* check if the param value can be modified */ + if (param_info['primary_key'] || ('no_update' in param_info['flags'])) + return (value.toString()); + + /* call handler by param class */ + var handler = _ipa_param_type_2_handler_map[param_info['class']]; + if (handler) { + return ( + handler(attr, value, param_info) + + _ipa_create_remove_link(attr, param_info) + ); + } + + /* no handler for this type? don't allow modification */ + return (value.toString()); +} + +/* HTML template for _ipa_create_remove_link() */ +var _ipa_a_remove_template = + '<a href="jslink" onclick="return (_ipa_remove_on_click(this))" title="A">Remove</a>'; + +/* creates a Remove link for deleting attribute values */ +function _ipa_create_remove_link(attr, param_info) +{ + if (!param_info) + return (_ipa_a_remove_template.replace('A', attr)); + + /* check if the param is required or of the Password type + * if it is, then we don't want people to be able to remove it */ + if ((param_info['required']) || (param_info['class'] == 'Password')) + return (''); + + return (_ipa_a_remove_template.replace('A', attr)); +} + +/* HTML template for _ipa_create_text_input() */ +var _ipa_input_text_template = + '<input type="text" name="A" value="V" />'; + +/* creates a input box for editing a string attribute */ +function _ipa_create_text_input(attr, value, param_info) +{ + return ( + _ipa_input_text_template.replace('A', attr).replace( + 'V', value.toString() + ) + ); +} + +function ipa_details_reset() +{ + if (ipa_details_cache) + ipa_details_display(ipa_details_cache); +} + +/* Event handlers */ + +function _ipa_add_on_click(obj) +{ + var jobj = $(obj); + var par = jobj.parent(); + par.append(ipa_create_input(jobj.attr('title'), '')); + jobj.next('input').focus(); + jobj.remove(); + return (false); +} + +function _ipa_remove_on_click(obj) +{ + var jobj = $(obj); + var attr = jobj.attr('title'); + var par = jobj.parent(); + + var next = par.next('dd'); + if (next.length) { + if (par.hasClass('first')) { + next.addClass('first'); + next.removeClass('other'); + } + par.remove(); + } else { + par.empty(); + par.append(_ipa_a_add_template.replace('A', attr)); + } + + return (false); +} + +var qs = ipa_parse_qs(); + +/* "Top-level" code */ + +function load_object(body,obj) +{ + if (!qs['pkey']) + return; + ipa_details_init(obj); + $('#butreset').click(reset_on_click); + $('#butupdate').click(update_on_click); + ipa_details_load(qs['pkey'], on_win); + $('h1').text('Managing user: ' + qs['pkey']); + +} + +function on_win(data, textStatus, xhr) +{ + if (data['error']) + alert(data['error']['message']); +} + +function reset_on_click() +{ + if (ipa_details_cache) + ipa_details_display(ipa_details_cache); + return (false); +} + +function update_on_click() +{ + ipa_details_update(qs['pkey'], on_win); + return (false); +} + +/* H2 expand/collapse */ + +function _h2_on_click(obj) +{ + var jobj = $(obj); + var txt = jobj.text().replace(/^\s*/, ''); + if (txt.charCodeAt(0) == 8722) { + obj.dl = jobj.next().detach(); + jobj.text('+' + txt.substr(1)); + } else { + if (obj.dl) + obj.dl.insertAfter(obj); + jobj.text( + String.fromCharCode(8722) + txt.substr(1) + ); + } +} + +/* Account status Toggle button */ + +function toggle_on_click(obj) +{ + var jobj = $(obj); + var val = jobj.attr('title'); + if (val == 'Active') { + ipa_cmd( + 'lock', [qs['pkey']], {}, on_lock_win, on_fail, + PluginData['name'] + ); + } else { + ipa_cmd( + 'unlock', [qs['pkey']], {}, on_lock_win, on_fail, + PluginData['name'] + ); + } + return (false); +} + +function on_lock_win(data, textStatus, xhr) +{ + if (data['error']) { + alert(data['error']['message']); + return; + } + + var jobj = $('a[title=Active]'); + if (jobj.length) { + if (ipa_details_cache) { + var memberof = ipa_details_cache['memberof']; + if (memberof) { + memberof.push( + 'cn=inactivated,cn=account inactivation' + ); + } else { + memberof = ['cn=inactivated,cn=account inactivation']; + } + ipa_details_cache['memberof'] = memberof; + a_status(jobj.parent().prev(), ipa_details_cache); + jobj.parent().remove() + } + return; + } + + var jobj = $('a[title=Inactive]'); + if (jobj.length) { + if (ipa_details_cache) { + var memberof = ipa_details_cache['memberof']; + if (memberof) { + for (var i = 0; i < memberof.length; ++i) { + if (memberof[i].indexOf('cn=inactivated,cn=account inactivation') != -1) { + memberof.splice(i, 1); + break; + } + } + } else { + memberof = []; + } + ipa_details_cache['memberof'] = memberof; + a_status(jobj.parent().prev(), ipa_details_cache); + jobj.parent().remove(); + } + return; + } +} + +/* ATTRIBUTE CALLBACKS */ + +var toggle_temp = 'S <a href="jslink" onclick="return (toggle_on_click(this))" title="S">Toggle</a>'; +function a_status(jobj, result, mode) +{ + if (mode != IPA_DETAILS_POPULATE) + return; + + var memberof = result['memberof']; + if (memberof) { + for (var i = 0; i < memberof.length; ++i) { + if (memberof[i].indexOf('cn=inactivated,cn=account inactivation') != -1) { + var t = toggle_temp.replace(/S/g, 'Inactive'); + ipa_insert_first_dd(jobj, t); + return; + } + } + } + ipa_insert_first_dd(jobj, toggle_temp.replace(/S/g, 'Inactive')); +} + +var pwd_temp = '<a href="jslink" onclick="return (resetpwd_on_click(this))" title="A">Reset Password</a>'; +function a_password(jobj, result, mode) +{ + if (mode == IPA_DETAILS_POPULATE) + ipa_insert_first_dd(jobj, pwd_temp.replace('A', 'userpassword')); +} + +var select_temp = '<select title="st"></select>'; +var option_temp = '<option value="V">V</option>'; +var states = [ + 'AL', 'AK', 'AS', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FM', + 'FL', 'GA', 'GU', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', + 'ME', 'MH', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', + 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'MP', 'OH', 'OK', 'OR', 'PW', + 'PA', 'PR', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VI', 'VA', + 'WA', 'WV', 'WI', 'WY', '', +]; +function a_st(jobj, result, mode) +{ + if (mode != IPA_DETAILS_POPULATE) + return; + + var next = jobj.next(); + next.css('clear', 'none'); + next.css('width', '70px'); + + ipa_insert_first_dd(jobj, select_temp); + + var sel = jobj.next().children().first(); + for (var i = 0; i < states.length; ++i) + sel.append(option_temp.replace(/V/g, states[i])); + + var st = result['st']; + if (st) + sel.val(st); + else + sel.val(''); +} + |