diff options
author | Pavel Zuna <pzuna@redhat.com> | 2010-09-16 10:28:07 -0400 |
---|---|---|
committer | Adam Young <ayoung@redhat.com> | 2010-09-17 19:42:40 -0400 |
commit | 1bb412239d0735af11c3939bfe437cb8b49c7004 (patch) | |
tree | a48dc9331164616c2d2ba655f03634604e08fda0 /install | |
parent | 4f37775db75eb59496ce0e6fe11230ea3bd21e8b (diff) | |
download | freeipa-1bb412239d0735af11c3939bfe437cb8b49c7004.tar.gz freeipa-1bb412239d0735af11c3939bfe437cb8b49c7004.tar.xz freeipa-1bb412239d0735af11c3939bfe437cb8b49c7004.zip |
Big webUI patch.
Quick summary:
- use jQuery UI and jQuery BBQ libraries
- code restructuring
The patch has so many changes they can't be listed here. Many parts
of the code have been rewritten from scrach.
See freeipa-devel mailing list:
webUI code restructuring [wall of text, diagrams, ... you've been warned!]
2010-09-07
Diffstat (limited to 'install')
-rw-r--r-- | install/static/Makefile.am | 2 | ||||
-rw-r--r-- | install/static/add.js | 177 | ||||
-rw-r--r-- | install/static/associate.js | 321 | ||||
-rw-r--r-- | install/static/details.js | 253 | ||||
-rw-r--r-- | install/static/develop.js | 2 | ||||
-rw-r--r-- | install/static/entity.js | 163 | ||||
-rw-r--r-- | install/static/group.js | 199 | ||||
-rw-r--r-- | install/static/groupmeta.js | 253 | ||||
-rw-r--r-- | install/static/host.js | 67 | ||||
-rw-r--r-- | install/static/hostgroup.js | 121 | ||||
-rw-r--r-- | install/static/index.xhtml | 134 | ||||
-rw-r--r-- | install/static/ipa.css | 57 | ||||
-rw-r--r-- | install/static/ipa.js | 106 | ||||
-rw-r--r-- | install/static/navigation.js | 286 | ||||
-rw-r--r-- | install/static/netgroup.js | 147 | ||||
-rw-r--r-- | install/static/pageparams.js | 15 | ||||
-rw-r--r-- | install/static/search.js | 268 | ||||
-rw-r--r-- | install/static/user.js | 312 | ||||
-rw-r--r-- | install/static/usermeta.js | 415 | ||||
-rw-r--r-- | install/static/webui.js | 124 |
20 files changed, 1272 insertions, 2150 deletions
diff --git a/install/static/Makefile.am b/install/static/Makefile.am index b0c4c7f7b..825493501 100644 --- a/install/static/Makefile.am +++ b/install/static/Makefile.am @@ -23,6 +23,8 @@ app_DATA = \ pageparams.js \ search.js \ details.js \ + entity.js \ + webui.js \ user.js \ user-add.inc \ ipalogo.png \ diff --git a/install/static/add.js b/install/static/add.js index fcbcc5293..c657cfe54 100644 --- a/install/static/add.js +++ b/install/static/add.js @@ -1,5 +1,5 @@ /* Authors: - * Adam Young <ayoung@redhat.com> + * Pavel Zuna <pzuna@redhat.com> * * Copyright (C) 2010 Red Hat * see file 'COPYING' for use and warranty information @@ -16,107 +16,94 @@ * 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 Add - creating new instances of entities */ +*/ /* REQUIRES: ipa.js */ - -//Process for managing the 'add' functionality -function EntityBuilder(obj,addProperties){ - - var builder = this; - - this.obj = obj; - this.addProperties = addProperties; - - this.getPKey = function(){ - return $("#pkey").val(); - } - - this.getOptions = function(){ - return {}; - } - - this.add_fail = function(desc){ - alert(desc); - } - - this.add = function(pkey, on_success){ - var params = [pkey]; - var options = this.getOptions(); - ipa_cmd( 'add', params, options, on_success, this.add_fail, this.obj ); - } - - this.setup = function(){ - showContent(); - $("<h1/>" ,{ html : "Add new " + this.obj } ).appendTo("#content"); - $("<div id='addForm'> </div>") - .appendTo("#content"); - var label =$("<span>Add and </span>").appendTo("#addForm") - - $("<input \>", { - id:'addEdit', - type:'button', - value:'Edit', - click: function(){ - var params = ipa_parse_qs(); - var pkey = builder.getPKey(); - builder.add(pkey, function(response){ - if (response.error){ - if (response.error.message) { - alert(response.error.message); - } else { - alert("error adding entry"); - } - return; - } - var hash= "tab=" - +params["tab"] - +"&facet=details&pkey=" - +pkey; - window.location.hash = hash; - }); +var IPA_ADD_POPULATE = 1; +var IPA_ADD_UPDATE = 2; + +function add_dialog_create(obj_name, adl) +{ + var add_dialog = $('<div></div>'); + + function add(evt, called_from_add_and_edit) { + function add_win(data, text_status, xhr) { + if (called_from_add_and_edit) { + var state = {}; + state[obj_name + '-facet'] = 'details'; + var pkey_name = ipa_objs[obj_name].primary_key; + var selector = 'input[name=' + pkey_name + ']'; + state[obj_name + '-pkey'] = add_dialog.find(selector).val(); + $.bbq.pushState(state); } - }).appendTo(label); - - $("<input\>", { - id:'addAnother', - type:'button', - value:'Add Another', - click: function(){ - var params = ipa_parse_qs(); - var pkey = builder.getPKey(); - builder.add(pkey, function(response){ - if (response.error){ - if (response.error.message) { - alert(response.error.message); - } else { - alert("error adding entry"); - } - return; - } - builder.setup(); - }); + }; + + var pkey = []; + var options = {}; + var pkey_name = ipa_objs[obj_name].primary_key; + + var fields = adl[2]; + for (var i = 0; i < fields.length; ++i) { + var f = fields[i]; + var attr = f[0]; + if (typeof f[2] == 'function') { + var value = f[2](add_dialog, IPA_ADD_UPDATE); + if (value != null) { + if (attr == pkey_name) + pkey = [value]; + else + options[attr] = value; + } } - }).appendTo(label); - - $("<dl id='addProperties' />").appendTo("#addForm"); + } - for (index = 0; index < this.addProperties.length; index++){ - var prop = this.addProperties[index]; - var title = $("<dt/>",{html:prop.title}); - var definition = $("<dd></dd>"); - $("<input/>",{ - id:prop.id, - type:prop.type - }).appendTo(definition); - definition.appendTo(title); - title.appendTo("#addProperties"); + add_dialog.find('input').each(function () { + var jobj = $(this); + var attr = jobj.attr('name'); + var value = jobj.val(); + if (value) { + if (pkey.length == 0 && attr == pkey_name) + pkey = [jobj.val()]; + else if (options[attr] == null) + options[attr] = jobj.val(); + } + }); + + ipa_cmd('add', pkey, options, add_win, null, obj_name); + add_dialog.dialog('close'); + }; + + function add_and_edit(evt) { + add(evt, true); + add_dialog.dialog('close'); + }; + + function cancel() { + add_dialog.dialog('close'); + }; + + add_dialog.attr('id', adl[0]); + add_dialog.attr('title', adl[1]); + + var fields = adl[2]; + for (var i = 0; i < fields.length; ++i) { + var f = fields[i]; + if (typeof f[2] == 'function') { + f[2](add_dialog, IPA_ADD_POPULATE); + } else { + add_dialog.append('<label>' + f[1] + '</label>'); + add_dialog.append('<input type="text" name="' + f[0] + '" />'); } } -} - + add_dialog.dialog({ + modal: true, + buttons: { + 'Add': add, + 'Add and edit': add_and_edit, + 'Cancel': cancel + } + }); +} diff --git a/install/static/associate.js b/install/static/associate.js index cd07c9f75..11c160f8f 100644 --- a/install/static/associate.js +++ b/install/static/associate.js @@ -16,22 +16,17 @@ * 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 Add - creating new instances of entities */ +*/ /* REQUIRES: ipa.js */ - -function keyForFacet(tab, facet){ - qs = ipa_parse_qs(); - var key = qs['tab'] +'-'+ qs['facet']; - return key; -} +/* CURRENTLY ALSO REQUIRES search.js, because it reuses it's code to create + * the AssociationList elements; IT NEEDS IT'S OWN CODE! */ /** *This associator is built for the case where each association requires a separate rpc */ -function SerialAssociator(form, oneObjPkey, manyObjPkeys){ +function SerialAssociator(form, oneObjPkey, manyObjPkeys) +{ this.form = form; this.manyObjPkeys = manyObjPkeys; this.oneObjPkey = oneObjPkey; @@ -55,27 +50,28 @@ function SerialAssociator(form, oneObjPkey, manyObjPkeys){ }, form.manyObj ); }else{ - location.hash="tab="+form.oneObj - +"&facet=details&pkey="+this.oneObjPkey; + var state = {}; + state[form.oneObj + '-facet'] = 'associate'; + state[form.oneObj + '-pkey'] = this.oneObjPkey; + $.bbq.pushState(state); } } - } /** *This associator is for the common case where all the asociations can be sent in a single rpc */ -function BulkAssociator(form, pkey, manyObjPkeys){ - - this.form = form; - this.pkey =pkey; - this.manyObjPkeys = manyObjPkeys; +function BulkAssociator(form, pkey, manyObjPkeys) +{ + this.form = form; + this.pkey = pkey; + this.manyObjPkeys = manyObjPkeys; - this.associateNext = function(){ + this.associateNext = function() { var form = this.form; var option = manyObjPkeys.shift(); - while(manyObjPkeys.length > 0){ + while(manyObjPkeys.length > 0) { option += "," + manyObjPkeys.shift(); } @@ -85,15 +81,16 @@ function BulkAssociator(form, pkey, manyObjPkeys){ options[form.manyObj] = option; var args = [this.pkey]; - var associator = this; + ipa_cmd( form.method,args, options , function(response){ - var qs = ipa_parse_qs(); if (response.error){ alert("error adding memeber"); }else{ - location.hash="tab=" +form.oneObj - +"&facet=details&pkey="+associator.pkey; + var state = {}; + state[form.onObj + '-facet'] = 'associate'; + state[form.oneObj + '-pkey'] = this.pkey; + $.bbq.pushState(state); } }, function(response){ @@ -107,45 +104,42 @@ function BulkAssociator(form, pkey, manyObjPkeys){ * Create a form for a one to many association. * */ -function AssociationForm(oneObj, manyObj,facet,facets, searchColumn, headerText , associatorConstructor, method){ +function AssociationForm(oneObj, manyObj, pkey, jobj, associatorConstructor, method) +{ this.oneObj = oneObj; this.manyObj = manyObj; - this.facet = facet; - this.facets = facets; - this.headerText = headerText; - this.searchColumn = searchColumn; + this.searchColumn = pkey; + this.parentTab = jobj + //An optional parameter to determine what ipa method to call to create //the association - if (method){ + if (method) this.method = method; - }else{ + else this.method = 'add_member'; - } - if (associatorConstructor){ + if (associatorConstructor) this.associatorConstructor = associatorConstructor; - }else{ + else this.associatorConstructor = SerialAssociator; - } - - this.setup = function(pkey){ - showAssociations(); - qs = ipa_parse_qs(); - $("#availableList").html(""); - $("#enrollments").html(""); - setupFacetNavigation(this.oneObj,qs['pkey'],qs['facet'],this.facets); + this.setup = function() { + association_form_create(this.parentTab); + this.parentTab.find('#availableList').html(''); + this.parentTab.find('#enrollments').html(''); - this.currentUserToEnroll = qs['pkey']; - this.manyObjPkeys = []; + var currentObjToEnroll = $.bbq.getState(this.oneObj + '-pkey', true) || ''; var form = this; - $('h1').text(this.headerText()); - - - $("#enroll").click(function(){ + $('h1').text('Enroll ' + this.oneObj + ' ' + currentObjToEnroll + ' in ' + this.manyObj + '.'); + $('#enroll').click(function () { form.associate(); }); + $('#cancel').click(function () { + var state = {}; + state[form.oneObj + '-facet'] = 'associate'; + $.bbq.pushState(state); + }); $("#addToList").click(function(){ $('#availableList :selected').each(function(i, selected){ $("#enrollments").append(selected); @@ -161,97 +155,91 @@ function AssociationForm(oneObj, manyObj,facet,facets, searchColumn, headerText $("#find").click(function(){ form.search(); }); - } - this.search = function(){ - - var queryFilter = $("#associateFilter").val(); + }; + this.search = function() { var form = this; - ipa_cmd( 'find', [queryFilter], {}, - function(searchResults){ - form.populateSearch(searchResults); - }, - function(){ - alert("associationSearchFailure"); - }, - this.manyObj); - } - this.associate = function(){ - var manyObjPkeys = []; - $('#enrollments').children().each(function(i, selected){ + function search_on_win(data, text_status, xhr) { + var results = data.result; + $("#availableList").html(""); + for (var i =0; i != results.count; i++){ + var result = results.result[i]; + $("<option></option>",{ + value: result[form.searchColumn][0], + html: result[form.searchColumn][0] + }).appendTo( $("#availableList")); + } + }; + + function search_on_fail(xhr, text_status, errow_thrown) { + alert("associationSearchFailure"); + }; + + var queryFilter = $('#associateFilter').val(); + ipa_cmd('find', [queryFilter], {}, search_on_win, null, this.manyObj); + }; + + this.associate = function () { + var manyObjPkeys = []; + $('#enrollments').children().each(function (i, selected) { manyObjPkeys.push(selected.value); }); - var pkey = qs['pkey']; + var pkey = $.bbq.getState(this.oneObj + '-pkey', true) || ''; var associator = - new this.associatorConstructor (this, pkey, manyObjPkeys); + new this.associatorConstructor(this, pkey, manyObjPkeys); associator.associateNext(); - } - this.populateSearch = function(searchResults){ - var results = searchResults.result; - $("#availableList").html(""); - for (var i =0; i != results.count; i++){ - var result = results.result[i]; - $("<option/>",{ - value: result[this.searchColumn][0], - html: result[this.searchColumn][0] - }).appendTo( $("#availableList")); - } - } + }; } - /** A modfied version of search. It shows the associations for an object. */ -function AssociationList(obj,facet,assignFacet,associationColumns,facets) { +function AssociationList(obj, assignFacet, associationColumns, jobj) +{ this.obj = obj; - this.facet = facet; - this.assignFacet = assignFacet; this.associationColumns = associationColumns; - this.facets = facets; - + this.assignFacet = assignFacet; + this.parentTab = jobj; - this.populate = function(userData){ - var associationList = userData.result.result[this.associationColumns[0].column]; - for (var j = 0; j < associationList.length; j++){ - var row = $("<tr/>").appendTo($('#searchResultsTable thead:last')); + this.populate = function(userData) { + var tbody = this.parentTab.find('.search-table tbody'); + tbody.empty(); + var associationList = userData.result.result[this.associationColumns[0].column]; + for (var j = 0; j < associationList.length; j++){ + var row = $("<tr/>").appendTo(tbody); for (var k = 0; k < associationColumns.length ;k++){ var column = this.associationColumns[k].column; - var link = - "#tab="+this.associationColumns[k].title - +"&facet=details" - +"&pkey="+userData.result.result[column][j]; - $("<td/>",{ - html: $("<a />",{ - href:link, - html:userData.result.result[column][j] - }) + $("<td></td>",{ + html: userData.result.result[column][j] }).appendTo(row); } } } - this.setup=function(){ - qs = ipa_parse_qs(); - showSearch(); - buildFacetNavigation(facets); - $("#filter").css("display","none"); - $("#searchButtons").html(""); - $("<input/>",{ + + this.setup = function() { + association_list_create(this.obj, this.parentTab); + var form = this; + var pkey_hash = this.obj + '-pkey'; + var pkey = $.bbq.getState(pkey_hash, true) || ''; + this.parentTab.find(".search-filter").css("display", "none"); + this.parentTab.find(".search-buttons").html(""); + $("<input/>", { type: 'button', value: 'enroll', - click: function(){ - location.hash="tab="+obj+"&facet="+assignFacet+"&pkey="+qs['pkey']; + click: function() { + var state = {}; + state[form.obj + '-facet'] = form.assignFacet; + $.bbq.pushState(state); } - }).appendTo("#searchButtons"); - var header = $("<tr/>").appendTo($('#searchResultsTable thead:last')); + }).appendTo(this.parentTab.find(".search-buttons")); + var header = $("<tr></tr>").appendTo(this.parentTab.find('.search-table thead:last')); for (var i =0 ; i != associationColumns.length ;i++){ - $("<th/>",{ + $("<th></th>",{ html: associationColumns[i].title }).appendTo(header); } - var form = this; - ipa_cmd( 'show', [qs['pkey']], {}, + ipa_cmd( 'show', [pkey], {}, function(result){ form.populate(result); }, @@ -261,3 +249,114 @@ function AssociationList(obj,facet,assignFacet,associationColumns,facets) { this.obj); } } + +/* FIXME: TEMPORARY FACET GENERATORS; WE NEED A BETTER WAY! */ + +function association_form_create(jobj) +{ + var div = $('<div id="associations"></div>'); + div.append($('<h1></h1>', { + text: 'Enroll in Groups' + })); + var form = $('<form></form>'); + var form_div = $('<div></div>'); + form_div.css('border-width', '1px'); + var sub_div = $('<div></div>'); + sub_div.append($('<input />', { + id: 'associateFilter', + type: 'text' + })); + sub_div.append($('<input />', { + id: 'find', + type: 'button', + value: 'Find' + })); + var but_span = $('<span></span>'); + but_span.css('float', 'right'); + but_span.append($('<input />', { + id: 'cancel', + type: 'button', + value: 'Cancel' + })); + but_span.append($('<input />', { + id: 'enroll', + type: 'button', + value: 'Enroll' + })); + sub_div.append(but_span); + form_div.append(sub_div); + form.append(form_div); + var form_div = $('<div id="results"></div>'); + form_div.css('border', '2px solid rgb(0, 0, 0)'); + form_div.css('position', 'relative'); + form_div.css('height', '200px'); + var sub_div = $('<div></div>'); + sub_div.css('float', 'left'); + sub_div.append($('<div></div>', { + text: 'Available' + })); + sub_div.append($('<select></select>', { + id: 'availableList', + width: '150px', + size: '10', + multiple: 'true' + })); + form_div.append(sub_div); + var sub_div = $('<div></div>'); + sub_div.css('float', 'left'); + var p = $('<p></p>'); + p.append($('<input />', { + id: 'removeFromList', + type: 'button', + value: '<<' + })); + sub_div.append(p); + var p = $('<p></p>'); + p.append($('<input />', { + id: 'addToList', + type: 'button', + value: '>>' + })); + sub_div.append(p); + form_div.append(sub_div); + var sub_div = $('<div></div>'); + sub_div.css('float', 'left'); + sub_div.append($('<div></div>', { + text: 'Prospective' + })); + sub_div.append($('<select></select>', { + id: 'enrollments', + width: '150px', + size: '10', + multiple: 'true' + })); + form_div.append(sub_div); + form.append(form_div); + form.append($('<hr />')); + form.append($('<div></div>', { + text: 'Message Area' + })); + form.append($('<hr />')); + var form_div = $('<div></div>'); + var span = $('<span></span>'); + span.css('float', 'left'); + span.append($('<p></p>', { + text: '*Enter Group Names and Press Groups' + })); + span.append($('<p></p>', { + text: '*More stuff' + })); + span.append($('<p></p>', { + text: '*More stuff' + })); + form_div.append(span); + form.append(form_div); + div.append(form); + jobj.append(div); +} + +function association_list_create(obj_name, jobj) +{ + search_create(obj_name, [], jobj); +} + diff --git a/install/static/details.js b/install/static/details.js index e291b49f9..f68c77324 100644 --- a/install/static/details.js +++ b/install/static/details.js @@ -1,6 +1,5 @@ /* Authors: * Pavel Zuna <pzuna@redhat.com> - * Adam Young <ayoung@redhat.com> * * Copyright (C) 2010 Red Hat * see file 'COPYING' for use and warranty information @@ -26,65 +25,122 @@ 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 = ''; +var ipa_details_cache = {}; -/* initialize the IPA Object Details library */ -function ipa_details_init(obj_name, url) +function ipa_details_create(obj_name, dls, container) { - _ipa_obj_name = obj_name; -} + if (!container) { + alert('ERROR: ipa_details_create: Missing container argument!'); + return; + } + + container.attr('title', obj_name); + container.addClass('details-container'); + + container.append('<div class="details-buttons"></div>'); + var jobj = container.children().last(); + jobj.append('<a class="details-reset" href="jslink">Reset</a>'); + jobj.append('<a class="details-update" href="jslink">Update</a>'); + + container.append('<hr />'); + + for (var i = 0; i < dls.length; ++i) { + var d = dls[i]; + ipa_generate_dl(container.children().last(), d[0], d[1], d[2]); + } -var _ipa_load_on_win_callback = null; -var _ipa_load_on_fail_callback = null; + container.append('<div class="details-back"></div>'); + var jobj = container.children().last(); + jobj.append('<a href="#details-viewtype">Back to Top</a>'); +} -var ipa_details_cache = null; +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_details_load(pkey, on_win, on_fail) +function ipa_generate_dl(jobj, id, name, dts) { - if (!pkey) + if (!dts) return; - _ipa_load_on_win_callback = on_win; - _ipa_load_on_fail_callback = on_fail; + var obj_name = jobj.parent().attr('title'); - ipa_cmd( - 'show', [pkey], {all: true}, _ipa_load_on_win, _ipa_load_on_fail, - _ipa_obj_name); + jobj.after(_ipa_h2_template.replace('I', name)); + jobj = jobj.next(); + jobj.after(_ipa_dl_template.replace('I', id)); + jobj = jobj.next(); + + for (var i = 0; i < dts.length; ++i) { + var label = ''; + if (dts[i][0].indexOf('call_') != 0) { + var param_info = ipa_get_param_info(obj_name, 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) + ); + } + + jobj.after('<hr />'); } -function _ipa_load_on_win(data, text_status, xhr) +function ipa_details_load(obj_name, pkey, on_win, on_fail, sampleData) { - if (_ipa_load_on_win_callback) - _ipa_load_on_win_callback(data, text_status, xhr); + function load_on_win(data, text_status, xhr) { + if (on_win) + on_win(data, text_status, xhr); + if (data.error) + return; - if (data['error']) - return; + var result = data.result.result; + ipa_details_cache[obj_name] = $.extend(true, {}, result); + ipa_details_display(obj_name, result); + }; - var result = data.result.result; + function load_on_fail(xhr, text_status, error_thrown) { + if (on_fail) + on_fail(xhr, text_status, error_thrown); + }; + + if (!pkey) + return; - ipa_details_cache = $.extend(true, {}, result); - ipa_details_display(result); + ipa_cmd( + 'show', [pkey], {all: true}, load_on_win, load_on_fail, + obj_name, sampleData + ); } -function _ipa_load_on_fail(xhr, text_status, error_thrown) +function ipa_details_update(obj_name, pkey, on_win, on_fail) { - if (_ipa_load_on_fail_callback) - _ipa_load_on_fail_callback(xhr, text_status, error_thrown); -} + function update_on_win(data, text_status, xhr) { + if (on_win) + on_win(data, text_status, xhr); + if (data.error) + return; -var _ipa_update_on_win_callback = null; -var _ipa_update_on_fail_callback = null; + var result = data.result.result; + ipa_details_cache[obj_name] = $.extend(true, {}, result); + ipa_details_display(obj_name, result); + }; + + function update_on_fail(xhr, text_status, error_thrown) { + if (on_fail) + on_fail(xhr, text_status, error_thrown); + }; -function ipa_details_update(pkey, on_win, on_fail) -{ if (!pkey) return; + var selector = '.details-container[title=' + obj_name + ']'; + var modlist = {'all': true, 'setattr': [], 'addattr': []}; var attrs_wo_option = {}; - $('.entryattrs input').each(function () { + $(selector + ' .entryattrs input').each(function () { var jobj = $(this); var dt = jobj.parent().prevAll('dt').slice(0, 1); @@ -96,7 +152,7 @@ function ipa_details_update(pkey, on_win, on_fail) return; var value = jQuery.trim(jobj.val()); - var param_info = ipa_get_param_info(attr); + var param_info = ipa_get_param_info(obj_name, attr); if (param_info) { modlist[attr] = value; return; @@ -107,7 +163,7 @@ function ipa_details_update(pkey, on_win, on_fail) attrs_wo_option[attr].push(value); }); - $('.entryattrs dt').each(function () { + $(selector + ' .entryattrs dt').each(function () { var jobj = $(this); var attr = jobj.attr('title'); @@ -121,7 +177,7 @@ function ipa_details_update(pkey, on_win, on_fail) return; } - var param_info = ipa_get_param_info(attr); + var param_info = ipa_get_param_info(obj_name, attr); if (param_info && param_info['primary_key']) return; @@ -138,76 +194,7 @@ function ipa_details_update(pkey, on_win, on_fail) } - _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, container) -{ - if (!container) - container = $('body'); - - for (var i = 0; i < dls.length; ++i) { - var d = dls[i]; - - ipa_generate_dl($('#detail-lists hr').last(), d[0], d[1], d[2]); - // ipa_generate_dl($("#detail-lists"), 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(); - - 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) - ); - } - jobj.after('<hr />'); + ipa_cmd('mod', [pkey], modlist, update_on_win, update_on_fail, obj_name); } /* HTML templates for ipa_details_display() */ @@ -230,13 +217,15 @@ var _ipa_span_doc_template = '<span class="attrhint">Hint: D</span>'; * 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) +function ipa_details_display(obj_name, entry_attrs) { + var selector = '.details-container[title=' + obj_name + ']'; + /* remove all <dd> tags i.e. all attribute values */ - $('.entryattrs dd').remove(); + $(selector + ' .entryattrs dd').remove(); /* go through all <dt> tags and pair them with newly created <dd>s */ - $('.entryattrs dt').each(function () { + $(selector + ' .entryattrs dt').each(function () { var jobj = $(this); var attr = jobj.attr('title'); @@ -252,7 +241,7 @@ function ipa_details_display(entry_attrs) var multivalue = false; var hint_span = ''; - var param_info = ipa_get_param_info(attr); + var param_info = ipa_get_param_info(obj_name, attr); if (param_info) { if (param_info['multivalue'] || param_info['class'] == 'List') multivalue = true; @@ -264,11 +253,13 @@ function ipa_details_display(entry_attrs) var value = entry_attrs[attr]; if (value) { ipa_insert_first_dd( - jobj, ipa_create_input(attr, value[0]) + hint_span + jobj, ipa_create_input(obj_name, attr, value[0]) + hint_span ); for (var i = 1; i < value.length; ++i) { jobj = jobj.next(); - ipa_insert_other_dd(jobj, ipa_create_input(attr, value[i])); + ipa_insert_other_dd( + jobj, ipa_create_input(obj_name, attr, value[i]) + ); } if (multivalue) { ipa_insert_other_dd( @@ -282,7 +273,7 @@ function ipa_details_display(entry_attrs) ); } else { ipa_insert_first_dd( - jobj, ipa_create_input(attr, '') + hint_span + jobj, ipa_create_input(obj_name, attr, '') + hint_span ); } } @@ -317,9 +308,9 @@ var _ipa_param_type_2_handler_map = { * arguments: * attr - LDAP attribute name * value - the attributes value */ -function ipa_create_input(attr, value) +function ipa_create_input(obj_name, attr, value) { - var param_info = ipa_get_param_info(attr); + var param_info = ipa_get_param_info(obj_name, attr); if (!param_info) { /* no information about the param is available, default to text input */ return (_ipa_create_text_input(attr, value, null)); @@ -377,10 +368,10 @@ function _ipa_create_text_input(attr, value, param_info) ); } -function ipa_details_reset() +function ipa_details_reset(obj_name) { - if (ipa_details_cache) - ipa_details_display(ipa_details_cache); + if (ipa_details_cache[obj_name]) + ipa_details_display(obj_name, ipa_details_cache[obj_name]); } @@ -391,8 +382,9 @@ function _ipa_add_on_click(obj) var jobj = $(obj); var attr = jobj.attr('title'); var par = jobj.parent(); + var obj_name = jobj.closest('.details-container').attr('title'); - par.prepend(ipa_create_input(attr, '')); + par.prepend(ipa_create_input(obj_name, attr, '')); ipa_insert_other_dd(par, _ipa_a_add_template.replace('A', attr)); jobj.next('input').focus(); jobj.remove(); @@ -439,24 +431,3 @@ function _h2_on_click(obj) } } -function DetailsForm(obj, details_list, pkeyCol, facets ){ - - this.obj = obj; - this.details_list = details_list; - this.pkeyCol = pkeyCol; - this.facets = facets; - - this.setup= function(key){ - //re initialize global parse of parameters - qs = ipa_parse_qs(); - - showDetails(); - $('h1').text("Managing " + this.obj +": " +qs['pkey'] ); - setupFacetNavigation(this.obj,qs.pkey,qs.facet,this.facets); - - - ipa_details_init(this.obj); - ipa_details_create(this.details_list, $('#details')); - ipa_details_load(qs.pkey, on_win, null); - } -} diff --git a/install/static/develop.js b/install/static/develop.js new file mode 100644 index 000000000..1a80e94a6 --- /dev/null +++ b/install/static/develop.js @@ -0,0 +1,2 @@ +ipa_use_sampledata = (window.location.protocol == 'file:'); + diff --git a/install/static/entity.js b/install/static/entity.js new file mode 100644 index 000000000..ea7292e36 --- /dev/null +++ b/install/static/entity.js @@ -0,0 +1,163 @@ +/* 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 + */ + +/* REQUIRES: ipa.js, details.js, search.js, add.js */ + +var ipa_entity_search_list = {}; +var ipa_entity_add_list = {}; +var ipa_entity_details_list = {}; + +function ipa_entity_set_search_definition(obj_name, data) +{ + ipa_entity_search_list[obj_name] = data; +} + +function ipa_entity_set_add_definition(obj_name, data) +{ + ipa_entity_add_list[obj_name] = data; +} + +function ipa_entity_set_details_definition(obj_name, data) +{ + ipa_entity_details_list[obj_name] = data; +} + +function ipa_entity_setup(jobj) +{ + var obj_name = jobj.attr('id'); + + function reset_on_click() { + ipa_details_reset(obj_name); + return (false); + }; + + function update_on_click() { + var pkey_name = ipa_objs[obj_name].primary_key; + ipa_details_update(obj_name, ipa_details_cache[obj_name][pkey_name][0]); + return (false); + }; + + function new_on_click() { + add_dialog_create(obj_name, ipa_entity_add_list[obj_name]); + return (false); + }; + + function setup_search_facet() { + var filter = $.bbq.getState(obj_name + '-filter', true); + search_create(obj_name, ipa_entity_search_list[obj_name], jobj); + var input = jobj.find('input[value=find]'); + input.after('<input type="submit" value="new" />'); + input.next().click(new_on_click); + if (typeof filter != 'undefined') + search_load(obj_name, filter, null, null); + }; + + function setup_details_facet() { + var pkey = $.bbq.getState(obj_name + '-pkey', true); + ipa_entity_generate_views(obj_name, jobj); + ipa_details_create(obj_name, ipa_entity_details_list[obj_name], jobj); + jobj.find('.details-reset').click(reset_on_click); + jobj.find('.details-update').click(update_on_click); + if (pkey) + ipa_details_load(obj_name, pkey, null, null); + }; + + function setup_associate_facet() { + var enroll_obj_name = $.bbq.getState(obj_name + '-enroll', true) || ''; + var attr = ipa_get_member_attribute(obj_name, enroll_obj_name); + var columns = [ + { + title: ipa_objs[enroll_obj_name].label, + column: attr + '_' + enroll_obj_name + } + ]; + var frm = new AssociationList(obj_name, 'enroll', columns, jobj); + ipa_entity_generate_views(obj_name, jobj); + frm.setup(); + }; + + function setup_enroll_facet() { + var enroll_obj_name = $.bbq.getState(obj_name + '-enroll', true) || ''; + var pkey = ipa_objs[enroll_obj_name].primary_key; + var frm = new AssociationForm(obj_name, enroll_obj_name, pkey, jobj); + frm.setup(); + }; + + jobj.empty(); + + var facet = $.bbq.getState(obj_name + '-facet', true) || 'search'; + if (facet == 'search') { + setup_search_facet(); + } else if (facet == 'details') { + setup_details_facet(); + } else if (facet == 'associate') { + setup_associate_facet(); + } else if (facet == 'enroll') { + setup_enroll_facet(); + } +} + +function ipa_entity_generate_views(obj_name, container) +{ + function switch_view() { + var enroll_obj_name = $(this).attr('title'); + var state = {}; + if (enroll_obj_name != 'search' && enroll_obj_name != 'details') { + state[obj_name + '-facet'] = 'associate'; + state[obj_name + '-enroll'] = enroll_obj_name; + } else { + state[obj_name + '-facet'] = enroll_obj_name; + state[obj_name + '-enroll'] = ''; + } + $.bbq.pushState(state); + }; + + var ul = $('<ul></ul>', {'class': 'entity-views'}); + + ul.append($('<li></li>', { + text: 'Back to Search', + title: 'search', + click: switch_view + })); + + ul.append($('<li></li>', { + text: 'Details', + title: 'details', + click: switch_view + })); + + var attribute_members = ipa_objs[obj_name].attribute_members; + for (attr in attribute_members) { + var objs = attribute_members[attr]; + for (var i = 0; i < objs.length; ++i) { + var m = objs[i]; + var label = ipa_objs[m].label; + + ul.append($('<li></li>', { + text: label, + title: m, + click: switch_view + })); + } + } + + container.append(ul); +} + diff --git a/install/static/group.js b/install/static/group.js index 8c5491aec..113c1f125 100644 --- a/install/static/group.js +++ b/install/static/group.js @@ -1,139 +1,66 @@ -function setupGroup(facet){ - - if (groupForms[facet]){ - groupForms[facet].setup(); - }else if (facet == "details"){ - setupGroupDetails(); - }else if (facet == "add"){ - setupAddGroup(); - }else{ - groupForms.search.setup(); - } -} - - -function addGroupFail(desc){ - alert(desc); -} - -function addGroup(on_success){ - - var options = { - posix: $('#isposix').is(':checked') ? 1 : 0 , - description: $("#groupdescription").val()}; - - - var gid = $("#groupidnumber").val(); - if (gid.length > 0){ - options.gidnumber = gid; +/* 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 + */ + +/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */ + +ipa_entity_set_search_definition('group', [ + ['cn', 'Name', null], + ['gidnumber', 'GID', null], + ['description', 'Description', null], +]); + +ipa_entity_set_add_definition('group', [ + 'dialog-add-group', 'Add New Group', [ + ['cn', 'Name', null], + ['description', 'Description', null], + ['posix', 'Is this a POSIX group?', f_posix], + ['gidnumber', 'GID', null] + ] +]); + +ipa_entity_set_details_definition('group', [ + ['identity', 'Group Details', [ + ['cn', 'Group Name'], + ['description', 'Description'], + ['gidnumber', 'Group ID'] + ]] +]); + +function f_posix(dlg, mode) +{ + function checkbox_on_click() { + var jobj = $(this); + if (jobj.attr('checked')) + jobj.attr('checked', false); + else + jobj.attr('checked', true); + }; + + if (mode == IPA_ADD_POPULATE) { + dlg.append('<label>Is this a POSIX group?</label>'); + dlg.append('<input type="checkbox" name="posix" />'); + dlg.children().last().click(checkbox_on_click); + } else { + if (dlg.find('input:checkbox[name=posix]').attr('checked')) + return (true); + return (false); } - - var params = [$("#groupname").val()]; - - ipa_cmd( 'add', params, options, on_success, addGroupFail, 'group' ); - -} - -function addEditGroup(){ - addGroup(function (response){ - location.hash="tab=group&facet=details&pkey="+$("#groupname").val(); - }); -} - -function addAnotherGroup(){ - addGroup(setupAddGroup); -} - - -function setupAddGroup(){ - showContent(); - $("<h1>Add new Group</h1>").appendTo("#content"); - - $("<form id='addGroupForm'> </form>") - .appendTo("#content"); - - $("<label>Add and </label><input id='addEdit' type='button' value='Edit'/><input id='addAnother' type='button' value='Add Another'/>").appendTo("#addGroupForm"); - $("<dl id='groupProperties' />").appendTo("#addGroupForm"); - - $("<dt>Name</dt><dd><input id='groupname' type='text'/></dd>") - .appendTo("#groupProperties"); - $("<dt>Description</dt><dd><input id='groupdescription' type='text'/></dd>") - .appendTo("#groupProperties"); - - $("<dt>Is this a posix Group</dt><dd><input id='isposix' type='checkbox'/></dd>") - .appendTo("#groupProperties"); - $("<dt>GID</dt><dd><input id='groupidnumber' type='text'/></dd>") - .appendTo("#groupProperties"); - - - $("#addEdit").click(addEditGroup); - $("#addAnother").click(addAnotherGroup); - -} - -var group_details_list = - [['identity', 'Group Details', [ - ['cn', 'Group Name'], - ['description', 'Description'], - ['gidnumber', 'Group ID']]]]; - -var groupFacets=['details','users']; - -function setupGroupDetails(group){ - - //re initialize global parse of parameters - qs = ipa_parse_qs(); - - showDetails(); - setupFacetNavigation('group',qs['pkey'],qs['facet'],groupFacets); - ipa_details_init('group'); - ipa_details_create(group_details_list, $('#details')); - ipa_details_load(qs['pkey'], on_win, null); - $('h1').text('Managing group: ' + group); -} - -function renderGroupDetailColumn(current,cell){ - - $("<a/>",{ - href:"#tab=group&facet=details&pkey="+current.cn, - html: ""+ current[this.column], - }).appendTo(cell); -} - - - -var groupSearchColumns = [ - {title:"Group Name", column:"cn",render: renderGroupDetailColumn}, - {title:"GID", column:"gidnumber",render: renderSimpleColumn}, - {title:"Description", column:"description",render: renderSimpleColumn} -]; - -var groupForms = new GroupForms(); - -function GroupForms(){ - - this.userListColumns = [ {title:"user",column:"member_user" }]; - this.obj="group"; - this.users = new AssociationList( - this.obj, - "users", - "assignusers", - this.userListColumns, groupFacets ); - - this.assignusers = new AssociationForm( - this.obj, - "user", - "assignusers", - groupFacets, - "uid", - function(){ - return 'Add Users to group : ' + qs['pkey'] ; - }, - BulkAssociator); - - - this.search = new SearchForm("group", "find", groupSearchColumns ); - - } diff --git a/install/static/groupmeta.js b/install/static/groupmeta.js deleted file mode 100644 index 10bb5d39d..000000000 --- a/install/static/groupmeta.js +++ /dev/null @@ -1,253 +0,0 @@ - -var PluginData = { - "primary_key": "cn", - "default_attributes": [ - "cn", - "description", - "gidnumber", - "member", - "memberof" - ], - "object_name_plural": "groups", - "container_dn": "cn=groups,cn=accounts", - "object_class_config": "ipagroupobjectclasses", - "hidden_attributes": [ - "objectclass", - "aci" - ], - "uuid_attribute": "ipauniqueid", - "label": "User Groups", - "methods": [ - "add", - "add_member", - "del", - "find", - "mod", - "remove_member", - "show" - ], - "object_name": "group", - "takes_params": [ - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "name", - "primary_key": true, - "name": "cn", - "default": null, - "doc": "Group name", - "required": true, - "flags": [], - "label": "Group name", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "desc", - "primary_key": false, - "name": "description", - "default": null, - "doc": "Group description", - "required": true, - "flags": [], - "label": "Description", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "include": null, - "cli_name": "gid", - "primary_key": false, - "minvalue": null, - "doc": "GID (use this option to set it manually)", - "required": false, - "flags": [], - "label": "GID", - "default": null, - "autofill": false, - "multivalue": false, - "attribute": false, - "query": false, - "maxvalue": null, - "cli_short_name": null, - "type": "int", - "class": "Int", - "name": "gidnumber" - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "member_group", - "primary_key": false, - "name": "member_group", - "default": null, - "doc": "Member groups", - "required": false, - "flags": [ - "no_update", - "no_create", - "no_search" - ], - "label": "Member groups", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "member_user", - "primary_key": false, - "name": "member_user", - "default": null, - "doc": "Member users", - "required": false, - "flags": [ - "no_update", - "no_create", - "no_search" - ], - "label": "Member users", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "member", - "primary_key": false, - "name": "member", - "default": null, - "doc": "Failed members", - "required": false, - "flags": [ - "no_update", - "no_create", - "no_search" - ], - "label": "Failed members", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "user", - "primary_key": false, - "name": "user", - "default": null, - "doc": "Users", - "required": false, - "flags": [ - "no_update", - "no_create", - "no_search" - ], - "label": "Users", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "group", - "primary_key": false, - "name": "group", - "default": null, - "doc": "Groups", - "required": false, - "flags": [ - "no_update", - "no_create", - "no_search" - ], - "label": "Groups", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - } - ], - "attribute_members": { - "member": [ - "user", - "group" - ], - "memberof": [ - "group", - "netgroup", - "rolegroup", - "taskgroup" - ] - }, - "parent_object": "", - "object_class": [ - "ipausergroup" - ], - "name": "group" -} - -ipa_objs['group'] = PluginData; diff --git a/install/static/host.js b/install/static/host.js index dba4f35e7..f59c1a3c0 100644 --- a/install/static/host.js +++ b/install/static/host.js @@ -1,34 +1,43 @@ -function setupHost(facet){ - if (facet == "details"){ - hostDetailsForm.setup(); - }else if (facet == "add"){ - hostBuilder.setup(); - }else{ - hostSearchForm.setup(); - } -} +/* 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 + */ -var hostAddProperties = [{title: 'Domain Name', id: 'pkey', type: 'text'}]; -var hostBuilder = new EntityBuilder("host",hostAddProperties); +/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */ +ipa_entity_set_search_definition('host', [ + ['fqdn', 'Name', null], + ['description', 'Description', null], + ['enrolled', 'Enrolled?', null], + ['manages', 'Manages?', null] +]); -var host_details_list = [['host', 'Host Details', [ - ['fqdn', 'Fully Qualified Domain Name'], - ['krbprincipalname', 'Kerberos Principal'], - ['serverhostname', 'Server Host Name'] -]]]; +ipa_entity_set_add_definition('host', [ + 'dialog-add-host', 'Add New Host', [ + ['fqdn', 'Name', null] + ] +]); -var hostFacets = ["details","hostgroup", "hostgroupmembership"]; +ipa_entity_set_details_definition('host', [ + ['host', 'Host Details', [ + ['fqdn', 'Fully Qualified Domain Name', null], + ['krbprincipalname', 'Kerberos Principal', null], + ['serverhostname', 'Server Host Name', null] + ]] +]); -var hostDetailsForm = new DetailsForm("host",host_details_list,"fqdn", - hostFacets ) ; - -var hostSearchColumns = [ - {title:"Host",column:"fqdn",render: function(current,cell){ - renderPkeyColumn(hostDetailsForm,current,cell); - }}, - {title:"Comment", column: "description", render: renderSimpleColumn}, - {title:"Enrolled?", render: renderUnknownColumn}, - {title:"Manages?", render: renderUnknownColumn} -]; -var hostSearchForm = new SearchForm("host", "find", hostSearchColumns); diff --git a/install/static/hostgroup.js b/install/static/hostgroup.js index 3872d125d..512ebcf8a 100644 --- a/install/static/hostgroup.js +++ b/install/static/hostgroup.js @@ -1,82 +1,41 @@ +/* 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 + */ + +/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */ + +ipa_entity_set_search_definition('hostgroup', [ + ['cn', 'Name', null], + ['description', 'Description', null] +]); + +ipa_entity_set_add_definition('hostgroup', [ + 'dialog-add-hostgroup', 'Add New Hostgroup', [ + ['cn', 'Name', null], + ['description', 'Description', null] + ] +]); + +ipa_entity_set_details_definition('hostgroup', [ + ['identity', 'Hostgroup Details', [ + ['cn', 'Name', null], + ['description', 'Description', null] + ]] +]); -function setupHostgroup(facet){ - hostgroupForms.setup(facet); -} - -var hostgroup_details_list = - [['identity', 'Hostgroup Details', [ - ['cn', 'Hostgroup Name'], - ['description', 'Description']]]]; - -var hostgroupFacets = ["details","hosts","assignhosts"]; - - - -var hostgroupForms = new HostgroupsForms(); - -function HostgroupsForms(){ - - this.setup = function(facet){ - if (this[facet]){ - this[facet].setup(); - }else{ - this.unspecified.setup(); - } - } - - -/** -* used to initialize the search -*/ - this.hostgroupSearchColumns = [ - { - title:"Hostgroup", - column:"cn", - render: function(current,cell){ - renderPkeyColumn2('hostgroup', 'cn', current,cell); - } - }, - {title:"Description", column:"description",render: renderSimpleColumn}]; - - this.hostgroupAddProperties = - [{title: 'Hostgroup Name', id: 'pkey', type: 'text'}, - {title: 'Description', id: 'description', type: 'text'}]; - - - /** - Facets - */ - this.hostListColumns = [ {title:"host",column:"member_host" }]; - this.obj="hostgroup"; - this.hosts = new AssociationList( - this.obj, - "hosts", - "assignhosts", - this.hostListColumns, hostgroupFacets ); - - this.assignhosts = new AssociationForm( - this.obj, - "host", - "assignhosts", - hostgroupFacets, - "fqdn", - function(){ - return 'Add Hosts to to hostgroup : ' + qs['pkey'] ; - }, - BulkAssociator); - - this.details = new DetailsForm("hostgroup",hostgroup_details_list,"cn",hostgroupFacets) ; - - this.add = new EntityBuilder("hostgroup",this.hostgroupAddProperties); - - this.add.getOptions = function() { - var options = { - name: $('#pkey').val(), - description: $('#description').val() - }; - return options; - } - - this.search = new SearchForm("hostgroup", "find", this.hostgroupSearchColumns); - this.unspecified = this.search; -} diff --git a/install/static/index.xhtml b/install/static/index.xhtml index 6e1d04352..2cc001b16 100644 --- a/install/static/index.xhtml +++ b/install/static/index.xhtml @@ -1,136 +1,46 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> - <head> +<head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>IPA: Identity Policy Audit</title> - <link href="ipa.css" rel="stylesheet" type="text/css" /> + <script type="text/javascript" src="json2.js"></script> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.cookie.js"></script> + <script type="text/javascript" src="ipa.js"></script> - <script type="text/javascript" src="navigation.js"></script> <script type="text/javascript" src="search.js"></script> <script type="text/javascript" src="details.js"></script> <script type="text/javascript" src="add.js"></script> <script type="text/javascript" src="associate.js"></script> + <script type="text/javascript" src="entity.js"></script> + <script type="text/javascript" src="navigation.js"></script> + <script type="text/javascript" src="user.js"></script> - <script type="text/javascript" src="usermeta.js"></script> <script type="text/javascript" src="group.js"></script> - <script type="text/javascript" src="groupmeta.js"></script> <script type="text/javascript" src="host.js"></script> <script type="text/javascript" src="hostgroup.js"></script> <script type="text/javascript" src="netgroup.js"></script> - <script type="text/javascript" src="service.js"></script> - <script type="text/javascript"> + <script type="text/javascript" src="develop.js"></script> + <script type="text/javascript" src="webui.js"></script> - $(document).ready(function(){ - ipa_init( buildNavigation); - }); + <link rel="stylesheet" type="text/css" href="ipa.css" /> +</head> - </script> - </head> - <body> +<body> <div class="header" > - <span class="logo"> - <a href="#"><img src="ipalogo.png" /></a> - </span> - <span class="LoggedInAs" id="loggedinas"> - Logged in as <strong>hardcoded@FREEIP.ORG</strong> - </span> + <span class="header-logo"> + <img src="ipalogo.png" /> + </span> + <span id="loggedinas" class="header-loggedinas"> + <a>Logged in as <strong>hardcoded@FREEIP.ORG</strong></a> + </span> </div> - <div id="navigation"> - <div id="main-nav" /> - <div id="sub-nav">Edit: </div> - </div> - - <h1></h1> - <ul id="viewtype" style="display:none" > - <li id="viewcaption"></li> - </ul> - - - <div id="content" border="1" style="display:none" > - </div> + <div id="navigation" class="tabs"></div> +</body> - <div id="details" style="display:none" > - <div id="buttons"> - <a href="jslink" onclick="return (reset_on_click(this));"> - <img id="butreset" src="but-reset.png" alt="Reset" /> - </a> - <a href="jslink" onclick="return (update_on_click(this));"> - <img id="butupdate" src="but-update.png" alt="Update" /> - </a> - </div> - - <div id="detail-lists"> - <hr /> - </div> - <div id="backtotop"> - <a href="#viewtype">Back to Top</a> - </div> - </div> - - <div id="search" style="display:none"> - <div class="searchControls" > - <span id="filter" class="filter" > - <input id="queryFilter" type="text"/> - <input id="query" type="submit" value="find" /> - <input id="new" type="submit" value="new" /> - </span> - <span class="filter" id="searchButtons" /> - </div> - <table id="searchResultsTable" class="SearchResults" > - <thead></thead> - <tfoot></tfoot> - - <tbody></tbody> - </table> - </div> - - <div id="associations" style="display:none"> - <ul id="viewtype"> - <li id="viewcaption">View:</li> - </ul> - <form> - <div style="border-width:1px"> - <div > - <input id="associateFilter" type="text"/> - <input id="find" type="button" value="Find"/> - <span style="float:right"> - <input id="cancel" type="button" value="Cancel"/> - <input id="enroll" type="button" value="Enroll"/> - </span> - </div> - <div id="results" style="border: 2px solid rgb(0, 0, 0); position:relative; height:200px;" > - <div style="float:left;"> - <div>Available</div> - <select id="availableList" width="150px" size="10" multiple="true" > - </select> - </div> - <div style="float:left;"> - <p><input id="removeFromList" type="button" value="<<"/> </p> - <p><input id="addToList" type="button" value=">>"/></p> - </div> - <div style="float:left;"> - <div>Prospective</div> - <select id="enrollments" width="150px" size="10" multiple="true" > - </select> - </div> - </div> - <hr/> - <div>Message Area</div> - <hr/> - <div> - <span style="float:left"> - <p>*Enter Group Names and Press Groups</p> - <p>*More stuff</p> - <p>*More stuff</p> - </span> - </div> - </div> - </form> - </div> - </body> </html> + diff --git a/install/static/ipa.css b/install/static/ipa.css index 6a3135b2d..326ed1c08 100644 --- a/install/static/ipa.css +++ b/install/static/ipa.css @@ -27,52 +27,47 @@ div.header { background-color: #1f1f1f; height: 70px; } -div.header span.LoggedInAs { - color: #fff; - padding-right: 10px; - line-height: 35px; - float: right; -} -div.header div.logo { - float: left; - padding: 10px 10px 0 10px; -} -div.header div.logo img { - border: 0; + +div.header a { + text-decoration: none; } +div.header a:link { + text-decoration: none; +} -div#view { - bottom: 0; - left: 0; - overflow: auto; - position: fixed; - right: 0; - top: 0; +div.header a:visited { + text-decoration: none; } -div#header { - background: -moz-linear-gradient(top, #65646e, #1f1f1f); - background-color: #1f1f1f; - height: 70px; +div.header div.header-logo { + float: left; + padding: 10px 10px 0 10px; } -div#header div#logo img { +div.header div.header-logo img { border: 0; } -div#header div#loggedinas { +div.header span.header-loggedinas { color: #fff; - font-size: 12pt; - font-weight: bold; + float: right; line-height: 35px; padding-right: 10px; - text-align: right; } -div#header div#loggedinas a { - color: #fff; - text-decoration: underline; +/* ---- Navigation ---- */ +div.tabs { + overflow: auto; +} + +/* ---- Search ---- */ +table.search-table { + width: 100%; +} + +table.search-table th { + text-align: left; } h1 { diff --git a/install/static/ipa.js b/install/static/ipa.js index d5a2dbddc..08cb184ea 100644 --- a/install/static/ipa.js +++ b/install/static/ipa.js @@ -20,6 +20,11 @@ /* IPA JSON-RPC helper */ +var IPA_DEFAULT_JSON_URL = '/ipa/json'; +var IPA_SAMPLEDATA_URL = '/ipa/ui/sampledata'; + +var ipa_use_sampledata = false; + /* JSON-RPC ID counter */ var ipa_jsonrpc_id = 0; @@ -27,29 +32,26 @@ var ipa_jsonrpc_id = 0; var ipa_objs = {}; var _ipa_init_on_win_callback = null; + /* initialize the IPA JSON-RPC helper * arguments: * url - JSON-RPC URL to use (optional) */ - -/*Query String*/ -var qs; - - -var useSampleData = (window.location.protocol == "file:"); - - -function ipa_init(on_win) +function ipa_init(url, on_win, use_sampledata) { - var url = '/ipa/json'; + if (url) + ipa_json_url = url; + else + ipa_json_url = IPA_DEFAULT_JSON_URL; + if (use_sampledata) + ipa_use_sampledata = use_sampledata; _ipa_init_on_win_callback = on_win; var options = { - url: url, - type: 'POST', - contentType: 'application/json', - dataType: 'json', - processData: false, + type: 'POST', + contentType: 'application/json', + dataType: 'json', + processData: false, }; $.ajaxSetup(options); @@ -64,7 +66,7 @@ function _ipa_load_objs(data, textStatus, xhr) { ipa_objs = data.result.result; if (_ipa_init_on_win_callback) - _ipa_init_on_win_callback(data, textStatus, xhr); + _ipa_init_on_win_callback(data, textStatus, xhr); } /* call an IPA command over JSON-RPC @@ -75,35 +77,27 @@ function _ipa_load_objs(data, textStatus, xhr) * win_callback - function to call if the JSON request succeeds * fail_callback - function to call if the JSON request fails * objname - name of an IPA object (optional) */ -function ipa_cmd(name, args, options, win_callback, fail_callback, objname,sampleData) +function ipa_cmd(name, args, options, win_callback, fail_callback, objname) { id = ipa_jsonrpc_id++; if (objname) - name = objname + '_' + name; - - if (useSampleData){ - var sampleData ="sampledata/"+name+".json"; - - var ajax_options = { - url: sampleData, - type: 'POST', - contentType: 'application/json', - dataType: 'json', - processData: false, - }; - $.ajaxSetup(ajax_options); - } + name = objname + '_' + name; + + var url = ipa_json_url; + if (ipa_use_sampledata && IPA_SAMPLEDATA_URL) + url = IPA_SAMPLEDATA_URL + '/' + name + '.json'; var data = { - method: name, - params: [args, options], - id: id, + method: name, + params: [args, options], + id: id, }; var request = { - data: JSON.stringify(data), - success: win_callback, - error: fail_callback, + url: url, + data: JSON.stringify(data), + success: win_callback, + error: fail_callback, }; $.ajax(request); @@ -119,33 +113,47 @@ function ipa_parse_qs(qs) var dict = {}; if (!qs) - qs = location.hash.substring(1); + qs = location.hash.substring(1); qs = qs.replace(/\+/g, ' '); var args = qs.split('&'); for (var i = 0; i < args.length; ++i) { - var parts = args[i].split('=', 2); - var key = decodeURIComponent(parts[0]); - if (parts.length == 2) - dict[key] = decodeURIComponent(parts[1]); - else - dict[key] = key; + var parts = args[i].split('=', 2); + var key = decodeURIComponent(parts[0]); + if (parts.length == 2) + dict[key] = decodeURIComponent(parts[1]); + else + dict[key] = key; } return (dict); } /* helper function used to retrieve information about an attribute */ -function ipa_get_param_info(attr) +function ipa_get_param_info(obj_name, attr) { - var takes_params = ipa_objs[_ipa_obj_name]['takes_params']; + var takes_params = ipa_objs[obj_name].takes_params; if (!takes_params) - return (null); + return (null); for (var i = 0; i < takes_params.length; ++i) { - if (takes_params[i]['name'] == attr) - return (takes_params[i]); + if (takes_params[i]['name'] == attr) + return (takes_params[i]); } return (null); } + +/* helper function used to retrieve attr name with members of type `member` */ +function ipa_get_member_attribute(obj_name, member) +{ + var attribute_members = ipa_objs[obj_name].attribute_members + for (var a in attribute_members) { + var objs = attribute_members[a]; + for (var i = 0; i < objs.length; ++i) { + if (objs[i] == member) + return a; + } + } +} + diff --git a/install/static/navigation.js b/install/static/navigation.js index ed1907789..ec048d9a8 100644 --- a/install/static/navigation.js +++ b/install/static/navigation.js @@ -1,242 +1,80 @@ -function setLoggedInText(principal){ - $("#loggedinas").html( "Logged in as " + principal); +/* 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 +*/ + +function nav_create(nls, container, tabclass) +{ + if (!container) + container = $('#navigation'); + if (!tabclass) + tabclass = 'tabs'; + + nav_generate_tabs(nls, container, tabclass); + + var tabs = $('.' + tabclass); + tabs.tabs({event: 'change'}); + tabs.find('ul.ui-tabs-nav a').click(_nav_tab_on_click); } -function whoamiSuccess(response){ +function nav_generate_tabs(nls, container, tabclass) +{ + container.addClass(tabclass); + container.prepend('<ul></ul>'); - $.cookie("whoami", response.result.summary); - setLoggedInText(response.result.summary); -} - -function unimplemented(facet){ - - showContent(); - $('#content').append("<div>Not yet implemented.</div>"); - -} - -var parentTabs; -function getParentTabs(){ - if (!parentTabs){ - parentTabs = { - user : "identity", - group : "identity", - host : "identity", - hostgroup: "identity", - netgroup : "identity", - service : "identity", - policy : "policy", - config : "config" - }; - } - return parentTabs; -} - -function buildNavigation(){ - params= ipa_parse_qs(); - var tab = params["tab"]; - - if (!tab){ - tab=$.cookie("lastpage"); - } - if ( !tab ) { - tab="user"; - } - - var facet = params["facet"]; - - - var siteMap = [{name:"IDENTITY", - tab:"identity", //Default subtab - children : [ - {name:"Users",tab:"user", setup: setupUser}, - {name:"Groups",tab:"group",setup: setupGroup}, - {name:"Hosts",tab:"host", setup: setupHost}, - {name:"Hostgroups", - tab:"hostgroup", - setup: setupHostgroup}, - {name:"Netgroups",tab:"netgroup", setup:setupNetgroup}, - {name:"Services",tab:"service", setup:setupService} - ]}, - {name:"POLICY", tab:"policy", setup: unimplemented}, - {name:"CONFIG", tab:"config", setup: unimplemented }]; + var ul = container.children().first(); + for (var i = 0; i < nls.length; ++i) { + var n = nls[i]; - //TODO autogen this from the site map + nav_insert_tab_li(ul, n[0], n[1]); + nav_insert_tab_div(container, n[0]); - var separator = $("<span class='main-separator' />"); - - var currentMain = siteMap[0]; - for (var i = 0 ; i < siteMap.length; i++){ - current = siteMap[i]; - if (i > 0){ - $('#main-nav').append(separator.clone()); - } - var tabClass = "main-nav-off"; - if (tab == current.tab){ - currentMain = current; - tabClass = "main-nav-on"; - } - - var span = $("<span/>", { - "class": tabClass, - id: "span-tab-"+current.tab, - }); - - $("<a/>",{ - "id": "tab-"+current.tab, - href: "#tab="+current.tab, - text: current.name, - }).appendTo(span); - - span.appendTo("#main-nav") - } - - if (currentMain.children){ - var selectedSub; - for (var i =0; i < currentMain.children.length; i++){ - var currentSub = currentMain.children[i]; - - var tabClass = "sub-nav-off"; - if (tab == currentSub.tab){ - tabClass = "sub-nav-on"; - selectedSub = currentSub; + var div = ul.parent().children().last(); + if (typeof n[2] == 'function') { + n[2](div); + } else if (n[2].length) { + nav_generate_tabs(n[2], div, tabclass); } - - var span = $("<span/>", { - "class": tabClass, - id: "span-subtab-"+currentSub.tab - }); - - $("<a/>",{ - "id": "subtab-"+currentSub.tab, - href: "#tab="+currentSub.tab, - text: currentSub.name, - //click: setActiveSubtab, - }).appendTo(span); - - span.appendTo("#sub-nav"); - } - - if (selectedSub && selectedSub.setup){ - selectedSub.setup(facet); } - }else if (currentMain && currentMain.setup){ - currentMain.setup(facet); - } - - var whoami = $.cookie("whoami"); - if (whoami == null){ - ipa_cmd( 'whoami', [], {}, whoamiSuccess, null,null); - }else{ - setLoggedInText(whoami); - } -} - -var setupFunctions; -function getSetupFunctions(){ - if (!setupFunctions){ - setupFunctions = { - user: setupUser, - group: setupGroup, - host: setupHost, - hostgroup:setupHostgroup, - netgroup:setupNetgroup, - service:setupService, - }; - } - return setupFunctions; } -$(window).bind( 'hashchange', function(e) { - - var queryParams = ipa_parse_qs(); - var tab=queryParams.tab; - if (!tab){ - tab = 'user'; - } - $(".sub-nav-on").removeClass('sub-nav-on').addClass("sub-nav-off") - var active = "#span-subtab-"+tab; - $(active).removeClass('sub-nav-off').addClass("sub-nav-on") - setActiveTab(getParentTabs()[tab]); +var _nav_li_tab_template = '<li><a href="#I">N</a></li>'; - getSetupFunctions()[tab](queryParams.facet ); -}); - - - -function setActiveTab(tabName){ - - $(".main-nav-on").removeClass('main-nav-on').addClass("main-nav-off") - var activeTab = "#span-tab-"+tabName; - $(activeTab).removeClass('main-nav-off').addClass("main-nav-on") +function nav_insert_tab_li(jobj, id, name) +{ + jobj.append(_nav_li_tab_template.replace('I', id).replace('N', name)); } +var _nav_div_tab_template = '<div id="T"></div>'; -function buildFacetNavigation(facets){ - setupFacetNavigation(qs['tab'], qs['pkey'],qs['facet'], facets); +function nav_insert_tab_div(jobj, id) +{ + jobj.append(_nav_div_tab_template.replace('T', id)); } -function setupFacetNavigation(tab, pkey,facet,facets){ - $('#viewtype').css("display","block"); - $("#viewtype").html(""); +function _nav_tab_on_click(obj) +{ + var jobj = $(this); + var state = {}; + var id = jobj.closest('.tabs').attr('id'); + var index = jobj.parent().prevAll().length; - for (var i =0; i < facets.length; i++){ - var li = $('<li>').appendTo($("#viewtype")); - if (facets[i] == facet){ - $('<img src="but-selected.png" alt="" />'); - li.html(facets[i]); - }else{ - $('<img src="but-unselected.png" alt="" />').appendTo(li); - $('<a/>',{ - href: "#tab="+tab+"&facet="+facets[i]+"&pkey="+pkey, - html: facets[i] - }).appendTo(li); - } - } + state[id] = index; + $.bbq.pushState(state); } -function clearOld(){ - - $('h1').html(""); - $('#viewtype').css("display","none"); - - $('#search').css("display","none"); - $('#details').css("display","none"); - $('#content').css("display","none"); - $('#associations').css("display","none"); - - - $('#searchResultsTable thead').html(""); - $('#searchResultsTable tfoot').html(""); - $('#searchResultsTable tbody').find("tr").remove(); - $("#searchButtons").html(""); - - $('#content').html(""); - - //remove old details - $('.entryattrs dd').remove(); - $('#detail-lists').html("<hr/>"); -} - -function showSearch(){ - clearOld(); - $('#search').css("display","block"); - $("#filter").css("display","block"); -} - -function showContent(){ - clearOld(); - $('#viewtype').css("display","block"); - $('#content').css("display","block"); -} - -function showDetails(){ - clearOld(); - $('#viewtype').css("display","block"); - $('#details').css("display","block"); -} - -function showAssociations(){ - clearOld(); - $('#associations').css("display","block"); -} diff --git a/install/static/netgroup.js b/install/static/netgroup.js index 4fcaffa98..625ebfdd4 100644 --- a/install/static/netgroup.js +++ b/install/static/netgroup.js @@ -1,107 +1,42 @@ -function setupNetgroup(facet){ - netgroupForms.setup(facet); -} +/* 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 + */ + +/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */ + +ipa_entity_set_search_definition('netgroup', [ + ['cn', 'Name', null], + ['description', 'Description', null] +]); + +ipa_entity_set_add_definition('netgroup', [ + 'dialog-add-netgroup', 'Add New Netgroup', [ + ['cn', 'Name', null], + ['description', 'Description', null] + ] +]); + +ipa_entity_set_details_definition('netgroup', [ + ['identity', 'Netgroup Details', [ + ['cn', 'Name', null], + ['description', 'Description', null], + ['nisdomainname', 'NIS Domain', null] + ]] +]); -var netgroupForms = new NetgroupForms(); - -function NetgroupForms(){ - this.obj='netgroup'; - this.pkeycol = 'cn'; - this.facets = ["details","users","assignusers","groups","assigngroups","hosts","assignhosts","hostgroups","assignhostgroups"]; - - this.netgroupSearchColumns = [ - {title:"Netgroup",column:"cn",render: function(current,cell){ - renderPkeyColumn2('netgroup', 'cn', current,cell); - }}, - {title:"Description", column:"description",render: renderSimpleColumn}]; - - - this.details_list = - [['identity', 'Netgroup Details', [ - ['cn', 'Netgroup Name'], - ['description', 'Description'], - ['nisdomainname', 'NIS Domain']]]]; - - this.details = new DetailsForm(this.obj,this.details_list,this.pkeycol, - this.facets) ; - - - - this.add_properties = - [{title: 'Netgroup Name', id: 'pkey', type: 'text'}, - {title: 'Description', id: 'description', type: 'text'}]; - - this.add = new EntityBuilder("netgroup",this.add_properties); - - this.add.getOptions = function() { - var options = { - name: $('#pkey').val(), - description: $('#description').val() - }; - return options; - } - - this.search = new SearchForm("netgroup", "find", this.netgroupSearchColumns); - - this.userListColumns = [ {title:"user",column:"memberuser_user", }]; - this.users = new AssociationList( - this.obj, "users", "assignusers", this.userListColumns, this.facets ); - - this.assignusers = new AssociationForm( - this.obj, "user", "assignuser", this.facets, "uid", - function(){ - return 'Add Hosts to to netgroup : ' + qs['pkey'] ; - }, - BulkAssociator); - - - this.groupListColumns = [ {title:"group",column:"memberuser_group", }]; - this.groups = new AssociationList( - this.obj, "groups", "assigngroups", this.groupListColumns, this.facets ); - - this.assigngroups = new AssociationForm( - this.obj, "group", "assigngroup", this.facets, "cn", - function(){ - return 'Add Hosts to to netgroup : ' + qs['pkey'] ; - }, - BulkAssociator); - - - - this.hostListColumns = [ {title:"host",column:"memberhost_host", }]; - - this.hosts = new AssociationList( - this.obj, "hosts", "assignhosts", this.hostListColumns, this.facets ); - - this.assignhosts = new AssociationForm( - this.obj, "host", "assignhosts", this.facets, "fqdn", - function(){ - return 'Add Hosts to to netgroup : ' + qs['pkey'] ; - }, - BulkAssociator); - - - this.hostgroupListColumns = [ {title:"hostgroup",column:"memberhost_hostgroup", }]; - - this.hostgroups = new AssociationList( - this.obj, "hostgroups", "assignhostgroups", this.hostgroupListColumns, this.facets ); - - this.assignhostgroups = new AssociationForm( - this.obj, "hostgroup", "assignhostgroups", this.facets, "cn", - function(){ - return 'Add Hostgroups to to netgroup : ' + qs['pkey'] ; - }, - BulkAssociator); - - - - this.unspecified = this.search; - this.setup = function(facet){ - if (this[facet]){ - this[facet].setup(); - }else{ - this.unspecified.setup(); - } - } - -} diff --git a/install/static/pageparams.js b/install/static/pageparams.js deleted file mode 100644 index 62307def8..000000000 --- a/install/static/pageparams.js +++ /dev/null @@ -1,15 +0,0 @@ -function getPageParams(){ - var qsParm = new Array(); - var query = window.location.search.substring(1); - var parms = query.split("&"); - for (var i=0; i<parms.length; i++) { - var pos = parms[i].indexOf('='); - if (pos > 0) { - var key = parms[i].substring(0,pos); - var val = parms[i].substring(pos+1); - qsParm[key] = val; - } - } - return qsParm; -} - diff --git a/install/static/search.js b/install/static/search.js index c1f99bab2..6a7c40b01 100644 --- a/install/static/search.js +++ b/install/static/search.js @@ -1,139 +1,171 @@ +/* Authors: + * Pavel Zuna <pzuna@redhat.com> + * Adam Young <ayoung@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 + */ + +/* REQUIRES: ipa.js */ + +function search_create(obj_name, scl, container) +{ + function find_on_click() { + var filter = $(this).prev('input[type=text]').val(); + var state = {}; + state[obj_name + '-filter'] = filter; + $.bbq.pushState(state); + }; + + if (!container) { + alert('ERROR: search_create: Second argument "container" missing!'); + return; + } -//Columns is an array of items in the form -// {title, column, render} -//title: the the value that goes at the head of the column -//filed: the column in the response used for populating the value -//render: the function used to generate cell.innerHtml -// it is in the form: -// render(current, cell) -// current is the row in response -// cell is the td in the table - - -//These are helper functions, either assigned to the rneder method -//Or called from a thin wrapper render method -function renderSimpleColumn(current,cell){ - cell.innerHTML = current[this.column]; + container.attr('title', obj_name); + container.addClass('search-container'); + + container.append('<div class="search-controls"></div>'); + var div = container.children().last(); + div.append('<span class="search-filter"></span>'); + var jobj = div.children().last(); + jobj.append('<input type="text" />'); + jobj.children().last().attr('name', 'search-' + obj_name + '-filter') + jobj.append('<input type="submit" value="find" />');; + jobj.children().last().click(find_on_click); + div.append('<span class="search-buttons"></span>'); + + container.append('<table class="search-table"></table>'); + jobj = container.children().last(); + jobj.append('<thead><tr></tr></thead>'); + jobj.append('<tbody></tbody>'); + jobj.append('<tfoot></tfoot>'); + + var tr = jobj.find('tr'); + for (var i = 0; i < scl.length; ++i) { + var c = scl[i]; + search_insert_th(tr, obj_name, c[0], c[1], c[2]); + } } +var _search_th_template = '<th abbr="A" title="C">N</th>'; -function renderUnknownColumn(current,cell){ - cell.innerHTML = "Unknown"; -} +function search_insert_th(jobj, obj_name, attr, name, render_call) +{ + var th = _search_th_template.replace('A', attr); + var param_info = ipa_get_param_info(obj_name, attr); + if (param_info && param_info['label']) + th = th.replace('N', param_info['label']); + else + th = th.replace('N', name); -function renderPkeyColumn2(obj,pkeyCol,current,cell){ - $("<a/>",{ - href:"#tab="+obj+"&facet=details&pkey="+current[pkeyCol], - html: "" + current[pkeyCol], - }).appendTo(cell); -} + if (typeof render_call == 'function') + th = th.replace('C', render_call.name); + else + th = th.replace('C', '-'); -function renderPkeyColumn(form,current,cell){ - renderPkeyColumn2(form.obj, form.pkeyCol,current, cell); + jobj.append(th); } - - - -function renderDetailColumn(current,cell,pkey,obj){ - $("<a/>",{ - href:"#tab="+obj+"&facet=details&pkey="+pkey, - html: ""+ current[this.column], - }).appendTo(cell); +function search_load(obj_name, criteria, on_win, on_fail) +{ + function load_on_win(data, text_status, xhr) { + if (data.error) + return; + search_display(obj_name, data); + if (on_win) + on_win(data, text_status, xhr); + }; + + function load_on_fail(xhr, text_status, error_thrown) { + if (on_fail) + on_fail(xhr, text_status, error_thrown); + }; + + ipa_cmd( + 'find', [criteria], {all: true}, load_on_win, load_on_fail, obj_name + ); } - - -function SearchForm(obj, method, cols){ - - this.buildColumnHeaders = function (){ - var columnHeaders = document.createElement("tr"); - for (var i =0 ; i != this.columns.length ;i++){ - var th = document.createElement("th"); - th.innerHTML = this.columns[i].title; - columnHeaders.appendChild(th); - } - $('#searchResultsTable thead:last').append(columnHeaders); +function search_generate_tr(thead, tbody, entry_attrs) +{ + tbody.append('<tr></tr>'); + var tr = tbody.children().last(); + + var ths = thead.find('th'); + for (var i = 0; i < ths.length; ++i) { + var jobj = $(ths[i]); + var attr = jobj.attr('abbr'); + var value = entry_attrs[attr]; + + var render_call = window[jobj.attr('title')]; + if (typeof render_call == 'function') + render_call(tr, attr, value); + else + search_generate_td(tr, attr, value); } + tbody.find('.search-a-pkey').click(function () { + var jobj = $(this); + var obj_name = tbody.closest('.search-container').attr('title'); - this.renderResultRow = function(current){ - var row = document.createElement("tr"); - var cell; - var link; - for(var index = 0 ; index < this.columns.length; index++){ - this.columns[index].render(current, row.insertCell(-1)); - } - return row; - } + var state = {}; + state[obj_name + '-facet'] = 'details'; + state[obj_name + '-pkey'] = $(this).text(); + $.bbq.pushState(state); - this.searchSuccess = function (json){ - if (json.result.truncated){ - $("#searchResultsTable tfoot").html("More than "+sizelimit+" results returned. First "+ sizelimit+" results shown." ); - }else{ - $("#searchResultsTable tfoot").html(json.result.summary); - } - $("#searchResultsTable tbody").find("tr").remove(); - for (var index = 0; index != json.result.result.length; index++){ - var current = json.result.result[index]; - $('#searchResultsTable tbody:last').append(this.renderResultRow(current)); - } - } + return (false); + }); +} - this.searchWithFilter = function(queryFilter){ - var form = this; - - $('#searchResultsTable tbody').html(""); - $('#searchResultsTable tbody').html(""); - $('#searchResultsTable tfoot').html(""); - - ipa_cmd(this.method, - [queryFilter], - {"all":"true"}, - function(json){ - form.searchSuccess(json); - }, - function(json){ - alert("Search Failed"); - }, - form.obj); - } +var _search_td_template = '<td title="A">V</td>'; +var _search_a_pkey_template = '<a href="jslink" class="search-a-pkey">V</a>'; - this.setup = function(){ - showSearch(); - - $('#searchResultsTable thead').html(""); - $('#searchResultsTable tbody').html(""); - $('#searchResultsTable tfoot').html(""); - $("#new").click(function(){ - location.hash="tab="+obj+"&facet=add"; - }); - $("#query").click(executeSearch); - this.buildColumnHeaders(); - var params = ipa_parse_qs(); - qs = location.hash.substring(1); - //TODO fix this hack. since parse returns an object, I don't know how to see if that object has a"critia" property if criteria is null. - if (qs.indexOf("criteria") > 0) - { - this.searchWithFilter(params["criteria"]); - } - } +function search_generate_td(tr, attr, value) +{ + var obj_name = tr.closest('.search-container').attr('title'); + + var param_info = ipa_get_param_info(obj_name, attr); + if (param_info && param_info['primary_key']) + value = _search_a_pkey_template.replace('V', value); - this.obj = obj; - this.method = method; - this.columns = cols; - this.setup(); + tr.append(_search_td_template.replace('A', attr).replace('V', value)); } -executeSearch = function(){ - var queryFilter = $("#queryFilter").val(); - var qp = ipa_parse_qs(); - var tab = qp.tab; - if (!tab){ - tab = 'user'; + +function search_display(obj_name, data) +{ + var selector = '.search-container[title=' + obj_name + ']'; + var thead = $(selector + ' thead'); + var tbody = $(selector + ' tbody'); + var tfoot = $(selector + ' tfoot'); + + tbody.find('tr').remove(); + + var result = data.result.result; + for (var i = 0; i < result.length; ++i) + search_generate_tr(thead, tbody, result[i]); + + if (data.result.truncated) { + tfoot.text( + 'More than ' + sizelimit + ' results returned. ' + + 'First ' + sizelimit + ' results shown.' + ); + } else { + tfoot.text(data.result.summary); } - window.location.hash="#tab=" - +tab - +"&facet=search&criteria=" - +queryFilter; } + diff --git a/install/static/user.js b/install/static/user.js index dca999a1a..a8954be19 100644 --- a/install/static/user.js +++ b/install/static/user.js @@ -1,243 +1,78 @@ -var user_details_lists = [ - ['identity', 'Identity Details', [ - ['title', 'Title'], - ['givenname', 'First Name'], - ['sn', 'Last Name'], - ['cn', 'Full Name'], - ['displayname', 'Dispaly Name'], - ['initials', 'Initials'] +/* 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 + */ + +/* REQUIRES: ipa.js, details.js, search.js, add.js, entity.js */ + +ipa_entity_set_search_definition('user', [ + ['cn', 'Name', null], + ['uid', 'Login', null], + ['uidnumber', 'UID', null], + ['mail', 'EMAIL', null], + ['telephonenumber', 'Phone', null], + ['title', 'Job Title', null], + ['actions', 'Actions', null] +]); + +ipa_entity_set_add_definition('user', [ + 'dialog-add-user', 'Add New User', [ + ['uid', 'Login', null], + ['givenname', 'First Name', null], + ['sn', 'Last Name', null] ] - ], +]); + +ipa_entity_set_details_definition('user', [ + ['identity', 'Identity Details', [ + ['title', 'Title', null], + ['givenname', 'First Name', null], + ['sn', 'Last Name', null], + ['cn', 'Full Name', null], + ['displayname', 'Dispaly Name', null], + ['initials', 'Initials', null] + ]], ['account', 'Account Details', [ - ['call_a_status', 'Account Status'], - ['uid', 'Login'], - ['call_a_password', 'Password'], - ['uidnumber', 'UID'], - ['gidnumber', 'GID'], - ['homedirectory', 'homedirectory'] - ] - ], + ['status', 'Account Status', a_status], + ['uid', 'Login', null], + ['userpassword', 'Password', a_password], + ['uidnumber', 'UID', null], + ['gidnumber', 'GID', null], + ['homedirectory', 'homedirectory', null] + ]], ['contact', 'Contact Details', [ - ['mail', 'E-mail Address'], - ['call_a_numbers', 'Numbers'] - ] - ], + ['mail', 'E-mail Address', null], + ['numbers', 'Numbers', a_numbers] + ]], ['address', 'Mailing Address', [ - ['street', 'Address'], - ['location', 'City'], - ['call_a_st', 'State'], - ['postalcode', 'ZIP'] - ] - ], + ['street', 'Address', null], + ['location', 'City', null], + ['state', 'State', a_st], + ['postalcode', 'ZIP', null] + ]], ['employee', 'Employee Information', [ - ['ou', 'Org. Unit'], - ['call_a_manager', 'Manager'] - ] - ], + ['ou', 'Org. Unit', null], + ['manager', 'Manager', a_manager] + ]], ['misc', 'Misc. Information', [ - ['carlicense', 'Car License'] - ] - ] -]; - - -function setupUser(facet){ - if (facet == "details"){ - setupUserDetails(); - }else if (facet == "add"){ - userBuilder.setup(); - }else if (facet == "group"){ - setupUserGroupList(); - }else if (facet == "groupmembership"){ - userGroupMembershipForm.setup(); - }else{ - userSearchForm.setup(); - } -} - -function add_user_fail(reason){ - alert("Add User Failed:"+JSON.stringify(reason)); -} - -function addUser(on_success){ - - var options = { givenname: $("#firstname").val(), - sn: $("#lastname").val(), - uid : $("#login").val()}; - - ipa_cmd( 'add', [], options, on_success, add_user_fail, 'user' ); -} - -function addAnotherUser(){ - addUser(setupAddUser); -} - -function addEditUser(){ - addUser(function (response){ - setupUserDetails($("#login").val()); - }); -} - -var userAddProperties = [ - {title: 'login', id: 'pkey', type: 'text'}, - {title: 'First Name', id: 'firstname', type:'text'}, - {title: 'Last Name', id: 'lastname', type:'text'} -]; - -var userBuilder = - new EntityBuilder( - "user", - userAddProperties); - -userBuilder.getOptions = function() { - var options = { - givenname: $("#firstname").val(), - sn: $("#lastname").val()}; - return options; -} - -var userFacets = ["details","group", "groupmembership"]; - - -function setupUserDetails(user){ - qs = ipa_parse_qs(); - showDetails(); - setupFacetNavigation('user',qs.pkey,qs.facet,userFacets); - renderUserDetails(); -} - -function renderUserDetails() -{ - ipa_details_init('user'); - ipa_details_create(user_details_lists, $('#details')); - - if (qs['principal']) { - ipa_cmd( - 'find', [], {'krbprincipalname': qs['principal']}, - on_win_find, null, 'user'); - - return; - } - - if (!qs['pkey']) - return; - - ipa_details_load(qs['pkey'], on_win, null); - $('h1').text('Managing user: ' + qs['pkey']); -} - -function renderSimpleColumn(current,cell){ - cell.innerHTML = current[this.column]; -} - -function renderUserLinks(current, cell){ - link = document.createElement("a"); - cell.appendChild(link); - - $("<a/>",{ - href:"#tab=user&facet=details&pkey="+current.uid, - html: "[D]", - }).appendTo(cell); - - $("<a/>",{ - href: "#tab=user&facet=group&pkey="+current.uid, - html: "[G]" - }).appendTo(cell); - - $("<a/>",{ - href:"#tab=user&facet=netgroup&pkey="+current.uid, - html: "[N]" - }).appendTo(cell); - - $("<a/>",{ - href:"#tab=user&facet=role&pkey="+current.uid, - html:"[R]" - }).appendTo(cell); -} - -function renderUserDetailColumn(current,cell){ - - $("<a/>",{ - href:"#tab=user&facet=details&pkey="+current.uid, - html: ""+ current[this.column], - click: function(){ setupUserDetails(current.uid)}, - }).appendTo(cell); -} - -var userSearchColumns = [ - {title:"Name", column:"cn", render: renderSimpleColumn}, - {title:"Login", column:"uid", render: renderUserDetailColumn}, - {title:"UID", column:"uidnumber", render: renderSimpleColumn}, - {title:"EMAIL", column:"mail", render: renderSimpleColumn}, - {title:"Phone", column:"telephonenumber",render: renderSimpleColumn}, - {title:"Job Title",column:"title", render: renderSimpleColumn}, - {title:"Actions", column:"none", render: renderUserLinks} -]; - -var userSearchForm = new SearchForm("user", "find", userSearchColumns); - -/*Usr group enrollement: - given a user, manage the groups in which they are enrolled */ -function populateUserGroupFailure(){ - alert("Can't find user"); -} - - - - -var userGroupMembershipForm = new AssociationForm("user","group","groupmembership",userFacets, "cn", function(){ - return 'Enroll user ' + qs['pkey'] + ' in groups'; -} -); - -/*Group Membership*/ -var groupMembershipColumns = [ - {title:"group", column:"memberof_group"}, -]; - -function populateUserEnrollments(userData){ - userEnrollmentList.populate(userData); -} -function setupUserGroupList(){ - userEnrollmentList.setup(); -} -var userEnrollmentList = new AssociationList('user', 'group','groupmembership',groupMembershipColumns,userFacets); - - -function on_win(data, textStatus, xhr) -{ - if (data['error']) - alert(data['error']['message']); -} - -function on_win_find(data, textStatus, xhr) -{ - if (data['error']) { - alert(data['error']['message']); - return; - } - - var result = data.result.result; - if (result.length == 1) { - var entry_attrs = result[0]; - qs['pkey'] = entry_attrs['uid'][0]; - - ipa_details_load(qs['pkey'], on_win); - $('h1').text('Managing user: ' + qs['pkey']); - } -} - -function reset_on_click() -{ - ipa_details_reset(); - return (false); -} - -function update_on_click() -{ - ipa_details_update(qs['pkey'], on_win); - return (false); -} + ['carlicense', 'Car License', null] + ]] +]); /* Account status Toggle button */ @@ -365,3 +200,12 @@ function a_st(jobj, result, mode) else sel.val(''); } + +function a_numbers(jobj, result, mode) +{ +} + +function a_manager(jobj, result, mode) +{ +} + diff --git a/install/static/usermeta.js b/install/static/usermeta.js deleted file mode 100644 index 9d8b228d4..000000000 --- a/install/static/usermeta.js +++ /dev/null @@ -1,415 +0,0 @@ -//TODO: This data should be fetched from a separate web URL and -//generated off the metadata for the user object -//but it is basically static. - -var PluginData = { - "primary_key": "uid", - "default_attributes": [ - "uid", - "givenname", - "sn", - "homedirectory", - "loginshell", - "ou", - "telephonenumber", - "title", - "memberof" - ], - "object_name_plural": "users", - "container_dn": "cn=users,cn=accounts", - "object_class_config": "ipauserobjectclasses", - "hidden_attributes": [ - "objectclass", - "aci" - ], - "uuid_attribute": "ipauniqueid", - "label": "Users", - "methods": [ - "add", - "del", - "find", - "lock", - "mod", - "show", - "unlock" - ], - "object_name": "user", - "takes_params": [ - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "login", - "primary_key": true, - "name": "uid", - "default": null, - "doc": "User login", - "required": true, - "flags": [], - "label": "User login", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "first", - "primary_key": false, - "name": "givenname", - "default": null, - "doc": "First name", - "required": true, - "flags": [], - "label": "First name", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "last", - "primary_key": false, - "name": "sn", - "default": null, - "doc": "Last name", - "required": true, - "flags": [], - "label": "Last name", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "homedir", - "primary_key": false, - "name": "homedirectory", - "default": null, - "doc": "Home directory", - "required": false, - "flags": [], - "label": "Home directory", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "gecos", - "primary_key": false, - "name": "gecos", - "default": null, - "doc": "GECOS field", - "required": false, - "flags": [], - "label": "GECOS field", - "autofill": true, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "shell", - "primary_key": false, - "name": "loginshell", - "default": "/bin/sh", - "doc": "Login shell", - "required": false, - "flags": [], - "label": "Login shell", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "principal", - "primary_key": false, - "name": "krbprincipalname", - "default": null, - "doc": "Kerberos principal", - "required": false, - "flags": [], - "label": "Kerberos principal", - "autofill": true, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "email", - "primary_key": false, - "name": "mail", - "default": null, - "doc": "Email address", - "required": false, - "flags": [], - "label": "Email address", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": [ - "webui" - ], - "minlength": null, - "include": null, - "cli_name": "password", - "primary_key": false, - "name": "userpassword", - "default": null, - "doc": "Set the user password", - "required": false, - "flags": [], - "label": "Password", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Password", - "maxlength": null - }, - { - "exclude": null, - "include": null, - "cli_name": "uid", - "primary_key": false, - "minvalue": null, - "doc": "User ID Number (system will assign one if not provided)", - "required": false, - "flags": [], - "label": "UID", - "default": 999, - "autofill": true, - "multivalue": false, - "attribute": false, - "query": false, - "maxvalue": null, - "cli_short_name": null, - "type": "int", - "class": "Int", - "name": "uidnumber" - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "street", - "primary_key": false, - "name": "street", - "default": null, - "doc": "Street address", - "required": false, - "flags": [], - "label": "Street address", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "memberof_group", - "primary_key": false, - "name": "memberof_group", - "default": null, - "doc": "Groups", - "required": false, - "flags": [ - "no_update", - "no_create", - "no_search" - ], - "label": "Groups", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "memberof_netgroup", - "primary_key": false, - "name": "memberof_netgroup", - "default": null, - "doc": "Netgroups", - "required": false, - "flags": [ - "no_update", - "no_create", - "no_search" - ], - "label": "Netgroups", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "memberof_rolegroup", - "primary_key": false, - "name": "memberof_rolegroup", - "default": null, - "doc": "Rolegroups", - "required": false, - "flags": [ - "no_update", - "no_create", - "no_search" - ], - "label": "Rolegroups", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - }, - { - "exclude": null, - "minlength": null, - "include": null, - "cli_name": "memberof_taskgroup", - "primary_key": false, - "name": "memberof_taskgroup", - "default": null, - "doc": "Taskgroups", - "required": false, - "flags": [ - "no_update", - "no_create", - "no_search" - ], - "label": "Taskgroups", - "autofill": false, - "multivalue": false, - "pattern": null, - "type": "unicode", - "attribute": false, - "query": false, - "cli_short_name": null, - "length": null, - "class": "Str", - "maxlength": null - } - ], - "attribute_members": { - "memberof": [ - "group", - "netgroup", - "rolegroup", - "taskgroup" - ] - }, - "parent_object": "", - "object_class": [ - "posixaccount" - ], - "name": "user" -} - -ipa_objs['user'] = PluginData; diff --git a/install/static/webui.js b/install/static/webui.js new file mode 100644 index 000000000..f7cccff6f --- /dev/null +++ b/install/static/webui.js @@ -0,0 +1,124 @@ +/* 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 + */ + +/* REQUIRES: everything, this file puts it all togheter */ + +/* tabs definition for IPA webUI */ +var nav_tabs_lists = [ + ['identity', 'IDENTITY', [ + ['user', 'Users', ipa_entity_setup], + ['group', 'Groups', ipa_entity_setup], + ['host', 'Hosts', ipa_entity_setup], + ['hostgroup', 'Hostgroups', ipa_entity_setup], + ['netgroup', 'Netgroups', ipa_entity_setup], + ]], + ['policy', 'POLICY', unimplemented_tab], + ['config', 'CONFIG', unimplemented_tab] +]; + +/* main (document onready event handler) */ +$(function() { + function set_logged_in_as(principal) { + $.cookie('whoami', principal); + $('#loggedinas').find('strong').text(principal); + }; + + function whoami_on_win(data, text_status, xhr) { + if (!data.error) + set_logged_in_as(data.result.summary); + }; + + function init_on_win(data, text_status, xhr) { + nav_create(nav_tabs_lists, $('#navigation'), 'tabs'); + + $(window).bind('hashchange', window_hashchange); + window_hashchange(null); + + var whoami = $.cookie('whoami'); + if (whoami) + set_logged_in_as(whoami); + else + ipa_cmd('whoami', [], {}, whoami_on_win, null, null, 'sampledata/whoami.json'); + }; + + ipa_init(null, init_on_win); +}); + +/* use this to track individual changes between two hashchange events */ +var window_hash_cache = {}; + +/* main loop (hashchange event handler) */ +function window_hashchange(evt) +{ + $('.tabs').each(function () { + var jobj = $(this); + var index = $.bbq.getState(jobj.attr('id'), true) || 0; + jobj.find('ul.ui-tabs-nav a').eq(index).triggerHandler('change'); + }); + + for (var i = 0; i < nav_tabs_lists.length; ++i) { + var t = nav_tabs_lists[i]; + if (typeof t[2] != 'function' && t[2].length) { + for (var j = 0; j < t[2].length; ++j) { + var tt = t[2][j]; + var obj_name = tt[0]; + var entity_setup = tt[2]; + var div = $('#' + t[0] + ' div[title=' + obj_name + ']'); + + var state = obj_name + '-facet'; + var facet = $.bbq.getState(state, true) || 'search'; + var last_facet = window_hash_cache[state] || 'search'; + if (facet != last_facet) { + entity_setup(div); + continue; + } + + if (facet == 'search') { + state = obj_name + '-filter'; + var filter = $.bbq.getState(state, true); + var last_filter = window_hash_cache[state]; + if (filter != last_filter) + entity_setup(div); + } else if (facet == 'details') { + state = obj_name + '-pkey'; + var pkey = $.bbq.getState(state, true); + var last_pkey = window_hash_cache[state]; + if (pkey != last_pkey) + entity_setup(div); + } else if (facet == 'associate' || facet == 'enroll') { + state = obj_name + '-enroll'; + var enroll = $.bbq.getState(state, true); + var last_enroll = window_hash_cache[state]; + if (enroll != last_enroll) + entity_setup(div); + } + } + } + } + + window_hash_cache = $.bbq.getState(); +} + +/* builder function for unimplemented tab content */ +function unimplemented_tab(jobj) +{ + jobj.text('Not implemented yet!'); +} + |