--- a/ForgeDiscussion/forgediscussion/templates/admin.html
+++ b/ForgeDiscussion/forgediscussion/templates/admin.html
@@ -5,34 +5,94 @@
xmlns:xi="http://www.w3.org/2001/XInclude">
<xi:include href="master.html" />
- <xi:include href="${app.templates}/lib.html" />
+ <xi:include href="${app.templates}/lib.html" />
+
+ <?python from pyforge.lib.security import has_artifact_access ?>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/>
- <title>Discussion Admin for ${c.project.name}: $app.config.options.mount_point</title>
+ <title>Admin for $c.project.name $app.config.options.mount_point</title>
</head>
<body>
- <h1 class="title">Discussion Admin for ${c.project.name}: $app.config.options.mount_point </h1>
- <div id="app-config" py:if="len(app.config_options) > 1">
- <h3>Config Options</h3>
- <form method="post" action="configure">
- <div py:for="o in app.config_options" py:if="o.name != 'mount_point'">
- <label for="$o.name">$o.name</label><br/>
- <input name="$o.name" value="${app.config.options.get(o.name, o.default)}"/>
+ <div id="app_admin_tabs">
+ <ul>
+ <li><a href="#app-config" py:if="len(app.config_options) > 1">$app.config.plugin_name Options</a></li>
+ <li><a href="#app-acl"
+ py:if="app.permissions and allow_config">Permissions</a></li>
+ <li><a href="#app-forums">Forums</a></li>
+ </ul>
+ <div id="app-config" py:if="len(app.config_options) > 1" style="overflow: auto">
+ <h3>$app.config.plugin_name Options</h3>
+ <form method="post" action="configure">
+ <py:for each="o in app.config_options" py:if="o.name != 'mount_point'">
+ <div class="span-3"><label for="$o.name" class="span-3">$o.name</label></div>
+ <div class="span-15 last" py:if="not allow_config">
+ ${app.config.options.get(o.name, o.default)}
+ </div>
+ <div class="editable viewing span-15 last" style="min-height:1em;"
+ py:if="allow_config">
+ <div class="viewer">${app.config.options.get(o.name, o.default)}</div>
+ <div class="editor"><input name="$o.name" value="${app.config.options.get(o.name, o.default)}"/></div>
+ </div>
+ </py:for>
+ <div class="span-15 push-3 last">
+ <input type="submit" value="Update config" py:if="allow_config"
+ class="ui-state-default ui-button ui-button-text"/>
+ <input py:if="app.installable and allow_config" type="submit" name="delete" value="Delete Plugin"
+ class="ui-state-default ui-button ui-button-text"/>
+ </div>
+ </form>
+ </div>
+ <div id="app-acl" py:if="app.permissions and allow_config">
+ <h3>Permissions</h3>
+ <div id="acl-admin">
+ <py:for each="p in app.permissions" >
+ <h3><a href="#">$p</a></h3>
+ <div>
+ <table>
+ <thead>
+ <tr>
+ <th>Role</th>
+ <th/>
+ </tr>
+ </thead>
+ <tbody>
+ <tr py:for="role in h.make_roles(app.config.acl[p])">
+ <td>${role.display()}</td>
+ <td>
+ <form method="POST" action="del_perm" style="display:inline">
+ <input type="hidden" name="permission" value="$p"/>
+ <input type="hidden" name="role" value="${role._id}"/>
+ <input type="submit" value="Remove" py:if="role.display() != '*user-'+c.user.username"
+ class="ui-state-default ui-button ui-button-text"/>
+ </form>
+ </td>
+ </tr>
+ <tr>
+ <form method="POST" action="add_perm">
+ <td>
+ <select name="role">
+ <option py:for="role in c.project.roles"
+ value="$role._id"
+ >${role.display()}</option>
+ </select>
+ </td>
+ <td>
+ <input type="hidden" name="permission" value="$p"/>
+ <input type="submit" value="Add Permission" class="ui-state-default ui-button ui-button-text"/>
+ </td>
+ </form>
+ </tr>
+ </tbody>
+ </table>
+ </div>
+ </py:for>
</div>
- <input type="submit" value="Update config"/>
- <input py:if="app.installable" type="submit" name="delete" value="Delete Plugin"/>
- </form>
- </div>
- <div id="forum" class="title-pane">
- <h3 class="title">Forums</h3>
- <div class="content">
- <form method="POST" action="update_forums">
- <input py:for="i, forum in enumerate(app.forums)"
- name="forum-${i}.id"
- type="hidden"
- value="$forum._id"/>
+ </div>
+ <div id="app-forums">
+ <h3>Forums</h3>
+ <form method="POST" action="update_forums">
<table id="forums">
<thead>
<tr>
@@ -42,51 +102,84 @@
</tr>
</thead>
<tbody>
- <py:for each="i, forum in enumerate(app.forums)">
- ${forum_admin_row(i, forum)}
- </py:for>
+ <tr py:for="i, forum in enumerate(app.forums)" class="${i%2 and 'even' or ''}">
+ <td>[icon]</td>
+ <td>
+ <div class="editable viewing">
+ <span class="viewer"><a href="${forum.url()}">$forum.name</a>($forum.shortname)</span>
+ <span class="editor">
+ ${text_field('forum-%s.name' % i, 'Forum Name', forum.name)}
+ </span>
+ </div>
+ <div class="editable viewing">
+ <span class="viewer">${Markup(g.markdown.convert(forum.description))}</span>
+ <span class="editor">
+ ${text_area('forum-%s.description' % i, 'Description', forum.description)}
+ </span>
+ </div>
+ <py:if test="forum.subforums">
+ <b>Subforums:</b>
+ <span py:for="j, sf in enumerate(forum.subforums)">
+ <py:if test="j != 0">, </py:if>
+ <a href="${sf.url()}">$sf.name</a>
+ </span>
+ </py:if>
+ </td>
+ <td>${forum.num_topics}</td>
+ <td>${forum.num_posts}</td>
+ <td>${post_summary(forum.last_post)}</td>
+ <td>
+ <input name="forum-${i}.id" type="hidden" value="$forum._id"/>
+ ${submit_button('Delete', 'forum-%s.delete' % i)}
+ </td>
+ </tr>
</tbody>
</table>
- <div class="title-pane closed">
- <div class="title">New Forum</div>
- <div class="content">
- ${text_field('new_forum.name', 'Name')}
- ${text_field('new_forum.shortname', 'Short Name')}
- ${select_field('new_forum.parent', 'Parent Forum',
- [('None', '')] + [ (f.name, f._id) for f in app.forums ])}
- ${text_area('new_forum.description', 'Description', style="height:50px;")}
- ${submit_button('Create Forum', 'new_forum.create')}
+ <input type="button" id="add_forum" value="Add another forum"
+ class="ui-state-default ui-button ui-button-text"/>
+ <div id="add_forum_form" style="display:none">
+ <div class="span-3 clear"><label>Name:</label></div>
+ <div class="span-13 last"><input type="text" name="new_forum.name" class="title wide"/></div>
+ <div class="span-3 clear"><label>Short Name:</label></div>
+ <div class="span-13 last"><input type="text" name="new_forum.shortname" class="title wide"/></div>
+ <div class="span-3 clear"><label>Parent Forum:</label></div>
+ <div class="span-13 last">
+ <select name="new_forum.parent" class="title">
+ <option value="">None</option>
+ <option py:for="f in app.forums" value="$f._id">$f.name</option>
+ </select>
+ </div>
+ <div class="span-3 clear"><label>Description:</label></div>
+ <div class="span-13 last"><textarea name="new_forum.description" class="title" style="height:50px; width:100%"/></div>
+ <div class="push-3 clear span-13 last">
+ <input type="submit" id="new_forum.create" name="new_forum.create" value="Create Forum"
+ class="ui-state-default ui-button ui-button-text"/>
+ <input type="button" id="add_forum_cancel" value="Cancel"
+ class="ui-state-default ui-button ui-button-text"/>
+ </div>
</div>
- </div>
+ <div class="clear"/>
</form>
</div>
</div>
- <div id="app-acl" class="title-pane closed">
- <h3 class="title">ACL Config</h3>
- <div class="content">
- <div py:for="p in app.permissions" >
- <h4>$p</h4>
- <ul>
- <li py:for="role in h.make_roles(app.config.acl[p])">
- ${role.display()}
- <form method="POST" action="del_perm" style="display:inline">
- <input type="hidden" name="permission" value="$p"/>
- <input type="hidden" name="role" value="${role._id}"/>
- <input type="submit" value="Remove"/>
- </form>
- </li>
- </ul>
- <form method="POST" action="add_perm">
- <input type="hidden" name="permission" value="$p"/>
- <select name="role">
- <option py:for="role in c.project.roles"
- value="$role._id"
- >${role.display()}</option>
- </select>
- <input type="submit" value="Add role"/>
- </form>
- </div>
- </div>
- </div>
+ <script type="text/javascript">
+ $(function() {
+ $("#app_admin_tabs").tabs({cookie:{expires:30}});
+ $("#acl-admin").accordion({
+ autoHeight: false,
+ navigation: true
+ });
+ $("#add_forum").click(function(){
+ $("#add_forum_form").show();
+ $(this).hide();
+ return false;
+ });
+ $("#add_forum_cancel").click(function(){
+ $("#add_forum_form").hide();
+ $("#add_forum").show();
+ return false;
+ });
+ });
+ </script>
</body>
</html>