Project: * Clean-up (Eclipse cruft, unused files, etc...) * Git-specific changes * Maven POMs clean-up and changes for the build system * Version set to 1.0.0-0 in the development branches * Maven plug-ins updated to latest versions * Very partial dev. documentation added
This commit is contained in:
parent
c74e30d5ba
commit
0665a760de
1439 changed files with 1020 additions and 1649 deletions
legacyworlds-web-admin/Content
Filtered/fm
Raw
META-INF
WEB-INF
admin-servlet.xml
fm
ROOT.ftl
web.xmlcontainers
layout
types
addAdmin.ftladmins.ftlbanReject.ftlbanRequest.ftlbans.ftlbansSummary.ftlbugsList.ftlbugsReport.ftlbugsSummary.ftlbugsTabs.ftlbugsView.ftlchangePassword.ftlconstants.ftllanguage.ftllanguages.ftllogEntry.ftllogin.ftllogs.ftlmain.ftlmaintenance.ftlmessage.ftlmessageBox.ftlmessageTabs.ftlmessageWriter.ftlnames.ftlnamesSummary.ftloffline.ftlpreferences.ftlresetAdmin.ftlspam.ftlticker.ftluser.ftluserSessions.ftlusers.ftlviewAdmin.ftl
css
2
legacyworlds-web-admin/Content/Filtered/fm/version.ftl
Normal file
2
legacyworlds-web-admin/Content/Filtered/fm/version.ftl
Normal file
|
@ -0,0 +1,2 @@
|
|||
<#macro version>${legacyworlds.version.string}</#macro>
|
||||
<#macro full_version>Beta 6 ${legacyworlds.version.string} (${legacyworlds.version.main}.${legacyworlds.version.release} b${legacyworlds.version.build})</#macro>
|
3
legacyworlds-web-admin/Content/Raw/META-INF/MANIFEST.MF
Normal file
3
legacyworlds-web-admin/Content/Raw/META-INF/MANIFEST.MF
Normal file
|
@ -0,0 +1,3 @@
|
|||
Manifest-Version: 1.0
|
||||
Class-Path:
|
||||
|
71
legacyworlds-web-admin/Content/Raw/WEB-INF/admin-servlet.xml
Normal file
71
legacyworlds-web-admin/Content/Raw/WEB-INF/admin-servlet.xml
Normal file
|
@ -0,0 +1,71 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
|
||||
xsi:schemaLocation="
|
||||
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
||||
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
|
||||
|
||||
<context:annotation-config />
|
||||
<context:component-scan base-package="com.deepclone.lw.web.admin" />
|
||||
|
||||
<!-- FreeMarker templating library -->
|
||||
<bean id="freemarkerConfig"
|
||||
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
|
||||
<property name="templateLoaderPath" value="/WEB-INF/fm/" />
|
||||
<property name="freemarkerVariables">
|
||||
<map>
|
||||
<entry key="xml_escape" value-ref="fmXmlEscape" />
|
||||
</map>
|
||||
</property>
|
||||
<property name="freemarkerSettings">
|
||||
<props>
|
||||
<prop key="default_encoding">UTF-8</prop>
|
||||
</props>
|
||||
</property>
|
||||
</bean>
|
||||
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
|
||||
|
||||
<!-- Session service connector -->
|
||||
<bean id="sessionSrv" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"
|
||||
scope="prototype">
|
||||
<property name="serviceInterface" value="com.deepclone.lw.session.SessionAccessor" />
|
||||
<property name="serviceUrl" value="rmi://localhost:9137/sessionSrv" />
|
||||
</bean>
|
||||
|
||||
<!-- General web beans -->
|
||||
<bean id="sessionClient" class="com.deepclone.lw.web.beans.session.SessionClientBean"
|
||||
scope="singleton" />
|
||||
<bean id="xhtmlOnIE"
|
||||
class="com.deepclone.lw.web.beans.intercept.IEContentTypeBean"
|
||||
scope="singleton" />
|
||||
<bean id="sessionInterceptor"
|
||||
class="com.deepclone.lw.web.beans.intercept.SessionInterceptorBean"
|
||||
scope="singleton" />
|
||||
<bean id="messageFormatter"
|
||||
class="com.deepclone.lw.web.beans.msgs.MessageFormatterBean"
|
||||
scope="singleton" />
|
||||
|
||||
<!-- Interceptors -->
|
||||
<bean id="annotationMapper"
|
||||
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
|
||||
<property name="interceptors">
|
||||
<list>
|
||||
<ref bean="sessionInterceptor" />
|
||||
<ref bean="xhtmlOnIE" />
|
||||
</list>
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<!-- Error handler -->
|
||||
<bean id="errorHandler" class="com.deepclone.lw.web.admin.ErrorHandlerBean" />
|
||||
|
||||
<!-- View resolver -->
|
||||
<bean id="viewResolver"
|
||||
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
|
||||
<property name="cache" value="true" />
|
||||
<property name="prefix" value="" />
|
||||
<property name="suffix" value=".ftl" />
|
||||
<property name="contentType" value="application/xhtml+xml;charset=UTF-8" />
|
||||
</bean>
|
||||
|
||||
</beans>
|
11
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/ROOT.ftl
Normal file
11
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/ROOT.ftl
Normal file
|
@ -0,0 +1,11 @@
|
|||
<#setting url_escaping_charset='UTF-8'>
|
||||
<#setting number_format='computer'>
|
||||
<#include "/version.ftl">
|
||||
<#include "/layout/columns.ftl">
|
||||
<#include "/layout/datatable.ftl">
|
||||
<#include "/layout/fields.ftl">
|
||||
<#include "/layout/form.ftl">
|
||||
<#include "/layout/lists.ftl">
|
||||
<#include "/layout/tabs.ftl">
|
||||
<#include "containers/${container}.ftl" />
|
||||
<#include "types/${type}.ftl" />
|
|
@ -0,0 +1,20 @@
|
|||
<#macro page title>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<title>LW Beta 6 <@version/> Administration - ${title?xhtml}</title>
|
||||
<link rel="stylesheet" type="text/css" href="css/main.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="page-header">
|
||||
<h1>Legacy Worlds administration interface</h1>
|
||||
<h3><@full_version /></h3>
|
||||
<h2>${title?xhtml}</h2>
|
||||
</div>
|
||||
<div class="page-contents page-full">
|
||||
<#nested>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</#macro>
|
|
@ -0,0 +1,72 @@
|
|||
<#macro page title>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<title>LW Beta 6 <@version/> Administration - ${title?xhtml}</title>
|
||||
<link rel="stylesheet" type="text/css" href="css/main.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="page-header">
|
||||
<h1>Legacy Worlds administration interface</h1>
|
||||
<h3><@full_version /></h3>
|
||||
<h2>${title?xhtml}</h2>
|
||||
</div>
|
||||
|
||||
<div class="page-full">
|
||||
<div class="side-bar">
|
||||
<div class="admin">${data.admin.name?xhtml}</div>
|
||||
<#if !data.admin.passwordChange>
|
||||
<a href="main">Overview</a>
|
||||
<p> </p>
|
||||
|
||||
<#local admin = data.admin>
|
||||
<a href="messages">Messages</a>
|
||||
<#if admin.canSpam>
|
||||
<a href="send-spam">Send spam</a>
|
||||
</#if>
|
||||
<#if admin.userAdmin>
|
||||
<a href="users">Users</a>
|
||||
</#if>
|
||||
<#if admin.banhammerUser>
|
||||
<a href="bans">Banhammer</a>
|
||||
</#if>
|
||||
<#if admin.nameAdmin>
|
||||
<a href="names">Names</a>
|
||||
</#if>
|
||||
<#if admin.bugTrackerAdmin>
|
||||
<a href="btracker">Bug tracker</a>
|
||||
</#if>
|
||||
<#if admin.translator>
|
||||
<a href="i18n">Translations</a>
|
||||
</#if>
|
||||
<#if admin.prefAdmin>
|
||||
<a href="prefs">Default preferences</a>
|
||||
</#if>
|
||||
<#if admin.constantsAdmin>
|
||||
<a href="constants">Constants</a>
|
||||
</#if>
|
||||
<#if admin.tickAdmin>
|
||||
<a href="ticker">Ticker</a>
|
||||
</#if>
|
||||
<#if admin.maintenanceAdmin>
|
||||
<a href="maintenance">Maintenance mode</a>
|
||||
</#if>
|
||||
<#if admin.canViewLogs>
|
||||
<a href="logs">Logs</a>
|
||||
</#if>
|
||||
|
||||
<#if admin.superuser>
|
||||
<a href="admins">Administrators</a>
|
||||
</#if>
|
||||
<p> </p>
|
||||
</#if>
|
||||
<a href="logout.action">Log out</a>
|
||||
</div>
|
||||
<div class="page-contents">
|
||||
<#nested>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</#macro>
|
|
@ -0,0 +1,18 @@
|
|||
<#macro left_column width=0>
|
||||
<#if width gt 0>
|
||||
<div class="left-column" style="width: ${width}px">
|
||||
<#else>
|
||||
<div class="column left-column">
|
||||
</#if>
|
||||
<#nested>
|
||||
</div>
|
||||
</#macro>
|
||||
<#macro right_column width=0>
|
||||
<#if width gt 0>
|
||||
<div style="width: ${width}px; padding: 0 0 0 ${width}px">
|
||||
<#else>
|
||||
<div class="column right-column">
|
||||
</#if>
|
||||
<#nested>
|
||||
</div>
|
||||
</#macro>
|
|
@ -0,0 +1,20 @@
|
|||
<#macro dt_main title="">
|
||||
<table class="data-table">
|
||||
<#if title != "">
|
||||
<tr><th colspan="2" class="title">${title}</th></tr>
|
||||
</#if>
|
||||
<#nested>
|
||||
</table>
|
||||
</#macro>
|
||||
<#macro dt_entry title abbr="" width=0>
|
||||
<tr>
|
||||
<th<#if width gt 0> style="width: ${width}px"</#if>><#if title == ""> <#else><#if abbr != ""><abbr title="${title?xhtml}">${abbr?xhtml}</abbr><#else>${title?xhtml}</#if>:</#if></th>
|
||||
<td><#nested></td>
|
||||
</tr>
|
||||
</#macro>
|
||||
<#macro dt_blank>
|
||||
<tr><td colspan="2"> </td></tr>
|
||||
</#macro>
|
||||
<#macro dt_status>
|
||||
<tr><td colspan="2" class="status"><#nested></td></tr>
|
||||
</#macro>
|
|
@ -0,0 +1,20 @@
|
|||
<#macro ff_text name value id="" maxLength=0 size=0>
|
||||
<input class="input" id="ff-${id?xhtml}" type="text" value="${value?xhtml}" name="${name?xhtml}" <#if maxLength gt 0>maxlength="${maxLength?string}"</#if> <#if size gt 0>size="${size?string}"</#if> />
|
||||
</#macro>
|
||||
<#macro ff_pwd id name>
|
||||
<input class="input" id="ff-${id?xhtml}" type="password" name="${name?xhtml}" />
|
||||
</#macro>
|
||||
<#macro ff_select id name style="">
|
||||
<select class="input" name="${name?xhtml}" id="ff-${id?xhtml}" <#if style != "">style="${style}"</#if>>
|
||||
<#nested>
|
||||
</select>
|
||||
</#macro>
|
||||
<#macro ff_checkbox id name value checked=false>
|
||||
<input class="input" type="checkbox" name="${name?xhtml}" id="ff-${id?xhtml}" value="${value?xhtml}" <#if checked>checked="checked"</#if> />
|
||||
</#macro>
|
||||
<#macro form_option text="" selected=false value="">
|
||||
<option<#if value?string != ""> value="${value?xhtml}"</#if><#if selected> selected="selected"</#if>><#if text == ""><#nested><#else>${text?xhtml}</#if></option>
|
||||
</#macro>
|
||||
<#macro ff_submit label extraClass="" name="" style="">
|
||||
<input class="input<#if extraClass?has_content> ${extraClass}</#if>" <#if name?has_content>name="${name?xhtml}"</#if> type="submit" value="${label?xhtml}" <#if style != "">style="${style}"</#if> />
|
||||
</#macro>
|
|
@ -0,0 +1,98 @@
|
|||
<#macro form action hash="">
|
||||
<div class="form-container">
|
||||
<form action="${action?url}.action<#if hash != "">#${hash?url}</#if>" method="post">
|
||||
<table>
|
||||
<#nested>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</#macro>
|
||||
<#macro form_field_line label id>
|
||||
<tr class="form-field">
|
||||
<th><label for="ff-${id?xhtml}">${label?xhtml}:</label></th>
|
||||
<td><#nested></td>
|
||||
</tr>
|
||||
</#macro>
|
||||
<#macro form_text label name value id="" maxLength=0 multiline=false>
|
||||
<#if id = "">
|
||||
<#local id = name>
|
||||
</#if>
|
||||
<@form_field_line label=label id=id>
|
||||
<#if multiline>
|
||||
<textarea class="input" rows="${maxLength}" cols="60" id="ff-${id}" name="${name}" style="height:auto">${value?xhtml}</textarea>
|
||||
<#else>
|
||||
<@ff_text id=id name=name maxLength=maxLenth value=value />
|
||||
</#if>
|
||||
</@form_field_line>
|
||||
</#macro>
|
||||
<#macro form_checkbox label name value id="" checked=false>
|
||||
<#if id = "">
|
||||
<#local id = name>
|
||||
</#if>
|
||||
<@form_field_line label=label id=id>
|
||||
<@ff_checkbox id=id name=name value=value checked=checked />
|
||||
</@form_field_line>
|
||||
</#macro>
|
||||
<#macro form_pwd label name id="">
|
||||
<#if id = "">
|
||||
<#local id = name>
|
||||
</#if>
|
||||
<@form_field_line label=label id=id>
|
||||
<@ff_pwd id=id name=name />
|
||||
</@form_field_line>
|
||||
</#macro>
|
||||
<#macro form_select label name id="">
|
||||
<#if id = "">
|
||||
<#local id = name>
|
||||
</#if>
|
||||
<@form_field_line label=label id=id>
|
||||
<@ff_select id=id name=name>
|
||||
<#nested>
|
||||
</@ff_select>
|
||||
</@form_field_line>
|
||||
</#macro>
|
||||
<#macro form_part title>
|
||||
<tr class="form-part">
|
||||
<th colspan="2">${title}</th>
|
||||
</tr>
|
||||
</#macro>
|
||||
<#macro form_extra>
|
||||
<tr class="form-extra">
|
||||
<td colspan="2"><#nested></td>
|
||||
</tr>
|
||||
</#macro>
|
||||
<#macro form_error>
|
||||
<tr class="form-error">
|
||||
<td colspan="2"><#nested></td>
|
||||
</tr>
|
||||
</#macro>
|
||||
<#macro standalone_error>
|
||||
<div class="form-container">
|
||||
<table>
|
||||
<tr class="form-error">
|
||||
<td colspan="2"><#nested></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</#macro>
|
||||
<#macro form_submit label extraClass="">
|
||||
<tr class="form-submit">
|
||||
<th> </th>
|
||||
<td><@ff_submit label=label extraClass=extraClass /></td>
|
||||
</tr>
|
||||
</#macro>
|
||||
<#macro form_extended_submit label extraClass="">
|
||||
<tr class="form-submit">
|
||||
<th> </th>
|
||||
<td><@ff_submit label=label extraClass=extraClass /><#nested /></td>
|
||||
</tr>
|
||||
</#macro>
|
||||
<#macro lineform action name="" hash="">
|
||||
<div class="form-container">
|
||||
<form action="${action?url}.action<#if hash != "">#${hash?url}</#if>" method="post">
|
||||
<table>
|
||||
<tr><td><#nested></td></tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</#macro>
|
|
@ -0,0 +1,25 @@
|
|||
<#macro listview>
|
||||
<table class="list-view">
|
||||
<#nested>
|
||||
</table>
|
||||
</#macro>
|
||||
<#macro lv_line headers=false class="">
|
||||
<tr<#if class != ""> class="${class}<#if headers>headers</#if>"<#elseif headers> class="headers"</#if>>
|
||||
<#nested>
|
||||
</tr>
|
||||
</#macro>
|
||||
<#macro lv_column width=0 centered=false>
|
||||
<#if width?is_string>
|
||||
<th style="text-align: <#if centered>center<#else>left</#if>">
|
||||
<#nested>
|
||||
</th>
|
||||
<#elseif width gt 0>
|
||||
<th style="width: ${width}px; text-align: <#if centered>center<#else>left</#if>">
|
||||
<#nested>
|
||||
</th>
|
||||
<#else>
|
||||
<td style="text-align: <#if centered>center<#else>left</#if>">
|
||||
<#nested>
|
||||
</td>
|
||||
</#if>
|
||||
</#macro>
|
|
@ -0,0 +1,13 @@
|
|||
<#macro tabs>
|
||||
<div class="tabs">
|
||||
<#nested>
|
||||
</div>
|
||||
</#macro>
|
||||
<#macro tab id title>
|
||||
<div class="tab" id="${id?xhtml}">
|
||||
<h3>${title?xhtml}</h3>
|
||||
<div class="tab-contents">
|
||||
<#nested>
|
||||
</div>
|
||||
</div>
|
||||
</#macro>
|
|
@ -0,0 +1,68 @@
|
|||
<#macro render_privs>
|
||||
<#if data.privileges?has_content>
|
||||
<#local source = data.privileges>
|
||||
<#local useSource = true>
|
||||
<#else>
|
||||
<#local source = data.admin.allPrivileges>
|
||||
<#local useSource = false>
|
||||
</#if>
|
||||
<tr class="form-field">
|
||||
<th>Privileges:</th>
|
||||
<td>
|
||||
<#list source as privilege>
|
||||
<#if useSource>
|
||||
<#local value = privilege.present>
|
||||
<#else>
|
||||
<#local value = false>
|
||||
</#if>
|
||||
<input class="input" type="checkbox" name="privileges" value="${privilege.privilege}" id="priv-${privilege.privilege}" <#if value>checked="checked"</#if> />
|
||||
<label for="priv-${privilege.privilege}"><abbr title="${privilege.privilege.description?xhtml}">${privilege.privilege}</abbr></label>
|
||||
</#list>
|
||||
</td>
|
||||
</tr>
|
||||
</#macro>
|
||||
<@page title="Add administrator">
|
||||
<@form action="add-admin">
|
||||
|
||||
<#switch data.addressError!>
|
||||
<#case 'EMPTY'>
|
||||
<@form_error>Please specify the user's address.</@form_error>
|
||||
<#break>
|
||||
<#case 'INVALID'>
|
||||
<@form_error>Invalid address.</@form_error>
|
||||
<#break>
|
||||
<#case 'NOT_FOUND'>
|
||||
<@form_error>User not found.</@form_error>
|
||||
<#break>
|
||||
<#case 'STATUS'>
|
||||
<@form_error>Invalid user status (banned or unconfirmed).</@form_error>
|
||||
<#break>
|
||||
<#case 'ALREADY_ADMIN'>
|
||||
<@form_error>This user is already an administrator.</@form_error>
|
||||
<#break>
|
||||
</#switch>
|
||||
<@form_text label="E-mail address" name="address" value=data.address! />
|
||||
|
||||
<#switch data.nameError!>
|
||||
<#case 'EMPTY'>
|
||||
<@form_error>Please specify a name.</@form_error>
|
||||
<#break>
|
||||
<#case 'INVALID'>
|
||||
<@form_error>Invalid name.</@form_error>
|
||||
<#break>
|
||||
<#case 'UNAVAILABLE'>
|
||||
<@form_error>This name is already in use.</@form_error>
|
||||
<#break>
|
||||
</#switch>
|
||||
<@form_text label="Administrator name" name="name" value=data.name! />
|
||||
|
||||
<#-- Privs -->
|
||||
<#if data.privError!false>
|
||||
<@form_error>Please select the new administrator's privileges.</@form_error>
|
||||
</#if>
|
||||
<@render_privs />
|
||||
|
||||
<@form_submit label="Add administrator" />
|
||||
|
||||
</@form>
|
||||
</@page>
|
|
@ -0,0 +1,43 @@
|
|||
<#macro render_admin admin>
|
||||
<#if admin.id = data.admin.id>
|
||||
<#local begin = "<strong>">
|
||||
<#local end = "</strong>">
|
||||
<#elseif admin.privileges?size = 0>
|
||||
<#local begin = "<em>">
|
||||
<#local end = "</em>">
|
||||
</#if>
|
||||
|
||||
<@lv_line>
|
||||
<@lv_column><a href="admin-${admin.id}">${begin!}${admin.name?xhtml}${end!}</a></@lv_column>
|
||||
<@lv_column>
|
||||
<#if admin.address?has_content>
|
||||
${begin!}${admin.address?xhtml}${end!}
|
||||
<#else>
|
||||
${begin!}N/A${end!}
|
||||
</#if>
|
||||
</@lv_column>
|
||||
<@lv_column>
|
||||
<#if admin.privileges?size gt 0>
|
||||
<#list admin.privileges as priv>
|
||||
<abbr title="${priv.description?xhtml}">${priv}</abbr>
|
||||
</#list>
|
||||
<#else>
|
||||
(inactive)
|
||||
</#if>
|
||||
</@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
</#macro>
|
||||
<@page title="Administrators">
|
||||
<@listview>
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=300>Name</@lv_column>
|
||||
<@lv_column width=300>Address</@lv_column>
|
||||
<@lv_column width="x">Privileges</@lv_column>
|
||||
</@lv_line>
|
||||
<#list data.administrators as admin>
|
||||
<@render_admin admin=admin />
|
||||
</#list>
|
||||
</@listview>
|
||||
<p><a href="add-admin">Add administrator</a></p>
|
||||
</@page>
|
|
@ -0,0 +1,9 @@
|
|||
<@page title="Reject ban request">
|
||||
<@form action="reject-ban-${data.id}">
|
||||
<#if data.error!false>
|
||||
<@form_error>You must give a reason</@form_error>
|
||||
</#if>
|
||||
<@form_text label="Rejection reason" name="reason" value="" multiline=true maxLength = 10 />
|
||||
<@form_submit label="Reject ban request" />
|
||||
</@form>
|
||||
</@page>
|
|
@ -0,0 +1,20 @@
|
|||
<@page title="Request ban">
|
||||
<@form action="request-ban">
|
||||
<#switch data.error!"">
|
||||
<#case "NOT_FOUND"><@form_error>User not found</@form_error><#break>
|
||||
<#case "BANNED"><@form_error>User is already banned or has a pending ban request.</@form_error><#break>
|
||||
<#case "NO_REASON"><@form_error>You have no reason!...</@form_error><#break>
|
||||
</#switch>
|
||||
<#if data.empire!false>
|
||||
<#assign eValue = data.user!"" >
|
||||
<#assign mValue = "" >
|
||||
<#else>
|
||||
<#assign mValue = data.user!"" >
|
||||
<#assign eValue = "" >
|
||||
</#if>
|
||||
<@form_text label="Empire name" value="" name="eName" value=eValue />
|
||||
<@form_text label="(or) User address" value="" name="eMail" value=mValue />
|
||||
<@form_text label="Reason" name="reason" value="" multiline=true maxLength=10 value=data.reason!"" />
|
||||
<@form_submit label="Request ban" />
|
||||
</@form>
|
||||
</@page>
|
75
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/bans.ftl
Normal file
75
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/bans.ftl
Normal file
|
@ -0,0 +1,75 @@
|
|||
<#if data.type = 'PENDING'>
|
||||
<#assign title = "Pending ban requests">
|
||||
<#elseif data.type = 'ARCHIVED'>
|
||||
<#assign title = "Expired/rejected ban requests">
|
||||
<#else>
|
||||
<#assign title = "Confirmed ban requests">
|
||||
</#if>
|
||||
<@page title=title>
|
||||
<#if data.bans?size = 0>
|
||||
<p>No ban requests in this category.</p>
|
||||
<#else>
|
||||
<@listview>
|
||||
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width="x">User address</@lv_column>
|
||||
<@lv_column width="x">Requested by</@lv_column>
|
||||
<@lv_column width="x">Requested on</@lv_column>
|
||||
<@lv_column width="x">Reason</@lv_column>
|
||||
<#if data.type = 'ARCHIVED'>
|
||||
<@lv_column width="x">Cancelled on</@lv_column>
|
||||
<@lv_column width="x">Rejected by</@lv_column>
|
||||
<@lv_column width="x">Rejection reason</@lv_column>
|
||||
<#elseif data.type = 'VALIDATED'>
|
||||
<@lv_column width="x">Validated on</@lv_column>
|
||||
<@lv_column width="x">Validated by</@lv_column>
|
||||
<@lv_column> </@lv_column>
|
||||
<#else>
|
||||
<@lv_column> </@lv_column>
|
||||
</#if>
|
||||
</@lv_line>
|
||||
|
||||
<#list data.bans as ban>
|
||||
<@lv_line>
|
||||
<@lv_column>${ban.accountMail?xhtml}</@lv_column>
|
||||
<@lv_column>${ban.requestedByName?xhtml}</@lv_column>
|
||||
<@lv_column>${ban.timestamp?string("yyyy-MM-dd HH:mm:ss")}</@lv_column>
|
||||
<@lv_column>${ban.reason?xhtml}</@lv_column>
|
||||
<#if data.type = 'ARCHIVED'>
|
||||
<@lv_column>${ban.update?string("yyyy-MM-dd HH:mm:ss")}</@lv_column>
|
||||
<@lv_column>
|
||||
<#if ban.rejectedByName?has_content>
|
||||
${ban.rejectedByName?xhtml}
|
||||
<#else>
|
||||
<em>(expired)</em>
|
||||
</#if>
|
||||
</@lv_column>
|
||||
<@lv_column>
|
||||
<#if ban.rejectedByName?has_content>
|
||||
${ban.rejectionReason?xhtml}
|
||||
<#else>
|
||||
<em>(expired)</em>
|
||||
</#if>
|
||||
</@lv_column>
|
||||
<#elseif data.type = 'VALIDATED'>
|
||||
<@lv_column>${ban.update?string("yyyy-MM-dd HH:mm:ss")}</@lv_column>
|
||||
<@lv_column>
|
||||
${ban.validatedByName?xhtml}
|
||||
</@lv_column>
|
||||
<@lv_column>
|
||||
<a href="lift-ban-${ban.id}.action"><#if ban.redeemable>Redeem<#else>Lift ban</#if></a>
|
||||
</@lv_column>
|
||||
<#else>
|
||||
<@lv_column>
|
||||
<#if ban.requestedById != data.admin.id>
|
||||
<a href="confirm-ban-${ban.id}.action">Confirm ban</a> -
|
||||
</#if>
|
||||
<a href="reject-ban-${ban.id}">Reject ban</a>
|
||||
</@lv_column>
|
||||
</#if>
|
||||
</@lv_line>
|
||||
</#list>
|
||||
|
||||
</@listview>
|
||||
</#if>
|
||||
</@page>
|
|
@ -0,0 +1,37 @@
|
|||
<@page title="Banhammer">
|
||||
<@listview>
|
||||
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=300> </@lv_column>
|
||||
<@lv_column width=100 centered=true>Entries</@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
<#list data.entries as entry>
|
||||
<@lv_line>
|
||||
<@lv_column>
|
||||
<#if entry.count gt 0>
|
||||
<a href="bans-${entry.type?lower_case}">
|
||||
</#if>
|
||||
<#switch entry.type>
|
||||
<#case "PENDING">
|
||||
Pending requests
|
||||
<#break>
|
||||
<#case "ARCHIVED">
|
||||
Expired and rejected requests
|
||||
<#break>
|
||||
<#case "VALIDATED">
|
||||
Confirmed bans
|
||||
<#break>
|
||||
</#switch>
|
||||
<#if entry.count gt 0>
|
||||
</a>
|
||||
</#if>
|
||||
</@lv_column>
|
||||
<@lv_column centered=true>${entry.count}</@lv_column>
|
||||
</@lv_line>
|
||||
</#list>
|
||||
|
||||
<p><a href="request-ban">Request ban</a></p>
|
||||
|
||||
</@listview>
|
||||
</@page>
|
151
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/bugsList.ftl
Normal file
151
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/bugsList.ftl
Normal file
|
@ -0,0 +1,151 @@
|
|||
<#include "bugsTabs.ftl">
|
||||
<#macro render_navigation current count total qString>
|
||||
<table style="width:100%;margin: 2px 0">
|
||||
<tr>
|
||||
<td style="width: 30px;text-align: right">
|
||||
<#if current gt 0>
|
||||
<a href="bugs?${qString}&first=${current - count}">
|
||||
</#if>
|
||||
<<
|
||||
<#if current gt 0>
|
||||
</a>
|
||||
</#if>
|
||||
</td>
|
||||
<td style="text-align: center">
|
||||
<#if total gt 1>
|
||||
${total?string(',##0')} entries found.
|
||||
<#elseif total = 1>
|
||||
1 entry found.
|
||||
<#else>
|
||||
No entries found.
|
||||
</#if>
|
||||
</td>
|
||||
<td style="width: 30px;text-align: left">
|
||||
<#if current lt total - count>
|
||||
<a href="bugs?${qString}&first=${current + count}">
|
||||
</#if>
|
||||
>>
|
||||
<#if current lt total - count>
|
||||
</a>
|
||||
</#if>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</#macro>
|
||||
<#macro render>
|
||||
<#if data.ownOnly>
|
||||
<#local ownOnly = "1">
|
||||
<#else>
|
||||
<#local ownOnly = "0">
|
||||
</#if>
|
||||
<#local qString = "status=${data.status!'x'}&own=${ownOnly}" >
|
||||
<@page title="Bug tracker">
|
||||
<#-- Tabs -->
|
||||
<@bugTabs selected="bugsList" qString="${qString}&first=${data.first}" />
|
||||
|
||||
<#-- Selection -->
|
||||
<div class="form-container">
|
||||
<form action="bugs" method="get">
|
||||
<table>
|
||||
<tr><td>
|
||||
List
|
||||
<@ff_select id="sel-own" name="own">
|
||||
<@form_option value="0">all</@form_option>
|
||||
<@form_option value="1" selected=(data.ownOnly)>my own</@form_option>
|
||||
</@ff_select>
|
||||
reports with the following status:
|
||||
<@ff_select id="sel-stat" name="status">
|
||||
<@form_option value="x">(indifferent)</@form_option>
|
||||
<@form_option value="PENDING" selected=((data.status!"") = 'PENDING')>pending validation</@form_option>
|
||||
<@form_option value="OPEN" selected=((data.status!"") = 'OPEN')>being handled</@form_option>
|
||||
<@form_option value="RESOLVED" selected=((data.status!"") = 'RESOLVED')>fixed</@form_option>
|
||||
<@form_option value="WONT_FIX" selected=((data.status!"") = 'WONT_FIX')>won't fix</@form_option>
|
||||
<@form_option value="NOT_A_BUG" selected=((data.status!"") = 'NOT_A_BUG')>not a bug</@form_option>
|
||||
</@ff_select>
|
||||
<@ff_submit label="Search" />
|
||||
</td></tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<#-- Navigation -->
|
||||
<@render_navigation current=data.first count=data.count total=data.entries qString=qString />
|
||||
|
||||
<#-- List of bugs -->
|
||||
<#if data.reports?size gt 0>
|
||||
<@listview>
|
||||
|
||||
<@lv_line headers=true>
|
||||
<@lv_column centered=true width=60>#</@lv_column>
|
||||
<@lv_column width=300>Title</@lv_column>
|
||||
<#if !( data.status?has_content )>
|
||||
<@lv_column width=130 centered=true>Status</@lv_column>
|
||||
</#if>
|
||||
<@lv_column width=150 centered=true>Initial post</@lv_column>
|
||||
<@lv_column width=150 centered=true>Last update</@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
<#list data.reports as report>
|
||||
|
||||
<#if !data.ownOnly && report.initialSubmitter.userId?has_content && report.initialSubmitter.admin && report.initialSubmitter.userId = data.admin.id>
|
||||
<#local eClass="own-fleet">
|
||||
<#else>
|
||||
<#local eClass="">
|
||||
</#if>
|
||||
|
||||
<@lv_line class=eClass>
|
||||
<@lv_column centered=true>${report.reportId?string(",##0")}</@lv_column>
|
||||
<@lv_column><a href="bug-${report.reportId}?${qString}&first=${data.first}">${report.title?xhtml}</a></@lv_column>
|
||||
<#if !( data.status?has_content )>
|
||||
<@lv_column centered=true><@bugStatus status=report.status /></@lv_column>
|
||||
</#if>
|
||||
<@lv_column centered=true>
|
||||
${report.posted?string("yyyy-MM-dd HH:mm:ss")}
|
||||
</@lv_column>
|
||||
<@lv_column centered=true>
|
||||
<#if report.updated>
|
||||
<strong>
|
||||
</#if>
|
||||
${report.lastUpdate?string("yyyy-MM-dd HH:mm:ss")}
|
||||
<#if report.updated>
|
||||
</strong>
|
||||
</#if>
|
||||
</@lv_column>
|
||||
</@lv_line>
|
||||
<@lv_line class=eClass>
|
||||
<#if data.status?has_content>
|
||||
<td colspan="2">
|
||||
<#else>
|
||||
<td colspan="3">
|
||||
</#if>
|
||||
</td>
|
||||
<@lv_column centered=true>
|
||||
by
|
||||
<#if report.initialSubmitter.admin>
|
||||
<span style="font-weight:bold">
|
||||
</#if>
|
||||
${report.initialSubmitter.name}
|
||||
<#if report.initialSubmitter.admin>
|
||||
</span>
|
||||
</#if>
|
||||
</@lv_column>
|
||||
<@lv_column centered=true>
|
||||
by
|
||||
<#if report.latestSubmitter.admin>
|
||||
<span style="font-weight:bold">
|
||||
</#if>
|
||||
${report.latestSubmitter.name}
|
||||
<#if report.latestSubmitter.admin>
|
||||
</span>
|
||||
</#if>
|
||||
</@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
</#list>
|
||||
|
||||
</@listview>
|
||||
</#if>
|
||||
|
||||
</@page>
|
||||
</#macro>
|
||||
<@render />
|
|
@ -0,0 +1,42 @@
|
|||
<#include "bugsTabs.ftl">
|
||||
<#macro render>
|
||||
<#if data.query.ownOnly>
|
||||
<#local ownOnly = "1">
|
||||
<#else>
|
||||
<#local ownOnly = "0">
|
||||
</#if>
|
||||
<#local qString = "status=${data.query.status!'x'}&own=${ownOnly}" >
|
||||
<@page title="Bug tracker - Report bug">
|
||||
<@bugTabs selected="bugsReport" qString="${qString}&first=${data.query.first}" />
|
||||
|
||||
<@form action="report-bug">
|
||||
<tr style="display:none"><td colspan="2">
|
||||
<input type="hidden" name="status" value="${(data.query.status!'x')?xhtml}" />
|
||||
<input type="hidden" name="own" value="${ownOnly}" />
|
||||
<input type="hidden" name="first" value="${data.query.first}" />
|
||||
</td></tr>
|
||||
|
||||
<#switch data.titleError!"">
|
||||
<#case "EMPTY"><@form_error>Please specify the report's title</@form_error><#break>
|
||||
<#case "INVALID"><@form_error>Title should be at least 10 characters long</@form_error><#break>
|
||||
</#switch>
|
||||
<@form_text label="Title" name="title" value=data.title!"" maxLength=127 />
|
||||
|
||||
<#switch data.descriptionError!"">
|
||||
<#case "EMPTY"><@form_error>Please specify the bug's description</@form_error><#break>
|
||||
<#case "INVALID"><@form_error>Title should be at least 30 characters long</@form_error><#break>
|
||||
</#switch>
|
||||
<@form_text label="Description" name="description" value=data.description!"" multiline=true maxLength=10 />
|
||||
|
||||
<@form_select name="public" label="Visible by players">
|
||||
<@form_option value="0">No</@form_option>
|
||||
<@form_option value="1" selected=data.publicReport!false>Yes</@form_option>
|
||||
</@form_select>
|
||||
|
||||
<@form_submit label="Post bug report" />
|
||||
|
||||
</@form>
|
||||
|
||||
</@page>
|
||||
</#macro>
|
||||
<@render />
|
|
@ -0,0 +1,53 @@
|
|||
<#include "bugsTabs.ftl">
|
||||
<#macro summary_entry label amount qString>
|
||||
|
||||
<@lv_line>
|
||||
<@lv_column>
|
||||
<#if amount gt 0>
|
||||
<a href="bugs?${qString}">
|
||||
</#if>
|
||||
${label}
|
||||
<#if amount gt 0>
|
||||
</a>
|
||||
</#if>
|
||||
</@lv_column>
|
||||
<@lv_column centered=true>
|
||||
${amount?string(",##0")}
|
||||
</@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
</#macro>
|
||||
<#macro render>
|
||||
<#local qString = "status=x&own=0" >
|
||||
<@page title="Bug tracker - Summary">
|
||||
<#-- Tabs -->
|
||||
<@bugTabs selected="bugsSummary" qString=qString />
|
||||
|
||||
<#-- Summary -->
|
||||
<@listview>
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=300> </@lv_column>
|
||||
<@lv_column width=100> </@lv_column>
|
||||
</@lv_line>
|
||||
<@summary_entry label="Pending validation" amount=data.pending qString="status=PENDING&own=0" />
|
||||
<@summary_entry label="Open bugs" amount=data.open qString="status=OPEN&own=0" />
|
||||
<@summary_entry label="Bugs you reported" amount=data.own qString="status=x&own=1" />
|
||||
<@summary_entry label="Total bugs" amount=data.total qString="status=x&own=0" />
|
||||
<#if data.updated gt 0>
|
||||
<@lv_line>
|
||||
<@lv_column> </@lv_column>
|
||||
<@lv_column> </@lv_column>
|
||||
</@lv_line>
|
||||
<@lv_line>
|
||||
<@lv_column>
|
||||
Updated bug reports
|
||||
</@lv_column>
|
||||
<@lv_column centered=true>
|
||||
${data.updated?string(",##0")}
|
||||
</@lv_column>
|
||||
</@lv_line>
|
||||
</#if>
|
||||
</@listview>
|
||||
</@page>
|
||||
</#macro>
|
||||
<@render />
|
|
@ -0,0 +1,19 @@
|
|||
<#macro bugTab href title selected>
|
||||
<a class="tab-button<#if selected> selected-tab</#if>" href="${href}">${title}</a>
|
||||
</#macro>
|
||||
<#macro bugTabs selected qString>
|
||||
<div class="tab-buttons">
|
||||
<@bugTab href="btracker" title="Summary" selected=( selected = 'bugsSummary' ) />
|
||||
<@bugTab href="bugs?${qString}" title="List bugs" selected=( selected = 'bugsList' ) />
|
||||
<@bugTab href="report-bug?${qString}" title="Report bug" selected=( selected = 'bugsReport' ) />
|
||||
</div>
|
||||
</#macro>
|
||||
<#macro bugStatus status>
|
||||
<#switch status>
|
||||
<#case "PENDING">pending validation<#break>
|
||||
<#case "OPEN">being handled<#break>
|
||||
<#case "RESOLVED">fixed<#break>
|
||||
<#case "WONT_FIX">won't fix<#break>
|
||||
<#case "NOT_A_BUG">not a bug<#break>
|
||||
</#switch>
|
||||
</#macro>
|
220
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/bugsView.ftl
Normal file
220
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/bugsView.ftl
Normal file
|
@ -0,0 +1,220 @@
|
|||
<#include "bugsTabs.ftl" />
|
||||
<#macro render_submitter s>
|
||||
<#if s.admin>
|
||||
<strong>
|
||||
<#if s.userId?has_content && s.userId = data.admin.id>
|
||||
<em>
|
||||
</#if>
|
||||
</#if>
|
||||
${s.name?xhtml}
|
||||
<#if s.admin>
|
||||
<#if s.userId?has_content && s.userId = data.admin.id>
|
||||
</em>
|
||||
</#if>
|
||||
</strong>
|
||||
</#if>
|
||||
</#macro>
|
||||
<#macro render_event e>
|
||||
<div style="text-align:center; padding:10px 10px">
|
||||
${e.timestamp?string("yyyy-MM-dd HH:mm:ss")} - <@render_submitter s=e.submitter />
|
||||
<#nested>
|
||||
</div>
|
||||
</#macro>
|
||||
<#macro render_report_event e>
|
||||
<@render_event e=e>
|
||||
posted bug report #<strong>${e.id?string(",##0")}</strong>
|
||||
</@render_event>
|
||||
<h3 style="margin:0;text-align:center;padding:0 0 10px 0">${e.title}</h3>
|
||||
<div style="margin: 0 40px 20px 40px">
|
||||
${e.contents}
|
||||
</div>
|
||||
<#if e.visible!false>
|
||||
<div style="text-align:center; padding:10px 10px">
|
||||
This report includes an XML snapshot of the empire's status
|
||||
(<a href="bug-${e.id}-xmlsnapshot">download</a>).
|
||||
</div>
|
||||
</#if>
|
||||
</#macro>
|
||||
<#macro render_status_event e>
|
||||
<@render_event e=e>
|
||||
set the report's status to <strong><@bugStatus status=e.status /></strong>
|
||||
</@render_event>
|
||||
</#macro>
|
||||
<#macro render_visibility_event e>
|
||||
<@render_event e=e>
|
||||
set the report's visibility to <strong><#if e.visible>public<#else>private</#if></strong>
|
||||
</@render_event>
|
||||
</#macro>
|
||||
<#macro render_merge_event e>
|
||||
<@render_event e=e>
|
||||
merged current bug report with bug report #<strong>${e.mergedId?string(",##0")}</strong>
|
||||
</@render_event>
|
||||
</#macro>
|
||||
<#macro render_comment_event e>
|
||||
<@render_event e=e>
|
||||
posted a comment
|
||||
</@render_event>
|
||||
<div style="margin: 0 40px 20px 40px">
|
||||
${e.contents}
|
||||
</div>
|
||||
<#if !e.visible>
|
||||
<@lineform action="bug-${data.report.reportId}-comment-moderation">
|
||||
<input type="hidden" name="status" value="${data.query.status!"x"}" />
|
||||
<input type="hidden" name="own" value="${ownOnly}" />
|
||||
<input type="hidden" name="first" value="${data.query.first}" />
|
||||
<input type="hidden" name="comment" value="${e.id}" />
|
||||
This comment is currently hidden.
|
||||
<@ff_select name="cAction" id="cAction-${e.id}">
|
||||
<@form_option value="1">Validate it</@form_option>
|
||||
<@form_option value="0">Delete it</@form_option>
|
||||
</@ff_select>
|
||||
<@ff_submit label="Go" />
|
||||
</@lineform>
|
||||
</#if>
|
||||
</#macro>
|
||||
<#macro render>
|
||||
<#if data.query.ownOnly>
|
||||
<#assign ownOnly = "1">
|
||||
<#else>
|
||||
<#assign ownOnly = "0">
|
||||
</#if>
|
||||
<#local qString = "status=${data.query.status!'x'}&own=${ownOnly}" >
|
||||
<@page title="Bug #${data.report.reportId?string(',##0')} - ${data.report.title}">
|
||||
<#-- Tabs -->
|
||||
<@bugTabs selected="" qString="${qString}&first=${data.query.first}" />
|
||||
|
||||
<#-- Bug info -->
|
||||
<@dt_main>
|
||||
<@dt_entry title="Status"><@bugStatus status=data.report.status /></@dt_entry>
|
||||
<@dt_entry title="Public"><#if data.report.visible>yes<#else>no</#if></@dt_entry>
|
||||
<@dt_entry title="Initially reported">
|
||||
${data.report.posted?string("yyyy-MM-dd HH:mm:ss")}
|
||||
by <@render_submitter s=data.report.initialSubmitter />
|
||||
</@dt_entry>
|
||||
<@dt_entry title="Latest update">
|
||||
${data.report.lastUpdate?string("yyyy-MM-dd HH:mm:ss")}
|
||||
by <@render_submitter s=data.report.latestSubmitter />
|
||||
</@dt_entry>
|
||||
</@dt_main>
|
||||
|
||||
<#-- List events -->
|
||||
<#list data.events as event>
|
||||
<hr/>
|
||||
<#switch event.type>
|
||||
<#case 'INIT'>
|
||||
<@render_report_event e=event />
|
||||
<#break>
|
||||
<#case 'STATUS'>
|
||||
<@render_status_event e=event />
|
||||
<#break>
|
||||
<#case 'COMMENT'>
|
||||
<@render_comment_event e=event />
|
||||
<#break>
|
||||
<#case 'VISIBILITY'>
|
||||
<@render_visibility_event e=event />
|
||||
<#break>
|
||||
<#case 'MERGE'>
|
||||
<@render_merge_event e=event />
|
||||
<#break>
|
||||
</#switch>
|
||||
</#list>
|
||||
|
||||
<#-- Controls -->
|
||||
<hr id="br-controls"/>
|
||||
<#if data.report.status = 'PENDING'>
|
||||
<@form action="bug-${data.report.reportId}-validation" hash="br-controls">
|
||||
<tr style="display:none">
|
||||
<td colspan="2">
|
||||
<input type="hidden" name="status" value="${data.query.status!"x"}" />
|
||||
<input type="hidden" name="own" value="${ownOnly}" />
|
||||
<input type="hidden" name="first" value="${data.query.first}" />
|
||||
</td>
|
||||
</tr>
|
||||
<@form_extra>This report is currently pending validation.</@form_extra>
|
||||
<@form_select label="Set status to" name="nStatus">
|
||||
<@form_option value="OPEN"><@bugStatus status="OPEN" /></@form_option>
|
||||
<@form_option value="RESOLVED"><@bugStatus status="RESOLVED" /></@form_option>
|
||||
<@form_option value="WONT_FIX"><@bugStatus status="WONT_FIX" /></@form_option>
|
||||
<@form_option value="NOT_A_BUG"><@bugStatus status="NOT_A_BUG" /></@form_option>
|
||||
</@form_select>
|
||||
<@form_select label="Visibility" name="visibility">
|
||||
<@form_option value="1">public</@form_option>
|
||||
<@form_option value="0">hidden</@form_option>
|
||||
</@form_select>
|
||||
<@form_select label="Grant game credits" name="credits">
|
||||
<@form_option value="0">no</@form_option>
|
||||
<@form_option value="1" selected=true>low priority bug - small amount</@form_option>
|
||||
<@form_option value="2">normal bug - medium amount</@form_option>
|
||||
<@form_option value="3">critical bug - large amount</@form_option>
|
||||
</@form_select>
|
||||
<@form_select label="Empire status snapshot" name="snapshot">
|
||||
<@form_option value="1">keep</@form_option>
|
||||
<@form_option value="0">delete</@form_option>
|
||||
</@form_select>
|
||||
<@form_submit label="Go" />
|
||||
</@form>
|
||||
<#else>
|
||||
<@lineform action="bug-${data.report.reportId}-status" hash="br-controls">
|
||||
<input type="hidden" name="status" value="${data.query.status!"x"}" />
|
||||
<input type="hidden" name="own" value="${ownOnly}" />
|
||||
<input type="hidden" name="first" value="${data.query.first}" />
|
||||
Change status to
|
||||
<@ff_select name="nStatus" id="nStatus">
|
||||
<@form_option value="OPEN" selected=( data.report.status = 'OPEN' )><@bugStatus status="OPEN" /></@form_option>
|
||||
<@form_option value="RESOLVED" selected=( data.report.status = 'RESOLVED' )><@bugStatus status="RESOLVED" /></@form_option>
|
||||
<@form_option value="WONT_FIX" selected=( data.report.status = 'WONT_FIX' )><@bugStatus status="WONT_FIX" /></@form_option>
|
||||
<@form_option value="NOT_A_BUG" selected=( data.report.status = 'NOT_A_BUG' )><@bugStatus status="NOT_A_BUG" /></@form_option>
|
||||
</@ff_select>
|
||||
<@ff_submit label="Go" />
|
||||
</@lineform>
|
||||
<#if data.report.status = 'OPEN'>
|
||||
<@lineform action="bug-${data.report.reportId}-visibility" hash="br-controls">
|
||||
<input type="hidden" name="status" value="${data.query.status!"x"}" />
|
||||
<input type="hidden" name="own" value="${ownOnly}" />
|
||||
<input type="hidden" name="first" value="${data.query.first}" />
|
||||
Change visibility to
|
||||
<#if data.report.visible>
|
||||
hidden
|
||||
<#else>
|
||||
public
|
||||
</#if>
|
||||
<@ff_submit label="Go" />
|
||||
</@lineform>
|
||||
<#switch data.mergeError!>
|
||||
<#case "NOT_FOUND"><@standalone_error>Bug report not found</@standalone_error><#break>
|
||||
<#case "MERGED"><@standalone_error>Bug reports already merged</@standalone_error><#break>
|
||||
<#case "STATUS"><@standalone_error>Both bug reports must be open</@standalone_error><#break>
|
||||
</#switch>
|
||||
<@lineform action="bug-${data.report.reportId}-merge" hash="br-controls">
|
||||
<input type="hidden" name="status" value="${data.query.status!"x"}" />
|
||||
<input type="hidden" name="own" value="${ownOnly}" />
|
||||
<input type="hidden" name="first" value="${data.query.first}" />
|
||||
Merge into bug report #<@ff_text name="mergeId" id="merge-into" value=data.mergeId!"" />
|
||||
<@ff_submit label="Go" />
|
||||
</@lineform>
|
||||
<hr id="post-comment" />
|
||||
<@form action="bug-${data.report.reportId}-comment" hash="post-comment">
|
||||
<tr style="display:none">
|
||||
<td colspan="2">
|
||||
<input type="hidden" name="status" value="${data.query.status!"x"}" />
|
||||
<input type="hidden" name="own" value="${ownOnly}" />
|
||||
<input type="hidden" name="first" value="${data.query.first}" />
|
||||
</td>
|
||||
</tr>
|
||||
<#switch data.commentError!"">
|
||||
<#case "EMPTY"><@form_error>You should type a comment before posting a comment.</@form_error><#break>
|
||||
<#case "INVALID"><@form_error>Comments must be at least 30 characters long.</@form_error><#break>
|
||||
</#switch>
|
||||
<@form_text label="New comment" name="comment" multiline=true maxLength=6 value=data.comment!"" />
|
||||
<@form_select label="Visibility" name="visibility">
|
||||
<@form_option value="1">public</@form_option>
|
||||
<@form_option value="0" selected=(! data.publicComment!true )>hidden</@form_option>
|
||||
</@form_select>
|
||||
<@form_submit label="Post comment" />
|
||||
</@form>
|
||||
</#if>
|
||||
</#if>
|
||||
|
||||
</@page>
|
||||
</#macro>
|
||||
<@render />
|
|
@ -0,0 +1,31 @@
|
|||
<@page title="Change password">
|
||||
<@form action="change-password">
|
||||
<#if data.admin.passwordChange!false>
|
||||
<@form_extra>Your administration password is currently the same as your player account's password. You <strong>must</strong> change it before you can proceed.</@form_extra>
|
||||
</#if>
|
||||
|
||||
<#if data.authError!false>
|
||||
<@form_error>Incorrect password</@form_error>
|
||||
</#if>
|
||||
<@form_pwd name="current" label="Current password" />
|
||||
|
||||
<#switch data.passwordError!>
|
||||
<#case 'EMPTY'>
|
||||
<@form_error>No password specified</@form_error>
|
||||
<#break>
|
||||
<#case 'TOO_WEAK'>
|
||||
<@form_error>Password too weak</@form_error>
|
||||
<#break>
|
||||
<#case 'MISMATCH'>
|
||||
<@form_error>Password and password confirmation did not match</@form_error>
|
||||
<#break>
|
||||
<#case 'PROHIBITED'>
|
||||
<@form_error>You are not allowed to use your player account's password.</@form_error>
|
||||
<#break>
|
||||
</#switch>
|
||||
<@form_pwd name="password" label="New password" />
|
||||
<@form_pwd name="passwordConfirm" label="New password (confirmation)" />
|
||||
|
||||
<@form_submit label="Change password" />
|
||||
</@form>
|
||||
</@page>
|
|
@ -0,0 +1,29 @@
|
|||
<#macro render_constant constant wrong>
|
||||
<h2 id="${constant.name?replace("." , "-")}">${constant.name?xhtml}</h2>
|
||||
<p>${constant.description?xhtml}</p>
|
||||
<#if wrong>
|
||||
<@standalone_error>Invalid constant value</@standalone_error>
|
||||
<#local cValue = data.value>
|
||||
<#else>
|
||||
<#local cValue = constant.value>
|
||||
</#if>
|
||||
<@lineform action="set-constant" hash=constant.name?replace("." , "-")>
|
||||
Value:
|
||||
<@ff_text name="value" id=constant.name?replace("." , "-") value=cValue?string("#.###") maxLength=10 size=10 />
|
||||
<#if constant.minValue?has_content || constant.maxValue?has_content>
|
||||
(<#if constant.minValue?has_content>min.: ${constant.minValue?string("#.###")}<#if constant.maxValue?has_content> ; </#if></#if><#if constant.maxValue?has_content>max.: ${constant.maxValue?string("#.###")}</#if>)
|
||||
</#if>
|
||||
<@ff_submit label="Change" />
|
||||
<input type="hidden" name="name" value="${constant.name?xhtml}" />
|
||||
</@lineform>
|
||||
<p> </p>
|
||||
</#macro>
|
||||
<@page title="Constants">
|
||||
<#list data.categories as category>
|
||||
<h1>${category.name?xhtml}</h1>
|
||||
<#list category.definitions as constant>
|
||||
<@render_constant constant=constant wrong=(((data.name!"") == constant.name) && data.error!false) />
|
||||
</#list>
|
||||
<p> </p>
|
||||
</#list>
|
||||
</@page>
|
|
@ -0,0 +1,37 @@
|
|||
<#macro render_string str>
|
||||
<tr id="str-${str.id}">
|
||||
<th style="text-align:right;vertical-align:top">${str.id}</th>
|
||||
<td>
|
||||
<#if (data.edited!"") == str.id>
|
||||
<div class="form-error">Empty strings are not allowed</div>
|
||||
</#if>
|
||||
<form action="i18n-${data.language.id}-set-string.action#str-${str.id}" method="post">
|
||||
<div>
|
||||
<input type="hidden" name="string" value="${str.id}" />
|
||||
<textarea class="input" rows="10" columns="80" name="value" style="height:auto;width:600px">${str.text?xhtml}</textarea>
|
||||
<br/>
|
||||
<input type="submit" value="Modify string" />
|
||||
</div>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
</#macro>
|
||||
<@page title="Language '${data.language.name}'">
|
||||
|
||||
<h1>Change language name</h1>
|
||||
<@form action="i18n-${data.language.id}-edit">
|
||||
<#if data.nameError!false>
|
||||
<@form_error>Invalid name</@form_error>
|
||||
</#if>
|
||||
<@form_text name="name" label="New name" value=data.language.name! />
|
||||
<@form_submit label="Change name" />
|
||||
</@form>
|
||||
|
||||
<h1>Translations</h1>
|
||||
<table>
|
||||
<#list data.strings as str>
|
||||
<@render_string str=str />
|
||||
</#list>
|
||||
</table>
|
||||
|
||||
</@page>
|
|
@ -0,0 +1,24 @@
|
|||
<#macro render_language lang>
|
||||
<@lv_line>
|
||||
<@lv_column centered=true><a href="i18n-${lang.id}">${lang.id}</a></@lv_column>
|
||||
<@lv_column>${lang.name?xhtml}</@lv_column>
|
||||
<@lv_column centered=true>${lang.completion}%</@lv_column>
|
||||
<@lv_column centered=true><a href="i18n-export-${lang.id}">(XML export)</a></@lv_column>
|
||||
</@lv_line>
|
||||
</#macro>
|
||||
<@page title="Languages">
|
||||
<@listview>
|
||||
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=100 centered=true>ID</@lv_column>
|
||||
<@lv_column width="x">Name</@lv_column>
|
||||
<@lv_column width=200 centered=true>Completion %</@lv_column>
|
||||
<@lv_column width=150> </@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
<#list data.languages as lang>
|
||||
<@render_language lang=lang />
|
||||
</#list>
|
||||
|
||||
</@listview>
|
||||
</@page>
|
|
@ -0,0 +1,41 @@
|
|||
<@page title="Log entry #${data.entry.id?string(',##0')}">
|
||||
<h1>Basics</h1>
|
||||
<@dt_main>
|
||||
<@dt_entry title="Date">${data.entry.timestamp?string("yyyy-MM-dd")}</@dt_entry>
|
||||
<@dt_entry title="Time">${data.entry.timestamp?string("HH:mm:ss")}</@dt_entry>
|
||||
<@dt_entry title="Log level">${data.entry.level}</@dt_entry>
|
||||
<@dt_entry title="Component">${data.entry.about?xhtml}</@dt_entry>
|
||||
<@dt_entry title="Message">${data.entry.entry?xhtml}</@dt_entry>
|
||||
</@dt_main>
|
||||
<p> </p>
|
||||
|
||||
<#if data.exceptions?size gt 0>
|
||||
<h1>Exception log</h1>
|
||||
<table>
|
||||
<#list data.exceptions as exc>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<strong>${exc.className?xhtml}</strong>
|
||||
<#if exc.message?has_content>: ${exc.message?xhtml}</#if>
|
||||
</td>
|
||||
</tr>
|
||||
<#list exc.trace as stEntry>
|
||||
<tr>
|
||||
<td style="width: 150px"> </td>
|
||||
<td>
|
||||
In
|
||||
<#if stEntry.location?has_content>
|
||||
<strong>${stEntry.location?xhtml}</strong>
|
||||
<#else>
|
||||
???
|
||||
</#if>
|
||||
<#if stEntry.fileName?has_content>
|
||||
(in file <em>${stEntry.fileName?xhtml}</em><#if stEntry.line?has_content> at line ${stEntry.line?string(",##0")}</#if>)
|
||||
</#if>
|
||||
</td>
|
||||
</tr>
|
||||
</#list>
|
||||
</#list>
|
||||
</table>
|
||||
</#if>
|
||||
</@page>
|
|
@ -0,0 +1,10 @@
|
|||
<@page title="Log in">
|
||||
<@form action="login">
|
||||
<#if data.failed!false>
|
||||
<@form_error>Invalid address or password</@form_error>
|
||||
</#if>
|
||||
<@form_text name="mail" label="E-mail address" value=data.mail! />
|
||||
<@form_pwd name="password" label="Password" />
|
||||
<@form_submit label="Log in" />
|
||||
</@form>
|
||||
</@page>
|
103
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/logs.ftl
Normal file
103
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/logs.ftl
Normal file
|
@ -0,0 +1,103 @@
|
|||
<@page title="Logs viewer">
|
||||
<h1>Log entries</h1>
|
||||
<table style="width:95%; margin: 10px 0 10px 2%">
|
||||
<tr>
|
||||
<td style="width: 50px;text-align:right">
|
||||
<#if data.params.first = 0>
|
||||
<<
|
||||
<#else>
|
||||
<#if data.params.first gt 30>
|
||||
<a href="logs?logType=${data.params.type?url}&logLevel=${data.params.level?url}&component=${(data.params.component!"")?url}&excOnly=<#if data.params.excOnly!false>1<#else>0</#if>&first=${data.params.first - 30 }">
|
||||
<#else>
|
||||
<a href="logs?logType=${data.params.type?url}&logLevel=${data.params.level?url}&component=${(data.params.component!"")?url}&excOnly=<#if data.params.excOnly!false>1<#else>0</#if>&first=0">
|
||||
</#if>
|
||||
<<</a>
|
||||
</#if>
|
||||
</td>
|
||||
<td style="text-align:center">
|
||||
<#if data.count = 0>
|
||||
No entries found.
|
||||
<#else>
|
||||
${data.count?string(",##0")} entries
|
||||
</#if>
|
||||
</td>
|
||||
<td style="width: 50px;text-align:left">
|
||||
<#if (data.params.first + 30) gt data.count>
|
||||
>>
|
||||
<#else>
|
||||
<a href="logs?logType=${data.params.type?url}&logLevel=${data.params.level?url}&component=${(data.params.component!"")?url}&excOnly=<#if data.params.excOnly!false>1<#else>0</#if>&first=${data.params.first + 30 }">
|
||||
>></a>
|
||||
</#if>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<#if data.count gt 0>
|
||||
<table class="list-view" style="width:95%; margin: 0 0 20px 2%" >
|
||||
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=60 centered=true>Date</@lv_column>
|
||||
<@lv_column width=60 centered=true>Time</@lv_column>
|
||||
<@lv_column width=60 centered=true>Log level</@lv_column>
|
||||
<@lv_column width=200 centered=true>
|
||||
<#if data.params.type = "SYSTEM">
|
||||
Component
|
||||
<#else>
|
||||
User
|
||||
</#if>
|
||||
</@lv_column>
|
||||
<@lv_column width="x">Message</@lv_column>
|
||||
<@lv_column width=50> </@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
<#list data.entries as entry>
|
||||
<@lv_line class="log-entry-${entry.level?lower_case}">
|
||||
<@lv_column centered=true>${entry.timestamp?string("yyyy-MM-dd")}</@lv_column>
|
||||
<@lv_column centered=true>${entry.timestamp?string("HH:mm:ss")}</@lv_column>
|
||||
<@lv_column centered=true>${entry.level}</@lv_column>
|
||||
<@lv_column centered=true>${entry.about?xhtml}</@lv_column>
|
||||
<@lv_column>${entry.entry?xhtml}</@lv_column>
|
||||
<@lv_column>
|
||||
<#if entry.exception?has_content>
|
||||
<a href="view-log-entry-${entry.id}">Details</a>
|
||||
<#else>
|
||||
|
||||
</#if>
|
||||
</@lv_column>
|
||||
</@lv_line>
|
||||
</#list>
|
||||
|
||||
</table>
|
||||
</#if>
|
||||
|
||||
<h1>Search parameters</h1>
|
||||
<div class="form-container">
|
||||
<form action="logs" method="get">
|
||||
<table>
|
||||
|
||||
<@form_select name="logType" label="Log type">
|
||||
<@form_option value="SYSTEM" selected=((data.params.type!"") = "SYSTEM")>system log</@form_option>
|
||||
<@form_option value="ADMIN" selected=((data.params.type!"") = "ADMIN")>administrative actions</@form_option>
|
||||
<@form_option value="PLAYER" selected=((data.params.type!"") = "PLAYER")>player actions</@form_option>
|
||||
</@form_select>
|
||||
|
||||
<@form_select name="logLevel" label="Minimal log level">
|
||||
<@form_option value="TRACE" selected=((data.params.level!"") = "TRACE")>TRACE</@form_option>
|
||||
<@form_option value="DEBUG" selected=((data.params.level!"") = "DEBUG")>DEBUG</@form_option>
|
||||
<@form_option value="INFO" selected=((data.params.level!"") = "INFO")>INFO</@form_option>
|
||||
<@form_option value="WARNING" selected=((data.params.level!"") = "WARNING")>WARNING</@form_option>
|
||||
<@form_option value="ERROR" selected=((data.params.level!"") = "ERROR")>ERROR</@form_option>
|
||||
</@form_select>
|
||||
|
||||
<@form_text label="Component / user" name="component" value=data.params.component! />
|
||||
|
||||
<@form_select name="excOnly" label="Only entries with exceptions">
|
||||
<@form_option value="0" selected=!( data.params.excOnly!false)>no</@form_option>
|
||||
<@form_option value="1" selected=data.params.excOnly!false>yes</@form_option>
|
||||
</@form_select>
|
||||
|
||||
<@form_submit label="Search"/>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</@page>
|
42
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/main.ftl
Normal file
42
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/main.ftl
Normal file
|
@ -0,0 +1,42 @@
|
|||
<@page title="Overview">
|
||||
<h1>Your administrative account</h1>
|
||||
<p>
|
||||
<strong>E-mail address:</strong> ${data.admin.address?xhtml}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Privileges:</strong>
|
||||
<#list data.admin.privileges as priv>
|
||||
<abbr title="${priv.description?xhtml}">${priv}</abbr>
|
||||
</#list>
|
||||
</p>
|
||||
<p>
|
||||
<a href="change-password">Change password</a>
|
||||
</p>
|
||||
<p> </p>
|
||||
|
||||
<h1>Overview</h1>
|
||||
<p>
|
||||
<strong>Unread messages:</strong> ${data.overview.newMessages}
|
||||
</p>
|
||||
<#if data.overview.pendingNames?has_content>
|
||||
<p>
|
||||
<strong>Unvalidated map names:</strong> ${data.overview.pendingNames}
|
||||
</p>
|
||||
</#if>
|
||||
<#if data.overview.pendingBans?has_content>
|
||||
<p>
|
||||
<strong>Unvalidated ban requests:</strong> ${data.overview.pendingBans}
|
||||
</p>
|
||||
</#if>
|
||||
<#if data.overview.pendingBugs?has_content>
|
||||
<p>
|
||||
<strong>Bug reports pending validation:</strong> ${data.overview.pendingBugs}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Open bug reports:</strong> ${data.overview.openBugs}
|
||||
</p>
|
||||
<p>
|
||||
<strong>Updated bug reports:</strong> ${data.overview.updatedBugs}
|
||||
</p>
|
||||
</#if>
|
||||
</@page>
|
|
@ -0,0 +1,40 @@
|
|||
<@page title="Maintenance mode">
|
||||
|
||||
<#if data.reason?has_content>
|
||||
|
||||
<p>Maintenance mode is <strong>enabled</strong>.</p>
|
||||
<@dt_main>
|
||||
<@dt_entry title="Started">${data.started?string("yyyy-MM-dd HH:mm:ss")}</@dt_entry>
|
||||
<@dt_entry title="Scheduled to end">${data.until?string("yyyy-MM-dd HH:mm:ss")}</@dt_entry>
|
||||
<@dt_entry title="Reason">${data.reason?xhtml}</@dt_entry>
|
||||
</@dt_main>
|
||||
|
||||
|
||||
<@form action="maintenance-extend">
|
||||
<@form_text label="Duration (minutes)" name="duration" value="" />
|
||||
<@form_submit label="Extend maintenance mode"/>
|
||||
</@form>
|
||||
<@form action="maintenance-end">
|
||||
<@form_submit label="Disable maintenance mode"/>
|
||||
</@form>
|
||||
|
||||
<#else>
|
||||
|
||||
<p>Maintenance mode is currently disabled.</p>
|
||||
|
||||
<@form action="maintenance-start">
|
||||
<#switch data.reasonError!"">
|
||||
<#case 'EMPTY'><@form_error>You must specify a reason.</@form_error><#break>
|
||||
<#case 'INVALID'><@form_error>Reason too short (must be at least 10 characters long).</@form_error><#break>
|
||||
</#switch>
|
||||
<@form_text label="Reason for maintenance activation" name="reason" value=data.newReason!"" />
|
||||
<#if ( data.newReason!"" ) != "" && ! data.reasonError?has_content>
|
||||
<@form_error>Invalid duration</@form_error>
|
||||
</#if>
|
||||
<@form_text label="Duration (minutes)" name="duration" value=data.newDuration!"" />
|
||||
<@form_submit label="Enable maintenance mode"/>
|
||||
</@form>
|
||||
|
||||
</#if>
|
||||
|
||||
</@page>
|
|
@ -0,0 +1,96 @@
|
|||
<#macro render_navigation message inbox>
|
||||
<#if inbox>
|
||||
<#local link="inbox-message-">
|
||||
<#else>
|
||||
<#local link="outbox-message-">
|
||||
</#if>
|
||||
<table style="width:100%;margin: 2px 0">
|
||||
<tr>
|
||||
<td style="width: 30px;text-align: right">
|
||||
<#if message.previous?has_content>
|
||||
<a href="${link}${message.previous}">
|
||||
</#if>
|
||||
<<
|
||||
<#if message.previous?has_content>
|
||||
</a>
|
||||
</#if>
|
||||
</td>
|
||||
<td style="text-align: center">
|
||||
<#if inbox>
|
||||
<a href="inbox-from-${message.id}">Received messages</a>
|
||||
<#else>
|
||||
<a href="outbox-from-${message.id}">Sent messages</a>
|
||||
</#if>
|
||||
</td>
|
||||
<td style="width: 30px;text-align: left">
|
||||
<#if message.next?has_content>
|
||||
<a href="${link}${message.next}">
|
||||
</#if>
|
||||
>>
|
||||
<#if message.next?has_content>
|
||||
</a>
|
||||
</#if>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</#macro>
|
||||
<#macro render>
|
||||
<#if data.inbox>
|
||||
<#local title="Received messages">
|
||||
<#local timeTtl="Received">
|
||||
<#else>
|
||||
<#local title="Sent messages">
|
||||
<#local timeTtl="Sent">
|
||||
</#if>
|
||||
<@page title=title>
|
||||
<@render_navigation message=data.message inbox=data.inbox />
|
||||
|
||||
<@dt_main>
|
||||
<@dt_entry width=100 title="From">
|
||||
${data.message.sender!}
|
||||
<#if data.inbox>
|
||||
(${data.message.type?lower_case})
|
||||
</#if>
|
||||
</@dt_entry>
|
||||
<@dt_entry width=100 title="To">
|
||||
${data.message.receiver!}
|
||||
<#if !data.inbox>
|
||||
(${data.message.type?lower_case})
|
||||
</#if>
|
||||
</@dt_entry>
|
||||
<@dt_entry width=100 title=timeTtl>
|
||||
${data.message.time?string("yyyy-MM-dd HH:mm:ss")}
|
||||
</@dt_entry>
|
||||
<#if data.message.unread>
|
||||
<@dt_entry width=100 title="">New!</@dt_entry>
|
||||
</#if>
|
||||
</@dt_main>
|
||||
|
||||
<@listview><@lv_line headers=true><th colspan="2" style="font-size:1px"> </th></@lv_line></@listview>
|
||||
|
||||
<h3 style="margin:0;text-align:center;padding:0 0 10px 0">${data.message.title}</h3>
|
||||
<div style="margin: 0 40px 20px 40px">
|
||||
${data.message.contents}
|
||||
</div>
|
||||
|
||||
<@listview><@lv_line headers=true><th colspan="2" style="font-size:1px"> </th></@lv_line></@listview>
|
||||
<@lineform action="message">
|
||||
<input type="hidden" name="inbox" value="<#if data.inbox>1<#else>0</#if>" />
|
||||
<input type="hidden" name="id" value="${data.message.id}" />
|
||||
<#if data.message.previous?has_content>
|
||||
<#local afterDelete = data.message.previous>
|
||||
<#elseif data.message.next?has_content>
|
||||
<#local afterDelete = data.message.next>
|
||||
<#else>
|
||||
<#local afterDelete = "x">
|
||||
</#if>
|
||||
<input type="hidden" name="next" value="${afterDelete}" />
|
||||
<@ff_submit label="Delete message" name="delete" />
|
||||
<#if data.inbox && data.message.type != 'INTERNAL'>
|
||||
<@ff_submit label="Compose reply" name="reply" />
|
||||
</#if>
|
||||
</@lineform>
|
||||
|
||||
</@page>
|
||||
</#macro>
|
||||
<@render />
|
|
@ -0,0 +1,112 @@
|
|||
<#include "messageTabs.ftl" />
|
||||
<#macro render_navigation current total inbox>
|
||||
<#if inbox>
|
||||
<#local link="inbox-">
|
||||
<#else>
|
||||
<#local link="outbox-">
|
||||
</#if>
|
||||
<table style="width:100%;margin: 2px 0">
|
||||
<tr>
|
||||
<td style="width: 30px;text-align: right">
|
||||
<#if current gt 0>
|
||||
<a href="${link}${current - 1}">
|
||||
</#if>
|
||||
<<
|
||||
<#if current gt 0>
|
||||
</a>
|
||||
</#if>
|
||||
</td>
|
||||
<td style="text-align: center">
|
||||
<#if total gt 0>
|
||||
Page ${current + 1} / ${total}
|
||||
<#elseif inbox>
|
||||
No messages received.
|
||||
<#else>
|
||||
No messages sent.
|
||||
</#if>
|
||||
</td>
|
||||
<td style="width: 30px;text-align: left">
|
||||
<#if current lt total - 1>
|
||||
<a href="${link}${current + 1}">
|
||||
</#if>
|
||||
>>
|
||||
<#if current lt total - 1>
|
||||
</a>
|
||||
</#if>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</#macro>
|
||||
<#macro render>
|
||||
<#if data.inbox>
|
||||
<#local title="Received messages">
|
||||
<#local tab="inbox">
|
||||
<#else>
|
||||
<#local title="Sent messages">
|
||||
<#local tab="outbox">
|
||||
</#if>
|
||||
<@page title=title>
|
||||
<@messageTabs selected=tab />
|
||||
<@render_navigation current=data.cPage total=data.pages inbox=data.inbox />
|
||||
<#if data.messages?size gt 0>
|
||||
<form action="messages.action" method="post">
|
||||
<input type="hidden" name="inbox" value="<#if data.inbox>1<#else>0</#if>" />
|
||||
<input type="hidden" name="page" value="${data.cPage}" />
|
||||
<@listview>
|
||||
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=16 centered=true> </@lv_column>
|
||||
<@lv_column width="x">Subject</@lv_column>
|
||||
<@lv_column width=150 centered=true><#if data.inbox>From<#else>To</#if></@lv_column>
|
||||
<@lv_column width=150 centered=true><#if data.inbox>Received<#else>Sent</#if></@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
<#list data.messages as message>
|
||||
<#if ! message.read>
|
||||
<#local mType = "unread-msg">
|
||||
<#else>
|
||||
<#local mType = "">
|
||||
</#if>
|
||||
|
||||
<@lv_line class=mType>
|
||||
<@lv_column centered=true>
|
||||
<input type="checkbox" name="selection" value="${message.id}" class="input" />
|
||||
</@lv_column>
|
||||
<@lv_column><a href="<#if data.inbox>inbox<#else>outbox</#if>-message-${message.id}"><#if message.type = 'EMPIRE'><em>${message.title}</em><#else>${message.title}</#if></a></@lv_column>
|
||||
<@lv_column centered=true>${message.sender!}</@lv_column>
|
||||
<@lv_column centered=true>${message.time?string("yyyy-MM-dd HH:mm:ss")}</@lv_column>
|
||||
</@lv_line>
|
||||
</#list>
|
||||
</@listview>
|
||||
|
||||
<#if data.inbox>
|
||||
<div class="form-container">
|
||||
With
|
||||
<@ff_select name="target" id="target">
|
||||
<@form_option value="0">selected</@form_option>
|
||||
<@form_option value="1">all</@form_option>
|
||||
</@ff_select>
|
||||
messages:
|
||||
<@ff_select name="action" id="action">
|
||||
<@form_option value="r">mark as read</@form_option>
|
||||
<@form_option value="u">mark as unread</@form_option>
|
||||
<@form_option value="d">delete</@form_option>
|
||||
</@ff_select>
|
||||
<@ff_submit label="Go" />
|
||||
</div>
|
||||
<#else>
|
||||
<div class="form-container">
|
||||
<input type="hidden" name="action" value="d" />
|
||||
Delete
|
||||
<@ff_select name="target" id="target">
|
||||
<@form_option value="0">selected</@form_option>
|
||||
<@form_option value="1">all</@form_option>
|
||||
</@ff_select>
|
||||
messages <@ff_submit label="Go" />
|
||||
</div>
|
||||
</#if>
|
||||
</form>
|
||||
</#if>
|
||||
</@page>
|
||||
</#macro>
|
||||
<@render />
|
|
@ -0,0 +1,10 @@
|
|||
<#macro messageTab href title selected>
|
||||
<a class="tab-button<#if selected> selected-tab</#if>" href="${href}">${title}</a>
|
||||
</#macro>
|
||||
<#macro messageTabs selected>
|
||||
<div class="tab-buttons">
|
||||
<@messageTab href="messages" title="Received" selected=( selected = 'inbox' ) />
|
||||
<@messageTab href="outbox" title="Sent" selected=( selected = 'outbox' ) />
|
||||
<@messageTab href="compose-message" title="Compose" selected=( selected = 'compose' ) />
|
||||
</div>
|
||||
</#macro>
|
|
@ -0,0 +1,79 @@
|
|||
<#include "messageTabs.ftl" />
|
||||
<#macro render>
|
||||
<#if data.replyTo?has_content>
|
||||
<#local title="Reply to message">
|
||||
<#else>
|
||||
<#local title="Compose new message">
|
||||
</#if>
|
||||
<@page title=title>
|
||||
<@messageTabs selected="compose" />
|
||||
|
||||
<div class="form-container">
|
||||
<form action="send-message.action" method="post">
|
||||
<#if data.replyTo?has_content>
|
||||
<input name="rtInbox" type="hidden" value="<#if data.inbox>1<#else>0</#if>" />
|
||||
<input name="rtId" type="hidden" value="${data.replyTo.id}" />
|
||||
</#if>
|
||||
|
||||
<table>
|
||||
<#if data.timingError>
|
||||
<@form_error>Not so fast! Wait a few seconds before trying again.</@form_error>
|
||||
</#if>
|
||||
|
||||
<#-- Message recipient -->
|
||||
<#if data.targetError>
|
||||
<@form_error>Message recipient not found.</@form_error>
|
||||
</#if>
|
||||
<@form_select label="Recipient type" name="toType">
|
||||
<@form_option value="ADMINISTRATOR" selected=( data.messageType = 'ADMINISTRATOR' )>Administrator</@form_option>
|
||||
<@form_option value="EMPIRE" selected=( data.messageType = 'EMPIRE' )>Empire</@form_option>
|
||||
</@form_select>
|
||||
<@form_text label="Recipient name" name="toName" maxLength=48 value=data.target />
|
||||
|
||||
<#-- Subject -->
|
||||
<#if data.titleError>
|
||||
<@form_error>Subject is too short (min.: 2 characters)</@form_error>
|
||||
</#if>
|
||||
<@form_text label="Subject" name="title" maxLength=64 value=data.title />
|
||||
|
||||
<#-- Body -->
|
||||
<#if data.contentsError>
|
||||
<@form_error>Contents are too short (min.: 2 characters)</@form_error>
|
||||
</#if>
|
||||
<@form_text label="Contents" name="contents" value=data.contents multiline=true maxLength=10 />
|
||||
|
||||
<@form_extended_submit label="Send message">
|
||||
<@ff_submit label="Cancel" name="cancel" />
|
||||
</@form_extended_submit>
|
||||
</table>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<#-- Original message -->
|
||||
<#if data.replyTo?has_content>
|
||||
<@listview><@lv_line headers=true><th colspan="2" style="font-size:1px"> </th></@lv_line></@listview>
|
||||
<@dt_main>
|
||||
<@dt_entry width=100 title="">Original message:</@dt_entry>
|
||||
<@dt_entry width=100 title="From">
|
||||
${data.replyTo.sender!}
|
||||
</@dt_entry>
|
||||
<@dt_entry width=100 title="To">
|
||||
${data.replyTo.receiver!}
|
||||
</@dt_entry>
|
||||
<@dt_entry width=100 title="Received">
|
||||
${data.replyTo.time?string("yyyy-MM-dd HH:mm:ss")}
|
||||
</@dt_entry>
|
||||
</@dt_main>
|
||||
|
||||
<@listview><@lv_line headers=true><th colspan="2" style="font-size:1px"> </th></@lv_line></@listview>
|
||||
|
||||
<h3 style="margin:0;text-align:center;padding:0 0 10px 0">${data.replyTo.title}</h3>
|
||||
<div style="margin: 0 40px 20px 40px">
|
||||
${data.replyTo.contents}
|
||||
</div>
|
||||
</#if>
|
||||
|
||||
</@page>
|
||||
</#macro>
|
||||
<@render />
|
|
@ -0,0 +1,72 @@
|
|||
<#macro render_name_entry name>
|
||||
<@lv_line>
|
||||
<@lv_column centered=true><input type="checkbox" name="ids" value="${name.id}" id="ns-${name.id}" /></@lv_column>
|
||||
<#if data.type = "EMPIRE" && (name.extra!"x") == "">
|
||||
<@lv_column><label for="ns-${name.id}"><em title="name currently in use">${name.name?xhtml}</em></label></@lv_column>
|
||||
<#else>
|
||||
<@lv_column><label for="ns-${name.id}">${name.name?xhtml}</label></@lv_column>
|
||||
</#if>
|
||||
<#if data.type = "ALLIANCE">
|
||||
<@lv_column><label for="ns-${name.id}">${name.extra?xhtml}</label></@lv_column>
|
||||
<#elseif data.type = "MAP_CHANGED">
|
||||
<@lv_column centered=true><#if name.type = "MAP_PENDING">No<#else>Yes</#if></@lv_column>
|
||||
</#if>
|
||||
</@lv_line>
|
||||
</#macro>
|
||||
<#macro render_actions>
|
||||
<#if data.type = "MAP_PENDING">
|
||||
<@ff_select name="action" id="action">
|
||||
<@form_option value="VALIDATE">Validate</@form_option>
|
||||
<@form_option value="REJECT">Reject and send warning</@form_option>
|
||||
<@form_option value="REJECT_BAN">Reject, send warning and ban name</@form_option>
|
||||
</@ff_select>
|
||||
<#elseif data.type = "MAP_VALIDATED">
|
||||
<@ff_select name="action" id="action">
|
||||
<@form_option value="REJECT">Reject and send warning</@form_option>
|
||||
<@form_option value="REJECT_BAN">Reject, send warning and ban name</@form_option>
|
||||
<@form_option value="RESET">Allow early renaming</@form_option>
|
||||
</@ff_select>
|
||||
<#elseif data.type = "MAP_CHANGED">
|
||||
<@ff_select name="action" id="action">
|
||||
<@form_option value="VALIDATE">Validate</@form_option>
|
||||
<@form_option value="REJECT">Reject and send warning</@form_option>
|
||||
<@form_option value="REJECT_BAN">Reject, send warning and ban name</@form_option>
|
||||
<@form_option value="RESET">Allow early renaming</@form_option>
|
||||
</@ff_select>
|
||||
<#elseif data.type = "EMPIRE">
|
||||
<@ff_select name="action" id="action">
|
||||
<@form_option value="REJECT">Forcibly rename to "RudeGuyXXX"</@form_option>
|
||||
<@form_option value="REJECT_BAN">Forcibly rename and ban old name</@form_option>
|
||||
</@ff_select>
|
||||
<#else>
|
||||
<input type="hidden" name="action" value="REJECT" />
|
||||
Disband selected alliance(s)
|
||||
</#if>
|
||||
</#macro>
|
||||
<@page title=data.type.description>
|
||||
<#if data.names?size = 0>
|
||||
<h1>No names to display</h1>
|
||||
<p>There are no such names at the moment.</p>
|
||||
<#else>
|
||||
<form action="names-${data.type.id}.action" method="post">
|
||||
<@listview>
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=24> </@lv_column>
|
||||
<#if data.type = "ALLIANCE">
|
||||
<@lv_column width=100>Tag</@lv_column>
|
||||
<@lv_column width=300>Name</@lv_column>
|
||||
<#elseif data.type = "MAP_CHANGED">
|
||||
<@lv_column width=300>Name</@lv_column>
|
||||
<@lv_column width=150 centered=true>Validated</@lv_column>
|
||||
<#else>
|
||||
<@lv_column width=300>Name</@lv_column>
|
||||
</#if>
|
||||
</@lv_line>
|
||||
<#list data.names as name>
|
||||
<@render_name_entry name=name />
|
||||
</#list>
|
||||
</@listview>
|
||||
<p><@render_actions /> <input type="submit" value="Go" /></p>
|
||||
</form>
|
||||
</#if>
|
||||
</@page>
|
|
@ -0,0 +1,20 @@
|
|||
<@page title="Names">
|
||||
<@listview>
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=250>Status</@lv_column>
|
||||
<@lv_column width=100 centered=true>Names</@lv_column>
|
||||
</@lv_line>
|
||||
<#list data.entries as entry>
|
||||
<@lv_line>
|
||||
<@lv_column>
|
||||
<#if entry.count gt 0>
|
||||
<a href="names-${entry.type.id}">${entry.type.description?xhtml}</a>
|
||||
<#else>
|
||||
${entry.type.description?xhtml}
|
||||
</#if>
|
||||
</@lv_column>
|
||||
<@lv_column centered=true>${entry.count?string(",##0")}</@lv_column>
|
||||
</@lv_line>
|
||||
</#list>
|
||||
</@listview>
|
||||
</@page>
|
|
@ -0,0 +1,5 @@
|
|||
<@page title="Server off-line">
|
||||
<p>
|
||||
The Legacy Worlds game server is currently off-line. Manual repairs need to be undertaken.
|
||||
</p>
|
||||
</@page>
|
|
@ -0,0 +1,53 @@
|
|||
<#macro render_preference pref>
|
||||
<div class="form-container">
|
||||
<form action="prefs.action#ff-pref-${pref.id}" method="post">
|
||||
<table>
|
||||
<tr class="form-field">
|
||||
<th style="width: 180px">Preference name:</th>
|
||||
<td>
|
||||
<strong>${pref.name?xhtml}</strong>
|
||||
<input type="hidden" name="pref" value="${pref.id?xhtml}" />
|
||||
</td>
|
||||
</tr>
|
||||
<#switch pref.type>
|
||||
<#case 'BOOLEAN'>
|
||||
<@form_select label="Default value" name="value" id="pref-${pref.id}">
|
||||
<@form_option value="0" text="No" selected=( pref.value != "1" )/>
|
||||
<@form_option value="1" text="Yes" selected=( pref.value == "1" )/>
|
||||
</@form_select>
|
||||
<#break>
|
||||
<#case 'INTEGER'>
|
||||
<#case 'STRING'>
|
||||
<@form_text label="Default value" name="value" id="pref-${pref.id}" value=pref.value />
|
||||
<#break>
|
||||
<#case 'CHOICE'>
|
||||
<@form_select label="Default value" name="value" id="pref-${pref.id}">
|
||||
<#list pref.choices as choice>
|
||||
<@form_option value=choice.value text=choice.display selected=( pref.value == choice.value )/>
|
||||
</#list>
|
||||
</@form_select>
|
||||
<#break>
|
||||
</#switch>
|
||||
<#if pref.description?has_content>
|
||||
<tr class="form-field">
|
||||
<th>Description:</th>
|
||||
<td>${pref.description?xhtml}</td>
|
||||
</tr>
|
||||
</#if>
|
||||
<@form_submit label="Update default value" />
|
||||
</table>
|
||||
</form>
|
||||
<p> </p>
|
||||
</div>
|
||||
</#macro>
|
||||
<#macro render_prefs_category category>
|
||||
<h1>${category.name?xhtml}</h1>
|
||||
<#list category.preferences as p>
|
||||
<@render_preference pref=p />
|
||||
</#list>
|
||||
</#macro>
|
||||
<@page title="Default preferences">
|
||||
<#list data.preferences as c>
|
||||
<@render_prefs_category category=c />
|
||||
</#list>
|
||||
</@page>
|
|
@ -0,0 +1,18 @@
|
|||
<@page title="Administrator ${data.view.name} - reset password">
|
||||
<@dt_main>
|
||||
<@dt_entry title="Name">${data.view.name?xhtml}</@dt_entry>
|
||||
<@dt_entry title="Address">
|
||||
<#if data.view.address?has_content>
|
||||
${data.view.address?xhtml}
|
||||
<#else>
|
||||
<em>(account deleted)</em>
|
||||
</#if>
|
||||
</@dt_entry>
|
||||
</@dt_main>
|
||||
|
||||
<@form action="do-reset-admin-${data.view.id}">
|
||||
<@form_extended_submit label="Reset password">
|
||||
<@ff_submit label="Cancel" name="cancel" />
|
||||
</@form_extended_submit>
|
||||
</@form>
|
||||
</@page>
|
27
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/spam.ftl
Normal file
27
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/spam.ftl
Normal file
|
@ -0,0 +1,27 @@
|
|||
<@page title="Spaminator! (TM)">
|
||||
<#if data.preview?has_content>
|
||||
<h1>Message preview</h1>
|
||||
<div>${data.preview}</div>
|
||||
<p> </p>
|
||||
</#if>
|
||||
|
||||
<h1>Compose spam</h1>
|
||||
<p>This message is going to be sent to every player in the game, so please don't be a complete idiot while typing it.</p>
|
||||
<@form action="send-spam">
|
||||
|
||||
<#if data.titleError!false>
|
||||
<@form_error>Spam title missing, too short or too long</@form_error>
|
||||
</#if>
|
||||
<@form_text name="title" label="Title" value=data.title!"" maxLength=64/>
|
||||
|
||||
<#if data.bodyError!false>
|
||||
<@form_error>Spam body missing or too short</@form_error>
|
||||
</#if>
|
||||
<@form_text name="body" label="Body" value=data.body!"" multiline=true maxLength=10 />
|
||||
|
||||
<@form_extended_submit label="Spam, spam, spam!">
|
||||
<@ff_submit label="Preview" name="preview" />
|
||||
</@form_extended_submit>
|
||||
|
||||
</@form>
|
||||
</@page>
|
|
@ -0,0 +1,51 @@
|
|||
<#macro render_task task>
|
||||
<@lv_line>
|
||||
<@lv_column> </@lv_column>
|
||||
<@lv_column>${task.name?xhtml}</@lv_column>
|
||||
<@lv_column>${task.status.description?xhtml}<#if task.status = 'AUTO'>
|
||||
<br/>${task.start?string("yyyy-MM-dd HH:mm:ss")}
|
||||
</#if></@lv_column>
|
||||
<@lv_column>
|
||||
<form action="set-ticker-task-${task.id}.action" method="post">
|
||||
<#if task.status != 'RUNNING'>
|
||||
<a href="start-ticker-task-${task.id}.action">Start</a> -
|
||||
</#if>
|
||||
<#if task.status != 'STOPPED'>
|
||||
<a href="stop-ticker-task-${task.id}.action">Stop</a>
|
||||
</#if>
|
||||
<br/>
|
||||
Schedule automatic start in
|
||||
<@ff_text name="delay" value="1" id="delay" maxLength=5 />
|
||||
<@ff_select name="multiplier" id="multiplier">
|
||||
<@form_option value="86400">day(s)</@form_option>
|
||||
<@form_option value="3600">hour(s)</@form_option>
|
||||
<@form_option value="60">minute(s)</@form_option>
|
||||
<@form_option value="1">second(s)</@form_option>
|
||||
</@ff_select>
|
||||
<@ff_submit label="Go" />
|
||||
</form>
|
||||
</@lv_column>
|
||||
</@lv_line>
|
||||
</#macro>
|
||||
<@page title="Ticker status">
|
||||
<h1>Ticker tasks</h1>
|
||||
<@listview>
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=40> </@lv_column>
|
||||
<@lv_column width=180>Task name</@lv_column>
|
||||
<@lv_column width=200>Status</@lv_column>
|
||||
<@lv_column width="x"> </@lv_column>
|
||||
</@lv_line>
|
||||
<#list data.tasks as task>
|
||||
<@render_task task=task />
|
||||
</#list>
|
||||
</@listview>
|
||||
<p> </p>
|
||||
|
||||
<h1>Ticker main thread</h1>
|
||||
<#if data.paused>
|
||||
<p>The main ticker thread is currently paused. <a href="toggle-ticker.action">Start it</a></p>
|
||||
<#else>
|
||||
<p>The main ticker thread is currently running. <a href="toggle-ticker.action">Pause it</a></p>
|
||||
</#if>
|
||||
</@page>
|
58
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/user.ftl
Normal file
58
legacyworlds-web-admin/Content/Raw/WEB-INF/fm/types/user.ftl
Normal file
|
@ -0,0 +1,58 @@
|
|||
<#assign accnt = data.account>
|
||||
<@page title="User #${accnt.id?string(',##0')} - ${accnt.address}">
|
||||
<@dt_main>
|
||||
|
||||
<@dt_entry title="User ID">${accnt.id?string(',##0')}</@dt_entry>
|
||||
<@dt_entry title="E-mail address">${accnt.address?xhtml}</@dt_entry>
|
||||
<@dt_entry title="Language code">${accnt.language}</@dt_entry>
|
||||
|
||||
<@dt_blank />
|
||||
|
||||
<@dt_entry title="Current status"><a href="users-by-status?status=${accnt.status?url}">${accnt.status.description?xhtml}</a></@dt_entry>
|
||||
<#if accnt.statusStart?has_content>
|
||||
<@dt_entry title="Since / Starting from">${accnt.statusStart?string("yyyy-MM-dd HH:mm:ss")}</@dt_entry>
|
||||
</#if>
|
||||
<#if accnt.inactivityReason?has_content>
|
||||
<@dt_entry title="Reason">${accnt.inactivityReason?xhtml}</@dt_entry>
|
||||
</#if>
|
||||
<#if accnt.ban?has_content>
|
||||
<#assign be = accnt.ban>
|
||||
<@dt_entry title="Requested by"><a href="msg-admin-${be.requestedById}">${be.requestedByName?xhtml}</a></@dt_entry>
|
||||
<@dt_entry title="Confirmed by"><a href="msg-admin-${be.confirmedById}">${be.confirmedByName?xhtml}</a></@dt_entry>
|
||||
</#if>
|
||||
<@dt_entry title="Warnings received">${accnt.warnings}</@dt_entry>
|
||||
<#if accnt.warnings gt 0>
|
||||
<@dt_entry title="Last warning">${accnt.lastWarning?string("yyyy-MM-dd HH:mm:ss")}</@dt_entry>
|
||||
</#if>
|
||||
|
||||
<@dt_blank />
|
||||
|
||||
<#if accnt.online>
|
||||
<@dt_entry title="">CURRENTLY ONLINE</@dt_entry>
|
||||
</#if>
|
||||
<@dt_entry title=""><a href="user-${accnt.id}-sessions">View sessions</a></@dt_entry>
|
||||
|
||||
<@dt_blank />
|
||||
|
||||
<@dt_entry title="Vacation credits">${accnt.vacationCredits?string(",##0")}</@dt_entry>
|
||||
<@dt_entry title="Game credits">${accnt.gameCredits?string(",##0")}</@dt_entry>
|
||||
<@dt_entry title="">
|
||||
<form action="user-${accnt.id}.action" method="post">
|
||||
Grant this user <@ff_text name="credits" id="credits" value=1 /> credit(s)
|
||||
<@ff_submit label="Go" />
|
||||
</form>
|
||||
</@dt_entry>
|
||||
|
||||
<@dt_blank />
|
||||
|
||||
<#if accnt.currentEmpire?has_content>
|
||||
<@dt_entry title="Currently playing as"><a href="msg-empire-${accnt.empireId}">${accnt.currentEmpire?xhtml}</a></@dt_entry>
|
||||
</#if>
|
||||
<#if accnt.empireNames?size gt 0>
|
||||
<@dt_entry title="All empire names">
|
||||
<#list accnt.empireNames as name>${name?xhtml}<br/></#list>
|
||||
</@dt_entry>
|
||||
</#if>
|
||||
|
||||
</@dt_main>
|
||||
</@page>
|
|
@ -0,0 +1,57 @@
|
|||
<@page title="User #${data.account.id?string(',##0')} - Sessions">
|
||||
<h1>Account</h1>
|
||||
<@dt_main>
|
||||
<@dt_entry title="E-mail address">${data.account.address?xhtml}</@dt_entry>
|
||||
<@dt_entry title="Language code">${data.account.language}</@dt_entry>
|
||||
<@dt_entry title="Current status">${data.account.status.description?xhtml}</@dt_entry>
|
||||
<#if data.account.currentEmpire?has_content>
|
||||
<@dt_entry title="Currently playing as">${data.account.currentEmpire?xhtml}</@dt_entry>
|
||||
</#if>
|
||||
<@dt_entry title=""><a href="user-${data.account.id}">Back to account page</a></@dt_entry>
|
||||
</@dt_main>
|
||||
|
||||
<h1>Sessions</h1>
|
||||
<#if data.account.sessions?size = 0>
|
||||
<p>No sessions for this account.</p>
|
||||
<#else>
|
||||
<@listview>
|
||||
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=60 centered=true>ID#</@lv_column>
|
||||
<@lv_column width=60 centered=true>C.T.</@lv_column>
|
||||
<@lv_column width=120 centered=true>IP address</@lv_column>
|
||||
<@lv_column width=60 centered=true>Start date</@lv_column>
|
||||
<@lv_column width=60 centered=true>- time</@lv_column>
|
||||
<@lv_column width=60 centered=true>End date</@lv_column>
|
||||
<@lv_column width=60 centered=true>- time</@lv_column>
|
||||
<@lv_column width="x">Termination reason</@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
<#list data.account.sessions as session>
|
||||
<@lv_line>
|
||||
<@lv_column centered=true>${session.id?string(",##0")}</@lv_column>
|
||||
<@lv_column centered=true>
|
||||
<#if session.exclusive>
|
||||
${session.clientName?xhtml}
|
||||
<#else>
|
||||
<em>${session.clientName?xhtml}</em>
|
||||
</#if>
|
||||
</@lv_column>
|
||||
<@lv_column centered=true>${session.fromAddress?xhtml}</@lv_column>
|
||||
<@lv_column centered=true>${session.started?string('yyyy-MM-dd')}</@lv_column>
|
||||
<@lv_column centered=true>${session.started?string('HH:mm:ss')}</@lv_column>
|
||||
|
||||
<#if session.ended?has_content>
|
||||
<@lv_column centered=true>${session.ended?string('yyyy-MM-dd')}</@lv_column>
|
||||
<@lv_column centered=true>${session.ended?string('HH:mm:ss')}</@lv_column>
|
||||
<@lv_column>${session.endType.description?xhtml}</@lv_column>
|
||||
<#else>
|
||||
<td colspan="3" style="text-align:center"><em>Still connected</em></td>
|
||||
</#if>
|
||||
</@lv_line>
|
||||
</#list>
|
||||
|
||||
</@listview>
|
||||
</#if>
|
||||
|
||||
</@page>
|
|
@ -0,0 +1,49 @@
|
|||
<#if data.status?has_content>
|
||||
<#assign pTitle= "Users with status '${data.status.description}'">
|
||||
</#if>
|
||||
<@page title=pTitle!"Users">
|
||||
<form action="users-by-status" method="get">
|
||||
<p>
|
||||
Display
|
||||
<@ff_select name="online" id="online">
|
||||
<@form_option value="0">all</@form_option>
|
||||
<@form_option value="1" selected=data.online!false>online</@form_option>
|
||||
</@ff_select>
|
||||
users that have the following status:
|
||||
<@ff_select name="status" id="status">
|
||||
<@form_option value="x" selected=!(data.status?has_content)>(all users)</@form_option>
|
||||
<#list data.allStatuses as st>
|
||||
<@form_option value=st selected=((data.status!"") = st)>${st.description}</@form_option>
|
||||
</#list>
|
||||
</@ff_select>
|
||||
<@ff_submit label="Filter" />
|
||||
</p>
|
||||
</form>
|
||||
|
||||
<#if data.entries?size gt 0>
|
||||
<p>${data.entries?size} account(s) found.</p>
|
||||
<@listview>
|
||||
|
||||
<@lv_line headers=true>
|
||||
<@lv_column width=40> </@lv_column>
|
||||
<@lv_column width=250>E-mail address</@lv_column>
|
||||
<@lv_column width=250>Current empire</@lv_column>
|
||||
<@lv_column width=100 centered=true>Status</@lv_column>
|
||||
<@lv_column width=100 centered=true>Language</@lv_column>
|
||||
</@lv_line>
|
||||
|
||||
<#list data.entries as entry>
|
||||
<@lv_line>
|
||||
<@lv_column> </@lv_column>
|
||||
<@lv_column><a href="user-${entry.id}">${entry.address?xhtml}</a></@lv_column>
|
||||
<@lv_column><#if entry.currentEmpire?has_content>${entry.currentEmpire?xhtml}<#else><em>N/A</em></#if></@lv_column>
|
||||
<@lv_column centered=true>${entry.status.description?xhtml}</@lv_column>
|
||||
<@lv_column centered=true>${entry.language}</@lv_column>
|
||||
</@lv_line>
|
||||
</#list>
|
||||
|
||||
</@listview>
|
||||
<#else>
|
||||
<p>No accounts found</p>
|
||||
</#if>
|
||||
</@page>
|
|
@ -0,0 +1,41 @@
|
|||
<@page title="Administrator ${data.view.name}">
|
||||
<h1>General information</h1>
|
||||
<@dt_main>
|
||||
<@dt_entry title="Name">${data.view.name?xhtml}</@dt_entry>
|
||||
<@dt_entry title="Address">
|
||||
<#if data.view.address?has_content>
|
||||
${data.view.address?xhtml}
|
||||
<#else>
|
||||
<em>(account deleted)</em>
|
||||
</#if>
|
||||
</@dt_entry>
|
||||
|
||||
<@dt_entry title="Password modified">
|
||||
<#if data.view.passwordChange>
|
||||
no
|
||||
<#else>
|
||||
yes
|
||||
</#if>
|
||||
</@dt_entry>
|
||||
<#if data.view.id != data.admin.id && data.view.address?has_content && !data.view.passwordChange>
|
||||
<@dt_entry title=""><a href="reset-admin-${data.view.id}.action">Reset administration password</a></@dt_entry>
|
||||
</#if>
|
||||
</@dt_main>
|
||||
|
||||
<#if data.view.id != data.admin.id && data.view.address?has_content>
|
||||
<p> </p>
|
||||
<h1>Privileges</h1>
|
||||
<@form action="admin-privileges-${data.view.id}">
|
||||
<tr class="form-field">
|
||||
<th>Privileges:</th>
|
||||
<td>
|
||||
<#list data.view.allPrivileges as privilege>
|
||||
<input class="input" type="checkbox" name="privileges" value="${privilege.privilege}" id="priv-${privilege.privilege}" <#if privilege.present>checked="checked"</#if> />
|
||||
<label for="priv-${privilege.privilege}"><abbr title="${privilege.privilege.description?xhtml}">${privilege.privilege}</abbr></label>
|
||||
</#list>
|
||||
</td>
|
||||
</tr>
|
||||
<@form_submit label="Update privileges" />
|
||||
</@form>
|
||||
</#if>
|
||||
</@page>
|
61
legacyworlds-web-admin/Content/Raw/WEB-INF/web.xml
Normal file
61
legacyworlds-web-admin/Content/Raw/WEB-INF/web.xml
Normal file
|
@ -0,0 +1,61 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
|
||||
|
||||
<display-name>legacyworlds-web-admin</display-name>
|
||||
|
||||
<filter>
|
||||
<filter-name>charsetFilter</filter-name>
|
||||
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
|
||||
<init-param>
|
||||
<param-name>encoding</param-name>
|
||||
<param-value>UTF-8</param-value>
|
||||
</init-param>
|
||||
<init-param>
|
||||
<param-name>forceEncoding</param-name>
|
||||
<param-value>1</param-value>
|
||||
</init-param>
|
||||
</filter>
|
||||
|
||||
<filter-mapping>
|
||||
<filter-name>charsetFilter</filter-name>
|
||||
<url-pattern>/*</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
<servlet>
|
||||
<servlet-name>admin</servlet-name>
|
||||
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
|
||||
<load-on-startup>1</load-on-startup>
|
||||
</servlet>
|
||||
|
||||
<servlet>
|
||||
<servlet-name>pass-through</servlet-name>
|
||||
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
|
||||
</servlet>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>pass-through</servlet-name>
|
||||
<url-pattern>*.js</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>pass-through</servlet-name>
|
||||
<url-pattern>*.css</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>pass-through</servlet-name>
|
||||
<url-pattern>*.jpg</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>pass-through</servlet-name>
|
||||
<url-pattern>*.png</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>admin</servlet-name>
|
||||
<url-pattern>/</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
</web-app>
|
171
legacyworlds-web-admin/Content/Raw/css/main.css
Normal file
171
legacyworlds-web-admin/Content/Raw/css/main.css
Normal file
|
@ -0,0 +1,171 @@
|
|||
* {
|
||||
color: black;
|
||||
font-family: Arial, sans-serif;
|
||||
font-size: 10pt;
|
||||
margin: 0;
|
||||
padding: 0
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #ffefef;
|
||||
}
|
||||
|
||||
/* Page header */
|
||||
div.page-header {
|
||||
width: 80%;
|
||||
margin: 5px auto 20px auto;
|
||||
background-color: #ff7f7f;
|
||||
border-color: #ff0000;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
}
|
||||
|
||||
.page-header * {
|
||||
text-align: center;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.page-header h1 {
|
||||
font-size: 16pt;
|
||||
}
|
||||
|
||||
.page-header h2 {
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
.page-header h3 {
|
||||
font-size: 9pt;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* Page body */
|
||||
div.page-full {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.page-full.page-contents {
|
||||
padding: 0px 20px;
|
||||
}
|
||||
|
||||
.page-full .page-contents {
|
||||
padding: 0px 20px 0px 250px;
|
||||
}
|
||||
|
||||
/* Side bar */
|
||||
.side-bar {
|
||||
float: left;
|
||||
margin: 0px 5px;
|
||||
padding: 5px;
|
||||
width: 225px;
|
||||
background-color: #ffafaf;
|
||||
border-color: #ff7f7f;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
}
|
||||
|
||||
.side-bar .admin {
|
||||
font-size: 11pt;
|
||||
font-weight: bold;
|
||||
padding: 0 0 10px 0;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.side-bar a {
|
||||
display: block;
|
||||
width: 100%;
|
||||
text-decoration: none;
|
||||
text-align: center;
|
||||
padding: 3px 0;
|
||||
}
|
||||
|
||||
.side-bar a:hover {
|
||||
background-color: #ff0000;
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Text */
|
||||
h1 {
|
||||
font-size: 14pt;
|
||||
margin: 0 0 10px 0;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 13pt;
|
||||
margin: 0 0 10px 10px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 12pt;
|
||||
margin: 0 0 10px 20px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 11pt;
|
||||
margin: 0 0 10px 40px;
|
||||
}
|
||||
|
||||
.page-contents p {
|
||||
margin: 5px 10px 5px 30px;
|
||||
text-align: justify;
|
||||
text-indent: 20px;
|
||||
}
|
||||
|
||||
.page-contents ul,.page-contents ol {
|
||||
margin: 0px 0px 0px 20px;
|
||||
padding: 0px 0px 0px 10px;
|
||||
}
|
||||
|
||||
.page-contents li {
|
||||
margin: 0px 0px 0px 20px;
|
||||
padding: 0px 0px 0px 0px;
|
||||
}
|
||||
|
||||
/* Forms */
|
||||
.form-container table {
|
||||
margin: 0 0 0 80px;
|
||||
}
|
||||
|
||||
.form-error {
|
||||
background-color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.form-error,.form-error * {
|
||||
color: yellow;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
/* List views */
|
||||
.list-view th,.list-view td {
|
||||
padding: 0 15px 0 0;
|
||||
}
|
||||
|
||||
/* Log entries */
|
||||
tr.log-entry-error,tr.log-entry-error * {
|
||||
background-color: #ff0000;
|
||||
color: #ffff00;
|
||||
}
|
||||
|
||||
tr.log-entry-warning,tr.log-entry-warning * {
|
||||
background-color: #ffff00;
|
||||
color: #0000ff;
|
||||
}
|
||||
|
||||
tr.log-entry-info,tr.log-entry-info * {
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
tr.log-entry-debug,tr.log-entry-debug * {
|
||||
background-color: #afffff;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
tr.log-entry-trace,tr.log-entry-trace * {
|
||||
background-color: #afffaf;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
.unread-msg * {
|
||||
font-weight: bold;
|
||||
}
|
Reference in a new issue