diff options
Diffstat (limited to 'ipa-server/ipa-gui/ipagui/templates')
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/groupedit.kid | 21 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/groupeditform.kid | 312 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/grouplist.kid | 43 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/groupnew.kid | 13 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/groupnewform.kid | 55 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/groupshow.kid | 50 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/master.kid | 4 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/useredit.kid | 2 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/usereditform.kid | 9 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/userlist.kid | 9 | ||||
-rw-r--r-- | ipa-server/ipa-gui/ipagui/templates/userlistajax.kid | 36 |
11 files changed, 549 insertions, 5 deletions
diff --git a/ipa-server/ipa-gui/ipagui/templates/groupedit.kid b/ipa-server/ipa-gui/ipagui/templates/groupedit.kid new file mode 100644 index 00000000..f1d309ca --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/groupedit.kid @@ -0,0 +1,21 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#" + py:extends="'grouplayout.kid'"> +<head> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/> + <title>Edit Group</title> +</head> +<body> + <div> + <div style="float:right"> + <input type="checkbox" id="toggleprotected_checkbox" + onclick="toggleProtectedFields(this);"> + <span class="small">edit protected fields</span> + </input> + </div> + <h2>Edit Group</h2> + </div> + + ${form.display(action="groupupdate", value=group, members=members)} +</body> +</html> diff --git a/ipa-server/ipa-gui/ipagui/templates/groupeditform.kid b/ipa-server/ipa-gui/ipagui/templates/groupeditform.kid new file mode 100644 index 00000000..9e388ee7 --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/groupeditform.kid @@ -0,0 +1,312 @@ +<div xmlns:py="http://purl.org/kid/ns#" + class="simpleroster"> + <form action="${action}" name="${name}" method="${method}" class="tableform" + onsubmit="preSubmit()" > + + + <?python searchurl = tg.url('/userlist_ajax') ?> + + <script type="text/javascript"> + // this is used for round-trip recontruction of the names. + // the hidden fields only contain uids. + var uid_to_cn_hash = new Hash(); + + // used to filter search results. + // records uids already in the group + var member_hash = new Hash(); + + // used to prevent double adding + // records uid to be added + var added_hash = new Hash(); + + + function toggleProtectedFields(checkbox) { + var gidnumberField = $('form_gidnumber'); + if (checkbox.checked) { + gidnumberField.disabled = false; + $('form_editprotected').value = 'true'; + } else { + gidnumberField.disabled = true; + $('form_editprotected').value = ''; + } + } + + /* + * Callback used for afterFinish in scriptaculous effect + */ + function removeElement(effect) { + Element.remove(effect.element); + } + + function adduser(uid, cn) { + uid_to_cn_hash[uid] = cn; + + if ((added_hash[uid] == 1) || (member_hash[uid] == 1)) { + return null; + } + added_hash[uid] = 1; + + var newdiv = document.createElement('div'); + newdiv.appendChild(document.createTextNode( + cn.escapeHTML() + " (" + uid.escapeHTML() + ") ")); + + var undolink = document.createElement('a'); + undolink.setAttribute('href', ''); + undolink.setAttribute('onclick', + 'new Effect.Fade(Element.up(this), {afterFinish: removeElement});' + + 'added_hash.remove("' + uid + '");' + + 'return false;'); + undolink.appendChild(document.createTextNode("undo")); + newdiv.appendChild(undolink); + + var uidInfo = document.createElement('input'); + uidInfo.setAttribute('type', 'hidden'); + uidInfo.setAttribute('name', 'uidadd'); + uidInfo.setAttribute('value', uid); + newdiv.appendChild(uidInfo); + + newdiv.style.display = 'none'; + $('newmembers').appendChild(newdiv); + + return newdiv + } + + function adduserHandler(element, uid, cn) { + var newdiv = adduser(uid, cn) + if (newdiv != null) { + new Effect.Fade(Element.up(element)); + new Effect.Appear(newdiv); + /* Element.up(element).remove(); */ + } + } + + function removeuser(uid, cn) { + uid_to_cn_hash[uid] = cn; + + var newdiv = document.createElement('div'); + newdiv.appendChild(document.createTextNode( + cn.escapeHTML() + " (" + uid.escapeHTML() + ") ")); + + var undolink = document.createElement('a'); + undolink.setAttribute('href', ''); + undolink.setAttribute('onclick', + 'new Effect.Fade(Element.up(this), {afterFinish: removeElement});' + + "new Effect.Appear($('member-" + uid + "'));" + + 'return false;'); + undolink.appendChild(document.createTextNode("undo")); + newdiv.appendChild(undolink); + + var uidInfo = document.createElement('input'); + uidInfo.setAttribute('type', 'hidden'); + uidInfo.setAttribute('name', 'uiddel'); + uidInfo.setAttribute('value', uid); + newdiv.appendChild(uidInfo); + + newdiv.style.display = 'none'; + $('delmembers').appendChild(newdiv); + + return newdiv + } + + function removeuserHandler(element, uid, cn) { + var newdiv = removeuser(uid, cn); + new Effect.Fade(Element.up(element)); + new Effect.Appear(newdiv); + /* Element.up(element).remove(); */ + } + + function enterDoSearch(e) { + var keyPressed; + if (window.event) { + keyPressed = window.event.keyCode; + } else { + keyPressed = e.which; + } + + if (keyPressed == 13) { + return doSearch(); + } else { + return true; + } + } + + function doSearch() { + $('searchresults').update("Searching..."); + new Ajax.Updater('searchresults', + '${searchurl}', + { asynchronous:true, + parameters: { uid: $('uid').value }, + evalScripts: true }); + return false; + } + + function preSubmit() { + var json = uid_to_cn_hash.toJSON(); + $('form_uid_to_cn_json').value = json; + return true; + } + </script> + + <div py:for="field in hidden_fields" + py:replace="field.display(value_for(field), **params_for(field))" + /> + + <div class="formsection">Group Details</div> + <table class="formtable" cellpadding="2" cellspacing="0" border="0"> + <tr> + <th> + <label class="fieldlabel" for="${group.cn.field_id}" + py:content="group.cn.label" />: + </th> + <td> + <!-- <span py:replace="group.cn.display(value_for(group.cn))" /> + <span py:if="tg.errors.get('cn')" class="fielderror" + py:content="tg.errors.get('cn')" /> --> + ${value_for(group.cn)} + + </td> + </tr> + + <tr> + <th> + <label class="fieldlabel" for="${group.description.field_id}" + py:content="group.description.label" />: + </th> + <td> + <span py:replace="group.description.display(value_for(group.description))" /> + <span py:if="tg.errors.get('description')" class="fielderror" + py:content="tg.errors.get('description')" /> + + </td> + </tr> + + <tr> + <th> + <label class="fieldlabel" for="${group.gidnumber.field_id}" + py:content="group.gidnumber.label" />: + </th> + <td> + <span py:replace="group.gidnumber.display(value_for(group.gidnumber))" /> + <span py:if="tg.errors.get('gidnumber')" class="fielderror" + py:content="tg.errors.get('gidnumber')" /> + + <script type="text/javascript"> + document.getElementById('form_gidnumber').disabled = true; + </script> + </td> + </tr> + </table> + + <div> + <div class="formsection">Group Members</div> + + <div class="floatlist"> + <div class="floatheader">To Remove:</div> + <div id="delmembers"> + </div> + </div> + + <div> + <div py:for="member in members" id="member-${member.get('uid')}"> + <?python + member_uid = member.get('uid') + member_name = "%s %s" % (member.get('givenname', ''), + member.get('sn', '')) + ?> + ${member_name} (${member_uid}) + <a href="#" + onclick="removeuserHandler(this, '${member_uid}', '${member_name}'); + return false;" + >remove</a> + <script type="text/javascript"> + member_hash["${member_uid}"] = 1; + </script> + </div> + </div> + + </div> + + <div style="clear:both"> + <div class="formsection">Add Persons</div> + + <div class="floatlist"> + <div class="floatheader">To Add:</div> + <div id="newmembers"> + </div> + </div> + + <div> + <div id="search"> + <input id="uid" type="text" name="uid" + onkeypress="return enterDoSearch(event);" /> + <input type="button" value="Find Users" + onclick="return doSearch();" + /> + </div> + <div id="searchresults"> + </div> + </div> + </div> + + + + <table class="formtable" cellpadding="2" cellspacing="0" border="0"> + <tr> + <th> + <br /> + <input type="submit" class="submitbutton" name="submit" + value="Update Group"/> + </th> + <td> + <br /> + <input type="submit" class="submitbutton" name="submit" + value="Cancel Edit" /> + </td> + </tr> + </table> + + </form> + + <script type="text/javascript"> + /* + * This section restores the contents of the add and remove lists + * dynamically if we have to refresh the page + */ + if ($('form_uid_to_cn_json').value != "") { + uid_to_cn_hash = new Hash($('form_uid_to_cn_json').value.evalJSON()); + } + + if ($('form_editprotected').value != "") { + $('toggleprotected_checkbox').checked = true; + toggleProtectedFields($('toggleprotected_checkbox')); + } + </script> + + <?python + uidadds = value.get('uidadd', []) + if not(isinstance(uidadds,list) or isinstance(uidadds,tuple)): + uidadds = [uidadds] + + uiddels = value.get('uiddel', []) + if not(isinstance(uiddels,list) or isinstance(uiddels,tuple)): + uiddels = [uiddels] + ?> + + <script py:for="uidadd in uidadds"> + var uid = "${uidadd}"; + var cn = uid_to_cn_hash[uid]; + var newdiv = adduser(uid, cn); + if (newdiv != null) { + newdiv.style.display = 'block'; + } + </script> + + <script py:for="uiddel in uiddels"> + var uid = "${uiddel}"; + var cn = uid_to_cn_hash[uid]; + var newdiv = removeuser(uid, cn); + newdiv.style.display = 'block'; + $('member-' + uid).style.display = 'none'; + </script> + +</div> diff --git a/ipa-server/ipa-gui/ipagui/templates/grouplist.kid b/ipa-server/ipa-gui/ipagui/templates/grouplist.kid new file mode 100644 index 00000000..464208d2 --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/grouplist.kid @@ -0,0 +1,43 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#" + py:extends="'grouplayout.kid'"> +<head> +<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/> +<title>Find Groups</title> +</head> +<body> + <div id="search"> + <form action="${tg.url('/grouplist')}" method="post"> + <input id="criteria" type="text" name="criteria" value="${criteria}" /> + <input type="submit" value="Find Groups"/> + </form> + <script type="text/javascript"> + document.getElementById("criteria").focus(); + </script> + </div> + <div py:if='(groups != None) and (len(groups) > 0)'> + <h2>${len(groups)} results returned:</h2> + <table id="resultstable"> + <tr> + <th> + <label class="fieldlabel" py:content="fields.cn.label" /> + </th> + <th> + <label class="fieldlabel" py:content="fields.description.label" /> + </th> + </tr> + <tr py:for="group in groups"> + <td> + <a href="${tg.url('/groupshow',cn=group.cn)}">${group.cn}</a> + </td> + <td> + ${group.description} + </td> + </tr> + </table> + </div> + <div py:if='(groups != None) and (len(groups) == 0)'> + <h2>No results found for "${criteria}"</h2> + </div> +</body> +</html> diff --git a/ipa-server/ipa-gui/ipagui/templates/groupnew.kid b/ipa-server/ipa-gui/ipagui/templates/groupnew.kid new file mode 100644 index 00000000..14c618d0 --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/groupnew.kid @@ -0,0 +1,13 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#" + py:extends="'grouplayout.kid'"> +<head> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/> + <title>Add Group</title> +</head> +<body> + <h2>Add Group</h2> + + ${form.display(action="groupcreate")} +</body> +</html> diff --git a/ipa-server/ipa-gui/ipagui/templates/groupnewform.kid b/ipa-server/ipa-gui/ipagui/templates/groupnewform.kid new file mode 100644 index 00000000..66b7c43b --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/groupnewform.kid @@ -0,0 +1,55 @@ +<div xmlns:py="http://purl.org/kid/ns#" + class="simpleroster"> + <form action="${action}" name="${name}" method="${method}" class="tableform"> + + <div class="formsection">Group Details</div> + <table class="formtable" cellpadding="2" cellspacing="0" border="0"> + <tr> + <th> + <label class="fieldlabel" for="${group.cn.field_id}" + py:content="group.cn.label" />: + </th> + <td> + <span py:replace="group.cn.display(value_for(group.cn))" /> + <span py:if="tg.errors.get('cn')" class="fielderror" + py:content="tg.errors.get('cn')" /> + + </td> + </tr> + + <tr> + <th> + <label class="fieldlabel" for="${group.description.field_id}" + py:content="group.description.label" />: + </th> + <td> + <span py:replace="group.description.display(value_for(group.description))" /> + <span py:if="tg.errors.get('description')" class="fielderror" + py:content="tg.errors.get('description')" /> + + </td> + </tr> + + <tr> + <th> + <label class="fieldlabel" for="${group.gidnumber.field_id}" + py:content="group.gidnumber.label" />: + </th> + <td> + Generated by server + </td> + </tr> + </table> + + <table class="formtable" cellpadding="2" cellspacing="0" border="0"> + <tr> + <th></th> + <td> + <br /> + <input type="submit" class="submitbutton" name="submit" value="Add Group"/> + </td> + </tr> + </table> + + </form> +</div> diff --git a/ipa-server/ipa-gui/ipagui/templates/groupshow.kid b/ipa-server/ipa-gui/ipagui/templates/groupshow.kid new file mode 100644 index 00000000..48fd3663 --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/groupshow.kid @@ -0,0 +1,50 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#" + py:extends="'grouplayout.kid'"> +<head> + <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/> + <title>View Group</title> +</head> +<body> + <h2>View Group</h2> + + <div class="formsection">Group Details</div> + <table class="formtable" cellpadding="2" cellspacing="0" border="0"> + <tr> + <th> + <label class="fieldlabel" py:content="fields.cn.label" />: + </th> + <td>${group.get("cn")}</td> + </tr> + + <tr> + <th> + <label class="fieldlabel" py:content="fields.description.label" />: + </th> + <td>${group.get("description")}</td> + </tr> + + <tr> + <th> + <label class="fieldlabel" py:content="fields.gidnumber.label" />: + </th> + <td>${group.get("gidnumber")}</td> + </tr> + </table> + + <div class="formsection">Group Members</div> + <div py:for="member in members"> + <?python + member_name = "%s %s" % (member.get('givenname', ''), + member.get('sn', '')) + ?> + ${member_name} (${member.get('uid')}) + </div> + + <br/> + <br/> + + <a href="${tg.url('/groupedit', cn=group.get('cn'))}">edit</a> + +</body> +</html> diff --git a/ipa-server/ipa-gui/ipagui/templates/master.kid b/ipa-server/ipa-gui/ipagui/templates/master.kid index 2d3a35f2..2675d3c4 100644 --- a/ipa-server/ipa-gui/ipagui/templates/master.kid +++ b/ipa-server/ipa-gui/ipagui/templates/master.kid @@ -69,8 +69,8 @@ <a href="${tg.url('/userlist')}">Find People</a><br/> </p> <p> - <a href="${tg.url('/groupindex')}">Add Group</a><br/> - <a href="${tg.url('/groupindex')}">Find Groups</a><br/> + <a href="${tg.url('/groupnew')}">Add Group</a><br/> + <a href="${tg.url('/grouplist')}">Find Groups</a><br/> </p> <p> <a href="${tg.url('/')}">Manage Policy</a><br/> diff --git a/ipa-server/ipa-gui/ipagui/templates/useredit.kid b/ipa-server/ipa-gui/ipagui/templates/useredit.kid index 9e8d8f46..b5e8447d 100644 --- a/ipa-server/ipa-gui/ipagui/templates/useredit.kid +++ b/ipa-server/ipa-gui/ipagui/templates/useredit.kid @@ -9,7 +9,7 @@ <div> <div style="float:right"> - <input type="checkbox" + <input type="checkbox" id="toggleprotected_checkbox" onclick="toggleProtectedFields(this);"> <span class="small">edit protected fields</span> </input> diff --git a/ipa-server/ipa-gui/ipagui/templates/usereditform.kid b/ipa-server/ipa-gui/ipagui/templates/usereditform.kid index ce92122b..3f7db50d 100644 --- a/ipa-server/ipa-gui/ipagui/templates/usereditform.kid +++ b/ipa-server/ipa-gui/ipagui/templates/usereditform.kid @@ -13,11 +13,13 @@ passwordConfirmField.disabled = false; uidnumberField.disabled = false; gidnumberField.disabled = false; + $('form_editprotected').value = 'true'; } else { passwordField.disabled = true; passwordConfirmField.disabled = true; uidnumberField.disabled = true; gidnumberField.disabled = true; + $('form_editprotected').value = ''; } } </script> @@ -228,4 +230,11 @@ </table> </form> + + <script type="text/javascript"> + if ($('form_editprotected').value != "") { + $('toggleprotected_checkbox').checked = true; + toggleProtectedFields($('toggleprotected_checkbox')); + } + </script> </div> diff --git a/ipa-server/ipa-gui/ipagui/templates/userlist.kid b/ipa-server/ipa-gui/ipagui/templates/userlist.kid index 1f3e72b0..1c244d05 100644 --- a/ipa-server/ipa-gui/ipagui/templates/userlist.kid +++ b/ipa-server/ipa-gui/ipagui/templates/userlist.kid @@ -6,6 +6,7 @@ <title>Find People</title> </head> <body> + <script type="text/javascript" charset="utf-8" src="${tg.url('/static/javascript/tablekit.js')}"></script> <div id="search"> <form action="${tg.url('/userlist')}" method="post"> <input id="uid" type="text" name="uid" value="${uid}" /> @@ -17,10 +18,11 @@ </div> <div py:if='(users != None) and (len(users) > 0)'> <h2>${len(users)} results returned:</h2> - <table id="resultstable"> + <table id="resultstable" class="sortable resizable"> + <thead> <tr> <th> - <label class="fieldlabel" py:content="fields.uid.label" /> + ${fields.uid.label} </th> <th> Name @@ -38,6 +40,8 @@ License Plate </th> </tr> + </thead> + <tbody> <tr py:for="user in users"> <td> <a href="${tg.url('/usershow',uid=user.uid)}">${user.uid}</a> @@ -58,6 +62,7 @@ ${user.carLicense} </td> </tr> + </tbody> </table> </div> <div py:if='(users != None) and (len(users) == 0)'> diff --git a/ipa-server/ipa-gui/ipagui/templates/userlistajax.kid b/ipa-server/ipa-gui/ipagui/templates/userlistajax.kid new file mode 100644 index 00000000..e62fb8b9 --- /dev/null +++ b/ipa-server/ipa-gui/ipagui/templates/userlistajax.kid @@ -0,0 +1,36 @@ +<div xmlns:py="http://purl.org/kid/ns#"> + <div id="search-results-count"> + </div> + <script type="text/javascript"> + search_string = "${uid}"; + results_counter = 0; + </script> + <div py:if='(users != None) and (len(users) > 0)'> + <div py:for="user in users" id="search-${user.uid}"> + <script type="text/javascript"> + if ((added_hash["${user.uid}"] == 1) || + (member_hash["${user.uid}"] == 1)) { + $("search-${user.uid}").style.display = 'none'; + } else { + results_counter = results_counter + 1; + } + </script> + ${user.givenName} ${user.sn} (${user.uid}) + <a href="" + onclick="adduserHandler(this, '${user.uid}', '${user.cn}'); return false;" + >add</a> + </div> + </div> + <script type="text/javascript"> + if (results_counter == 0) { + var message = "No results found for " + search_string; + } else { + var message = results_counter + " results found:"; + } + $('search-results-count').appendChild(document.createTextNode(message)); + </script> + <script py:if="counter < 0"> + $('search-results-count').appendChild(document.createTextNode( + " (truncated)")); + </script> +</div> |