hashchange

We now catch the hashchange event and use that to drive most of the site.
To trigger page transitions, modify location.hash.
Params start with # not ?.
Removed user-group.inc.
converted tabs to spaces
trivial imlementation of add and details for netgroup and hostgroup
lots of bug fixes based on routing problems and the refactorings.
This commit is contained in:
Adam Young 2010-08-23 22:32:23 -04:00
parent 02479babb9
commit 49584d6efc
16 changed files with 713 additions and 520 deletions

View File

@ -2,6 +2,7 @@ NULL =
appdir = $(IPA_DATA_DIR)/static
app_DATA = \
add.js \
but-reset.png \
but-update.png \
but-selected.png \

110
install/static/add.js Normal file
View File

@ -0,0 +1,110 @@
/* Authors:
* 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
*/
/* IPA Object Add - creating new instances of entities */
/* REQUIRES: ipa.js */
/*
* An associatev array between entity names and their builders
*/
var builders = {} ;
function add_fail(desc){
alert(desc);
}
//Process for managing the 'add' functionality
function EntityBuilder(obj,addProperties,addOptionsFunction ){
this.obj = obj;
this.addProperties = addProperties;
if (addOptionsFunction){
this.addOptionsFunction = addOptionsFunction;
}else{
this.addOptionsFunction = function(){
var options = { };
return options;
}
}
this.add = function(on_success){
var options = this.addOptionsFunction();
var params = [$("#pkey").val()];
ipa_cmd( 'add', params, options, on_success, 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();
builders[params["tab"]].add (addEdit)
}
}).appendTo(label);
$("<input\>", {
id:'addAnother',
type:'button',
value:'Add Another',
click: function(){
var params = ipa_parse_qs();
builders[params["tab"]].add (addAnother)
}
}).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");
}
}
//register the new object with the associatev array of builders.
builders[obj] = this;
}
function addAnother(response){
var params = ipa_parse_qs();
builders[params["tab"]].setup();
}
function addEdit(response){
var params = ipa_parse_qs();
var hash= "tab="
+ params["tab"]
+"&facet=details&pkey="
+$("#pkey").val();
window.location.hash = hash;
}

View File

@ -1,5 +1,6 @@
/* Authors:
* Pavel Zuna <pzuna@redhat.com>
* Adam Young <ayoung@redhat.com>
*
* Copyright (C) 2010 Red Hat
* see file 'COPYING' for use and warranty information
@ -16,7 +17,7 @@
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
*/
/* IPA Object Details - populating definiton lists from entry data */
@ -134,6 +135,7 @@ function ipa_details_update(pkey, on_win, on_fail)
modlist['setattr'].push(attr + '=' + values[0]);
for (var i = 1; i < values.length; ++i)
modlist['addattr'].push(attr + '=' + values[i]);
}
_ipa_update_on_win_callback = on_win;
@ -162,6 +164,7 @@ 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)
@ -173,7 +176,7 @@ function ipa_details_create(dls, container)
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]);
// ipa_generate_dl($("#detail-lists"), d[0], d[1], d[2]);
}
}
@ -332,7 +335,7 @@ function ipa_create_input(attr, value)
if (param_info['multivalue'] || param_info['class'] == 'List') {
return (
handler(attr, value, param_info) +
_ipa_create_remove_link(attr, param_info)
_ipa_create_remove_link(attr, param_info)
);
}
return (handler(attr, value, param_info));
@ -378,6 +381,7 @@ function ipa_details_reset()
{
if (ipa_details_cache)
ipa_details_display(ipa_details_cache);
}
/* Event handlers */
@ -435,3 +439,22 @@ function _h2_on_click(obj)
}
}
function DetailsForm(obj, details_list, pkeyCol, sampleData ){
this.obj = obj;
this.details_list = details_list;
this.sampleData = sampleData;
this.pkeyCol = pkeyCol;
this.setup= function(key){
//re initialize global parse of parameters
qs = ipa_parse_qs();
showDetails();
$('h1').text("Managing " + this.obj +": " +qs['pkey'] );
ipa_details_init(this.obj);
ipa_details_create(this.details_list, $('#details'));
ipa_details_load(qs.pkey, on_win, null, this.sampleData);
}
}

View File

@ -1,10 +1,10 @@
function setupGroup(facet){
if (facet == "details"){
setupGroupDetails();
setupGroupDetails();
}else if (facet == "add"){
setupAddGroup();
setupAddGroup();
}else{
setupGroupSearch();
groupSearchForm.setup();
}
}
@ -14,15 +14,15 @@ function addGroupFail(desc){
}
function addGroup(on_success){
var options = {
posix: $('#isposix').is(':checked') ? 1 : 0 ,
description: $("#groupdescription").val()};
var options = {
posix: $('#isposix').is(':checked') ? 1 : 0 ,
description: $("#groupdescription").val()};
var gid = $("#groupidnumber").val();
var gid = $("#groupidnumber").val();
if (gid.length > 0){
options.gidnumber = gid;
options.gidnumber = gid;
}
var params = [$("#groupname").val()];
@ -33,7 +33,7 @@ function addGroup(on_success){
function addEditGroup(){
addGroup(function (response){
location.href="index.xhtml?tab=group&facet=details&pkey="+$("#groupname").val();
location.hash="tab=group&facet=details&pkey="+$("#groupname").val();
});
}
@ -47,20 +47,20 @@ function setupAddGroup(){
$("<h1>Add new Group</h1>").appendTo("#content");
$("<form id='addGroupForm'> </form>")
.appendTo("#content");
.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");
.appendTo("#groupProperties");
$("<dt>Description</dt><dd><input id='groupdescription' type='text'/></dd>")
.appendTo("#groupProperties");
.appendTo("#groupProperties");
$("<dt>Is this a posix Group</dt><dd><input id='isposix' type='checkbox'/></dd>")
.appendTo("#groupProperties");
.appendTo("#groupProperties");
$("<dt>GID</dt><dd><input id='groupidnumber' type='text'/></dd>")
.appendTo("#groupProperties");
.appendTo("#groupProperties");
$("#addEdit").click(addEditGroup);
@ -70,20 +70,15 @@ function setupAddGroup(){
var group_details_list =
[['identity', 'Group Details', [
['cn', 'Group Name'],
['description', 'Description'],
['gidnumber', 'Group ID']]]];
['cn', 'Group Name'],
['description', 'Description'],
['gidnumber', 'Group ID']]]];
function setupGroupDetails(group){
window.location.hash="#tab=user&facet=details&pkey="+group;
//re initialize global parse of parameters
qs = ipa_parse_qs();
//TODO make this work for more than just user details
user_details_lists;
showDetails();
ipa_details_init('group');
@ -103,29 +98,21 @@ function renderGroupDetails(group)
function renderGroupDetailColumn(current,cell){
$("<a/>",{
href:"#tab=group&facet=details&pkey="+current.cn,
html: ""+ current[this.column],
click: function(){ setupGroupDetails(current.cn)},
href:"#tab=group&facet=details&pkey="+current.cn,
html: ""+ current[this.column],
//click: function(){ setupGroupDetails(current.cn)},
}).appendTo(cell);
}
function setupGroupSearch(){
var columns = [
{title:"Group Name", column:"cn",render: renderGroupDetailColumn},
{title:"GID", column:"gidnumber",render: renderSimpleColumn},
{title:"Description", column:"description",render: renderSimpleColumn}
];
var groupSearchColumns = [
{title:"Group Name", column:"cn",render: renderGroupDetailColumn},
{title:"GID", column:"gidnumber",render: renderSimpleColumn},
{title:"Description", column:"description",render: renderSimpleColumn}
];
var groupSearchForm = new SearchForm("group", "find", groupSearchColumns ,"sampledata/grouplist.json");
var groupSearchForm = new SearchForm("group", "find", columns,"sampledata/grouplist.json");
$("#query").unbind();
$("#query").click(function(){
executeSearch(groupSearchForm);
});
$("#new").unbind();
$("#new").click( setupAddGroup );
}

View File

@ -1,38 +1,32 @@
function setupHost(facet){
if (facet == "details"){
setupHostDetails();
hostDetailsForm.setup();
}else if (facet == "add"){
hostBuilder.setup();
}else{
setupHostSearch();
hostSearchForm.setup();
}
}
function setupHostDetails(){
var detailsForm = new DetailsForm();
}
var hostAddProperties = [{title: 'Domain Name', id: 'pkey', type: 'text'}];
var hostBuilder = new EntityBuilder("host",hostAddProperties);
function setupHostSearch(){
sampleData = "sampledata/hostlist.json";
var columns = [
{title:"Host",column:"fqdn",render: function(current,cell){
renderDetailColumn(current,cell,current[this.column],"group");
}},
{title:"Comment", column: "description", render: renderSimpleColumn},
{title:"Enrolled?", render: renderUnknownColumn},
{title:"Manages?", render: renderUnknownColumn}
];
var host_details_list = [['host', 'Host Details', [
['fqdn', 'Fully Qualified Domain Name'],
['krbprincipalname', 'Kerberos Principal'],
['serverhostname', 'Server Host Name']
]]];
var hostDetailsForm = new DetailsForm("host",host_details_list,"fqdn","sampledata/hostshow.json") ;
var hostSearchForm = new SearchForm("host", "find", columns);
$("#query").unbind();
$("#query").click(function(){
sampleData = "sampledata/hostlist.json";
executeSearch(hostSearchForm);
});
$("#new").unbind();
$("#new").click( function() {
alert("New Host...");
});
}
var hostDetailsColumns = [
{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", hostDetailsColumns,"sampledata/hostlist.json");

View File

@ -1,35 +1,48 @@
function setupHostgroup(facet){
if (facet == "details"){
setupHostgroupDetails();
hostgroupDetailsForm.setup();
}else if (facet == "add"){
hostgroupBuilder.setup();
}else{
setupHostgroupSearch();
hostgroupSearchForm.setup();
}
}
function setupHostgroupDetails(){
var detailsForm = new DetailsForm();
var hostgroup_details_list =
[['identity', 'Hostgroup Details', [
['cn', 'Hostgroup Name'],
['description', 'Description']]]];
var hostgroupDetailsForm = new DetailsForm("hostgroup",hostgroup_details_list,"cn","sampledata/hostgroupshow.json") ;
function hostgroupAddOptionsFunction (){
var options = {
name: $('#pkey').val(),
description: $('#description').val()
};
return options;
}
var hostgroupAddProperties =
[{title: 'Hostgroup Name', id: 'pkey', type: 'text'},
{title: 'Description', id: 'description', type: 'text'}];
function setupHostgroupSearch(){
var hostgroupBuilder = new EntityBuilder("hostgroup",hostgroupAddProperties,hostgroupAddOptionsFunction);
var columns = [
{title:"Hostgroup",column:"cn",render: function(current,cell){
renderDetailColumn(current,cell,current[this.column],"hostgroup");
}},
{title:"Description", column:"description",render: renderSimpleColumn}];
var hostgroupSearchForm = new SearchForm("hostgroup", "find", columns);
var hostgroupSearchColumns = [
{
title:"Hostgroup",
column:"cn",
render: function(current,cell){
renderPkeyColumn(hostgroupDetailsForm, current,cell);
}
},
{title:"Description", column:"description",render: renderSimpleColumn}];
$("#query").unbind();
$("#query").click(function(){
sampleData = "sampledata/hostgrouplist.json";
executeSearch(hostgroupSearchForm);
});
$("#new").unbind();
$("#new").click( function() {
alert("New Hostgroup...");
});
}
var hostgroupSearchForm =
new SearchForm("hostgroup", "find", hostgroupSearchColumns,
"sampledata/hostgrouplist.json");

View File

@ -20,6 +20,7 @@
<script type="text/javascript" src="sampledata/develop.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="user.js"></script>
<script type="text/javascript" src="usermeta.js"></script>
<script type="text/javascript" src="group.js"></script>
@ -70,14 +71,6 @@
<ul id="viewtype">
<li id="viewcaption">View:</li>
<li>
<img src="but-selected.png" alt="" />
Identity Details
</li>
<li>
<img src="but-unselected.png" alt="" />
<a href="memberof?pkey=${pkey}">Memberships</a>
</li>
</ul>
<div id="detail-lists">
<hr />
@ -89,7 +82,7 @@
<div id="search" style="display:none">
<div class="searchControls" >
<span class="filter" >
<span id="filter" class="filter" >
<input id="queryFilter" type="text"/>
<input id="query" type="submit" value="find" />
<input id="new" type="submit" value="new" />
@ -104,5 +97,49 @@
</table>
</div>
<div id="associations" style="display:none">
<h1>Enroll in Groups</h1>
<ul id="viewtype">
<li id="viewcaption">View:</li>
</ul>
<form>
<div style="border-width:1px">
<div >
<input type="text"/>
<input id="find" type="button" value="Find Groups"/>
<span style="float:right">
<input id="cancelEnrollGroups" type="button" value="Cancel"/>
<input id="enrollGroups" 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>Groups</div>
<select id="grouplist" width="150px" size="10" multiple="true" >
</select>
</div>
<div style="float:left;">
<p><input id="removeFromList" type="button" value="&lt;&lt;"/> </p>
<p><input id="addToList" type="button" value="&gt;&gt;"/></p>
</div>
<div style="float:left;">
<div>Prospective Enrollments</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>

View File

@ -89,11 +89,11 @@ div#details {
}
div#details ul#viewtype {
ul#viewtype {
padding-left: 20px;
}
div#details ul#viewtype li {
ul#viewtype li {
color: #656565;
display: inline;
font-weight: bold;
@ -101,16 +101,12 @@ div#details ul#viewtype li {
padding-right: 20px;
}
div#content ul#viewtype li#viewcaption {
color: #000;
padding-right: 10px;
}
div#details ul#viewtype li img {
ul#viewtype li img {
vertical-align: middle;
}
div#details ul#viewtype li a {
ul#viewtype li a {
font-weight: normal;
}

View File

@ -39,16 +39,16 @@ var qs;
function ipa_init(url, on_win)
{
if (!url)
url = '/ipa/json';
url = '/ipa/json';
_ipa_init_on_win_callback = on_win;
var options = {
url: url,
type: 'POST',
contentType: 'application/json',
dataType: 'json',
processData: false,
url: url,
type: 'POST',
contentType: 'application/json',
dataType: 'json',
processData: false,
};
$.ajaxSetup(options);
@ -60,7 +60,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
@ -95,9 +95,9 @@ function ipa_cmd(name, args, options, win_callback, fail_callback, objname,sampl
};
var request = {
data: JSON.stringify(data),
success: win_callback,
error: fail_callback,
data: JSON.stringify(data),
success: win_callback,
error: fail_callback,
};
$.ajax(request);
@ -143,4 +143,3 @@ function ipa_get_param_info(attr)
return (null);
}

View File

@ -15,144 +15,165 @@ function unimplemented(facet){
}
var parentTabs;
function getParentTabs(){
if (!parentTabs){
parentTabs = {
user : "identity",
group : "identity",
host : "identity",
hostgroup: "identity",
netgroup : "identity",
policy : "policy",
config : "config"
};
}
return parentTabs;
}
function buildNavigation(){
params= ipa_parse_qs();
var tab = params["tab"];
if (!tab){
tab=$.cookie("lastpage");
tab=$.cookie("lastpage");
}
if ( !tab ) {
tab="user";
tab="user";
}
var facet = params["facet"];
var siteMap = [{name:"IDENTITY",
tab:"user",
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:"POLICY", tab:"policy", setup: unimplemented},
{name:"CONFIG", tab:"config", setup: unimplemented }];
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:"POLICY", tab:"policy", setup: unimplemented},
{name:"CONFIG", tab:"config", setup: unimplemented }];
//TODO autogen this from the site map
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,
click: setActiveTab
}).appendTo(span);
span.appendTo("#main-nav")
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];
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 tabClass = "sub-nav-off";
if (tab == currentSub.tab){
tabClass = "sub-nav-on";
selectedSub = currentSub;
}
var span = $("<span/>", {
"class": tabClass,
id: "span-subtab-"+currentSub.tab
});
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);
$("<a/>",{
"id": "subtab-"+currentSub.tab,
href: "#tab="+currentSub.tab,
text: currentSub.name,
//click: setActiveSubtab,
}).appendTo(span);
span.appendTo("#sub-nav");
}
span.appendTo("#sub-nav");
}
if (selectedSub && selectedSub.setup){
selectedSub.setup(facet);
}
if (selectedSub && selectedSub.setup){
selectedSub.setup(facet);
}
}else if (currentMain && currentMain.setup){
currentMain.setup(facet);
currentMain.setup(facet);
}
var whoami = $.cookie("whoami");
if (whoami == null){
ipa_cmd( 'whoami', [], {}, whoamiSuccess, null,null, "sampledata/whoami.json");
ipa_cmd( 'whoami', [], {}, whoamiSuccess, null,null, "sampledata/whoami.json");
}else{
setLoggedInText(whoami);
setLoggedInText(whoami);
}
}
var setupFunctions;
function getSetupFunctions(){
if (!setupFunctions){
setupFunctions = {
user: setupUser,
group: setupGroup,
host: setupHost,
hostgroup:setupHostgroup,
netgroup:setupNetgroup,
};
}
return setupFunctions;
}
$(window).bind( 'hashchange', function(e) {
function setActiveTab(){
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")
var setupFunctions = {
user: setupUser,
policy: unimplemented,
config: unimplemented};
setActiveTab(getParentTabs()[tab]);
getSetupFunctions()[tab](queryParams.facet );
});
var tabName = this.id.substring("tab-".length);
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")
setupFunctions[tabName]();
}
function setActiveSubtab(){
var setupFunctions = {
user: setupUser,
group: setupGroup,
host: setupHost,
hostgroup:setupHostgroup,
netgroup:setupNetgroup,
};
var subtabName = this.id.substring("subtab-".length);
$(".sub-nav-on").removeClass('sub-nav-on').addClass("sub-nav-off")
var active = "#span-subtab-"+subtabName;
$(active).removeClass('sub-nav-off').addClass("sub-nav-on")
setupFunctions[subtabName]();
}
function clearOld(){
$('#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();
@ -163,30 +184,25 @@ function clearOld(){
//remove old details
$('.entryattrs dd').remove();
$('#detail-lists').html("<hr/>");
}
function showSearch(){
$('#content').css("display","none");
$('#details').css("display","none");
clearOld();
$('#search').css("display","block");
$("#filter").css("display","block");
}
function showContent(){
$('#search').css("display","none");
$('#details').css("display","none");
clearOld();
$('#content').css("display","block");
}
function showDetails(){
$('#search').css("display","none");
$('#content').css("display","none");
clearOld();
$('#details').css("display","block");
}
function showAssociations(){
clearOld();
$('#associations').css("display","block");
}

View File

@ -1,39 +1,46 @@
function setupNetgroup(facet){
if (facet == "details"){
setupNetgroupDetails();
netgroupDetailsForm.setup();
}else if(facet == "add"){
netgroupBuilder.setup();
}else{
setupNetgroupSearch();
netgroupSearchForm.setup();
}
}
var netgroup_details_list =
[['identity', 'Netgroup Details', [
['cn', 'Netgroup Name'],
['description', 'Description'],
['nisdomainname', 'NIS Domain']]]];
function setupNetgroupDetails(){
var detailsForm = new DetailsForm();
var netgroupDetailsForm = new DetailsForm("netgroup",netgroup_details_list,"cn","sampledata/netgroupshow.json") ;
var netgroupAddProperties =
[{title: 'Netgroup Name', id: 'pkey', type: 'text'},
{title: 'Description', id: 'description', type: 'text'}];
function netgroupAddOptionsFunction (){
var options = {
name: $('#pkey').val(),
description: $('#description').val()
};
return options;
}
function setupNetgroupSearch(){
var netgroupBuilder = new EntityBuilder("netgroup",netgroupAddProperties,netgroupAddOptionsFunction);
var columns = [
{title:"Netgroup",column:"cn",render: function(current,cell){
renderDetailColumn(current,cell,current[this.column],"netgroup");
}},
{title:"Description", column:"description",render: renderSimpleColumn}];
var netgroupSearchColumns = [
{title:"Netgroup",column:"cn",render: function(current,cell){
renderPkeyColumn(netgroupDetailsForm, current,cell);
}},
{title:"Description", column:"description",render: renderSimpleColumn}];
var netgroupSearchForm = new SearchForm("netgroup", "find", columns);
$("#query").unbind();
$("#query").click(function(){
sampleData = "sampledata/netgrouplist.json";
executeSearch(netgroupSearchForm);
});
$("#new").unbind();
$("#new").click( function() {
alert("New Netgroup...");
});
}
var netgroupSearchForm =
new SearchForm("netgroup", "find", netgroupSearchColumns,"sampledata/netgrouplist.json");

View File

@ -0,0 +1,17 @@
{
"error": null,
"id": 0,
"result": {
"result": {
"cn": [
"host-live"
],
"description": [
"Live servers"
],
"dn": "cn=host-live,cn=hostgroups,cn=accounts,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com"
},
"summary": null,
"value": "host-live"
}
}

View File

@ -0,0 +1,26 @@
{
"error": null,
"id": 0,
"result": {
"result": {
"cn": [
"net-live"
],
"description": [
"live servers"
],
"dn": "ipauniqueid=51451097-abef-11df-ad3a-525400674dcd,cn=ng,cn=alt,dc=ayoung,dc=boston,dc=devel,dc=redhat,dc=com",
"memberhost_hostgroup": [
"host-live"
],
"memberuser_group": [
"muppets"
],
"nisdomainname": [
"ayoung.boston.devel.redhat.com"
]
},
"summary": null,
"value": "net-live"
}
}

View File

@ -16,7 +16,7 @@ var sampleData;
//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];
cell.innerHTML = current[this.column];
}
@ -24,11 +24,19 @@ function renderUnknownColumn(current,cell){
cell.innerHTML = "Unknown";
}
function renderPkeyColumn(form,current,cell){
$("<a/>",{
href:"#tab="+form.obj+"&facet=details&pkey="+current[form.pkeyCol],
html: "" + current[form.pkeyCol],
}).appendTo(cell);
}
function renderDetailColumn(current,cell,pkey,obj){
$("<a/>",{
href:"#tab=user&facet=details&pkey="+pkey,
html: ""+ current[this.column],
click: function(){ setupUserDetails(current.uid)},
href:"#tab="+obj+"&facet=details&pkey="+pkey,
html: ""+ current[this.column],
}).appendTo(cell);
}
@ -37,67 +45,59 @@ function renderDetailColumn(current,cell,pkey,obj){
function SearchForm(obj, method, cols, searchSampleData){
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);
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);
}
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 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;
}
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));
}
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));
}
}
this.searchWithFilter = function(queryFilter){
var form = this;
window.location.hash="#tab="
+this.obj
+"&facet=search&criteria="
+queryFilter;
var form = this;
$('#searchResultsTable tbody').html("");
$('#searchResultsTable tbody').html("");
$('#searchResultsTable tfoot').html("");
$('#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, form.searchSampleData);
ipa_cmd(this.method,
[queryFilter],
{"all":"true"},
function(json){
form.searchSuccess(json);
},
function(json){
alert("Search Failed");
},form.obj, form.searchSampleData);
}
this.obj = obj;
this.method = method;
this.columns = cols;
this.searchSampleData = searchSampleData;
this.setup = function(){
showSearch();
$('#searchResultsTable thead').html("");
@ -105,20 +105,39 @@ function SearchForm(obj, method, cols, searchSampleData){
$('#searchResultsTable tfoot').html("");
$("#new").click(function(){
location.href="#tab="+obj+"&facet=add";
location.hash="tab="+obj+"&facet=add";
});
$("#query").click(executeSearch);
this.buildColumnHeaders();
var params = ipa_parse_qs();
if (params["criteria"]){
this.searchWithFilter(params["criteria"]);
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"]);
}
}
this.obj = obj;
this.method = method;
this.columns = cols;
this.searchSampleData = searchSampleData;
this.setup();
}
executeSearch = function(searchForm){
executeSearch = function(){
var queryFilter = $("#queryFilter").val();
searchForm.searchWithFilter(queryFilter);
var qp = ipa_parse_qs();
var tab = qp.tab;
if (!tab){
tab = 'user';
}
window.location.hash="#tab="
+tab
+"&facet=search&criteria="
+queryFilter;
}

View File

@ -1,49 +0,0 @@
<script type="text/javascript">
$(document).ready( initializeUserGroupEnrollments);
</script>
<h1>Enroll in Groups</h1>
<form>
<div style="border-width:1px">
<div >
<input type="text"/>
<input id="query" type="button" value="Find Groups"/>
<span style="float:right">
<input id="cancelEnrollGroups" type="button" value="Cancel"/>
<input id="enrollGroups" 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>Groups</div>
<select id="grouplist" width="150px" size="10" multiple="true" >
</select>
</div>
<div style="float:left;">
<p><input id="removeFromList" type="button" value="&lt;&lt;"/> </p>
<p><input id="addToList" type="button" value="&gt;&gt;"/></p>
</div>
<div style="float:left;">
<div>Prospective Enrollments</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>

View File

@ -1,102 +1,121 @@
var user_details_lists = [
['identity', 'Identity Details', [
['title', 'Title'],
['givenname', 'First Name'],
['sn', 'Last Name'],
['cn', 'Full Name'],
['displayname', 'Dispaly Name'],
['initials', 'Initials']
]
['title', 'Title'],
['givenname', 'First Name'],
['sn', 'Last Name'],
['cn', 'Full Name'],
['displayname', 'Dispaly Name'],
['initials', 'Initials']
]
],
['account', 'Account Details', [
['call_a_status', 'Account Status'],
['uid', 'Login'],
['call_a_password', 'Password'],
['uidnumber', 'UID'],
['gidnumber', 'GID'],
['homedirectory', 'homedirectory']
]
['call_a_status', 'Account Status'],
['uid', 'Login'],
['call_a_password', 'Password'],
['uidnumber', 'UID'],
['gidnumber', 'GID'],
['homedirectory', 'homedirectory']
]
],
['contact', 'Contact Details', [
['mail', 'E-mail Address'],
['call_a_numbers', 'Numbers']
]
['mail', 'E-mail Address'],
['call_a_numbers', 'Numbers']
]
],
['address', 'Mailing Address', [
['street', 'Address'],
['location', 'City'],
['call_a_st', 'State'],
['postalcode', 'ZIP']
]
['street', 'Address'],
['location', 'City'],
['call_a_st', 'State'],
['postalcode', 'ZIP']
]
],
['employee', 'Employee Information', [
['ou', 'Org. Unit'],
['call_a_manager', 'Manager']
]
['ou', 'Org. Unit'],
['call_a_manager', 'Manager']
]
],
['misc', 'Misc. Information', [
['carlicense', 'Car License']
]
['carlicense', 'Car License']
]
]
];
function setupUser(facet){
if (facet == "details"){
setupUserDetails()
setupUserDetails();
}else if (facet == "add"){
setupAddUser();
userBuilder.setup();
}else if (facet == "group"){
setupUserGroupEnrollmentSearch();
setupUserGroupList();
}else if (facet == "groupmembership"){
setupUserGroupMembership();
setupUserGroupMembership();
}else{
setupUserSearch();
userSearchForm.setup();
}
}
function add_user_fail(reason){
alert("Add User Failed:"+JSON.stringify(reason));
alert("Add User Failed:"+JSON.stringify(reason));
}
function addUser(on_success){
var options = { givenname: $("#firstname").val(),
sn: $("#lastname").val(),
uid : $("#login").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());
setupUserDetails($("#login").val());
});
}
function setupAddUser(){
showContent();
$('#content').load("user-add.inc");
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,
function(){
var options = { givenname: $("#firstname").val(),
sn: $("#lastname").val()};
return options;
});
function setupFacetNavigation(pkey,facet){
$("#viewtype").html("");
var facets = ["details","group", "groupmembership"];
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=user&facet="+facets[i]+"&pkey="+pkey,
html: facets[i]
}).appendTo(li);
}
}
}
function setupUserDetails(user){
window.location.hash="#tab=user&facet=details&pkey="+user;
//re initialize global parse of parameters
qs = ipa_parse_qs();
//TODO make this work for more than just user details
details_lists = user_details_lists;
setupFacetNavigation(qs.pkey,qs.facet);
showDetails();
renderUserDetails();
}
@ -122,48 +141,44 @@ function renderUserDetails()
}
function renderSimpleColumn(current,cell){
cell.innerHTML = current[this.column];
cell.innerHTML = current[this.column];
}
function renderUserLinks(current, cell){
link = document.createElement("a");
cell.appendChild(link);
link = document.createElement("a");
cell.appendChild(link);
$("<a/>",{
href:"#tab=user&facet=details&pkey="+current.uid,
html: "[D]",
click: function(){ setupUserDetails(current.uid)},
href:"#tab=user&facet=details&pkey="+current.uid,
html: "[D]",
}).appendTo(cell);
$("<a/>",{
href: "#tab=user&facet=group&pkey="+current.uid,
click:setupUserGroupMembership,
html: "[G]"
href: "#tab=user&facet=group&pkey="+current.uid,
html: "[G]"
}).appendTo(cell);
$("<a/>",{
href:"#tab=user&facet=netgroup&pkey="+current.uid,
html: "[N]"
href:"#tab=user&facet=netgroup&pkey="+current.uid,
html: "[N]"
}).appendTo(cell);
$("<a/>",{
href:"#tab=user&facet=role&pkey="+current.uid,
html:"[R]"
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)},
href:"#tab=user&facet=details&pkey="+current.uid,
html: ""+ current[this.column],
click: function(){ setupUserDetails(current.uid)},
}).appendTo(cell);
}
var columns = [
var userSearchColumns = [
{title:"Name", column:"cn", render: renderSimpleColumn},
{title:"Login", column:"uid", render: renderUserDetailColumn},
{title:"UID", column:"uidnumber", render: renderSimpleColumn},
@ -173,18 +188,7 @@ var columns = [
{title:"Actions", column:"none", render: renderUserLinks}
];
function setupUserSearch(){
var userSearchForm = new SearchForm("user", "find", columns, "sampledata/userlist.json");
$("#query").unbind();
$("#query").click(function(){
sampleData = "sampledata/userlist.json";
executeSearch(userSearchForm);
});
$("#new").unbind();
$("#new").click(setupAddUser);
}
var userSearchForm = new SearchForm("user", "find", userSearchColumns, "sampledata/userlist.json");
/*Usr group enrollement:
given a user, manage the groups in which they are enrolled */
@ -192,22 +196,53 @@ function populateUserGroupFailure(){
alert("Can't find user");
}
function setupUserGroupEnrollmentSearch(pkey){
function setupUserGroupMembership(pkey){
sampleData = "sampledata/usershow.json";
showContent();
$("#content").load("user-groups.inc");
}
showAssociations();
qs = ipa_parse_qs();
setupFacetNavigation(qs['pkey'],qs['facet']);
$('h1').text('Enroll user ' + qs['pkey'] + ' in groups');
$("#enrollGroups").click(function(){
groupsToEnroll = [];
$('#enrollments').children().each(function(i, selected){
groupsToEnroll.push(selected.value);
});
currentUserToEnroll = qs['pkey'];
enrollUserInNextGroup();
});
$("#addToList").click(function(){
$('#grouplist :selected').each(function(i, selected){
$("#enrollments").append(selected);
});
$('#grouplist :selected').remove();
});
$("#removeFromList").click(function(){
$('#enrollments :selected').each(function(i, selected){
$("#grouplist").append(selected);
});
$('#enrollments :selected').remove();
});
$("#find").click(function(){
ipa_cmd( 'find', [], {}, populateUserGroupSearch, populateUserGroupFailure, 'group', "sampledata/grouplist.json" );
});
}
function populateUserGroupSearch(searchResults){
results = searchResults.result;
$("#grouplist").html("");
for (var i =0; i != searchResults.result.count; i++){
var li = document.createElement("option");
li.value = searchResults.result.result[i].cn;
li.innerHTML = searchResults.result.result[i].cn;
$("#grouplist").append(li);
}
$("#grouplist").html("");
for (var i =0; i != searchResults.result.count; i++){
var li = document.createElement("option");
li.value = searchResults.result.result[i].cn;
li.innerHTML = searchResults.result.result[i].cn;
$("#grouplist").append(li);
}
}
var currentUserToEnroll;
@ -222,63 +257,27 @@ function enrollUserInGroupFailure(response){
}
function enrollUserInNextGroup(){
var currentGroupToEnroll = groupsToEnroll.shift();
var currentGroupToEnroll = groupsToEnroll.shift();
if (currentGroupToEnroll){
var options = {"user":currentUserToEnroll};
var args = [currentGroupToEnroll];
var options = {"user":currentUserToEnroll};
var args = [currentGroupToEnroll];
ipa_cmd( 'add_member',args, options ,
enrollUserInGroupSuccess,
enrollUserInGroupFailure );
ipa_cmd( 'add_member',args, options ,
enrollUserInGroupSuccess,
enrollUserInGroupFailure );
}else{
setupUserGroupMembership();
location.hash="tab=user&facet=group&pkey="+qs.pkey;
}
}
function initializeUserGroupEnrollments(){
$('h1').text('Enroll user ' + qs['pkey'] + ' in groups');
$("#enrollGroups").click(function(){
groupsToEnroll = [];
$('#enrollments').children().each(function(i, selected){
groupsToEnroll.push(selected.value);
});
currentUserToEnroll = qs['pkey'];
enrollUserInNextGroup();
});
$("#addToList").click(function(){
$('#grouplist :selected').each(function(i, selected){
$("#enrollments").append(selected);
});
$('#grouplist :selected').remove();
});
$("#removeFromList").click(function(){
$('#enrollments :selected').each(function(i, selected){
$("#grouplist").append(selected);
});
$('#enrollments :selected').remove();
});
$("#query").click(function(){
ipa_cmd( 'find', [], {}, populateUserGroupSearch, populateUserGroupFailure, 'group', "sampledata/grouplist.json" );
});
}
function renderUserGroupColumn(){
}
/*Group Membership&*/
function renderUserGroupColumn(current,cell){
cell.innerHTML = "Nothing to see here";
cell.innerHTML = "Nothing to see here";
}
var groupMembershipColumns = [
@ -293,52 +292,51 @@ function populateUserEnrollments(userData){
var memberof_group = userData.result.result.memberof_group
for (var j = 0; j < memberof_group.length; j++){
var row = document.createElement("tr");
var row = document.createElement("tr");
var td = document.createElement("td");
td.innerHTML = memberof_group[j];
row.appendChild(td);
var td = document.createElement("td");
td.innerHTML = memberof_group[j];
row.appendChild(td);
td = document.createElement("td");
td.innerHTML = "TBD";
row.appendChild(td);
td = document.createElement("td");
td.innerHTML = "TBD";
row.appendChild(td);
var td = document.createElement("td");
td.innerHTML = "TBD";
row.appendChild(td);
var td = document.createElement("td");
td.innerHTML = "TBD";
row.appendChild(td);
$('#searchResultsTable thead:last').append(row);
$('#searchResultsTable thead:last').append(row);
}
}
function setupUserGroupMembership(){
function setupUserGroupList(){
qs = ipa_parse_qs();
setupFacetNavigation(qs['pkey'],qs['facet']);
showSearch();
$("#filter").css("display","none");
$("#searchButtons").html("");
$("<input/>",{
type: 'button',
value: 'enroll',
click: setupUserGroupEnrollmentSearch
type: 'button',
value: 'enroll',
click: function(){
location.hash="tab=user&facet=groupmembership&pkey="+qs['pkey'];
}
}).appendTo("#searchButtons");
showSearch();
var columnHeaders = document.createElement("tr");
for (var i =0 ; i != groupMembershipColumns.length ;i++){
var th = document.createElement("th");
th.innerHTML = groupMembershipColumns[i].title;
columnHeaders.appendChild(th);
var th = document.createElement("th");
th.innerHTML = groupMembershipColumns[i].title;
columnHeaders.appendChild(th);
}
$('#searchResultsTable thead:last').append(columnHeaders);
sampleData="sampledata/usershow.json";
ipa_cmd( 'show', [qs['pkey']], {}, populateUserEnrollments, populateUserGroupFailure, 'user' );
ipa_cmd( 'show', [qs['pkey']], {}, populateUserEnrollments, populateUserGroupFailure, 'user',"sampledata/usershow.json" );
}
/* user-details.inc javascript */
function on_win(data, textStatus, xhr)
{
@ -501,4 +499,3 @@ function a_st(jobj, result, mode)
else
sel.val('');
}