This is an automated email from the ASF dual-hosted git repository.

smolnar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new 3af43b73c KNOX-2896 - API services view on Knox Home page can be 
selected (#795)
3af43b73c is described below

commit 3af43b73cef94481679ec42157a0a07d227f586f
Author: Sandor Molnar <[email protected]>
AuthorDate: Tue Sep 19 13:32:02 2023 +0200

    KNOX-2896 - API services view on Knox Home page can be selected (#795)
    
    The default view is the 'old' list view which belongs to v1. If end-users 
want the most recent modal-window style, they will need to use v2 as 
gateway.api.services.view.version in gateway-site.xml.
---
 .../gateway/config/impl/GatewayConfigImpl.java     |  8 +++++
 .../service/metadata/KnoxMetadataResource.java     |  2 +-
 .../service/metadata/TopologyInformation.java      | 11 +++++++
 .../metadata/TopologyInformationWrapper.java       |  3 +-
 .../org/apache/knox/gateway/GatewayTestConfig.java |  6 ++++
 .../apache/knox/gateway/config/GatewayConfig.java  |  8 +++++
 knox-homepage-ui/angular.json                      |  3 ++
 knox-homepage-ui/home/app/app.module.ts            |  2 ++
 .../topologies/topology.information.component.html | 36 ++++++++++++++++++++--
 .../home/app/topologies/topology.information.ts    |  1 +
 knox-homepage-ui/package-lock.json                 | 11 +++++--
 knox-homepage-ui/package.json                      |  1 +
 12 files changed, 86 insertions(+), 6 deletions(-)

diff --git 
a/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java
 
b/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java
index e3f4847ed..5663aaf34 100644
--- 
a/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java
+++ 
b/gateway-server/src/main/java/org/apache/knox/gateway/config/impl/GatewayConfigImpl.java
@@ -302,6 +302,8 @@ public class GatewayConfigImpl extends Configuration 
implements GatewayConfig {
   private static final String KNOX_HOMEPAGE_PROFILE_PREFIX =  
"knox.homepage.profile.";
   private static final String KNOX_HOMEPAGE_PINNED_TOPOLOGIES =  
"knox.homepage.pinned.topologies";
   private static final String KNOX_HOMEPAGE_HIDDEN_TOPOLOGIES =  
"knox.homepage.hidden.topologies";
+  private static final String KNOX_HOMEPAGE_API_SERVICES_VIEW_VERSION = 
"knox.homepage.api.services.view.version";
+
   private static final Set<String> KNOX_HOMEPAGE_HIDDEN_TOPOLOGIES_DEFAULT = 
new HashSet<>(Arrays.asList("admin", "manager", "knoxsso", "metadata", 
"homepage"));
   private static final String KNOX_HOMEPAGE_LOGOUT_ENABLED =  
"knox.homepage.logout.enabled";
   private static final String GLOBAL_LOGOUT_PAGE_URL = 
"knox.global.logout.page.url";
@@ -1325,6 +1327,11 @@ public class GatewayConfigImpl extends Configuration 
implements GatewayConfig {
     return pinnedTopologies == null ? Collections.emptySet() : new 
HashSet<>(pinnedTopologies);
   }
 
+  @Override
+  public String getApiServicesViewVersionOnHomepage() {
+    return getTrimmed(KNOX_HOMEPAGE_API_SERVICES_VIEW_VERSION, 
DEFAULT_API_SERVICES_VIEW_VERSION);
+  }
+
   /**
    * @return returns whether know token permissive failure is enabled
    */
@@ -1481,4 +1488,5 @@ public class GatewayConfigImpl extends Configuration 
implements GatewayConfig {
   public boolean isAsyncSupported() {
     return getBoolean(GATEWAY_SERVLET_ASYNC_SUPPORTED, 
GATEWAY_SERVLET_ASYNC_SUPPORTED_DEFAULT);
   }
+
 }
diff --git 
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/KnoxMetadataResource.java
 
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/KnoxMetadataResource.java
index 591d2daf1..ec826c62b 100644
--- 
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/KnoxMetadataResource.java
+++ 
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/KnoxMetadataResource.java
@@ -242,7 +242,7 @@ public class KnoxMetadataResource {
               }
             });
           });
-          topologies.addTopology(topology.getName(), 
isPinnedTopology(topology.getName(), config), new TreeSet<>(apiServices), new 
TreeSet<>(uiServices));
+          topologies.addTopology(topology.getName(), 
isPinnedTopology(topology.getName(), config), 
config.getApiServicesViewVersionOnHomepage(), new TreeSet<>(apiServices), new 
TreeSet<>(uiServices));
         }
       }
     }
diff --git 
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformation.java
 
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformation.java
index c544f77a0..7bfb0c649 100644
--- 
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformation.java
+++ 
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformation.java
@@ -32,6 +32,9 @@ public class TopologyInformation implements 
Comparable<TopologyInformation>{
   @XmlElement(name = "pinned")
   private boolean pinned;
 
+  @XmlElement(name = "apiServicesViewVersion")
+  private String apiServicesViewVersion;
+
   @XmlElement(name = "service")
   @XmlElementWrapper(name = "apiServices")
   private Set<ServiceModel> apiServices;
@@ -56,6 +59,14 @@ public class TopologyInformation implements 
Comparable<TopologyInformation>{
     this.pinned = pinned;
   }
 
+  public void setApiServicesViewVersion(String apiServicesViewVersion) {
+    this.apiServicesViewVersion = apiServicesViewVersion;
+  }
+
+  public String getApiServicesViewVersion() {
+    return apiServicesViewVersion;
+  }
+
   public Set<ServiceModel> getApiServices() {
     return apiServices;
   }
diff --git 
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformationWrapper.java
 
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformationWrapper.java
index 5613b9fd4..f27a25673 100644
--- 
a/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformationWrapper.java
+++ 
b/gateway-service-metadata/src/main/java/org/apache/knox/gateway/service/metadata/TopologyInformationWrapper.java
@@ -36,12 +36,13 @@ public class TopologyInformationWrapper {
     return topologies;
   }
 
-  public void addTopology(String name, boolean pinned, Set<ServiceModel> 
apiServices, Set<ServiceModel> uiServices) {
+  public void addTopology(String name, boolean pinned, String 
apiServicesViewVersion, Set<ServiceModel> apiServices, Set<ServiceModel> 
uiServices) {
     final TopologyInformation topology = new TopologyInformation();
     topology.setTopologyName(name);
     topology.setPinned(pinned);
     topology.setApiServices(apiServices);
     topology.setUiServices(uiServices);
+    topology.setApiServicesViewVersion(apiServicesViewVersion);
     this.topologies.add(topology);
   }
 
diff --git 
a/gateway-spi-common/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
 
b/gateway-spi-common/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
index 64c4e4366..f34a83cc4 100644
--- 
a/gateway-spi-common/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
+++ 
b/gateway-spi-common/src/main/java/org/apache/knox/gateway/GatewayTestConfig.java
@@ -911,6 +911,11 @@ public class GatewayTestConfig extends Configuration 
implements GatewayConfig {
     return Collections.emptySet();
   }
 
+  @Override
+  public String getApiServicesViewVersionOnHomepage() {
+    return DEFAULT_API_SERVICES_VIEW_VERSION;
+  }
+
   /**
    * @return returns whether know token permissive failure is enabled
    */
@@ -1051,4 +1056,5 @@ public class GatewayTestConfig extends Configuration 
implements GatewayConfig {
   public boolean isAsyncSupported() {
     return false;
   }
+
 }
diff --git 
a/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java 
b/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java
index 8de39010c..7c37a96c4 100644
--- 
a/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java
+++ 
b/gateway-spi/src/main/java/org/apache/knox/gateway/config/GatewayConfig.java
@@ -113,6 +113,8 @@ public interface GatewayConfig {
 
   int DEFAULT_CM_SERVICE_DISCOVERY_MAX_RETRY_ATTEMPTS = 3;
 
+  String DEFAULT_API_SERVICES_VIEW_VERSION = "v1";
+
   /**
    * The location of the gateway configuration.
    * Subdirectories will be: topologies
@@ -793,6 +795,11 @@ public interface GatewayConfig {
    */
   Set<String> getPinnedTopologiesOnHomepage();
 
+  /**
+   * @return the API services view version (v1/v2) on Knox homepage
+   */
+  String getApiServicesViewVersionOnHomepage();
+
   /**
    * @return returns whether know token permissive validation is enabled
    */
@@ -879,4 +886,5 @@ public interface GatewayConfig {
    * @return true if the async supported flag is enabled in jetty gateway 
servlet; false otherwise (defaults to false)
    */
   boolean isAsyncSupported();
+
 }
diff --git a/knox-homepage-ui/angular.json b/knox-homepage-ui/angular.json
index b6fbb6253..2e90da621 100644
--- a/knox-homepage-ui/angular.json
+++ b/knox-homepage-ui/angular.json
@@ -58,6 +58,8 @@
           },
           "configurations": {
             "production": {
+              "buildOptimizer": false,
+              "aot": false,
               "fileReplacements": [
                 {
                   "replace": "home/environments/environment.ts",
@@ -68,6 +70,7 @@
             },
             "development": {
               "buildOptimizer": false,
+              "aot": false,
               "optimization": false,
               "vendorChunk": true,
               "extractLicenses": false,
diff --git a/knox-homepage-ui/home/app/app.module.ts 
b/knox-homepage-ui/home/app/app.module.ts
index 87aa93efb..79019acd3 100644
--- a/knox-homepage-ui/home/app/app.module.ts
+++ b/knox-homepage-ui/home/app/app.module.ts
@@ -15,6 +15,7 @@
  * limitations under the License.
  */
 import {NgModule} from '@angular/core';
+import {DataTableModule} from 'angular2-datatable';
 import {BrowserModule} from '@angular/platform-browser';
 import {HttpClientModule, HttpClientXsrfModule} from '@angular/common/http';
 import {MatGridListModule} from '@angular/material/grid-list';
@@ -31,6 +32,7 @@ import {HomepageService} from './homepage.service';
     imports: [BrowserModule,
         HttpClientModule,
         HttpClientXsrfModule,
+        DataTableModule,
         MatGridListModule,
         BsModalModule,
         RouterModule.forRoot([])
diff --git 
a/knox-homepage-ui/home/app/topologies/topology.information.component.html 
b/knox-homepage-ui/home/app/topologies/topology.information.component.html
index 281ce60df..9086f087b 100644
--- a/knox-homepage-ui/home/app/topologies/topology.information.component.html
+++ b/knox-homepage-ui/home/app/topologies/topology.information.component.html
@@ -53,10 +53,42 @@
             </mat-grid-tile>
         </mat-grid-list>
 
+        <!-- API services -->
+
         <h5 *ngIf="topology.apiServices.service.length > 0">API Services</h5>
 
-        <!-- API services -->
-        <mat-grid-list cols="4" rowHeight="130px">
+        <table *ngIf="topology.apiServicesViewVersion === 'v1'" class="table 
table-hover" [mfData]="topology.apiServices.service" #api="mfDataTable" 
[mfRowsOnPage]="5">
+            <colgroup>
+                <col width="30%">
+                <col width="70%">
+            </colgroup>
+            <thead>
+                <tr *ngIf="topology.apiServices.service.length === 0"><th 
colspan="2">No API services found</th></tr>
+                <tr *ngIf="topology.apiServices.service.length > 0"><th 
colspan="2">API services</th></tr>
+            </thead>
+            <tbody>
+                <tr *ngFor="let service of api.data">
+                    <td>
+                        <span class="inline-glyph glyphicon 
glyphicon-info-sign btn btn-xs"
+                        title="{{service.description}}"
+                        data-toggle="tooltip"></span>
+                        {{service.shortDesc}} <span class="small" 
*ngIf="service.version">(v{{service.version}})</span>
+                    </td>
+                    <td>
+                        <a 
href="{{service.serviceUrl}}">{{service.serviceUrl}}</a>
+                    </td>
+                </tr>
+            </tbody>
+            <tfoot>
+                <tr>
+                    <td colspan="4">
+                      <mfBootstrapPaginator 
[rowsOnPageSet]="[5,10,15]"></mfBootstrapPaginator>
+                    </td>
+                </tr>
+            </tfoot>
+        </table>
+
+        <mat-grid-list *ngIf="topology.apiServicesViewVersion === 'v2'" 
cols="4" rowHeight="130px">
             <mat-grid-tile *ngFor="let service of 
topology.apiServices.service" [colspan]="1" [rowspan]="1">
                 <span *ngIf="!this['enableServiceText_' + 
service.serviceName.toLowerCase()]" 
(click)="openApiServiceInformationModal(service)">
                     <img 
src="assets/service-logos/{{service.serviceName.toLowerCase()}}.png" 
height="50px" (error)="enableServiceText('enableServiceText_' + 
service.serviceName.toLowerCase())"/>
diff --git a/knox-homepage-ui/home/app/topologies/topology.information.ts 
b/knox-homepage-ui/home/app/topologies/topology.information.ts
index 5bb00a0a4..dabd4c8e2 100644
--- a/knox-homepage-ui/home/app/topologies/topology.information.ts
+++ b/knox-homepage-ui/home/app/topologies/topology.information.ts
@@ -19,6 +19,7 @@ import {Service} from './service';
 export class TopologyInformation {
     topology: string;
     pinned: boolean;
+    apiServicesViewVersion: string;
     apiServices: Service[];
     uiServices: Service[];
 }
diff --git a/knox-homepage-ui/package-lock.json 
b/knox-homepage-ui/package-lock.json
index 47056ec43..ea3192d69 100644
--- a/knox-homepage-ui/package-lock.json
+++ b/knox-homepage-ui/package-lock.json
@@ -2967,6 +2967,14 @@
       "integrity": 
"sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
       "dev": true
     },
+    "angular2-datatable": {
+      "version": "0.6.0",
+      "resolved": 
"https://registry.npmjs.org/angular2-datatable/-/angular2-datatable-0.6.0.tgz";,
+      "integrity": 
"sha512-Fgg3hg3Pyg80Tp21Fu9qzsj9yx4941cIbbWpbKHJlQua5eketQPAp+yEbnz0KnaMprlpQg5IBe6xdIAg1G6aCQ==",
+      "requires": {
+        "lodash": "^4.0.0"
+      }
+    },
     "ansi-colors": {
       "version": "4.1.1",
       "resolved": 
"https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz";,
@@ -6291,8 +6299,7 @@
     "lodash": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz";,
-      "integrity": 
"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
+      "integrity": 
"sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
     },
     "lodash.debounce": {
       "version": "4.0.8",
diff --git a/knox-homepage-ui/package.json b/knox-homepage-ui/package.json
index 3e69cda28..5ebcec334 100644
--- a/knox-homepage-ui/package.json
+++ b/knox-homepage-ui/package.json
@@ -21,6 +21,7 @@
     "@angular/platform-browser": "^13.0.1",
     "@angular/platform-browser-dynamic": "^13.0.1",
     "@angular/router": "^13.0.1",
+    "angular2-datatable": "^0.6.0",
     "bootstrap": "^3.4.1",
     "core-js": "^2.6.11",
     "jquery": "^3.5.1",

Reply via email to