You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@submarine.apache.org by pi...@apache.org on 2021/10/15 18:34:14 UTC

[submarine] branch master updated: SUBMARINE-1048. Static model registry overview page

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0bca1ff  SUBMARINE-1048. Static model registry overview page
0bca1ff is described below

commit 0bca1ff4fdcaad459ea87f39e2f8ee9e3cacf416
Author: andybi7676 <an...@gmail.com>
AuthorDate: Sat Oct 16 00:20:07 2021 +0800

    SUBMARINE-1048. Static model registry overview page
    
    ### What is this PR for?
    Add static model page overview UI.
    
    ### What type of PR is it?
    [Improvement]
    
    ### Todos
    * [x] - model overview UI
    * [x] - search by name
    * [x] - filter by tags
    * [x] - shorten description if it is too long
    * [x] - link model card
    
    ### What is the Jira issue?
    https://issues.apache.org/jira/projects/SUBMARINE/issues/SUBMARINE-1048
    ### How should this be tested?
    checkout the model page.
    ### Screenshots (if appropriate)
    ![image](https://i.imgur.com/1Q5mkDU.gif)
    
    ### Questions:
    * Do the license files need updating? No
    * Are there breaking changes for older versions? No
    * Does this need new documentation? No
    
    Author: andybi7676 <an...@gmail.com>
    
    Signed-off-by: Kevin <pi...@apache.org>
    
    Closes #779 from andybi7676/SUBMARINE-1048 and squashes the following commits:
    
    916ba309 [andybi7676] SUBMARINE-1048. remove unnecessary
    2c5c3065 [andybi7676] SUBMARINE-1048. remove unnecessary
    27e14823 [andybi7676] SUBMARINE-1048. shorten description and link model card
    7e6707fc [andybi7676] SUBMARINE-1048. add static model page overview
    04c5468b [andybi7676] remove log
    90a10fcc [andybi7676] add search function for model UI
    862855a4 [andybi7676] model page UI
---
 .../model-info.ts}                                 | 30 ++-----
 .../model-card/model-card.component.html}          | 35 +++-----
 .../model-card/model-card.component.scss}          | 29 +------
 .../model-card/model-card.component.ts}            | 41 +++++-----
 .../model-cards/model-cards.component.html}        | 27 ++-----
 .../model-cards/model-cards.component.scss}        | 27 +------
 .../model-cards/model-cards.component.ts}          | 34 +++-----
 .../model/model-home/model-home.component.html     | 45 +++++++++++
 .../model-home.component.scss}                     | 27 +------
 .../model/model-home/model-home.component.ts       | 93 ++++++++++++++++++++++
 .../pages/workbench/model/model-routing.module.ts  |  6 ++
 .../app/pages/workbench/model/model.component.html | 38 ++++-----
 .../src/app/pages/workbench/model/model.module.ts  |  6 ++
 13 files changed, 235 insertions(+), 203 deletions(-)

diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts b/submarine-workbench/workbench-web/src/app/interfaces/model-info.ts
similarity index 59%
copy from submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
copy to submarine-workbench/workbench-web/src/app/interfaces/model-info.ts
index a98f32c..01b9f59 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
+++ b/submarine-workbench/workbench-web/src/app/interfaces/model-info.ts
@@ -17,26 +17,10 @@
  * under the License.
  */
 
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { ModelComponent } from './model.component';
-import { ModelVersionComponent } from './model-version/model-version.component';
-
-const routes: Routes = [
-  {
-    path: '',
-    component: ModelComponent,
-    children: [
-      {
-        path: ':name/:version',
-        component: ModelVersionComponent,
-      },
-    ],
-  },
-];
-
-@NgModule({
-  imports: [RouterModule.forChild(routes)],
-  exports: [RouterModule],
-})
-export class ModelRoutingModule {}
+export interface ModelInfo {
+  name: string;
+  createTime: string,
+  updatedTime: string, 
+  tags: string[],
+  description: string,
+}
\ No newline at end of file
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-card/model-card.component.html
similarity index 54%
copy from submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html
copy to submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-card/model-card.component.html
index 8343648..9b5f464 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-card/model-card.component.html
@@ -16,26 +16,15 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
   -->
-
-  <nz-layout style="margin: -24px -24px 16px">
-    <div style="background-color: white; padding-left: 30px; padding-top: 20px">
-      <nz-breadcrumb>
-        <nz-breadcrumb-item>
-          <a>Home</a>
-        </nz-breadcrumb-item>
-        <nz-breadcrumb-item>
-          <a [routerLink]="['/', 'workbench', 'model']" (click)="modelName = null">model</a>
-        </nz-breadcrumb-item>
-        <nz-breadcrumb-item *ngIf="modelName != null">
-          {{ modelName }}
-        </nz-breadcrumb-item>
-      </nz-breadcrumb>
-      <div *ngIf="modelName == null">
-        <br />
-        <h2>Model</h2>
-      </div>
-      <br />
-    </div>
-    <router-outlet></router-outlet>
-  </nz-layout>
-  
\ No newline at end of file
+<a [routerLink]="[card.name]">
+  <nz-list-item >
+    <nz-card style="width:300px;" nzTitle={{card.name}} [nzExtra]="extraTemplate">
+    <p>Created: {{card.createTime}}</p>
+    <p>Updated: {{card.updatedTime}}</p>
+    <p>Tags: 
+      <nz-tag *ngFor="let tag of card.tags">{{tag}}</nz-tag>
+    </p>
+    <p>Description: {{description}}</p>
+    </nz-card>
+  </nz-list-item>
+</a>
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-card/model-card.component.scss
similarity index 59%
copy from submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
copy to submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-card/model-card.component.scss
index a98f32c..af9019f 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-card/model-card.component.scss
@@ -1,4 +1,4 @@
-/*
+/*!
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -16,27 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { ModelComponent } from './model.component';
-import { ModelVersionComponent } from './model-version/model-version.component';
-
-const routes: Routes = [
-  {
-    path: '',
-    component: ModelComponent,
-    children: [
-      {
-        path: ':name/:version',
-        component: ModelVersionComponent,
-      },
-    ],
-  },
-];
-
-@NgModule({
-  imports: [RouterModule.forChild(routes)],
-  exports: [RouterModule],
-})
-export class ModelRoutingModule {}
+p {
+  margin: 0;
+}
\ No newline at end of file
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-card/model-card.component.ts
similarity index 57%
copy from submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
copy to submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-card/model-card.component.ts
index a98f32c..8a23c81 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-card/model-card.component.ts
@@ -17,26 +17,25 @@
  * under the License.
  */
 
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { ModelComponent } from './model.component';
-import { ModelVersionComponent } from './model-version/model-version.component';
+import { Component, Input, OnInit } from '@angular/core';
+import { ModelInfo } from '@submarine/interfaces/model-info';
+@Component({
+  selector: 'submarine-model-card',
+  templateUrl: './model-card.component.html',
+  styleUrls: ['./model-card.component.scss'],
+})
+export class ModelCardComponent implements OnInit {
+  @Input() card: ModelInfo;
+  description: string;
 
-const routes: Routes = [
-  {
-    path: '',
-    component: ModelComponent,
-    children: [
-      {
-        path: ':name/:version',
-        component: ModelVersionComponent,
-      },
-    ],
-  },
-];
+  constructor() {}
 
-@NgModule({
-  imports: [RouterModule.forChild(routes)],
-  exports: [RouterModule],
-})
-export class ModelRoutingModule {}
+  ngOnInit() {
+    if (this.card.description.length > 15) {
+      this.description = this.card.description.substring(0,15) + "...";
+    }
+    else {
+      this.description = this.card.description;
+    }
+  }
+}
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-cards.component.html
similarity index 55%
copy from submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html
copy to submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-cards.component.html
index 8343648..28958d9 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-cards.component.html
@@ -17,25 +17,10 @@
   ~ under the License.
   -->
 
-  <nz-layout style="margin: -24px -24px 16px">
-    <div style="background-color: white; padding-left: 30px; padding-top: 20px">
-      <nz-breadcrumb>
-        <nz-breadcrumb-item>
-          <a>Home</a>
-        </nz-breadcrumb-item>
-        <nz-breadcrumb-item>
-          <a [routerLink]="['/', 'workbench', 'model']" (click)="modelName = null">model</a>
-        </nz-breadcrumb-item>
-        <nz-breadcrumb-item *ngIf="modelName != null">
-          {{ modelName }}
-        </nz-breadcrumb-item>
-      </nz-breadcrumb>
-      <div *ngIf="modelName == null">
-        <br />
-        <h2>Model</h2>
-      </div>
-      <br />
+<nz-list nzGrid>
+  <div nz-row [nzGutter]="16">
+    <div nz-col [nzSpan]="6" *ngFor="let card of modelCards; let i = index">
+      <submarine-model-card [card]="card"></submarine-model-card>
     </div>
-    <router-outlet></router-outlet>
-  </nz-layout>
-  
\ No newline at end of file
+  </div>
+</nz-list>
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-cards.component.scss
similarity index 59%
copy from submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
copy to submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-cards.component.scss
index a98f32c..61d2115 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-cards.component.scss
@@ -1,4 +1,4 @@
-/*
+/*!
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -16,27 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { ModelComponent } from './model.component';
-import { ModelVersionComponent } from './model-version/model-version.component';
-
-const routes: Routes = [
-  {
-    path: '',
-    component: ModelComponent,
-    children: [
-      {
-        path: ':name/:version',
-        component: ModelVersionComponent,
-      },
-    ],
-  },
-];
-
-@NgModule({
-  imports: [RouterModule.forChild(routes)],
-  exports: [RouterModule],
-})
-export class ModelRoutingModule {}
+ 
\ No newline at end of file
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-cards.component.ts
similarity index 59%
copy from submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
copy to submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-cards.component.ts
index a98f32c..3c33a63 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-cards/model-cards.component.ts
@@ -17,26 +17,18 @@
  * under the License.
  */
 
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { ModelComponent } from './model.component';
-import { ModelVersionComponent } from './model-version/model-version.component';
+import { Component, Input, OnInit } from '@angular/core';
+import { ModelInfo } from '@submarine/interfaces/model-info';
+@Component({
+  selector: 'submarine-model-cards',
+  templateUrl: './model-cards.component.html',
+  styleUrls: ['./model-cards.component.scss'],
+})
+export class ModelCardsComponent implements OnInit {
+  @Input() modelCards: ModelInfo[];
 
-const routes: Routes = [
-  {
-    path: '',
-    component: ModelComponent,
-    children: [
-      {
-        path: ':name/:version',
-        component: ModelVersionComponent,
-      },
-    ],
-  },
-];
+  constructor() {}
 
-@NgModule({
-  imports: [RouterModule.forChild(routes)],
-  exports: [RouterModule],
-})
-export class ModelRoutingModule {}
+  ngOnInit() {
+  }
+}
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-home.component.html b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-home.component.html
new file mode 100644
index 0000000..c5dae9f
--- /dev/null
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-home.component.html
@@ -0,0 +1,45 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<div style="margin: 15px; padding: 15px; background-color: white">
+  <div align="right">
+    <button
+      nz-button
+      id="btn-newModel"
+      nzType="primary"
+      style="margin: 10px 4px 10px 4px"
+    >
+      <i nz-icon nzType="plus"></i>
+      New Model
+    </button>
+  </div>
+  <div align='left'>
+    <nz-input-group nzSearch style="width: 265px; margin: 10px 4px 10px 4px" [nzAddOnAfter]="suffixIconButton">
+      <input type="text" nz-input placeholder="Search by model name..." (keyup)="searchModel($event)" />
+    </nz-input-group>
+    <ng-template #suffixIconButton>
+      <button nz-button nzType="primary" nzSearch><i nz-icon nzType="search"></i></button>
+    </ng-template>
+    <nz-select nzMode="tags" style="width: 265px; margin: 10px 4px 10px 12px" nzPlaceHolder="Search by tags" [(ngModel)]="listOfChosenTags" (ngModelChange)="filterByTags()">
+      <nz-option *ngFor="let option of listOfTagsOption" [nzLabel]="option.label" [nzValue]="option.value"></nz-option>
+    </nz-select>
+  </div>
+  <submarine-model-cards [modelCards]="onDisplayModelCards"></submarine-model-cards>
+</div>
+  
\ No newline at end of file
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-home.component.scss
similarity index 59%
copy from submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
copy to submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-home.component.scss
index a98f32c..61d2115 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-home.component.scss
@@ -1,4 +1,4 @@
-/*
+/*!
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -16,27 +16,4 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-import { NgModule } from '@angular/core';
-import { RouterModule, Routes } from '@angular/router';
-import { ModelComponent } from './model.component';
-import { ModelVersionComponent } from './model-version/model-version.component';
-
-const routes: Routes = [
-  {
-    path: '',
-    component: ModelComponent,
-    children: [
-      {
-        path: ':name/:version',
-        component: ModelVersionComponent,
-      },
-    ],
-  },
-];
-
-@NgModule({
-  imports: [RouterModule.forChild(routes)],
-  exports: [RouterModule],
-})
-export class ModelRoutingModule {}
+ 
\ No newline at end of file
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-home.component.ts b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-home.component.ts
new file mode 100644
index 0000000..63429eb
--- /dev/null
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-home/model-home.component.ts
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Component, OnInit } from '@angular/core';
+import { ModelInfo } from '@submarine/interfaces/model-info';
+import { ExperimentService } from '@submarine/services/experiment.service';
+
+@Component({
+  selector: 'submarine-model-home',
+  templateUrl: './model-home.component.html',
+  styleUrls: ['./model-home.component.scss'],
+})
+export class ModelHomeComponent implements OnInit {
+  constructor(private experimentService: ExperimentService) {}
+
+  modelCards: ModelInfo[];
+
+  onDisplayModelCards = [];
+  
+  nameForFilter = "";
+  listOfTagsOption: Array<{ label: string; value: string }> = [];
+  listOfChosenTags = [];
+
+  ngOnInit() {
+    this.modelCards = [
+      {
+        'name': "Model One",
+        'createTime': "2021-10-12",
+        'updatedTime': "2021-10-13", 
+        'tags': ["image", 'text'],
+        'description': "first model",
+      }, 
+      {
+        'name': "Model Two",
+        'createTime': "2021-10-12",
+        'updatedTime': "2021-10-13", 
+        'tags': ["speech"],
+        'description': "second model",
+      },
+      {
+        'name': "Model Three",
+        'createTime': "2021-10-12",
+        'updatedTime': "2021-10-13", 
+        'tags': ["speech"],
+        'description': "The third model has very long description for description shorten testing, 1234567890 A recurrent neural network (RNN) is a class of artificial neural networks where connections between nodes form a directed graph along a temporal sequence. This allows it to exhibit temporal dynamic behavior. Derived from feedforward neural networks, RNNs can use their internal state (memory) to process variable length sequences of inputs",
+      },
+    ];
+    
+    this.onDisplayModelCards = this.modelCards.map(card => card);
+    let tags = [];
+    this.modelCards.map((card) => {
+      Array.prototype.push.apply(tags, card.tags);
+    });
+    let tags_set = new Set(tags);
+    tags = Array.from(tags_set);
+    this.listOfTagsOption = tags.map((tag) => ({ "label": String(tag), "value": String(tag)}));
+  }
+
+  searchModel(event: any) {
+    this.nameForFilter = event.target.value;
+    this.changeDisplayModelCards();
+  }
+  
+  filterByTags() {
+    this.changeDisplayModelCards();
+  }
+
+  changeDisplayModelCards() {
+    this.onDisplayModelCards = this.modelCards.filter((card) => card.name.toLowerCase().includes(this.nameForFilter.toLowerCase()));
+    this.onDisplayModelCards = this.onDisplayModelCards.filter((card) => {
+      for (let chosenTag of this.listOfChosenTags) {
+        if (!card.tags.includes(chosenTag)) return false;
+      }
+      return true;
+    });
+  }
+}
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
index a98f32c..5ee877c 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model-routing.module.ts
@@ -21,6 +21,7 @@ import { NgModule } from '@angular/core';
 import { RouterModule, Routes } from '@angular/router';
 import { ModelComponent } from './model.component';
 import { ModelVersionComponent } from './model-version/model-version.component';
+import { ModelHomeComponent } from './model-home/model-home.component';
 
 const routes: Routes = [
   {
@@ -28,6 +29,11 @@ const routes: Routes = [
     component: ModelComponent,
     children: [
       {
+        path: '',
+        pathMatch: 'full',
+        component: ModelHomeComponent,
+      },
+      {
         path: ':name/:version',
         component: ModelVersionComponent,
       },
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html
index 8343648..98c447a 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.component.html
@@ -17,25 +17,25 @@
   ~ under the License.
   -->
 
-  <nz-layout style="margin: -24px -24px 16px">
-    <div style="background-color: white; padding-left: 30px; padding-top: 20px">
-      <nz-breadcrumb>
-        <nz-breadcrumb-item>
-          <a>Home</a>
-        </nz-breadcrumb-item>
-        <nz-breadcrumb-item>
-          <a [routerLink]="['/', 'workbench', 'model']" (click)="modelName = null">model</a>
-        </nz-breadcrumb-item>
-        <nz-breadcrumb-item *ngIf="modelName != null">
-          {{ modelName }}
-        </nz-breadcrumb-item>
-      </nz-breadcrumb>
-      <div *ngIf="modelName == null">
-        <br />
-        <h2>Model</h2>
-      </div>
+<nz-layout style="margin: -24px -24px 16px">
+  <div style="background-color: white; padding-left: 30px; padding-top: 20px">
+    <nz-breadcrumb>
+      <nz-breadcrumb-item>
+        <a>Home</a>
+      </nz-breadcrumb-item>
+      <nz-breadcrumb-item>
+        <a [routerLink]="['/', 'workbench', 'model']" (click)="modelName = null">model</a>
+      </nz-breadcrumb-item>
+      <nz-breadcrumb-item *ngIf="modelName != null">
+        {{ modelName }}
+      </nz-breadcrumb-item>
+    </nz-breadcrumb>
+    <div *ngIf="modelName == null">
       <br />
+      <h2>Model</h2>
     </div>
-    <router-outlet></router-outlet>
-  </nz-layout>
+    <br />
+  </div>
+  <router-outlet></router-outlet>
+</nz-layout>
   
\ No newline at end of file
diff --git a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.module.ts b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.module.ts
index dbfe533..258ce1c 100644
--- a/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.module.ts
+++ b/submarine-workbench/workbench-web/src/app/pages/workbench/model/model.module.ts
@@ -26,11 +26,17 @@ import { RouterModule } from '@angular/router';
 import { ModelComponent } from './model.component';
 import { ModelVersionComponent } from './model-version/model-version.component';
 import { PipeSharedModule } from '@submarine/pipe/pipe-shared.module';
+import { ModelHomeComponent } from './model-home/model-home.component';
+import { ModelCardsComponent } from './model-home/model-cards/model-cards.component';
+import { ModelCardComponent } from './model-home/model-cards/model-card/model-card.component';
 
 @NgModule({
   declarations: [
     ModelComponent,
+    ModelHomeComponent,
     ModelVersionComponent,
+    ModelCardsComponent,
+    ModelCardComponent,
   ],
   imports: [
     CommonModule,

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@submarine.apache.org
For additional commands, e-mail: dev-help@submarine.apache.org