Explorar o código

wordlist configmanager display fixes

Jason Rivard %!s(int64=7) %!d(string=hai) anos
pai
achega
103a37f2cd

+ 57 - 45
server/src/main/java/password/pwm/http/servlet/configmanager/ConfigManagerWordlistServlet.java

@@ -23,6 +23,8 @@
 package password.pwm.http.servlet.configmanager;
 
 import com.novell.ldapchai.exception.ChaiUnavailableException;
+import lombok.Builder;
+import lombok.Value;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import password.pwm.PwmApplication;
 import password.pwm.PwmConstants;
@@ -32,6 +34,7 @@ import password.pwm.error.PwmUnrecoverableException;
 import password.pwm.http.HttpMethod;
 import password.pwm.http.JspUrl;
 import password.pwm.http.PwmRequest;
+import password.pwm.http.bean.DisplayElement;
 import password.pwm.http.servlet.AbstractPwmServlet;
 import password.pwm.i18n.Message;
 import password.pwm.svc.wordlist.StoredWordlistDataBean;
@@ -48,11 +51,11 @@ import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.text.NumberFormat;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.List;
 
 @WebServlet(
         name = "ConfigManagerWordlistServlet",
@@ -199,7 +202,6 @@ public class ConfigManagerWordlistServlet extends AbstractPwmServlet
             throws IOException
     {
         final LinkedHashMap<WordlistType, WordlistDataBean> outputData = new LinkedHashMap<>();
-        final NumberFormat numberFormat = NumberFormat.getInstance( pwmRequest.getLocale() );
 
         for ( final WordlistType wordlistType : WordlistType.values() )
         {
@@ -207,81 +209,91 @@ public class ConfigManagerWordlistServlet extends AbstractPwmServlet
             final StoredWordlistDataBean storedWordlistDataBean = wordlist.readMetadata();
             final WordlistConfiguration wordlistConfiguration = wordlistType.forType( pwmRequest.getPwmApplication() ).getConfiguration();
 
-            final WordlistDataBean wordlistDataBean = new WordlistDataBean();
+            final WordlistDataBean.WordlistDataBeanBuilder builder = WordlistDataBean.builder();
             {
-                final Map<String, String> presentableValues = new LinkedHashMap<>();
-                presentableValues.put( "Population Status", storedWordlistDataBean.isCompleted() ? "Completed" : "In-Progress" );
-                presentableValues.put( "List Source", storedWordlistDataBean.getSource() == null
-                        ? StoredWordlistDataBean.Source.BuiltIn.getLabel()
-                        : storedWordlistDataBean.getSource().getLabel() );
+                final List<DisplayElement> presentableValues = new ArrayList<>();
+                presentableValues.add( new DisplayElement(
+                        wordlistType.name() + "_populationStatus",
+                        DisplayElement.Type.string,
+                        "Population Status",
+                        storedWordlistDataBean.isCompleted() ? "Completed" : "In-Progress" ) );
+                presentableValues.add( new DisplayElement(
+                        wordlistType.name() + "_listSource",
+                        DisplayElement.Type.string, "List Source",
+                        storedWordlistDataBean.getSource() == null
+                                ? StoredWordlistDataBean.Source.BuiltIn.getLabel()
+                                : storedWordlistDataBean.getSource().getLabel() ) );
                 if ( wordlistConfiguration.getAutoImportUrl() != null )
                 {
-                    presentableValues.put( "Configured Source URL", wordlistConfiguration.getAutoImportUrl() );
+                    presentableValues.add( new DisplayElement(
+                            wordlistType.name() + "_sourceURL",
+                            DisplayElement.Type.string,
+                            "Configured Source URL",
+                            wordlistConfiguration.getAutoImportUrl() ) );
                 }
 
+                presentableValues.add( new DisplayElement(
+                        wordlistType.name() + "_wordCount",
+                        DisplayElement.Type.number,
+                        "Word Count",
+                        Integer.toString( storedWordlistDataBean.getSize() ) ) );
+
                 if ( storedWordlistDataBean.isCompleted() )
                 {
-                    presentableValues.put( "Word Count", numberFormat.format( storedWordlistDataBean.getSize() ) );
+
                     if ( StoredWordlistDataBean.Source.BuiltIn != storedWordlistDataBean.getSource() )
                     {
-                        presentableValues.put( "Population Timestamp", JavaHelper.toIsoDate( storedWordlistDataBean.getStoreDate() ) );
+                        presentableValues.add( new DisplayElement(
+                                wordlistType.name() + "_populationTimestamp",
+                                DisplayElement.Type.string,
+                                "Population Timestamp",
+                                JavaHelper.toIsoDate( storedWordlistDataBean.getStoreDate() ) ) );
                     }
-                    presentableValues.put( "SHA1 Checksum Hash", storedWordlistDataBean.getSha1hash() );
+                    presentableValues.add( new DisplayElement(
+                            wordlistType.name() + "_sha1Hash",
+                            DisplayElement.Type.string,
+                            "SHA1 Checksum Hash",
+                            storedWordlistDataBean.getSha1hash() ) );
                 }
                 if ( wordlist.getAutoImportError() != null )
                 {
-                    presentableValues.put( "Error During Import", wordlist.getAutoImportError().getDetailedErrorMsg() );
-                    presentableValues.put( "Last Import Attempt", JavaHelper.toIsoDate( wordlist.getAutoImportError().getDate() ) );
+                    presentableValues.add( new DisplayElement(
+                            wordlistType.name() + "_lastImportError",
+                            DisplayElement.Type.string,
+                            "Error During Import",
+                            wordlist.getAutoImportError().getDetailedErrorMsg() ) );
+                    presentableValues.add( new DisplayElement(
+                            wordlistType.name() + "_lastImportAttempt",
+                            DisplayElement.Type.string,
+                            "Last Import Attempt",
+                            JavaHelper.toIsoDate( wordlist.getAutoImportError().getDate() ) ) );
                 }
-                wordlistDataBean.getPresentableData().putAll( presentableValues );
+                builder.presentableData( Collections.unmodifiableList( presentableValues ) );
             }
 
             if ( storedWordlistDataBean.isCompleted() )
             {
                 if ( wordlistConfiguration.getAutoImportUrl() == null )
                 {
-                    wordlistDataBean.setAllowUpload( true );
+                    builder.allowUpload( true );
                 }
                 if ( wordlistConfiguration.getAutoImportUrl() != null || storedWordlistDataBean.getSource() != StoredWordlistDataBean.Source.BuiltIn )
                 {
-                    wordlistDataBean.setAllowClear( true );
+                    builder.allowClear( true );
                 }
             }
-            outputData.put( wordlistType, wordlistDataBean );
+            outputData.put( wordlistType, builder.build() );
         }
         pwmRequest.outputJsonResult( RestResultBean.withData( outputData ) );
     }
 
+    @Value
+    @Builder
     public static class WordlistDataBean implements Serializable
     {
-        private Map<String, String> presentableData = new LinkedHashMap<>();
+        private List<DisplayElement> presentableData;
         private boolean allowUpload;
         private boolean allowClear;
-
-        public Map<String, String> getPresentableData( )
-        {
-            return presentableData;
-        }
-
-        public boolean isAllowUpload( )
-        {
-            return allowUpload;
-        }
-
-        public void setAllowUpload( final boolean allowUpload )
-        {
-            this.allowUpload = allowUpload;
-        }
-
-        public boolean isAllowClear( )
-        {
-            return allowClear;
-        }
-
-        public void setAllowClear( final boolean allowClear )
-        {
-            this.allowClear = allowClear;
-        }
     }
 }
 

+ 1 - 0
webapp/src/main/webapp/WEB-INF/jsp/fragment/admin-nav.jsp

@@ -27,6 +27,7 @@
 
 <%@ taglib uri="pwm" prefix="pwm" %>
 <% final AdminServlet.Page currentPage = AdminServlet.Page.forUrl(JspUtility.getPwmRequest(pageContext).getURL()); %>
+<pwm:script-ref url="/public/resources/js/uilibrary.js"/>
 <pwm:script-ref url="/public/resources/js/admin.js"/>
 <pwm:script>
     <script type="text/javascript">

+ 2 - 12
webapp/src/main/webapp/public/resources/js/admin.js

@@ -216,19 +216,9 @@ PWM_ADMIN.refreshReportDataStatus=function() {
     var loadFunction = function(data) {
         if (data['data'] && data['data']['presentable']) {
             var fields = data['data']['presentable'];
-            var htmlTable = '';
-            for (var field in fields) {(function(field){
-                var fieldData = fields[field];
-                htmlTable += '<tr><td>' + fieldData['label'] + '</td><td><span id="report_status_' + fieldData['key']  + '"</tr>';
-            }(field)); }
+            var htmlTable = UILibrary.displayElementsToTableContents(fields);
             PWM_MAIN.getObject('statusTable').innerHTML = htmlTable;
-            for (var field in fields) {(function(field) {
-                var fieldData = fields[field];
-                PWM_MAIN.getObject('report_status_' + fieldData['key']).innerHTML = fieldData['value'];
-                if (fieldData['type'] === 'timestamp') {
-                    PWM_MAIN.TimestampHandler.initElement(PWM_MAIN.getObject("report_status_" + fieldData['key']));
-                }
-            }(field)); }
+            UILibrary.initElementsToTableContents(fields);
         }
 
         var availableCommands = data['data']['availableCommands'];

+ 10 - 14
webapp/src/main/webapp/public/resources/js/configmanager.js

@@ -405,21 +405,11 @@ PWM_CONFIG.initConfigManagerWordlistPage = function() {
         clearWordlist('SEEDLIST', 'Seedlist');
     });
 
-    setInterval(refreshWordlistInfoTables, 5000);
-    refreshWordlistInfoTables();
-
     function refreshWordlistInfoTables() {
         var makeTableData = function (tableData, title) {
             var outputHtml = '';
             outputHtml += '<tr><td colspan="2" class="title">' + title + '</td></tr>';
-            for (var iter in tableData) {
-                (function (label) {
-                    var value = tableData[label];
-                    outputHtml += '<tr><td class="key">' + label + '</td><td class="';
-                    PWM_MAIN.TimestampHandler.testIfStringIsTimestamp(value,function(){outputHtml += 'timestamp'});
-                    outputHtml += '">' + value + '</td></tr>';
-                })(iter);
-            }
+            outputHtml += UILibrary.displayElementsToTableContents(tableData);
             return outputHtml;
         };
         var updateWordlistActionButtons = function (data) {
@@ -437,15 +427,18 @@ PWM_CONFIG.initConfigManagerWordlistPage = function() {
             PWM_MAIN.setStyle('MenuItem_ClearSeedlist','visibility', disabled ? 'hidden' : 'visible');
         };
         var dataHandler = function (data) {
+            var wordlistData = data['data']['WORDLIST']['presentableData'];
             PWM_MAIN.getObject('table-wordlistInfo').innerHTML = makeTableData(
-                data['data']['WORDLIST']['presentableData'],
+                wordlistData,
                 PWM_CONFIG.showString('Label_Wordlist')
             );
+            UILibrary.initElementsToTableContents(wordlistData);
+            var seedlistData = data['data']['SEEDLIST']['presentableData'];
             PWM_MAIN.getObject('table-seedlistInfo').innerHTML = makeTableData(
-                data['data']['SEEDLIST']['presentableData'],
+                seedlistData,
                 PWM_CONFIG.showString('Label_Seedlist')
             );
-            PWM_MAIN.TimestampHandler.initAllElements();
+            UILibrary.initElementsToTableContents(seedlistData);
             updateWordlistActionButtons(data['data']);
         };
         var errorHandler = function(data) {
@@ -453,6 +446,9 @@ PWM_CONFIG.initConfigManagerWordlistPage = function() {
         };
         PWM_MAIN.ajaxRequest('wordlists?processAction=readWordlistData', dataHandler,{errorFunction:errorHandler});
     }
+
+    setInterval(refreshWordlistInfoTables, 5000);
+    refreshWordlistInfoTables();
 };
 
 

+ 10 - 0
webapp/src/main/webapp/public/resources/js/main.js

@@ -2114,5 +2114,15 @@ PWM_MAIN.copyObject = function(input) {
     return JSON.parse(JSON.stringify(input));
 };
 
+PWM_MAIN.numberFormat = function (number) {
+    try {
+        return new Number(number).toLocaleString();
+    } catch (t) {
+        console.log('error localizing number value "' + number + '", error: ' + t);
+    }
+
+    return number;
+};
+
 PWM_MAIN.pageLoadHandler();
 

+ 23 - 0
webapp/src/main/webapp/public/resources/js/uilibrary.js

@@ -791,3 +791,26 @@ UILibrary.passwordDialogPopup = function(options, state) {
 
 };
 
+UILibrary.displayElementsToTableContents = function(fields) {
+    var htmlTable = '';
+    for (var field in fields) {(function(field){
+        var fieldData = fields[field];
+        htmlTable += '<tr><td>' + fieldData['label'] + '</td><td><span id="report_status_' + fieldData['key']  + '"</tr>';
+    }(field)); }
+    return htmlTable;
+};
+
+UILibrary.initElementsToTableContents = function(fields) {
+    for (var field in fields) {(function(field) {
+        var fieldData = fields[field];
+        var value = fieldData['value'];
+        if (fieldData['type'] === 'number') {
+            value = PWM_MAIN.numberFormat(value);
+        }
+        PWM_MAIN.getObject('report_status_' + fieldData['key']).innerHTML = value;
+        if (fieldData['type'] === 'timestamp') {
+            PWM_MAIN.TimestampHandler.initElement(PWM_MAIN.getObject("report_status_" + fieldData['key']));
+        }
+    }(field)); }
+};
+