Repository: roller
Updated Branches:
  refs/heads/bootstrap-ui 84579b4a9 -> e83e5f811


Server Administration (GlobalConfig) working well and looking good with 
Bootstrap.


Project: http://git-wip-us.apache.org/repos/asf/roller/repo
Commit: http://git-wip-us.apache.org/repos/asf/roller/commit/e83e5f81
Tree: http://git-wip-us.apache.org/repos/asf/roller/tree/e83e5f81
Diff: http://git-wip-us.apache.org/repos/asf/roller/diff/e83e5f81

Branch: refs/heads/bootstrap-ui
Commit: e83e5f8115b3ebaa44eeb2653e360b21473e4d6e
Parents: 84579b4
Author: Dave Johnson <[email protected]>
Authored: Sun Jul 29 15:42:39 2018 -0400
Committer: Dave Johnson <[email protected]>
Committed: Sun Jul 29 15:42:39 2018 -0400

----------------------------------------------------------------------
 app/pom.xml                                     |  4 +-
 .../ui/struts2/admin/GlobalConfig.java          | 14 ++--
 .../resources/ApplicationResources.properties   |  8 +-
 .../webapp/WEB-INF/jsps/admin/GlobalConfig.jsp  | 79 +++++++++++++-------
 4 files changed, 65 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/roller/blob/e83e5f81/app/pom.xml
----------------------------------------------------------------------
diff --git a/app/pom.xml b/app/pom.xml
index bad3b5d..b35fe2f 100644
--- a/app/pom.xml
+++ b/app/pom.xml
@@ -56,7 +56,7 @@ limitations under the License.
         <slf4j.version>1.7.25</slf4j.version>
         <spring.version>4.1.4.RELEASE</spring.version>
         <spring.security.version>3.2.5.RELEASE</spring.security.version>
-        <struts.version>2.5.12</struts.version>
+        <struts.version>2.5.16</struts.version>
         <velocity.version>1.7</velocity.version>
         <webjars.version>1.5</webjars.version>
         <ws-commons-util.version>1.0.2</ws-commons-util.version>
@@ -359,7 +359,7 @@ limitations under the License.
         <dependency>
             <groupId>com.jgeppert.struts2.bootstrap</groupId>
             <artifactId>struts2-bootstrap-plugin</artifactId>
-            <version>2.0.3</version>
+            <version>2.5.2</version>
         </dependency>
 
         <dependency>

http://git-wip-us.apache.org/repos/asf/roller/blob/e83e5f81/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java
 
b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java
index 010601a..fb2e18f 100644
--- 
a/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java
+++ 
b/app/src/main/java/org/apache/roller/weblogger/ui/struts2/admin/GlobalConfig.java
@@ -38,7 +38,7 @@ import org.apache.roller.weblogger.pojos.GlobalPermission;
 import org.apache.roller.weblogger.pojos.RuntimeConfigProperty;
 import org.apache.roller.weblogger.pojos.Weblog;
 import org.apache.roller.weblogger.ui.struts2.util.UIAction;
-import org.apache.struts2.convention.annotation.AllowedMethods;
+import org.apache.roller.weblogger.util.Utilities;
 import org.apache.struts2.interceptor.ParameterAware;
 import org.apache.struts2.interceptor.ServletRequestAware;
 
@@ -161,9 +161,6 @@ public class GlobalConfig extends UIAction implements 
ParameterAware, ServletReq
             updProp = getProperties().get(propName);
             incomingProp = this.getParameter(updProp.getName());
 
-            log.debug("Checking property [" + propName + "]");
-            log.debug("Request value is [" + incomingProp + "]");
-
             PropertyDef propertyDef = globalConfigDef.getPropertyDef( propName 
);
             if ( propertyDef == null) {
                 // we're only processing defined properties, i.e. ones shown 
in the UI
@@ -175,6 +172,7 @@ public class GlobalConfig extends UIAction implements 
ParameterAware, ServletReq
                 try {
                     Boolean.parseBoolean(incomingProp);
                     updProp.setValue(incomingProp);
+                    log.debug("Set boolean " + propName + " = " + 
incomingProp);
                 } catch ( Exception nfe ) {
                     String propDesc = bundle.getString( propertyDef.getKey() );
                     addError("ConfigForm.invalidBooleanProperty",
@@ -186,6 +184,7 @@ public class GlobalConfig extends UIAction implements 
ParameterAware, ServletReq
                 try {
                     Integer.parseInt(incomingProp);
                     updProp.setValue(incomingProp);
+                    log.debug("Set integer " + propName + " = " + 
incomingProp);
                 } catch ( NumberFormatException nfe ) {
                     String propDesc = bundle.getString( propertyDef.getKey() );
                     addError("ConfigForm.invalidIntegerProperty",
@@ -197,6 +196,7 @@ public class GlobalConfig extends UIAction implements 
ParameterAware, ServletReq
                 try {
                     Float.parseFloat(incomingProp);
                     updProp.setValue(incomingProp);
+                    log.debug("Set float " + propName + " = " + incomingProp);
                 } catch ( NumberFormatException nfe ) {
                     String propDesc = bundle.getString( propertyDef.getKey() );
                     addError("ConfigForm.invalidFloatProperty",
@@ -205,6 +205,7 @@ public class GlobalConfig extends UIAction implements 
ParameterAware, ServletReq
 
             } else if ( incomingProp != null ){
                 updProp.setValue( incomingProp.trim() );
+                log.debug("Set something " + propName + " = " + incomingProp);
 
             } else if ( propertyDef.getName().equals("users.comments.plugins") 
) {
                 // not a problem
@@ -252,7 +253,7 @@ public class GlobalConfig extends UIAction implements 
ParameterAware, ServletReq
             log.debug("Parameter map:");
 
             for (Map.Entry<String, String[]> entry : parameters.entrySet()) {
-                log.debug(entry.getKey() + " = " + entry.getValue());
+                log.debug(entry.getKey() + " = " + 
Utilities.stringArrayToString(entry.getValue(),","));
             }
         }
     }
@@ -274,6 +275,9 @@ public class GlobalConfig extends UIAction implements 
ParameterAware, ServletReq
 
     public void setProperties(Map<String, RuntimeConfigProperty> properties) {
         this.properties = properties;
+        for (Map.Entry<String, RuntimeConfigProperty> entry : 
properties.entrySet()) {
+            log.debug("Got " + entry.getKey() + " = " + 
entry.getValue().getValue());
+        }
     }
 
     public ConfigDef getGlobalConfigDef() {

http://git-wip-us.apache.org/repos/asf/roller/blob/e83e5f81/app/src/main/resources/ApplicationResources.properties
----------------------------------------------------------------------
diff --git a/app/src/main/resources/ApplicationResources.properties 
b/app/src/main/resources/ApplicationResources.properties
index 82e5ae1..c522cd9 100644
--- a/app/src/main/resources/ApplicationResources.properties
+++ b/app/src/main/resources/ApplicationResources.properties
@@ -310,10 +310,10 @@ commentServlet.email.thereAreErrorMessages=This comment 
failed validation for th
 
 configForm.title=Roller Configuration
 configForm.subtitle=Change site-wide configuration settings.
-configForm.prompt=Changes you make here apply to the entire site. Note that \
-these are <i>runtime</i> properties only. Please refer to the Roller 
documentation \
-for information on overriding Roller''s <i>startup</i> properties (in the \
-roller.properties file).
+configForm.prompt=<p>Make the changes you wish and then use the <b>Save</b> 
button below. \
+Changes you make here apply to the entire site.<p> \
+<p>Note that there is also a Roller configuration file that contains 
additional settings. \
+Talk to your systems administrator or refer to the Roller documentation for 
more information.</p>
 
 configForm.siteSettings=Site Settings
 configForm.siteName=Site Name (for main page and RSS feed)

http://git-wip-us.apache.org/repos/asf/roller/blob/e83e5f81/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
----------------------------------------------------------------------
diff --git a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp 
b/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
index 3f668c4..d9f8f11 100644
--- a/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
+++ b/app/src/main/webapp/WEB-INF/jsps/admin/GlobalConfig.jsp
@@ -21,7 +21,7 @@
 <p><s:text name="configForm.prompt"/></p>
 
 
-<s:form action="globalConfig!save" theme="bootstrap" 
cssClass="form-horizontal">
+<s:form action="globalConfig!save" theme="bootstrap" cssClass="form-vertical">
 
     <s:hidden name="salt"/>
 
@@ -31,64 +31,72 @@
 
         <s:iterator var="pd" value="#dg.propertyDefs">
 
-            <%-- special condition for comment plugins --%>
+            <%-- special case for comment plugins --%>
             <s:if test="#pd.name == 'users.comments.plugins'">
                 <s:checkboxlist label="%{getText(#pd.key)}" 
name="commentPlugins"
-                                list="pluginsList" listKey="id" 
listValue="name"/>
+                                list="pluginsList" listKey="id" value="name" 
listValue="name" />
             </s:if>
 
-            <%-- special condition for front page blog --%>
+            <%-- special case for front page blog --%>
             <s:elseif test="#pd.name == 'site.frontpage.weblog.handle'">
-                <s:select name="%{#pd.name}" label="%{getText(#pd.key)}"
-                          list="weblogs" listKey="handle" listValue="name"/>
+                <s:select name="%{#pd.name}" label="%{getText(#pd.key)}" 
value="%{properties[#pd.name].value}"
+                          list="weblogs" listKey="handle" listValueKey="name" 
/>
             </s:elseif>
 
             <%-- "string" type means use a simple textbox --%>
             <s:elseif test="#pd.type == 'string'">
                 <s:textfield name="%{#pd.name}" label="%{getText(#pd.key)}" 
size="35"
-                             value="%{properties[#pd.name].value}"/>
+                             value="%{properties[#pd.name].value} "/>
             </s:elseif>
 
             <%-- "text" type means use a full textarea --%>
             <s:elseif test="#pd.type == 'text'">
                 <s:textarea name="%{#pd.name}" label="%{getText(#pd.key)}" 
rows="#pd.rows" cols="#pd.cols"
-                            value="%{properties[#pd.name].value}"/>
+                            value="%{properties[#pd.name].value} "/>
             </s:elseif>
 
             <%-- "boolean" type means use a checkbox --%>
             <s:elseif test="#pd.type == 'boolean'">
+
                 <s:if test="properties[#pd.name].value == 'true'">
-                    <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}" 
checked="checked" />
+                    <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}" 
cssClass="boolean"
+                        fieldValue="true" checked="true" 
onchange="formChanged()" />
                 </s:if>
-                <s:if test="properties[#pd.name].value == 'false'">
-                    <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}" 
/>
+                <s:if test="properties[#pd.name].value != 'true'">
+                    <s:checkbox name="%{#pd.name}" label="%{getText(#pd.key)}" 
cssClass="boolean"
+                        fieldValue="false" onchange="formChanged()" />
                 </s:if>
+
             </s:elseif>
 
+            <%-- "integer" use input type number --%>
             <s:elseif test="#pd.type == 'integer'">
                 <div class="form-group ">
-                    <label class="col-sm-3 control-label"
+                    <label class="control-label"
                         for='globalConfig_<s:property 
value="#pd.nameWithUnderbars" />'>
                         <s:text name="%{#pd.key}"/>
                     </label>
-                    <div class="col-sm-9 controls">
-                        <input type="number" name='<s:property 
value="#pd.name" />'
-                            size="35" value="30" id='globalConfig_<s:property 
value="#pd.nameWithUnderbars" />'
-                            class="form-control integer" 
onkeyup="formChanged()" />
+                    <div class="controls">
+                        <input type="number" name='<s:property 
value="#pd.name" />' size="35"
+                                value='<s:property 
value="%{properties[#pd.name].value}"/>'
+                                id='globalConfig_<s:property 
value="#pd.nameWithUnderbars" />'
+                                class="form-control integer" 
onkeyup="formChanged()" />
                     </div>
                 </div>
             </s:elseif>
 
+            <%-- "float" use input type number --%>
             <s:elseif test="#pd.type == 'float'">
                 <div class="form-group ">
-                    <label class="col-sm-3 control-label"
+                    <label class="control-label"
                         for='globalConfig_<s:property 
value="#pd.nameWithUnderbars" />'>
                         <s:text name="%{#pd.key}"/>
                     </label>
-                    <div class="col-sm-9 controls">
-                        <input type="number" name='<s:property 
value="#pd.name" />'
-                            size="35" value="30" id='globalConfig_<s:property 
value="#pd.nameWithUnderbars" />'
-                            class="form-control float" onkeyup="formChanged()" 
/>
+                    <div class="controls">
+                        <input type="number" name='<s:property 
value="#pd.name" />' size="5"
+                                value='<s:property 
value="properties[#pd.name].value"/>'
+                                id='globalConfig_<s:property 
value="#pd.nameWithUnderbars" />'
+                                class="form-control float" 
onkeyup="formChanged()" />
                     </div>
                 </div>
             </s:elseif>
@@ -110,28 +118,41 @@
 <script type="text/javascript">
 
     function formChanged() {
-
         var saveBookmarkButton = $('#saveButton:first');
-
         var error = false;
 
         $("input").each( function() {
-
             var isInteger = $(this).hasClass("integer");
+            var isFloat = $(this).hasClass("float");
+            var isBoolean = $(this).hasClass("boolean");
 
-            if ( $(this).attr("type") == "number") {
+          if ( isInteger || isFloat )  {
 
-                if ( isNaN( this.valueAsNumber )) {
-                    $(this).css("background", "#FBB")
-                    error = true;
+              if ( isNaN( this.valueAsNumber )) {
+                  $(this).css("background", "#FBB")
+                  error = true;
+
+              } else if ( isInteger && !Number.isInteger( this.valueAsNumber ) 
) {
+                  $(this).css("background", "#FBB")
+                  error = true;
+
+              } else {
+                  $(this).css("background", "white")
+              }
 
-                } else if ( isInteger && !Number.isInteger( this.valueAsNumber 
) ) {
+            } else if (isFloat)  {
+
+                if ( isNaN( this.valueAsNumber )) {
                     $(this).css("background", "#FBB")
                     error = true;
 
                 } else {
                     $(this).css("background", "white")
                 }
+
+            } else if (isBoolean) {
+                // not sure why this is necessary, value does not track 
checked state?
+                $(this).prop("value", !(!$(this).prop("checked")));
             }
 
         });

Reply via email to