summaryrefslogtreecommitdiffstats
path: root/ipa-server/ipa-gui/ipagui/templates
diff options
context:
space:
mode:
Diffstat (limited to 'ipa-server/ipa-gui/ipagui/templates')
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/groupedit.kid21
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/groupeditform.kid312
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/grouplist.kid43
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/groupnew.kid13
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/groupnewform.kid55
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/groupshow.kid50
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/master.kid4
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/useredit.kid2
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/usereditform.kid9
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/userlist.kid9
-rw-r--r--ipa-server/ipa-gui/ipagui/templates/userlistajax.kid36
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 000000000..f1d309ca9
--- /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 000000000..9e388ee70
--- /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 000000000..464208d20
--- /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 000000000..14c618d06
--- /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 000000000..66b7c43bb
--- /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 000000000..48fd36637
--- /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 2d3a35f22..2675d3c40 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 9e8d8f46f..b5e8447d2 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 ce92122bf..3f7db50d7 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 1f3e72b00..1c244d05c 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 000000000..e62fb8b91
--- /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 &lt; 0">
+ $('search-results-count').appendChild(document.createTextNode(
+ " (truncated)"));
+ </script>
+</div>