mirror of
				https://github.com/richard-loafle/fuse-angular.git
				synced 2025-10-31 03:53:34 +00:00 
			
		
		
		
	New: Knowledge base page design
This commit is contained in:
		
							parent
							
								
									5d56b3bcd6
								
							
						
					
					
						commit
						3fc510469d
					
				| @ -0,0 +1,20 @@ | ||||
| <div class="dialog-content-wrapper"> | ||||
| 
 | ||||
|     <mat-toolbar matDialogTitle class="mat-accent m-0"> | ||||
|         <span class="title dialog-title">{{data.article.title}}</span> | ||||
|     </mat-toolbar> | ||||
| 
 | ||||
|     <div mat-dialog-content class="p-24 m-0" fusePerfectScrollbar> | ||||
|         <div [innerHTML]="data.article.content"></div> | ||||
|     </div> | ||||
| 
 | ||||
|     <div mat-dialog-actions class="m-0 p-16" fxLayout="row" fxLayoutAlign="end center"> | ||||
|         <button mat-button | ||||
|                 (click)="dialogRef.close()" | ||||
|                 class="mat-accent" | ||||
|                 aria-label="Close"> | ||||
|             CLOSE | ||||
|         </button> | ||||
|     </div> | ||||
| 
 | ||||
| </div> | ||||
| @ -0,0 +1,13 @@ | ||||
| .knowledgebase-article-dialog { | ||||
| 
 | ||||
|     .mat-dialog-container { | ||||
|         padding: 0; | ||||
|         width: 720px; | ||||
|     } | ||||
| 
 | ||||
|     .dialog-content-wrapper { | ||||
|         max-height: 85vh; | ||||
|         display: flex; | ||||
|         flex-direction: column; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,20 @@ | ||||
| import { Component, ViewEncapsulation, Inject } from '@angular/core'; | ||||
| import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; | ||||
| 
 | ||||
| @Component({ | ||||
|     selector     : 'fuse-knowledge-base-article', | ||||
|     templateUrl  : './article.component.html', | ||||
|     styleUrls    : ['./article.component.scss'], | ||||
|     encapsulation: ViewEncapsulation.None | ||||
| }) | ||||
| export class FuseKnowledgeBaseArticleComponent | ||||
| { | ||||
|     article: any; | ||||
| 
 | ||||
|     constructor( | ||||
|         public dialogRef: MatDialogRef<FuseKnowledgeBaseArticleComponent>, | ||||
|         @Inject(MAT_DIALOG_DATA) public data: any | ||||
|     ) | ||||
|     { | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,40 @@ | ||||
| <div id="knowledgebase" class="page-layout simple" fusePerfectScrollbar> | ||||
| 
 | ||||
|     <!-- HEADER --> | ||||
|     <div class="header mat-accent-bg p-16 p-sm-24" fxLayout="column" fxLayoutAlign="center center"> | ||||
| 
 | ||||
|         <div class="hero-text mb-32"> | ||||
|             <h1>How can we help?</h1> | ||||
|             <h3>Welcome to our knowledge base</h3> | ||||
|         </div> | ||||
| 
 | ||||
|     </div> | ||||
|     <!-- / HEADER --> | ||||
| 
 | ||||
|     <!-- CONTENT --> | ||||
|     <div class="content p-24"> | ||||
| 
 | ||||
|         <div fxLayout="row" fxLayoutAlign="center" fxLayoutWrap> | ||||
| 
 | ||||
|             <mat-nav-list class="articles-list mat-white-bg mat-elevation-z4" *ngFor="let category of knowledgeBase"> | ||||
| 
 | ||||
|                 <h3 mat-subheader>{{category.title}}</h3> | ||||
| 
 | ||||
|                 <a mat-list-item *ngFor="let article of category.featuredArticles" | ||||
|                    (click)="readArticle(article)"> | ||||
|                     <mat-icon class="mr-8">note</mat-icon> | ||||
|                     {{ article.title }} | ||||
|                 </a> | ||||
| 
 | ||||
|                 <a mat-list-item class="see-all-link accent-fg" [routerLink]="category.path"> | ||||
|                     See all articles ({{category.articlesCount}}) | ||||
|                 </a> | ||||
| 
 | ||||
|             </mat-nav-list> | ||||
| 
 | ||||
|         </div> | ||||
| 
 | ||||
|     </div> | ||||
|     <!-- / CONTENT --> | ||||
| 
 | ||||
| </div> | ||||
| @ -0,0 +1,77 @@ | ||||
| @import "../../../../core/scss/fuse"; | ||||
| 
 | ||||
| #knowledgebase { | ||||
| 
 | ||||
|     .header { | ||||
|         flex: 1 0 auto; | ||||
|         height: 280px; | ||||
|         max-height: 280px; | ||||
|         background: #1A237E; | ||||
|         background: linear-gradient(to right, #0E2A3B 0%, #34306B 100%); | ||||
| 
 | ||||
|         @include media-breakpoint('xs') { | ||||
|             height: 240px; | ||||
|             padding: 16px; | ||||
|         } | ||||
| 
 | ||||
|         .hero-text { | ||||
| 
 | ||||
|             h1 { | ||||
|                 color: white; | ||||
|                 font-size: 48px; | ||||
|                 font-weight: 300; | ||||
|                 letter-spacing: 0.01em; | ||||
|                 text-align: center; | ||||
|                 margin-top: 0; | ||||
|                 margin-bottom: 16px; | ||||
| 
 | ||||
|                 @include media-breakpoint-down('xs') { | ||||
|                     font-size: 24px; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             h3 { | ||||
|                 color: rgba(255, 255, 255, 0.75); | ||||
|                 max-width: 480px; | ||||
|                 text-align: center; | ||||
|                 font-weight: 300; | ||||
|                 letter-spacing: 0.03em; | ||||
|                 margin: 0; | ||||
| 
 | ||||
|                 @include media-breakpoint-down('xs') { | ||||
|                     font-size: 14px; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     .content { | ||||
|         max-width: 960px; | ||||
|         width: 100%; | ||||
|         margin: 0 auto; | ||||
| 
 | ||||
|         .articles-list { | ||||
|             width: 400px; | ||||
|             min-width: 400px; | ||||
|             margin: 16px; | ||||
|             padding: 16px; | ||||
| 
 | ||||
|             @include media-breakpoint-down('xs') { | ||||
|                 min-width: 300px; | ||||
|                 margin: 16px 0; | ||||
|             } | ||||
| 
 | ||||
|             .mat-list-item { | ||||
|                 text-decoration: none !important; | ||||
| 
 | ||||
|                 .mat-list-item-content { | ||||
| 
 | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             .see-all-link { | ||||
|                 font-size: 14px; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,47 @@ | ||||
| import { Component, OnInit, OnDestroy, ViewEncapsulation} from '@angular/core'; | ||||
| import { Subscription } from 'rxjs/Subscription'; | ||||
| import { KnowledgeBaseService } from './knowledge-base.service'; | ||||
| import { MatDialog } from '@angular/material'; | ||||
| import { FuseKnowledgeBaseArticleComponent } from './dialogs/article/article.component'; | ||||
| 
 | ||||
| @Component({ | ||||
|     selector     : 'fuse-knowledge-base', | ||||
|     templateUrl  : './knowledge-base.component.html', | ||||
|     styleUrls    : ['./knowledge-base.component.scss'], | ||||
|     encapsulation: ViewEncapsulation.None | ||||
| }) | ||||
| export class FuseKnowledgeBaseComponent implements OnInit, OnDestroy | ||||
| { | ||||
|     knowledgeBase: any; | ||||
|     onKnowledgeBaseChanged: Subscription; | ||||
| 
 | ||||
|     constructor( | ||||
|         private knowledgeBaseService: KnowledgeBaseService, | ||||
|         private matDialog: MatDialog | ||||
|     ) | ||||
|     { | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     ngOnInit() | ||||
|     { | ||||
|         this.onKnowledgeBaseChanged = | ||||
|             this.knowledgeBaseService.onKnowledgeBaseChanged | ||||
|                 .subscribe(response => { | ||||
|                     this.knowledgeBase = response; | ||||
|                 }); | ||||
|     } | ||||
| 
 | ||||
|     ngOnDestroy() | ||||
|     { | ||||
|         this.onKnowledgeBaseChanged.unsubscribe(); | ||||
|     } | ||||
| 
 | ||||
|     readArticle(article) | ||||
|     { | ||||
|         this.matDialog.open(FuseKnowledgeBaseArticleComponent, { | ||||
|             panelClass: 'knowledgebase-article-dialog', | ||||
|             data : {article: article} | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,36 @@ | ||||
| import { NgModule } from '@angular/core'; | ||||
| import { SharedModule } from '../../../../core/modules/shared.module'; | ||||
| import { RouterModule } from '@angular/router'; | ||||
| import { KnowledgeBaseService } from './knowledge-base.service'; | ||||
| import { FuseKnowledgeBaseComponent } from './knowledge-base.component'; | ||||
| import { FuseKnowledgeBaseArticleComponent } from './dialogs/article/article.component'; | ||||
| 
 | ||||
| const routes = [ | ||||
|     { | ||||
|         path     : 'pages/knowledge-base', | ||||
|         component: FuseKnowledgeBaseComponent, | ||||
|         resolve  : { | ||||
|             knowledgeBase: KnowledgeBaseService | ||||
|         } | ||||
|     } | ||||
| ]; | ||||
| 
 | ||||
| @NgModule({ | ||||
|     declarations   : [ | ||||
|         FuseKnowledgeBaseComponent, | ||||
|         FuseKnowledgeBaseArticleComponent | ||||
|     ], | ||||
|     imports        : [ | ||||
|         SharedModule, | ||||
|         RouterModule.forChild(routes) | ||||
|     ], | ||||
|     providers      : [ | ||||
|         KnowledgeBaseService | ||||
|     ], | ||||
|     entryComponents: [ | ||||
|         FuseKnowledgeBaseArticleComponent | ||||
|     ] | ||||
| }) | ||||
| export class FuseKnowledgeBaseModule | ||||
| { | ||||
| } | ||||
| @ -0,0 +1,52 @@ | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; | ||||
| import { Observable } from 'rxjs/Observable'; | ||||
| import { HttpClient } from '@angular/common/http'; | ||||
| import { BehaviorSubject } from 'rxjs/BehaviorSubject'; | ||||
| 
 | ||||
| @Injectable() | ||||
| export class KnowledgeBaseService implements Resolve<any> | ||||
| { | ||||
|     knowledgeBase: any; | ||||
|     onKnowledgeBaseChanged: BehaviorSubject<any> = new BehaviorSubject({}); | ||||
| 
 | ||||
|     constructor(private http: HttpClient) | ||||
|     { | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Resolve | ||||
|      * @param {ActivatedRouteSnapshot} route | ||||
|      * @param {RouterStateSnapshot} state | ||||
|      * @returns {Observable<any> | Promise<any> | any} | ||||
|      */ | ||||
|     resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<any> | any | ||||
|     { | ||||
|         return new Promise((resolve, reject) => { | ||||
|             Promise.all([ | ||||
|                 this.getKnowledgeBase() | ||||
|             ]).then( | ||||
|                 () => { | ||||
|                     resolve(); | ||||
|                 }, | ||||
|                 reject | ||||
|             ); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get knowledge base | ||||
|      */ | ||||
|     getKnowledgeBase(): Promise<any[]> | ||||
|     { | ||||
|         return new Promise((resolve, reject) => { | ||||
| 
 | ||||
|             this.http.get('api/knowledge-base') | ||||
|                 .subscribe((response: any) => { | ||||
|                     this.knowledgeBase = response; | ||||
|                     this.onKnowledgeBaseChanged.next(this.knowledgeBase); | ||||
|                     resolve(this.knowledgeBase); | ||||
|                 }, reject); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| @ -20,6 +20,7 @@ import { PricingModule } from './pricing/pricing.module'; | ||||
| import { ProfileModule } from './profile/profile.module'; | ||||
| import { SearchModule } from './search/search.module'; | ||||
| import { FaqModule } from './faq/faq.module'; | ||||
| import { FuseKnowledgeBaseModule } from './knowledge-base/knowledge-base.module'; | ||||
| 
 | ||||
| @NgModule({ | ||||
|     imports: [ | ||||
| @ -59,7 +60,10 @@ import { FaqModule } from './faq/faq.module'; | ||||
|         SearchModule, | ||||
| 
 | ||||
|         // Faq
 | ||||
|         FaqModule | ||||
|         FaqModule, | ||||
| 
 | ||||
|         // Knowledge base
 | ||||
|         FuseKnowledgeBaseModule | ||||
|     ] | ||||
| }) | ||||
| export class PagesModule | ||||
|  | ||||
| @ -264,6 +264,12 @@ export class NavigationModel | ||||
|                         'type' : 'item', | ||||
|                         'icon' : 'help', | ||||
|                         'url'  : '/pages/faq' | ||||
|                     }, | ||||
|                     { | ||||
|                         'title': 'Knowledge Base', | ||||
|                         'type' : 'item', | ||||
|                         'icon' : 'import_contacts', | ||||
|                         'url'  : '/pages/knowledge-base' | ||||
|                     } | ||||
|                 ] | ||||
|             }, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user