Compare commits

..

17 Commits

Author SHA1 Message Date
sercan
2d2db97416 Merge remote-tracking branch 'origin/demo' into starter 2021-05-24 14:33:12 +03:00
sercan
5daa2260e6 Merge remote-tracking branch 'origin/demo' into starter 2021-05-24 14:29:35 +03:00
sercan
af984fcba1 Merge remote-tracking branch 'origin/demo' into starter 2021-05-23 07:13:28 +03:00
sercan
97d3662417 Merge remote-tracking branch 'origin/demo' into starter 2021-05-21 12:17:06 +03:00
sercan
d897a244c8 Merge remote-tracking branch 'origin/demo' into starter 2021-05-18 16:25:53 +03:00
sercan
d146a92c79 Merge remote-tracking branch 'origin/demo' into starter 2021-05-15 13:18:13 +03:00
sercan
27b6858b76 Merge remote-tracking branch 'origin/demo' into starter 2021-05-06 17:12:50 +03:00
sercan
fcfba4c9e4 Merge remote-tracking branch 'origin/demo' into starter 2021-04-30 19:40:30 +03:00
sercan
40894e0aa3 Merge remote-tracking branch 'origin/demo' into starter
# Conflicts:
#	src/app/app.routing.ts
#	src/app/mock-api/common/navigation/data.ts
#	src/app/modules/admin/apps/academy/academy.service.ts
#	src/app/modules/admin/apps/academy/details/details.component.html
#	src/app/modules/admin/apps/academy/list/list.component.html
#	src/app/modules/admin/apps/mailbox/list/list.component.ts
#	src/app/modules/admin/docs/changelog/changelog.ts
#	src/app/modules/admin/pages/pricing/modern/modern.component.html
#	src/app/modules/admin/pages/pricing/simple/simple.component.html
#	src/app/modules/admin/pages/pricing/single/single.component.html
#	src/app/modules/admin/pages/pricing/table/table.component.html
2021-04-30 19:40:07 +03:00
sercan
8dcf21cb1a Merge remote-tracking branch 'origin/demo' into starter 2021-04-26 10:23:15 +03:00
sercan
d917f03883 Merge remote-tracking branch 'origin/demo' into starter 2021-04-26 10:20:06 +03:00
sercan
0f2ddbda83 Merge remote-tracking branch 'origin/demo' into starter
# Conflicts:
#	src/app/mock-api/common/navigation/data.ts
#	src/app/modules/admin/docs/changelog/changelog.ts
2021-04-26 09:56:44 +03:00
sercan
fa0d74504b Merge remote-tracking branch 'origin/demo' into starter 2021-04-26 09:56:29 +03:00
sercan
ad2b19a07a Merge remote-tracking branch 'origin/demo' into starter
# Conflicts:
#	src/app/app.routing.ts
#	src/app/mock-api/common/navigation/data.ts
#	src/app/modules/admin/apps/contacts/details/details.component.html
#	src/app/modules/admin/apps/file-manager/list/list.component.html
#	src/app/modules/admin/apps/file-manager/list/list.component.ts
#	src/app/modules/landing/home/home.component.html
2021-04-26 09:31:42 +03:00
sercan
4bf11591a2 (Assets) Added avatar images back 2021-04-19 13:08:24 +03:00
sercan
f45a605b4e Preparing the starter 2021-04-15 17:43:28 +03:00
sercan
c150a8902c Starter 2021-04-15 17:23:49 +03:00
910 changed files with 4623 additions and 82296 deletions

View File

@@ -12,7 +12,7 @@ Run `ng generate component component-name` to generate a new component. You can
## Build ## Build
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build.
## Running unit tests ## Running unit tests
@@ -20,7 +20,7 @@ Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.
## Running end-to-end tests ## Running end-to-end tests
Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. Run `ng e2e` to execute the end-to-end tests via a platform of your choice.
## Further help ## Further help

View File

@@ -60,13 +60,13 @@
"budgets": [ "budgets": [
{ {
"type": "initial", "type": "initial",
"maximumWarning": "3mb", "maximumWarning": "5mb",
"maximumError": "5mb" "maximumError": "8mb"
}, },
{ {
"type": "anyComponentStyle", "type": "anyComponentStyle",
"maximumWarning": "75kb", "maximumWarning": "100kb",
"maximumError": "90kb" "maximumError": "150kb"
} }
], ],
"fileReplacements": [ "fileReplacements": [
@@ -120,7 +120,7 @@
"src/assets" "src/assets"
], ],
"styles": [ "styles": [
"src/styles/styles.scss" "src/styles.scss"
], ],
"scripts": [] "scripts": []
} }
@@ -133,6 +133,18 @@
"src/**/*.html" "src/**/*.html"
] ]
} }
},
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "fuse:serve"
},
"configurations": {
"production": {
"devServerTarget": "fuse:serve:production"
}
}
} }
} }
} }

View File

@@ -26,7 +26,7 @@ module.exports = function (config)
suppressAll: true // removes the duplicated traces suppressAll: true // removes the duplicated traces
}, },
coverageReporter : { coverageReporter : {
dir : require('path').join(__dirname, './coverage/fuse'), dir : require('path').join(__dirname, './coverage/angular12'),
subdir : '.', subdir : '.',
reporters: [ reporters: [
{type: 'html'}, {type: 'html'},

6333
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,30 +1,28 @@
{ {
"name": "@fuse/demo", "name": "@fuse/demo",
"version": "13.5.0", "version": "13.0.2",
"description": "Fuse - Angular Admin Template and Starter Project",
"author": "https://themeforest.net/user/srcn",
"license": "https://themeforest.net/licenses/standard", "license": "https://themeforest.net/licenses/standard",
"private": true, "private": true,
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve", "start": "ng serve",
"build": "ng build", "build": "ng build",
"watch": "ng build --watch --configuration development",
"test": "ng test", "test": "ng test",
"lint": "ng lint" "lint": "ng lint",
"e2e": "ng e2e"
}, },
"dependencies": { "dependencies": {
"@angular/animations": "12.2.1", "@angular/animations": "12.0.0",
"@angular/cdk": "12.2.1", "@angular/cdk": "12.0.0",
"@angular/common": "12.2.1", "@angular/common": "12.0.0",
"@angular/compiler": "12.2.1", "@angular/compiler": "12.0.0",
"@angular/core": "12.2.1", "@angular/core": "12.0.0",
"@angular/forms": "12.2.1", "@angular/forms": "12.0.0",
"@angular/material": "12.2.1", "@angular/material": "12.0.0",
"@angular/material-moment-adapter": "12.2.1", "@angular/material-moment-adapter": "12.0.0",
"@angular/platform-browser": "12.2.1", "@angular/platform-browser": "12.0.0",
"@angular/platform-browser-dynamic": "12.2.1", "@angular/platform-browser-dynamic": "12.0.0",
"@angular/router": "12.2.1", "@angular/router": "12.0.0",
"@fullcalendar/angular": "4.4.5-beta", "@fullcalendar/angular": "4.4.5-beta",
"@fullcalendar/core": "4.4.2", "@fullcalendar/core": "4.4.2",
"@fullcalendar/daygrid": "4.4.2", "@fullcalendar/daygrid": "4.4.2",
@@ -33,59 +31,62 @@
"@fullcalendar/moment": "4.4.2", "@fullcalendar/moment": "4.4.2",
"@fullcalendar/rrule": "4.4.2", "@fullcalendar/rrule": "4.4.2",
"@fullcalendar/timegrid": "4.4.2", "@fullcalendar/timegrid": "4.4.2",
"@ngneat/transloco": "2.22.0", "@ngneat/transloco": "2.20.1",
"apexcharts": "3.27.3", "apexcharts": "3.26.3",
"crypto-js": "3.3.0", "crypto-js": "3.3.0",
"highlight.js": "11.2.0", "highlight.js": "10.7.2",
"lodash-es": "4.17.21", "lodash-es": "4.17.21",
"moment": "2.29.1", "moment": "2.29.1",
"ng-apexcharts": "1.5.12", "ng-apexcharts": "1.5.10",
"ngx-markdown": "12.0.1", "ngx-markdown": "12.0.0",
"ngx-quill": "14.2.0", "ngx-quill": "14.0.0",
"perfect-scrollbar": "1.5.2", "perfect-scrollbar": "1.5.1",
"quill": "1.3.7", "quill": "1.3.7",
"rrule": "2.6.8", "rrule": "2.6.8",
"rxjs": "6.6.7", "rxjs": "6.6.7",
"tslib": "2.3.1", "tslib": "2.2.0",
"web-animations-js": "2.3.2", "web-animations-js": "2.3.2",
"zone.js": "0.11.4" "zone.js": "0.11.4"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "12.2.1", "@angular-devkit/build-angular": "12.0.0",
"@angular-eslint/builder": "12.3.1", "@angular-eslint/builder": "12.0.0",
"@angular-eslint/eslint-plugin": "12.3.1", "@angular-eslint/eslint-plugin": "12.0.0",
"@angular-eslint/eslint-plugin-template": "12.3.1", "@angular-eslint/eslint-plugin-template": "12.0.0",
"@angular-eslint/schematics": "12.3.1", "@angular-eslint/schematics": "12.0.0",
"@angular-eslint/template-parser": "12.3.1", "@angular-eslint/template-parser": "12.0.0",
"@angular/cli": "12.2.1", "@angular/cli": "12.0.0",
"@angular/compiler-cli": "12.2.1", "@angular/compiler-cli": "12.0.0",
"@tailwindcss/aspect-ratio": "0.2.1", "@angular/language-service": "12.0.0",
"@tailwindcss/line-clamp": "0.2.1", "@tailwindcss/aspect-ratio": "0.2.0",
"@tailwindcss/typography": "0.4.1", "@tailwindcss/line-clamp": "0.2.0",
"@tailwindcss/typography": "0.4.0",
"@types/chroma-js": "2.1.3", "@types/chroma-js": "2.1.3",
"@types/crypto-js": "3.1.47", "@types/crypto-js": "3.1.47",
"@types/highlight.js": "10.1.0", "@types/highlight.js": "10.1.0",
"@types/jasmine": "3.8.2", "@types/jasmine": "3.6.11",
"@types/lodash": "4.14.172", "@types/lodash": "4.14.169",
"@types/lodash-es": "4.17.4", "@types/lodash-es": "4.17.4",
"@types/node": "12.20.19", "@types/node": "12.20.13",
"@typescript-eslint/eslint-plugin": "4.29.1", "@typescript-eslint/eslint-plugin": "4.24.0",
"@typescript-eslint/parser": "4.29.1", "@typescript-eslint/parser": "4.24.0",
"autoprefixer": "10.3.1", "autoprefixer": "10.2.5",
"chroma-js": "2.1.2", "chroma-js": "2.1.2",
"eslint": "7.32.0", "eslint": "7.26.0",
"eslint-plugin-import": "2.24.0", "eslint-plugin-import": "2.23.2",
"eslint-plugin-jsdoc": "36.0.7", "eslint-plugin-jsdoc": "34.8.2",
"eslint-plugin-prefer-arrow": "1.2.3", "eslint-plugin-prefer-arrow": "1.2.3",
"jasmine-core": "3.8.0", "jasmine-core": "3.7.1",
"karma": "6.3.4", "jasmine-spec-reporter": "5.0.2",
"karma": "6.3.2",
"karma-chrome-launcher": "3.1.0", "karma-chrome-launcher": "3.1.0",
"karma-coverage": "2.0.3", "karma-coverage": "2.0.3",
"karma-jasmine": "4.0.1", "karma-jasmine": "4.0.1",
"karma-jasmine-html-reporter": "1.7.0", "karma-jasmine-html-reporter": "1.6.0",
"lodash": "4.17.21", "lodash": "4.17.21",
"postcss": "8.3.6", "postcss": "8.3.0",
"tailwindcss": "2.2.7", "protractor": "7.0.0",
"typescript": "4.3.5" "tailwindcss": "2.1.2",
"typescript": "4.2.4"
} }
} }

View File

@@ -341,13 +341,6 @@ export class FuseDrawerComponent implements OnChanges, OnInit, OnDestroy
animate('300ms cubic-bezier(0.25, 0.8, 0.25, 1)', style({opacity: 1})) animate('300ms cubic-bezier(0.25, 0.8, 0.25, 1)', style({opacity: 1}))
]).create(this._overlay); ]).create(this._overlay);
// Once the animation is done...
this._player.onDone(() => {
// Destroy the player
this._player.destroy();
});
// Play the animation // Play the animation
this._player.play(); this._player.play();
@@ -380,9 +373,6 @@ export class FuseDrawerComponent implements OnChanges, OnInit, OnDestroy
// Once the animation is done... // Once the animation is done...
this._player.onDone(() => { this._player.onDone(() => {
// Destroy the player
this._player.destroy();
// If the backdrop still exists... // If the backdrop still exists...
if ( this._overlay ) if ( this._overlay )
{ {

View File

@@ -1,12 +1,7 @@
<!-- Button --> <!-- Button -->
<button <button
mat-icon-button mat-icon-button
[matTooltip]="tooltip || 'Toggle Fullscreen'" [matTooltip]="'Toggle Fullscreen'"
(click)="toggleFullscreen()"> (click)="toggleFullscreen()">
<ng-container [ngTemplateOutlet]="iconTpl || defaultIconTpl"></ng-container>
</button>
<!-- Default icon -->
<ng-template #defaultIconTpl>
<mat-icon [svgIcon]="'heroicons_outline:arrows-expand'"></mat-icon> <mat-icon [svgIcon]="'heroicons_outline:arrows-expand'"></mat-icon>
</ng-template> </button>

View File

@@ -1,4 +1,4 @@
import { ChangeDetectionStrategy, Component, Inject, Input, OnInit, TemplateRef, ViewEncapsulation } from '@angular/core'; import { ChangeDetectionStrategy, Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';
import { DOCUMENT } from '@angular/common'; import { DOCUMENT } from '@angular/common';
import { FSDocument, FSDocumentElement } from '@fuse/components/fullscreen/fullscreen.types'; import { FSDocument, FSDocumentElement } from '@fuse/components/fullscreen/fullscreen.types';
@@ -11,8 +11,6 @@ import { FSDocument, FSDocumentElement } from '@fuse/components/fullscreen/fulls
}) })
export class FuseFullscreenComponent implements OnInit export class FuseFullscreenComponent implements OnInit
{ {
@Input() iconTpl: TemplateRef<any>;
@Input() tooltip: string;
private _fsDoc: FSDocument; private _fsDoc: FSDocument;
private _fsDocEl: FSDocumentElement; private _fsDocEl: FSDocumentElement;
private _isFullscreen: boolean = false; private _isFullscreen: boolean = false;

View File

@@ -3,17 +3,15 @@ import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatTooltipModule } from '@angular/material/tooltip'; import { MatTooltipModule } from '@angular/material/tooltip';
import { FuseFullscreenComponent } from '@fuse/components/fullscreen/fullscreen.component'; import { FuseFullscreenComponent } from '@fuse/components/fullscreen/fullscreen.component';
import { CommonModule } from '@angular/common';
@NgModule({ @NgModule({
declarations: [ declarations: [
FuseFullscreenComponent FuseFullscreenComponent
], ],
imports: [ imports : [
MatButtonModule, MatButtonModule,
MatIconModule, MatIconModule,
MatTooltipModule, MatTooltipModule
CommonModule
], ],
exports : [ exports : [
FuseFullscreenComponent FuseFullscreenComponent

View File

@@ -1,5 +1,5 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import hljs from 'highlight.js'; import * as hljs from 'highlight.js';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'

View File

@@ -5,83 +5,69 @@
[ngClass]="item.classes?.wrapper"> [ngClass]="item.classes?.wrapper">
<!-- Item with an internal link --> <!-- Item with an internal link -->
<ng-container *ngIf="item.link && !item.externalLink && !item.function && !item.disabled"> <div
<div class="fuse-horizontal-navigation-item"
class="fuse-horizontal-navigation-item" *ngIf="item.link && !item.externalLink && !item.function && !item.disabled"
[ngClass]="{'fuse-horizontal-navigation-item-active-forced': item.active}" [ngClass]="{'fuse-horizontal-navigation-item-active-forced': item.active}"
[routerLink]="[item.link]" [routerLink]="[item.link]"
[routerLinkActive]="'fuse-horizontal-navigation-item-active'" [routerLinkActive]="'fuse-horizontal-navigation-item-active'"
[routerLinkActiveOptions]="isActiveMatchOptions" [routerLinkActiveOptions]="isActiveMatchOptions">
[matTooltip]="item.tooltip || ''"> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> </div>
</div>
</ng-container>
<!-- Item with an external link --> <!-- Item with an external link -->
<ng-container *ngIf="item.link && item.externalLink && !item.function && !item.disabled"> <a
<a class="fuse-horizontal-navigation-item"
class="fuse-horizontal-navigation-item" *ngIf="item.link && item.externalLink && !item.function && !item.disabled"
[href]="item.link" [href]="item.link">
[target]="item.target || '_self'" <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
[matTooltip]="item.tooltip || ''"> </a>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
</a>
</ng-container>
<!-- Item with a function --> <!-- Item with a function -->
<ng-container *ngIf="!item.link && item.function && !item.disabled"> <div
<div class="fuse-horizontal-navigation-item"
class="fuse-horizontal-navigation-item" *ngIf="!item.link && item.function && !item.disabled"
[ngClass]="{'fuse-horizontal-navigation-item-active-forced': item.active}" [ngClass]="{'fuse-horizontal-navigation-item-active-forced': item.active}"
[matTooltip]="item.tooltip || ''" (click)="item.function(item)">
(click)="item.function(item)"> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> </div>
</div>
</ng-container>
<!-- Item with an internal link and function --> <!-- Item with an internal link and function -->
<ng-container *ngIf="item.link && !item.externalLink && item.function && !item.disabled"> <div
<div class="fuse-horizontal-navigation-item"
class="fuse-horizontal-navigation-item" *ngIf="item.link && !item.externalLink && item.function && !item.disabled"
[ngClass]="{'fuse-horizontal-navigation-item-active-forced': item.active}" [ngClass]="{'fuse-horizontal-navigation-item-active-forced': item.active}"
[routerLink]="[item.link]" [routerLink]="[item.link]"
[routerLinkActive]="'fuse-horizontal-navigation-item-active'" [routerLinkActive]="'fuse-horizontal-navigation-item-active'"
[routerLinkActiveOptions]="isActiveMatchOptions" [routerLinkActiveOptions]="isActiveMatchOptions"
[matTooltip]="item.tooltip || ''" (click)="item.function(item)">
(click)="item.function(item)"> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> </div>
</div>
</ng-container>
<!-- Item with an external link and function --> <!-- Item with an external link and function -->
<ng-container *ngIf="item.link && item.externalLink && item.function && !item.disabled"> <a
<a class="fuse-horizontal-navigation-item"
class="fuse-horizontal-navigation-item" *ngIf="item.link && item.externalLink && item.function && !item.disabled"
[href]="item.link" [href]="item.link"
[target]="item.target || '_self'" (click)="item.function(item)"
[matTooltip]="item.tooltip || ''" mat-menu-item>
(click)="item.function(item)" <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
mat-menu-item> </a>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
</a>
</ng-container>
<!-- Item with a no link and no function --> <!-- Item with a no link and no function -->
<ng-container *ngIf="!item.link && !item.function && !item.disabled"> <div
<div class="fuse-horizontal-navigation-item"
class="fuse-horizontal-navigation-item" *ngIf="!item.link && !item.function && !item.disabled"
[ngClass]="{'fuse-horizontal-navigation-item-active-forced': item.active}" [ngClass]="{'fuse-horizontal-navigation-item-active-forced': item.active}">
[matTooltip]="item.tooltip || ''"> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> </div>
</div>
</ng-container>
<!-- Item is disabled --> <!-- Item is disabled -->
<ng-container *ngIf="item.disabled"> <div
<div class="fuse-horizontal-navigation-item fuse-horizontal-navigation-item-disabled"> class="fuse-horizontal-navigation-item fuse-horizontal-navigation-item-disabled"
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> *ngIf="item.disabled">
</div> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
</ng-container> </div>
</div> </div>
@@ -89,12 +75,11 @@
<ng-template #itemTemplate> <ng-template #itemTemplate>
<!-- Icon --> <!-- Icon -->
<ng-container *ngIf="item.icon"> <mat-icon
<mat-icon class="fuse-horizontal-navigation-item-icon"
class="fuse-horizontal-navigation-item-icon" [ngClass]="item.classes?.icon"
[ngClass]="item.classes?.icon" *ngIf="item.icon"
[svgIcon]="item.icon"></mat-icon> [svgIcon]="item.icon"></mat-icon>
</ng-container>
<!-- Title & Subtitle --> <!-- Title & Subtitle -->
<div class="fuse-horizontal-navigation-item-title-wrapper"> <div class="fuse-horizontal-navigation-item-title-wrapper">
@@ -103,24 +88,24 @@
{{item.title}} {{item.title}}
</span> </span>
</div> </div>
<ng-container *ngIf="item.subtitle"> <div
<div class="fuse-horizontal-navigation-item-subtitle text-hint"> class="fuse-horizontal-navigation-item-subtitle text-hint"
<span [ngClass]="item.classes?.subtitle"> *ngIf="item.subtitle">
{{item.subtitle}} <span [ngClass]="item.classes?.subtitle">
</span> {{item.subtitle}}
</div> </span>
</ng-container> </div>
</div> </div>
<!-- Badge --> <!-- Badge -->
<ng-container *ngIf="item.badge"> <div
<div class="fuse-horizontal-navigation-item-badge"> class="fuse-horizontal-navigation-item-badge"
<div *ngIf="item.badge">
class="fuse-horizontal-navigation-item-badge-content" <div
[ngClass]="item.badge.classes"> class="fuse-horizontal-navigation-item-badge-content"
{{item.badge.title}} [ngClass]="item.badge.classes">
</div> {{item.badge.title}}
</div> </div>
</ng-container> </div>
</ng-template> </ng-template>

View File

@@ -10,6 +10,7 @@ import { FuseUtilsService } from '@fuse/services/utils/utils.service';
@Component({ @Component({
selector : 'fuse-horizontal-navigation-basic-item', selector : 'fuse-horizontal-navigation-basic-item',
templateUrl : './basic.component.html', templateUrl : './basic.component.html',
styles : [],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FuseHorizontalNavigationBasicItemComponent implements OnInit, OnDestroy export class FuseHorizontalNavigationBasicItemComponent implements OnInit, OnDestroy

View File

@@ -1,63 +1,59 @@
<ng-container *ngIf="!child"> <div
<div *ngIf="!child"
[ngClass]="{'fuse-horizontal-navigation-menu-active': trigger.menuOpen, [ngClass]="{'fuse-horizontal-navigation-menu-active': trigger.menuOpen,
'fuse-horizontal-navigation-menu-active-forced': item.active}" 'fuse-horizontal-navigation-menu-active-forced': item.active}"
[matMenuTriggerFor]="matMenu" [matMenuTriggerFor]="matMenu"
(onMenuOpen)="triggerChangeDetection()" (onMenuOpen)="triggerChangeDetection()"
(onMenuClose)="triggerChangeDetection()" (onMenuClose)="triggerChangeDetection()"
#trigger="matMenuTrigger"> #trigger="matMenuTrigger">
<ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: item}"></ng-container> <ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: item}"></ng-container>
</div> </div>
</ng-container>
<mat-menu <mat-menu
class="fuse-horizontal-navigation-menu-panel" class="fuse-horizontal-navigation-menu-panel"
[overlapTrigger]="false" [overlapTrigger]="false"
#matMenu="matMenu"> #matMenu="matMenu">
<ng-container *ngFor="let item of item.children; trackBy: trackByFn"> <ng-container *ngFor="let item of item.children">
<!-- Skip the hidden items --> <!-- Skip the hidden items -->
<ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden"> <ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden">
<!-- Basic --> <!-- Basic -->
<ng-container *ngIf="item.type === 'basic'"> <div
<div class="fuse-horizontal-navigation-menu-item"
class="fuse-horizontal-navigation-menu-item" *ngIf="item.type === 'basic'"
[disabled]="item.disabled" [disabled]="item.disabled"
mat-menu-item> mat-menu-item>
<fuse-horizontal-navigation-basic-item <fuse-horizontal-navigation-basic-item
[item]="item" [item]="item"
[name]="name"></fuse-horizontal-navigation-basic-item> [name]="name"></fuse-horizontal-navigation-basic-item>
</div> </div>
</ng-container>
<!-- Branch: aside, collapsable, group --> <!-- Branch: aside, collapsable, group -->
<ng-container *ngIf="item.type === 'aside' || item.type === 'collapsable' || item.type === 'group'"> <div
<div class="fuse-horizontal-navigation-menu-item"
class="fuse-horizontal-navigation-menu-item" *ngIf="item.type === 'aside' || item.type === 'collapsable' || item.type === 'group'"
[disabled]="item.disabled" [disabled]="item.disabled"
[matMenuTriggerFor]="branch.matMenu" [matMenuTriggerFor]="branch.matMenu"
mat-menu-item> mat-menu-item>
<ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: item}"></ng-container> <ng-container *ngTemplateOutlet="itemTemplate; context: {$implicit: item}"></ng-container>
<fuse-horizontal-navigation-branch-item <fuse-horizontal-navigation-branch-item
[child]="true" [child]="true"
[item]="item" [item]="item"
[name]="name" [name]="name"
#branch></fuse-horizontal-navigation-branch-item> #branch></fuse-horizontal-navigation-branch-item>
</div> </div>
</ng-container>
<!-- Divider --> <!-- Divider -->
<ng-container *ngIf="item.type === 'divider'"> <div
<div class="fuse-horizontal-navigation-menu-item"
class="fuse-horizontal-navigation-menu-item" *ngIf="item.type === 'divider'"
mat-menu-item> mat-menu-item>
<fuse-horizontal-navigation-divider-item <fuse-horizontal-navigation-divider-item
[item]="item" [item]="item"
[name]="name"></fuse-horizontal-navigation-divider-item> [name]="name"></fuse-horizontal-navigation-divider-item>
</div> </div>
</ng-container>
</ng-container> </ng-container>
@@ -78,16 +74,14 @@
<div <div
class="fuse-horizontal-navigation-item" class="fuse-horizontal-navigation-item"
[ngClass]="{'fuse-horizontal-navigation-item-disabled': item.disabled, [ngClass]="{'fuse-horizontal-navigation-item-disabled': item.disabled,
'fuse-horizontal-navigation-item-active-forced': item.active}" 'fuse-horizontal-navigation-item-active-forced': item.active}">
[matTooltip]="item.tooltip || ''">
<!-- Icon --> <!-- Icon -->
<ng-container *ngIf="item.icon"> <mat-icon
<mat-icon class="fuse-horizontal-navigation-item-icon"
class="fuse-horizontal-navigation-item-icon" [ngClass]="item.classes?.icon"
[ngClass]="item.classes?.icon" *ngIf="item.icon"
[svgIcon]="item.icon"></mat-icon> [svgIcon]="item.icon"></mat-icon>
</ng-container>
<!-- Title & Subtitle --> <!-- Title & Subtitle -->
<div class="fuse-horizontal-navigation-item-title-wrapper"> <div class="fuse-horizontal-navigation-item-title-wrapper">
@@ -96,25 +90,25 @@
{{item.title}} {{item.title}}
</span> </span>
</div> </div>
<ng-container *ngIf="item.subtitle"> <div
<div class="fuse-horizontal-navigation-item-subtitle text-hint"> class="fuse-horizontal-navigation-item-subtitle text-hint"
<span [ngClass]="item.classes?.subtitle"> *ngIf="item.subtitle">
{{item.subtitle}} <span [ngClass]="item.classes?.subtitle">
</span> {{item.subtitle}}
</div> </span>
</ng-container> </div>
</div> </div>
<!-- Badge --> <!-- Badge -->
<ng-container *ngIf="item.badge"> <div
<div class="fuse-horizontal-navigation-item-badge"> class="fuse-horizontal-navigation-item-badge"
<div *ngIf="item.badge">
class="fuse-horizontal-navigation-item-badge-content" <div
[ngClass]="item.badge.classes"> class="fuse-horizontal-navigation-item-badge-content"
{{item.badge.title}} [ngClass]="item.badge.classes">
</div> {{item.badge.title}}
</div> </div>
</ng-container> </div>
</div> </div>
</div> </div>

View File

@@ -10,6 +10,7 @@ import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types
@Component({ @Component({
selector : 'fuse-horizontal-navigation-branch-item', selector : 'fuse-horizontal-navigation-branch-item',
templateUrl : './branch.component.html', templateUrl : './branch.component.html',
styles : [],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FuseHorizontalNavigationBranchItemComponent implements OnInit, OnDestroy export class FuseHorizontalNavigationBranchItemComponent implements OnInit, OnDestroy
@@ -80,15 +81,4 @@ export class FuseHorizontalNavigationBranchItemComponent implements OnInit, OnDe
// Mark for check // Mark for check
this._changeDetectorRef.markForCheck(); this._changeDetectorRef.markForCheck();
} }
/**
* Track by function for ngFor loops
*
* @param index
* @param item
*/
trackByFn(index: number, item: any): any
{
return item.id || index;
}
} }

View File

@@ -8,6 +8,7 @@ import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types
@Component({ @Component({
selector : 'fuse-horizontal-navigation-divider-item', selector : 'fuse-horizontal-navigation-divider-item',
templateUrl : './divider.component.html', templateUrl : './divider.component.html',
styles : [],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FuseHorizontalNavigationDividerItemComponent implements OnInit, OnDestroy export class FuseHorizontalNavigationDividerItemComponent implements OnInit, OnDestroy

View File

@@ -8,6 +8,7 @@ import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types
@Component({ @Component({
selector : 'fuse-horizontal-navigation-spacer-item', selector : 'fuse-horizontal-navigation-spacer-item',
templateUrl : './spacer.component.html', templateUrl : './spacer.component.html',
styles : [],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FuseHorizontalNavigationSpacerItemComponent implements OnInit, OnDestroy export class FuseHorizontalNavigationSpacerItemComponent implements OnInit, OnDestroy

View File

@@ -1,33 +1,30 @@
<div class="fuse-horizontal-navigation-wrapper"> <div class="fuse-horizontal-navigation-wrapper">
<ng-container *ngFor="let item of navigation; trackBy: trackByFn"> <ng-container *ngFor="let item of navigation">
<!-- Skip the hidden items --> <!-- Skip the hidden items -->
<ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden"> <ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden">
<!-- Basic --> <!-- Basic -->
<ng-container *ngIf="item.type === 'basic'"> <fuse-horizontal-navigation-basic-item
<fuse-horizontal-navigation-basic-item class="fuse-horizontal-navigation-menu-item"
class="fuse-horizontal-navigation-menu-item" *ngIf="item.type === 'basic'"
[item]="item" [item]="item"
[name]="name"></fuse-horizontal-navigation-basic-item> [name]="name"></fuse-horizontal-navigation-basic-item>
</ng-container>
<!-- Branch: aside, collapsable, group --> <!-- Branch: aside, collapsable, group -->
<ng-container *ngIf="item.type === 'aside' || item.type === 'collapsable' || item.type === 'group'"> <fuse-horizontal-navigation-branch-item
<fuse-horizontal-navigation-branch-item class="fuse-horizontal-navigation-menu-item"
class="fuse-horizontal-navigation-menu-item" *ngIf="item.type === 'aside' || item.type === 'collapsable' || item.type === 'group'"
[item]="item" [item]="item"
[name]="name"></fuse-horizontal-navigation-branch-item> [name]="name"></fuse-horizontal-navigation-branch-item>
</ng-container>
<!-- Spacer --> <!-- Spacer -->
<ng-container *ngIf="item.type === 'spacer'"> <fuse-horizontal-navigation-spacer-item
<fuse-horizontal-navigation-spacer-item class="fuse-horizontal-navigation-menu-item"
class="fuse-horizontal-navigation-menu-item" *ngIf="item.type === 'spacer'"
[item]="item" [item]="item"
[name]="name"></fuse-horizontal-navigation-spacer-item> [name]="name"></fuse-horizontal-navigation-spacer-item>
</ng-container>
</ng-container> </ng-container>

View File

@@ -15,15 +15,8 @@ export interface FuseNavigationItem
hidden?: (item: FuseNavigationItem) => boolean; hidden?: (item: FuseNavigationItem) => boolean;
active?: boolean; active?: boolean;
disabled?: boolean; disabled?: boolean;
tooltip?: string;
link?: string; link?: string;
externalLink?: boolean; externalLink?: boolean;
target?:
| '_blank'
| '_self'
| '_parent'
| '_top'
| string;
exactMatch?: boolean; exactMatch?: boolean;
isActiveMatchOptions?: IsActiveMatchOptions; isActiveMatchOptions?: IsActiveMatchOptions;
function?: (item: FuseNavigationItem) => void; function?: (item: FuseNavigationItem) => void;

View File

@@ -7,16 +7,14 @@
class="fuse-vertical-navigation-item" class="fuse-vertical-navigation-item"
[ngClass]="{'fuse-vertical-navigation-item-active': active, [ngClass]="{'fuse-vertical-navigation-item-active': active,
'fuse-vertical-navigation-item-disabled': item.disabled, 'fuse-vertical-navigation-item-disabled': item.disabled,
'fuse-vertical-navigation-item-active-forced': item.active}" 'fuse-vertical-navigation-item-active-forced': item.active}">
[matTooltip]="item.tooltip || ''">
<!-- Icon --> <!-- Icon -->
<ng-container *ngIf="item.icon"> <mat-icon
<mat-icon class="fuse-vertical-navigation-item-icon"
class="fuse-vertical-navigation-item-icon" [ngClass]="item.classes?.icon"
[ngClass]="item.classes?.icon" *ngIf="item.icon"
[svgIcon]="item.icon"></mat-icon> [svgIcon]="item.icon"></mat-icon>
</ng-container>
<!-- Title & Subtitle --> <!-- Title & Subtitle -->
<div class="fuse-vertical-navigation-item-title-wrapper"> <div class="fuse-vertical-navigation-item-title-wrapper">
@@ -25,25 +23,25 @@
{{item.title}} {{item.title}}
</span> </span>
</div> </div>
<ng-container *ngIf="item.subtitle"> <div
<div class="fuse-vertical-navigation-item-subtitle"> class="fuse-vertical-navigation-item-subtitle"
<span [ngClass]="item.classes?.subtitle"> *ngIf="item.subtitle">
{{item.subtitle}} <span [ngClass]="item.classes?.subtitle">
</span> {{item.subtitle}}
</div> </span>
</ng-container> </div>
</div> </div>
<!-- Badge --> <!-- Badge -->
<ng-container *ngIf="item.badge"> <div
<div class="fuse-vertical-navigation-item-badge"> class="fuse-vertical-navigation-item-badge"
<div *ngIf="item.badge">
class="fuse-vertical-navigation-item-badge-content" <div
[ngClass]="item.badge.classes"> class="fuse-vertical-navigation-item-badge-content"
{{item.badge.title}} [ngClass]="item.badge.classes">
</div> {{item.badge.title}}
</div> </div>
</ng-container> </div>
</div> </div>
@@ -59,40 +57,35 @@
<ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden"> <ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden">
<!-- Basic --> <!-- Basic -->
<ng-container *ngIf="item.type === 'basic'"> <fuse-vertical-navigation-basic-item
<fuse-vertical-navigation-basic-item *ngIf="item.type === 'basic'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-basic-item> [name]="name"></fuse-vertical-navigation-basic-item>
</ng-container>
<!-- Collapsable --> <!-- Collapsable -->
<ng-container *ngIf="item.type === 'collapsable'"> <fuse-vertical-navigation-collapsable-item
<fuse-vertical-navigation-collapsable-item *ngIf="item.type === 'collapsable'"
[item]="item" [item]="item"
[name]="name" [name]="name"
[autoCollapse]="autoCollapse"></fuse-vertical-navigation-collapsable-item> [autoCollapse]="autoCollapse"></fuse-vertical-navigation-collapsable-item>
</ng-container>
<!-- Divider --> <!-- Divider -->
<ng-container *ngIf="item.type === 'divider'"> <fuse-vertical-navigation-divider-item
<fuse-vertical-navigation-divider-item *ngIf="item.type === 'divider'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-divider-item> [name]="name"></fuse-vertical-navigation-divider-item>
</ng-container>
<!-- Group --> <!-- Group -->
<ng-container *ngIf="item.type === 'group'"> <fuse-vertical-navigation-group-item
<fuse-vertical-navigation-group-item *ngIf="item.type === 'group'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-group-item> [name]="name"></fuse-vertical-navigation-group-item>
</ng-container>
<!-- Spacer --> <!-- Spacer -->
<ng-container *ngIf="item.type === 'spacer'"> <fuse-vertical-navigation-spacer-item
<fuse-vertical-navigation-spacer-item *ngIf="item.type === 'spacer'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-spacer-item> [name]="name"></fuse-vertical-navigation-spacer-item>
</ng-container>
</ng-container> </ng-container>

View File

@@ -10,6 +10,7 @@ import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types
@Component({ @Component({
selector : 'fuse-vertical-navigation-aside-item', selector : 'fuse-vertical-navigation-aside-item',
templateUrl : './aside.component.html', templateUrl : './aside.component.html',
styles : [],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FuseVerticalNavigationAsideItemComponent implements OnChanges, OnInit, OnDestroy export class FuseVerticalNavigationAsideItemComponent implements OnChanges, OnInit, OnDestroy

View File

@@ -5,84 +5,68 @@
[ngClass]="item.classes?.wrapper"> [ngClass]="item.classes?.wrapper">
<!-- Item with an internal link --> <!-- Item with an internal link -->
<ng-container *ngIf="item.link && !item.externalLink && !item.function && !item.disabled"> <a
<a class="fuse-vertical-navigation-item"
class="fuse-vertical-navigation-item" *ngIf="item.link && !item.externalLink && !item.function && !item.disabled"
[ngClass]="{'fuse-vertical-navigation-item-active-forced': item.active}" [ngClass]="{'fuse-vertical-navigation-item-active-forced': item.active}"
[routerLink]="[item.link]" [routerLink]="[item.link]"
[routerLinkActive]="'fuse-vertical-navigation-item-active'" [routerLinkActive]="'fuse-vertical-navigation-item-active'"
[routerLinkActiveOptions]="isActiveMatchOptions" [routerLinkActiveOptions]="isActiveMatchOptions">
[matTooltip]="item.tooltip || ''"> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> </a>
</a>
</ng-container>
<!-- Item with an external link --> <!-- Item with an external link -->
<ng-container *ngIf="item.link && item.externalLink && !item.function && !item.disabled"> <a
<a class="fuse-vertical-navigation-item"
class="fuse-vertical-navigation-item" *ngIf="item.link && item.externalLink && !item.function && !item.disabled"
[href]="item.link" [href]="item.link">
[target]="item.target || '_self'" <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
[matTooltip]="item.tooltip || ''"> </a>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
</a>
</ng-container>
<!-- Item with a function --> <!-- Item with a function -->
<ng-container *ngIf="!item.link && item.function && !item.disabled"> <div
<div class="fuse-vertical-navigation-item"
class="fuse-vertical-navigation-item" *ngIf="!item.link && item.function && !item.disabled"
[ngClass]="{'fuse-vertical-navigation-item-active-forced': item.active}" [ngClass]="{'fuse-vertical-navigation-item-active-forced': item.active}"
[matTooltip]="item.tooltip || ''" (click)="item.function(item)">
(click)="item.function(item)"> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> </div>
</div>
</ng-container>
<!-- Item with an internal link and function --> <!-- Item with an internal link and function -->
<ng-container *ngIf="item.link && !item.externalLink && item.function && !item.disabled"> <a
<a class="fuse-vertical-navigation-item"
class="fuse-vertical-navigation-item" *ngIf="item.link && !item.externalLink && item.function && !item.disabled"
[ngClass]="{'fuse-vertical-navigation-item-active-forced': item.active}" [ngClass]="{'fuse-vertical-navigation-item-active-forced': item.active}"
[routerLink]="[item.link]" [routerLink]="[item.link]"
[routerLinkActive]="'fuse-vertical-navigation-item-active'" [routerLinkActive]="'fuse-vertical-navigation-item-active'"
[routerLinkActiveOptions]="isActiveMatchOptions" [routerLinkActiveOptions]="isActiveMatchOptions"
[matTooltip]="item.tooltip || ''" (click)="item.function(item)">
(click)="item.function(item)"> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> </a>
</a>
</ng-container>
<!-- Item with an external link and function --> <!-- Item with an external link and function -->
<ng-container *ngIf="item.link && item.externalLink && item.function && !item.disabled"> <a
<a class="fuse-vertical-navigation-item"
class="fuse-vertical-navigation-item" *ngIf="item.link && item.externalLink && item.function && !item.disabled"
[href]="item.link" [href]="item.link"
[target]="item.target || '_self'" (click)="item.function(item)">
[matTooltip]="item.tooltip || ''" <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
(click)="item.function(item)"> </a>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
</a>
</ng-container>
<!-- Item with a no link and no function --> <!-- Item with a no link and no function -->
<ng-container *ngIf="!item.link && !item.function && !item.disabled"> <div
<div class="fuse-vertical-navigation-item"
class="fuse-vertical-navigation-item" *ngIf="!item.link && !item.function && !item.disabled"
[ngClass]="{'fuse-vertical-navigation-item-active-forced': item.active}" [ngClass]="{'fuse-vertical-navigation-item-active-forced': item.active}">
[matTooltip]="item.tooltip || ''"> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> </div>
</div>
</ng-container>
<!-- Item is disabled --> <!-- Item is disabled -->
<ng-container *ngIf="item.disabled"> <div
<div class="fuse-vertical-navigation-item fuse-vertical-navigation-item-disabled"
class="fuse-vertical-navigation-item fuse-vertical-navigation-item-disabled" *ngIf="item.disabled">
[matTooltip]="item.tooltip || ''"> <ng-container *ngTemplateOutlet="itemTemplate"></ng-container>
<ng-container *ngTemplateOutlet="itemTemplate"></ng-container> </div>
</div>
</ng-container>
</div> </div>
@@ -90,12 +74,11 @@
<ng-template #itemTemplate> <ng-template #itemTemplate>
<!-- Icon --> <!-- Icon -->
<ng-container *ngIf="item.icon"> <mat-icon
<mat-icon class="fuse-vertical-navigation-item-icon"
class="fuse-vertical-navigation-item-icon" [ngClass]="item.classes?.icon"
[ngClass]="item.classes?.icon" *ngIf="item.icon"
[svgIcon]="item.icon"></mat-icon> [svgIcon]="item.icon"></mat-icon>
</ng-container>
<!-- Title & Subtitle --> <!-- Title & Subtitle -->
<div class="fuse-vertical-navigation-item-title-wrapper"> <div class="fuse-vertical-navigation-item-title-wrapper">
@@ -104,24 +87,24 @@
{{item.title}} {{item.title}}
</span> </span>
</div> </div>
<ng-container *ngIf="item.subtitle"> <div
<div class="fuse-vertical-navigation-item-subtitle"> class="fuse-vertical-navigation-item-subtitle"
<span [ngClass]="item.classes?.subtitle"> *ngIf="item.subtitle">
{{item.subtitle}} <span [ngClass]="item.classes?.subtitle">
</span> {{item.subtitle}}
</div> </span>
</ng-container> </div>
</div> </div>
<!-- Badge --> <!-- Badge -->
<ng-container *ngIf="item.badge"> <div
<div class="fuse-vertical-navigation-item-badge"> class="fuse-vertical-navigation-item-badge"
<div *ngIf="item.badge">
class="fuse-vertical-navigation-item-badge-content" <div
[ngClass]="item.badge.classes"> class="fuse-vertical-navigation-item-badge-content"
{{item.badge.title}} [ngClass]="item.badge.classes">
</div> {{item.badge.title}}
</div> </div>
</ng-container> </div>
</ng-template> </ng-template>

View File

@@ -10,6 +10,7 @@ import { FuseUtilsService } from '@fuse/services/utils/utils.service';
@Component({ @Component({
selector : 'fuse-vertical-navigation-basic-item', selector : 'fuse-vertical-navigation-basic-item',
templateUrl : './basic.component.html', templateUrl : './basic.component.html',
styles : [],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FuseVerticalNavigationBasicItemComponent implements OnInit, OnDestroy export class FuseVerticalNavigationBasicItemComponent implements OnInit, OnDestroy

View File

@@ -6,16 +6,14 @@
<div <div
class="fuse-vertical-navigation-item" class="fuse-vertical-navigation-item"
[ngClass]="{'fuse-vertical-navigation-item-disabled': item.disabled}" [ngClass]="{'fuse-vertical-navigation-item-disabled': item.disabled}"
[matTooltip]="item.tooltip || ''"
(click)="toggleCollapsable()"> (click)="toggleCollapsable()">
<!-- Icon --> <!-- Icon -->
<ng-container *ngIf="item.icon"> <mat-icon
<mat-icon class="fuse-vertical-navigation-item-icon"
class="fuse-vertical-navigation-item-icon" [ngClass]="item.classes?.icon"
[ngClass]="item.classes?.icon" *ngIf="item.icon"
[svgIcon]="item.icon"></mat-icon> [svgIcon]="item.icon"></mat-icon>
</ng-container>
<!-- Title & Subtitle --> <!-- Title & Subtitle -->
<div class="fuse-vertical-navigation-item-title-wrapper"> <div class="fuse-vertical-navigation-item-title-wrapper">
@@ -24,25 +22,25 @@
{{item.title}} {{item.title}}
</span> </span>
</div> </div>
<ng-container *ngIf="item.subtitle"> <div
<div class="fuse-vertical-navigation-item-subtitle"> class="fuse-vertical-navigation-item-subtitle"
<span [ngClass]="item.classes?.subtitle"> *ngIf="item.subtitle">
{{item.subtitle}} <span [ngClass]="item.classes?.subtitle">
</span> {{item.subtitle}}
</div> </span>
</ng-container> </div>
</div> </div>
<!-- Badge --> <!-- Badge -->
<ng-container *ngIf="item.badge"> <div
<div class="fuse-vertical-navigation-item-badge"> class="fuse-vertical-navigation-item-badge"
<div *ngIf="item.badge">
class="fuse-vertical-navigation-item-badge-content" <div
[ngClass]="item.badge.classes"> class="fuse-vertical-navigation-item-badge-content"
{{item.badge.title}} [ngClass]="item.badge.classes">
</div> {{item.badge.title}}
</div> </div>
</ng-container> </div>
<!-- Arrow --> <!-- Arrow -->
<mat-icon <mat-icon
@@ -64,40 +62,35 @@
<ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden"> <ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden">
<!-- Basic --> <!-- Basic -->
<ng-container *ngIf="item.type === 'basic'"> <fuse-vertical-navigation-basic-item
<fuse-vertical-navigation-basic-item *ngIf="item.type === 'basic'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-basic-item> [name]="name"></fuse-vertical-navigation-basic-item>
</ng-container>
<!-- Collapsable --> <!-- Collapsable -->
<ng-container *ngIf="item.type === 'collapsable'"> <fuse-vertical-navigation-collapsable-item
<fuse-vertical-navigation-collapsable-item *ngIf="item.type === 'collapsable'"
[item]="item" [item]="item"
[name]="name" [name]="name"
[autoCollapse]="autoCollapse"></fuse-vertical-navigation-collapsable-item> [autoCollapse]="autoCollapse"></fuse-vertical-navigation-collapsable-item>
</ng-container>
<!-- Divider --> <!-- Divider -->
<ng-container *ngIf="item.type === 'divider'"> <fuse-vertical-navigation-divider-item
<fuse-vertical-navigation-divider-item *ngIf="item.type === 'divider'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-divider-item> [name]="name"></fuse-vertical-navigation-divider-item>
</ng-container>
<!-- Group --> <!-- Group -->
<ng-container *ngIf="item.type === 'group'"> <fuse-vertical-navigation-group-item
<fuse-vertical-navigation-group-item *ngIf="item.type === 'group'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-group-item> [name]="name"></fuse-vertical-navigation-group-item>
</ng-container>
<!-- Spacer --> <!-- Spacer -->
<ng-container *ngIf="item.type === 'spacer'"> <fuse-vertical-navigation-spacer-item
<fuse-vertical-navigation-spacer-item *ngIf="item.type === 'spacer'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-spacer-item> [name]="name"></fuse-vertical-navigation-spacer-item>
</ng-container>
</ng-container> </ng-container>

View File

@@ -11,6 +11,7 @@ import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types
@Component({ @Component({
selector : 'fuse-vertical-navigation-collapsable-item', selector : 'fuse-vertical-navigation-collapsable-item',
templateUrl : './collapsable.component.html', templateUrl : './collapsable.component.html',
styles : [],
animations : fuseAnimations, animations : fuseAnimations,
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })

View File

@@ -8,6 +8,7 @@ import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types
@Component({ @Component({
selector : 'fuse-vertical-navigation-divider-item', selector : 'fuse-vertical-navigation-divider-item',
templateUrl : './divider.component.html', templateUrl : './divider.component.html',
styles : [],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FuseVerticalNavigationDividerItemComponent implements OnInit, OnDestroy export class FuseVerticalNavigationDividerItemComponent implements OnInit, OnDestroy

View File

@@ -7,12 +7,11 @@
<div class="fuse-vertical-navigation-item"> <div class="fuse-vertical-navigation-item">
<!-- Icon --> <!-- Icon -->
<ng-container *ngIf="item.icon"> <mat-icon
<mat-icon class="fuse-vertical-navigation-item-icon"
class="fuse-vertical-navigation-item-icon" [ngClass]="item.classes?.icon"
[ngClass]="item.classes?.icon" *ngIf="item.icon"
[svgIcon]="item.icon"></mat-icon> [svgIcon]="item.icon"></mat-icon>
</ng-container>
<!-- Title & Subtitle --> <!-- Title & Subtitle -->
<div class="fuse-vertical-navigation-item-title-wrapper"> <div class="fuse-vertical-navigation-item-title-wrapper">
@@ -21,25 +20,25 @@
{{item.title}} {{item.title}}
</span> </span>
</div> </div>
<ng-container *ngIf="item.subtitle"> <div
<div class="fuse-vertical-navigation-item-subtitle"> class="fuse-vertical-navigation-item-subtitle"
<span [ngClass]="item.classes?.subtitle"> *ngIf="item.subtitle">
{{item.subtitle}} <span [ngClass]="item.classes?.subtitle">
</span> {{item.subtitle}}
</div> </span>
</ng-container> </div>
</div> </div>
<!-- Badge --> <!-- Badge -->
<ng-container *ngIf="item.badge"> <div
<div class="fuse-vertical-navigation-item-badge"> class="fuse-vertical-navigation-item-badge"
<div *ngIf="item.badge">
class="fuse-vertical-navigation-item-badge-content" <div
[ngClass]="item.badge.classes"> class="fuse-vertical-navigation-item-badge-content"
{{item.badge.title}} [ngClass]="item.badge.classes">
</div> {{item.badge.title}}
</div> </div>
</ng-container> </div>
</div> </div>
@@ -51,40 +50,35 @@
<ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden"> <ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden">
<!-- Basic --> <!-- Basic -->
<ng-container *ngIf="item.type === 'basic'"> <fuse-vertical-navigation-basic-item
<fuse-vertical-navigation-basic-item *ngIf="item.type === 'basic'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-basic-item> [name]="name"></fuse-vertical-navigation-basic-item>
</ng-container>
<!-- Collapsable --> <!-- Collapsable -->
<ng-container *ngIf="item.type === 'collapsable'"> <fuse-vertical-navigation-collapsable-item
<fuse-vertical-navigation-collapsable-item *ngIf="item.type === 'collapsable'"
[item]="item" [item]="item"
[name]="name" [name]="name"
[autoCollapse]="autoCollapse"></fuse-vertical-navigation-collapsable-item> [autoCollapse]="autoCollapse"></fuse-vertical-navigation-collapsable-item>
</ng-container>
<!-- Divider --> <!-- Divider -->
<ng-container *ngIf="item.type === 'divider'"> <fuse-vertical-navigation-divider-item
<fuse-vertical-navigation-divider-item *ngIf="item.type === 'divider'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-divider-item> [name]="name"></fuse-vertical-navigation-divider-item>
</ng-container>
<!-- Group --> <!-- Group -->
<ng-container *ngIf="item.type === 'group'"> <fuse-vertical-navigation-group-item
<fuse-vertical-navigation-group-item *ngIf="item.type === 'group'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-group-item> [name]="name"></fuse-vertical-navigation-group-item>
</ng-container>
<!-- Spacer --> <!-- Spacer -->
<ng-container *ngIf="item.type === 'spacer'"> <fuse-vertical-navigation-spacer-item
<fuse-vertical-navigation-spacer-item *ngIf="item.type === 'spacer'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-spacer-item> [name]="name"></fuse-vertical-navigation-spacer-item>
</ng-container>
</ng-container> </ng-container>

View File

@@ -9,6 +9,7 @@ import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types
@Component({ @Component({
selector : 'fuse-vertical-navigation-group-item', selector : 'fuse-vertical-navigation-group-item',
templateUrl : './group.component.html', templateUrl : './group.component.html',
styles : [],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FuseVerticalNavigationGroupItemComponent implements OnInit, OnDestroy export class FuseVerticalNavigationGroupItemComponent implements OnInit, OnDestroy

View File

@@ -8,6 +8,7 @@ import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types
@Component({ @Component({
selector : 'fuse-vertical-navigation-spacer-item', selector : 'fuse-vertical-navigation-spacer-item',
templateUrl : './spacer.component.html', templateUrl : './spacer.component.html',
styles : [],
changeDetection: ChangeDetectionStrategy.OnPush changeDetection: ChangeDetectionStrategy.OnPush
}) })
export class FuseVerticalNavigationSpacerItemComponent implements OnInit, OnDestroy export class FuseVerticalNavigationSpacerItemComponent implements OnInit, OnDestroy

View File

@@ -335,7 +335,6 @@ fuse-vertical-navigation {
} }
> .fuse-vertical-navigation-item-children { > .fuse-vertical-navigation-item-children {
margin-top: 6px;
> *:last-child { > *:last-child {
padding-bottom: 6px; padding-bottom: 6px;

View File

@@ -24,52 +24,46 @@
<ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden"> <ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden">
<!-- Aside --> <!-- Aside -->
<ng-container *ngIf="item.type === 'aside'"> <fuse-vertical-navigation-aside-item
<fuse-vertical-navigation-aside-item *ngIf="item.type === 'aside'"
[item]="item" [item]="item"
[name]="name" [name]="name"
[activeItemId]="activeAsideItemId" [activeItemId]="activeAsideItemId"
[autoCollapse]="autoCollapse" [autoCollapse]="autoCollapse"
[skipChildren]="true" [skipChildren]="true"
(click)="toggleAside(item)"></fuse-vertical-navigation-aside-item> (click)="toggleAside(item)"></fuse-vertical-navigation-aside-item>
</ng-container>
<!-- Basic --> <!-- Basic -->
<ng-container *ngIf="item.type === 'basic'"> <fuse-vertical-navigation-basic-item
<fuse-vertical-navigation-basic-item *ngIf="item.type === 'basic'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-basic-item> [name]="name"></fuse-vertical-navigation-basic-item>
</ng-container>
<!-- Collapsable --> <!-- Collapsable -->
<ng-container *ngIf="item.type === 'collapsable'"> <fuse-vertical-navigation-collapsable-item
<fuse-vertical-navigation-collapsable-item *ngIf="item.type === 'collapsable'"
[item]="item" [item]="item"
[name]="name" [name]="name"
[autoCollapse]="autoCollapse"></fuse-vertical-navigation-collapsable-item> [autoCollapse]="autoCollapse"></fuse-vertical-navigation-collapsable-item>
</ng-container>
<!-- Divider --> <!-- Divider -->
<ng-container *ngIf="item.type === 'divider'"> <fuse-vertical-navigation-divider-item
<fuse-vertical-navigation-divider-item *ngIf="item.type === 'divider'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-divider-item> [name]="name"></fuse-vertical-navigation-divider-item>
</ng-container>
<!-- Group --> <!-- Group -->
<ng-container *ngIf="item.type === 'group'"> <fuse-vertical-navigation-group-item
<fuse-vertical-navigation-group-item *ngIf="item.type === 'group'"
[item]="item" [item]="item"
[name]="name" [name]="name"
[autoCollapse]="autoCollapse"></fuse-vertical-navigation-group-item> [autoCollapse]="autoCollapse"></fuse-vertical-navigation-group-item>
</ng-container>
<!-- Spacer --> <!-- Spacer -->
<ng-container *ngIf="item.type === 'spacer'"> <fuse-vertical-navigation-spacer-item
<fuse-vertical-navigation-spacer-item *ngIf="item.type === 'spacer'"
[item]="item" [item]="item"
[name]="name"></fuse-vertical-navigation-spacer-item> [name]="name"></fuse-vertical-navigation-spacer-item>
</ng-container>
</ng-container> </ng-container>
@@ -90,33 +84,31 @@
</div> </div>
<!-- Aside --> <!-- Aside -->
<ng-container *ngIf="activeAsideItemId"> <div
<div class="fuse-vertical-navigation-aside-wrapper"
class="fuse-vertical-navigation-aside-wrapper" *ngIf="activeAsideItemId"
fuseScrollbar fuseScrollbar
[fuseScrollbarOptions]="{wheelPropagation: false, suppressScrollX: true}" [fuseScrollbarOptions]="{wheelPropagation: false, suppressScrollX: true}"
[@fadeInLeft]="position === 'left'" [@fadeInLeft]="position === 'left'"
[@fadeInRight]="position === 'right'" [@fadeInRight]="position === 'right'"
[@fadeOutLeft]="position === 'left'" [@fadeOutLeft]="position === 'left'"
[@fadeOutRight]="position === 'right'"> [@fadeOutRight]="position === 'right'">
<!-- Items --> <!-- Items -->
<ng-container *ngFor="let item of navigation; trackBy: trackByFn"> <ng-container *ngFor="let item of navigation; trackBy: trackByFn">
<!-- Skip the hidden items --> <!-- Skip the hidden items -->
<ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden"> <ng-container *ngIf="(item.hidden && !item.hidden(item)) || !item.hidden">
<!-- Aside --> <!-- Aside -->
<ng-container *ngIf="item.type === 'aside' && item.id === activeAsideItemId"> <fuse-vertical-navigation-aside-item
<fuse-vertical-navigation-aside-item *ngIf="item.type === 'aside' && item.id === activeAsideItemId"
[item]="item" [item]="item"
[name]="name" [name]="name"
[autoCollapse]="autoCollapse"></fuse-vertical-navigation-aside-item> [autoCollapse]="autoCollapse"></fuse-vertical-navigation-aside-item>
</ng-container>
</ng-container>
</ng-container> </ng-container>
</div> </ng-container>
</ng-container>
</div>

View File

@@ -374,10 +374,6 @@ export class FuseVerticalNavigationComponent implements OnChanges, OnInit, After
*/ */
ngOnDestroy(): void ngOnDestroy(): void
{ {
// Forcefully close the navigation and aside in case they are opened
this.close();
this.closeAside();
// Deregister the navigation component from the registry // Deregister the navigation component from the registry
this._fuseNavigationService.deregisterComponent(this.name); this._fuseNavigationService.deregisterComponent(this.name);

View File

@@ -0,0 +1,114 @@
import { ChangeDetectorRef, Directive, ElementRef, HostBinding, HostListener, Input, NgZone, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core';
import { Subject } from 'rxjs';
@Directive({
selector: 'textarea[fuseAutogrow]',
exportAs: 'fuseAutogrow'
})
export class FuseAutogrowDirective implements OnChanges, OnInit, OnDestroy
{
// eslint-disable-next-line @angular-eslint/no-input-rename
@Input('fuseAutogrowVerticalPadding') padding: number = 8;
@HostBinding('rows') private _rows: number = 1;
private _height: string = 'auto';
private _unsubscribeAll: Subject<any> = new Subject<any>();
/**
* Constructor
*/
constructor(
private _elementRef: ElementRef,
private _changeDetectorRef: ChangeDetectorRef,
private _ngZone: NgZone
)
{
}
// -----------------------------------------------------------------------------------------------------
// @ Accessors
// -----------------------------------------------------------------------------------------------------
/**
* Host binding for component inline styles
*/
@HostBinding('style') get styleList(): any
{
return {
'height' : this._height,
'overflow': 'hidden',
'resize' : 'none'
};
}
// -----------------------------------------------------------------------------------------------------
// @ Decorated methods
// -----------------------------------------------------------------------------------------------------
/**
* Resize on 'input' and 'ngModelChange' events
*
* @private
*/
@HostListener('input')
@HostListener('ngModelChange')
private _resize(): void
{
// This doesn't need to trigger Angular's change detection by itself
this._ngZone.runOutsideAngular(() => {
setTimeout(() => {
// Set the height to 'auto' so we can correctly read the scrollHeight
this._height = 'auto';
// Detect the changes so the height is applied
this._changeDetectorRef.detectChanges();
// Get the scrollHeight and subtract the vertical padding
this._height = `${this._elementRef.nativeElement.scrollHeight - this.padding}px`;
// Detect the changes one more time to apply the final height
this._changeDetectorRef.detectChanges();
});
});
}
// -----------------------------------------------------------------------------------------------------
// @ Lifecycle hooks
// -----------------------------------------------------------------------------------------------------
/**
* On changes
*
* @param changes
*/
ngOnChanges(changes: SimpleChanges): void
{
// Padding
if ( 'fuseAutogrowVerticalPadding' in changes )
{
// Resize
this._resize();
}
}
/**
* On init
*/
ngOnInit(): void
{
// Resize for the first time
this._resize();
}
/**
* On destroy
*/
ngOnDestroy(): void
{
// Unsubscribe from all subscriptions
this._unsubscribeAll.next();
this._unsubscribeAll.complete();
}
}

View File

@@ -0,0 +1,14 @@
import { NgModule } from '@angular/core';
import { FuseAutogrowDirective } from '@fuse/directives/autogrow/autogrow.directive';
@NgModule({
declarations: [
FuseAutogrowDirective
],
exports : [
FuseAutogrowDirective
]
})
export class FuseAutogrowModule
{
}

View File

@@ -0,0 +1 @@
export * from '@fuse/directives/autogrow/public-api';

View File

@@ -0,0 +1,2 @@
export * from '@fuse/directives/autogrow/autogrow.directive';
export * from '@fuse/directives/autogrow/autogrow.module';

View File

@@ -1,7 +1,5 @@
import { NgModule, Optional, SkipSelf } from '@angular/core'; import { NgModule, Optional, SkipSelf } from '@angular/core';
import { MATERIAL_SANITY_CHECKS } from '@angular/material/core';
import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field'; import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
import { FuseConfirmationModule } from '@fuse/services/confirmation';
import { FuseMediaWatcherModule } from '@fuse/services/media-watcher/media-watcher.module'; import { FuseMediaWatcherModule } from '@fuse/services/media-watcher/media-watcher.module';
import { FuseSplashScreenModule } from '@fuse/services/splash-screen/splash-screen.module'; import { FuseSplashScreenModule } from '@fuse/services/splash-screen/splash-screen.module';
import { FuseTailwindConfigModule } from '@fuse/services/tailwind/tailwind.module'; import { FuseTailwindConfigModule } from '@fuse/services/tailwind/tailwind.module';
@@ -9,22 +7,12 @@ import { FuseUtilsModule } from '@fuse/services/utils/utils.module';
@NgModule({ @NgModule({
imports : [ imports : [
FuseConfirmationModule,
FuseMediaWatcherModule, FuseMediaWatcherModule,
FuseSplashScreenModule, FuseSplashScreenModule,
FuseTailwindConfigModule, FuseTailwindConfigModule,
FuseUtilsModule FuseUtilsModule
], ],
providers: [ providers: [
{
// Disable 'theme' sanity check
provide : MATERIAL_SANITY_CHECKS,
useValue: {
doctype: true,
theme : false,
version: true
}
},
{ {
// Use the 'fill' appearance on Angular Material form fields by default // Use the 'fill' appearance on Angular Material form fields by default
provide : MAT_FORM_FIELD_DEFAULT_OPTIONS, provide : MAT_FORM_FIELD_DEFAULT_OPTIONS,

View File

@@ -1,31 +0,0 @@
import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatDialogModule } from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon';
import { FuseConfirmationService } from '@fuse/services/confirmation/confirmation.service';
import { FuseConfirmationDialogComponent } from '@fuse/services/confirmation/dialog/dialog.component';
import { CommonModule } from '@angular/common';
@NgModule({
declarations: [
FuseConfirmationDialogComponent
],
imports: [
MatButtonModule,
MatDialogModule,
MatIconModule,
CommonModule
],
providers : [
FuseConfirmationService
]
})
export class FuseConfirmationModule
{
/**
* Constructor
*/
constructor(private _fuseConfirmationService: FuseConfirmationService)
{
}
}

View File

@@ -1,58 +0,0 @@
import { Injectable } from '@angular/core';
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
import { merge } from 'lodash-es';
import { FuseConfirmationDialogComponent } from '@fuse/services/confirmation/dialog/dialog.component';
import { FuseConfirmationConfig } from '@fuse/services/confirmation/confirmation.types';
@Injectable()
export class FuseConfirmationService
{
private _defaultConfig: FuseConfirmationConfig = {
title : 'Confirm action',
message : 'Are you sure you want to confirm this action?',
icon : {
show : true,
name : 'heroicons_outline:exclamation',
color: 'warn'
},
actions : {
confirm: {
show : true,
label: 'Confirm',
color: 'warn'
},
cancel : {
show : true,
label: 'Cancel'
}
},
dismissible: false
};
/**
* Constructor
*/
constructor(
private _matDialog: MatDialog
)
{
}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
open(config: FuseConfirmationConfig = {}): MatDialogRef<FuseConfirmationDialogComponent>
{
// Merge the user config with the default config
const userConfig = merge({}, this._defaultConfig, config);
// Open the dialog
return this._matDialog.open(FuseConfirmationDialogComponent, {
autoFocus : false,
disableClose: !userConfig.dismissible,
data : userConfig,
panelClass : 'fuse-confirmation-dialog-panel'
});
}
}

View File

@@ -1,22 +0,0 @@
export interface FuseConfirmationConfig
{
title?: string;
message?: string;
icon?: {
show?: boolean;
name?: string;
color?: 'primary' | 'accent' | 'warn' | 'basic' | 'info' | 'success' | 'warning' | 'error';
};
actions?: {
confirm?: {
show?: boolean;
label?: string;
color?: 'primary' | 'accent' | 'warn';
};
cancel?: {
show?: boolean;
label?: string;
};
};
dismissible?: boolean;
}

View File

@@ -1,85 +0,0 @@
<div class="relative flex flex-col w-full h-full">
<!-- Dismiss button -->
<ng-container *ngIf="data.dismissible">
<div class="absolute top-0 right-0 pt-4 pr-4">
<button
mat-icon-button
[matDialogClose]="undefined">
<mat-icon
class="text-secondary"
[svgIcon]="'heroicons_outline:x'"></mat-icon>
</button>
</div>
</ng-container>
<!-- Content -->
<div class="flex flex-col sm:flex-row flex-auto items-center sm:items-start p-8 pb-6 sm:pb-8">
<!-- Icon -->
<ng-container *ngIf="data.icon.show">
<div
class="flex flex-0 items-center justify-center w-10 h-10 sm:mr-4 rounded-full"
[ngClass]="{'text-primary-600 bg-primary-100 dark:text-primary-50 dark:bg-primary-600': data.icon.color === 'primary',
'text-accent-600 bg-accent-100 dark:text-accent-50 dark:bg-accent-600': data.icon.color === 'accent',
'text-warn-600 bg-warn-100 dark:text-warn-50 dark:bg-warn-600': data.icon.color === 'warn',
'text-gray-600 bg-gray-100 dark:text-gray-50 dark:bg-gray-600': data.icon.color === 'basic',
'text-blue-600 bg-blue-100 dark:text-blue-50 dark:bg-blue-600': data.icon.color === 'info',
'text-green-500 bg-green-100 dark:text-green-50 dark:bg-green-500': data.icon.color === 'success',
'text-amber-500 bg-amber-100 dark:text-amber-50 dark:bg-amber-500': data.icon.color === 'warning',
'text-red-600 bg-red-100 dark:text-red-50 dark:bg-red-600': data.icon.color === 'error'
}">
<mat-icon
class="text-current"
[svgIcon]="data.icon.name"></mat-icon>
</div>
</ng-container>
<ng-container *ngIf="data.title || data.message">
<div class="flex flex-col items-center sm:items-start mt-4 sm:mt-0 sm:pr-8 space-y-1 text-center sm:text-left">
<!-- Title -->
<ng-container *ngIf="data.title">
<div
class="text-xl leading-6 font-medium"
[innerHTML]="data.title"></div>
</ng-container>
<!-- Message -->
<ng-container *ngIf="data.message">
<div
class="text-secondary"
[innerHTML]="data.message"></div>
</ng-container>
</div>
</ng-container>
</div>
<!-- Actions -->
<ng-container *ngIf="data.actions.confirm.show || data.actions.cancel.show">
<div class="flex items-center justify-center sm:justify-end px-6 py-4 space-x-3 bg-gray-50 dark:bg-black dark:bg-opacity-10">
<!-- Cancel -->
<ng-container *ngIf="data.actions.cancel.show">
<button
mat-stroked-button
[matDialogClose]="'cancelled'">
{{data.actions.cancel.label}}
</button>
</ng-container>
<!-- Confirm -->
<ng-container *ngIf="data.actions.confirm.show">
<button
mat-flat-button
[color]="data.actions.confirm.color"
[matDialogClose]="'confirmed'">
{{data.actions.confirm.label}}
</button>
</ng-container>
</div>
</ng-container>
</div>

View File

@@ -1,52 +0,0 @@
import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { FuseConfirmationConfig } from '@fuse/services/confirmation/confirmation.types';
@Component({
selector : 'fuse-confirmation-dialog',
templateUrl : './dialog.component.html',
styles : [
/* language=SCSS */
`
.fuse-confirmation-dialog-panel {
@screen md {
@apply w-128;
}
.mat-dialog-container {
padding: 0 !important;
}
}
`
],
encapsulation: ViewEncapsulation.None
})
export class FuseConfirmationDialogComponent implements OnInit
{
/**
* Constructor
*/
constructor(
@Inject(MAT_DIALOG_DATA) public data: FuseConfirmationConfig,
public matDialogRef: MatDialogRef<FuseConfirmationDialogComponent>
)
{
}
// -----------------------------------------------------------------------------------------------------
// @ Lifecycle hooks
// -----------------------------------------------------------------------------------------------------
/**
* On init
*/
ngOnInit(): void
{
}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
}

View File

@@ -1 +0,0 @@
export * from '@fuse/services/confirmation/public-api';

View File

@@ -1,3 +0,0 @@
export * from '@fuse/services/confirmation/confirmation.module';
export * from '@fuse/services/confirmation/confirmation.service';
export * from '@fuse/services/confirmation/confirmation.types';

View File

@@ -136,8 +136,11 @@
.mat-flat-button, .mat-flat-button,
.mat-raised-button, .mat-raised-button,
.mat-stroked-button { .mat-stroked-button {
padding: 0 20px !important;
border-radius: 9999px !important; .fuse-mat-rounded & {
padding: 0 20px;
border-radius: 9999px;
}
} }
/* Target all buttons */ /* Target all buttons */
@@ -331,8 +334,6 @@
/* @ Button Toggle /* @ Button Toggle
/* ----------------------------------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------------------------------- */
.mat-button-toggle-group { .mat-button-toggle-group {
border: none !important;
@apply space-x-1;
&.mat-button-toggle-group-appearance-standard { &.mat-button-toggle-group-appearance-standard {
@@ -340,27 +341,36 @@
background-clip: padding-box; background-clip: padding-box;
} }
} }
}
.mat-button-toggle { /* Rounded design */
border-radius: 9999px; .fuse-mat-rounded {
overflow: hidden;
.mat-button-toggle-group {
border: none !important; border: none !important;
font-weight: 500; @apply space-x-1;
&.mat-button-toggle-checked { .mat-button-toggle {
border-radius: 9999px;
overflow: hidden;
border: none !important;
font-weight: 500;
&.mat-button-toggle-checked {
.mat-button-toggle-label-content {
@apply text-default #{'!important'};
}
}
.mat-button-toggle-label-content { .mat-button-toggle-label-content {
@apply text-default #{'!important'}; padding: 0 20px;
@apply text-secondary;
} }
}
.mat-button-toggle-label-content { .mat-ripple {
padding: 0 20px; border-radius: 9999px;
@apply text-secondary; }
}
.mat-ripple {
border-radius: 9999px;
} }
} }
} }
@@ -400,13 +410,6 @@
font-weight: 500 !important; font-weight: 500 !important;
} }
/* ----------------------------------------------------------------------------------------------------- */
/* @ Dialog
/* ----------------------------------------------------------------------------------------------------- */
.mat-dialog-container {
border-radius: 16px !important;
}
/* ----------------------------------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------------------------------- */
/* @ Drawer /* @ Drawer
/* ----------------------------------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------------------------------- */
@@ -680,8 +683,8 @@
align-self: stretch; align-self: stretch;
min-height: 36px; min-height: 36px;
height: auto; height: auto;
margin: 14px 0; margin: 10px 0;
padding: 0 6px 0 0; padding: 4px 6px 4px 0 !important;
transform: none; transform: none;
} }
@@ -1319,55 +1322,62 @@
opacity: 0 !important; opacity: 0 !important;
} }
} }
.mat-tab-header {
border-bottom: none !important;
.mat-tab-label-container {
padding: 0 24px;
.mat-tab-list {
.mat-tab-labels {
.mat-tab-label {
min-width: 0 !important;
height: 40px !important;
padding: 0 20px !important;
border-radius: 9999px !important;
@apply text-secondary;
&.mat-tab-label-active {
@apply bg-gray-700 bg-opacity-10 dark:bg-gray-50 dark:bg-opacity-10 #{'!important'};
@apply text-default #{'!important'};
}
+ .mat-tab-label {
margin-left: 4px;
}
.mat-tab-label-content {
line-height: 20px;
}
}
}
.mat-ink-bar {
display: none !important;
}
}
}
}
.mat-tab-body-content {
padding: 24px;
}
} }
.mat-tab-label { .mat-tab-label {
opacity: 1 !important; opacity: 1 !important;
} }
/* Rounded design */
.fuse-mat-rounded {
.mat-tab-group {
.mat-tab-header {
border-bottom: none !important;
.mat-tab-label-container {
padding: 0 24px;
.mat-tab-list {
.mat-tab-labels {
.mat-tab-label {
min-width: 0 !important;
height: 40px !important;
padding: 0 20px !important;
border-radius: 9999px !important;
@apply text-secondary;
&.mat-tab-label-active {
@apply bg-gray-700 bg-opacity-10 dark:bg-gray-50 dark:bg-opacity-10 #{'!important'};
@apply text-default #{'!important'};
}
+ .mat-tab-label {
margin-left: 4px;
}
.mat-tab-label-content {
line-height: 20px;
}
}
}
.mat-ink-bar {
display: none !important;
}
}
}
}
.mat-tab-body-content {
padding: 24px;
}
}
}
/* ----------------------------------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------------------------------- */
/* @ Textarea /* @ Textarea
/* ----------------------------------------------------------------------------------------------------- */ /* ----------------------------------------------------------------------------------------------------- */

View File

@@ -4,12 +4,11 @@
.ql-toolbar { .ql-toolbar {
border-radius: 6px 6px 0 0; border-radius: 6px 6px 0 0;
padding: 0 !important; padding: 0 !important;
@apply bg-gray-100; @apply bg-gray-100 border-gray-300;
@apply border-gray-300 border-opacity-100 #{'!important'};
.dark & { .dark & {
background-color: rgba(0, 0, 0, 0.05); background-color: rgba(0, 0, 0, 0.05);
@apply border-gray-500 #{'!important'}; @apply border-gray-500;
} }
.ql-formats { .ql-formats {
@@ -82,22 +81,26 @@
.ql-container { .ql-container {
overflow: hidden; overflow: hidden;
border-radius: 0 0 6px 6px; border-radius: 0 0 6px 6px;
@apply border-gray-300 border-opacity-100 shadow-sm #{'!important'}; @apply border-gray-300 shadow-sm;
.dark & { .dark & {
@apply border-gray-500 #{'!important'}; @apply border-gray-500;
} }
.ql-editor { .ql-editor {
min-height: 160px; min-height: 160px;
max-height: 160px; max-height: 160px;
height: 160px; height: 160px;
@apply bg-card; @apply bg-gray-50;
.dark & { .dark & {
background-color: rgba(0, 0, 0, 0.05); background-color: rgba(0, 0, 0, 0.05);
} }
&:focus {
@apply bg-card;
}
&.ql-blank::before { &.ql-blank::before {
@apply text-hint; @apply text-hint;
} }

View File

@@ -1,24 +1,96 @@
@use '~@angular/material' as mat; @use '~@angular/material' as mat;
@use "sass:map"; @use "sass:map";
/* Include the core Angular Material styles */ /** Include the core Angular Material styles */
@include mat.core(); @include mat.core();
/* Create a base theme without color. /** Configure the Angular Material typography */
This will globally set the density and typography for all future color themes. */ @include mat.all-component-typographies(
@include mat.all-component-themes(( mat.define-typography-config(
color: null, $font-family: theme('fontFamily.sans'),
density: -2, $title: mat.define-typography-level(1.25rem, 2rem, 600),
typography: mat.define-typography-config( $body-2: mat.define-typography-level(0.875rem, 1.5rem, 600),
$font-family: theme('fontFamily.sans'), $button: mat.define-typography-level(0.875rem, 0.875rem, 500),
$title: mat.define-typography-level(1.25rem, 2rem, 600), $input: mat.define-typography-level(0.875rem, 1.2857142857, 400) // line-height: 20px
$body-2: mat.define-typography-level(0.875rem, 1.5rem, 600), )
$button: mat.define-typography-level(0.875rem, 0.875rem, 500), );
$input: mat.define-typography-level(0.875rem, 1.2857142857, 400) /* line-height: 20px */
)
));
/* Generate Primary, Accent and Warn palettes */ /** Prepare the Background and Foreground maps */
$background-light: (
status-bar: #CBD5E1, /* blueGray.300 */
app-bar: #FFFFFF,
background: #F1F5F9, /* blueGray.100 */
hover: rgba(148, 163, 184, 0.12), /* blueGray.400 + opacity */
card: #FFFFFF,
dialog: #FFFFFF,
disabled-button: rgba(148, 163, 184, 0.38), /* blueGray.400 + opacity */
raised-button: #FFFFFF,
focused-button: #64748B, /* blueGray.500 */
selected-button: #E2E8F0, /* blueGray.200 */
selected-disabled-button: #E2E8F0, /* blueGray.200 */
disabled-button-toggle: #CBD5E1, /* blueGray.300 */
unselected-chip: #E2E8F0, /* blueGray.200 */
disabled-list-option: #CBD5E1, /* blueGray.300 */
tooltip: #1E293B /* blueGray.800 */
);
$background-dark: (
status-bar: #0F172A, /* blueGray.900 */
app-bar: #0F172A, /* blueGray.900 */
background: #0F172A, /* blueGray.900 */
hover: rgba(255, 255, 255, 0.05),
card: #1E293B, /* blueGray.800 */
dialog: #1E293B, /* blueGray.800 */
disabled-button: rgba(15, 23, 42, 0.38), /* blueGray.900 + opacity */
raised-button: #0F172A, /* blueGray.900 */
focused-button: #E2E8F0, /* blueGray.200 */
selected-button: rgba(255, 255, 255, 0.05),
selected-disabled-button: #1E293B, /* blueGray.800 */
disabled-button-toggle: #0F172A, /* blueGray.900 */
unselected-chip: #475569, /* blueGray.600 */
disabled-list-option: #E2E8F0, /* blueGray.200 */
tooltip: #64748B /* blueGray.500 */
);
$foreground-light: (
base: #000000,
divider: #E2E8F0, /* blueGray.200 */
dividers: #E2E8F0, /* blueGray.200 */
disabled: #94A3B8, /* blueGray.400 */
disabled-button: #94A3B8, /* blueGray.400 */
disabled-text: #94A3B8, /* blueGray.400 */
elevation: #000000,
hint-text: #94A3B8, /* blueGray.400 */
secondary-text: #64748B, /* blueGray.500 */
icon: #64748B, /* blueGray.500 */
icons: #64748B, /* blueGray.500 */
mat-icon: #64748B, /* blueGray.500 */
text: #1E293B, /* blueGray.800 */
slider-min: #1E293B, /* blueGray.800 */
slider-off: #CBD5E1, /* blueGray.300 */
slider-off-active: #94A3B8 /* blueGray.400 */
);
$foreground-dark: (
base: #FFFFFF,
divider: rgba(241, 245, 249, 0.12), /* blueGray.100 + opacity */
dividers: rgba(241, 245, 249, 0.12), /* blueGray.100 + opacity */
disabled: #475569, /* blueGray.600 */
disabled-button: #1E293B, /* blueGray.800 */
disabled-text: #475569, /* blueGray.600 */
elevation: #000000,
hint-text: #64748B, /* blueGray.500 */
secondary-text: #94A3B8, /* blueGray.400 */
icon: #F1F5F9, /* blueGray.100 */
icons: #F1F5F9, /* blueGray.100 */
mat-icon: #94A3B8, /* blueGray.400 */
text: #FFFFFF,
slider-min: #FFFFFF,
slider-off: #64748B, /* blueGray.500 */
slider-off-active: #94A3B8 /* blueGray.400 */
);
/** Generate Primary, Accent and Warn palettes */
$palettes: (); $palettes: ();
@each $name in (primary, accent, warn) { @each $name in (primary, accent, warn) {
$palettes: map.merge($palettes, (#{$name}: ( $palettes: map.merge($palettes, (#{$name}: (
@@ -54,7 +126,7 @@ $palettes: ();
))); )));
} }
/* Generate Angular Material themes. Since we are using CSS Custom Properties, /** Generate Angular Material themes. Since we are using CSS Custom Properties,
we don't have to generate a separate Angular Material theme for each color we don't have to generate a separate Angular Material theme for each color
set. We can just create one light and one dark theme and then switch the set. We can just create one light and one dark theme and then switch the
CSS Custom Properties to dynamically switch the colors. */ CSS Custom Properties to dynamically switch the colors. */
@@ -70,46 +142,13 @@ body .light {
accent: map.get(map.get($base-light-theme, color), accent), accent: map.get(map.get($base-light-theme, color), accent),
warn: map.get(map.get($base-light-theme, color), warn), warn: map.get(map.get($base-light-theme, color), warn),
is-dark: map.get(map.get($base-light-theme, color), is-dark), is-dark: map.get(map.get($base-light-theme, color), is-dark),
foreground: ( foreground: $foreground-light,
base: #000000, background: $background-light
divider: #E2E8F0, /* blueGray.200 */ ),
dividers: #E2E8F0, /* blueGray.200 */ density: -2
disabled: #94A3B8, /* blueGray.400 */
disabled-button: #94A3B8, /* blueGray.400 */
disabled-text: #94A3B8, /* blueGray.400 */
elevation: #000000,
hint-text: #94A3B8, /* blueGray.400 */
secondary-text: #64748B, /* blueGray.500 */
icon: #64748B, /* blueGray.500 */
icons: #64748B, /* blueGray.500 */
mat-icon: #64748B, /* blueGray.500 */
text: #1E293B, /* blueGray.800 */
slider-min: #1E293B, /* blueGray.800 */
slider-off: #CBD5E1, /* blueGray.300 */
slider-off-active: #94A3B8 /* blueGray.400 */
),
background: (
status-bar: #CBD5E1, /* blueGray.300 */
app-bar: #FFFFFF,
background: #F1F5F9, /* blueGray.100 */
hover: rgba(148, 163, 184, 0.12), /* blueGray.400 + opacity */
card: #FFFFFF,
dialog: #FFFFFF,
disabled-button: rgba(148, 163, 184, 0.38), /* blueGray.400 + opacity */
raised-button: #FFFFFF,
focused-button: #64748B, /* blueGray.500 */
selected-button: #E2E8F0, /* blueGray.200 */
selected-disabled-button: #E2E8F0, /* blueGray.200 */
disabled-button-toggle: #CBD5E1, /* blueGray.300 */
unselected-chip: #E2E8F0, /* blueGray.200 */
disabled-list-option: #CBD5E1, /* blueGray.300 */
tooltip: #1E293B /* blueGray.800 */
)
)
); );
/* Use all-component-colors to only generate the colors */ @include mat.all-component-themes($light-theme);
@include mat.all-component-colors($light-theme);
} }
body.dark, body.dark,
@@ -124,44 +163,11 @@ body .dark {
accent: map.get(map.get($base-dark-theme, color), accent), accent: map.get(map.get($base-dark-theme, color), accent),
warn: map.get(map.get($base-dark-theme, color), warn), warn: map.get(map.get($base-dark-theme, color), warn),
is-dark: map.get(map.get($base-dark-theme, color), is-dark), is-dark: map.get(map.get($base-dark-theme, color), is-dark),
foreground: ( foreground: $foreground-dark,
base: #FFFFFF, background: $background-dark
divider: rgba(241, 245, 249, 0.12), /* blueGray.100 + opacity */ ),
dividers: rgba(241, 245, 249, 0.12), /* blueGray.100 + opacity */ density: -2
disabled: #475569, /* blueGray.600 */
disabled-button: #1E293B, /* blueGray.800 */
disabled-text: #475569, /* blueGray.600 */
elevation: #000000,
hint-text: #64748B, /* blueGray.500 */
secondary-text: #94A3B8, /* blueGray.400 */
icon: #F1F5F9, /* blueGray.100 */
icons: #F1F5F9, /* blueGray.100 */
mat-icon: #94A3B8, /* blueGray.400 */
text: #FFFFFF,
slider-min: #FFFFFF,
slider-off: #64748B, /* blueGray.500 */
slider-off-active: #94A3B8 /* blueGray.400 */
),
background: (
status-bar: #0F172A, /* blueGray.900 */
app-bar: #0F172A, /* blueGray.900 */
background: #0F172A, /* blueGray.900 */
hover: rgba(255, 255, 255, 0.05),
card: #1E293B, /* blueGray.800 */
dialog: #1E293B, /* blueGray.800 */
disabled-button: rgba(15, 23, 42, 0.38), /* blueGray.900 + opacity */
raised-button: #0F172A, /* blueGray.900 */
focused-button: #E2E8F0, /* blueGray.200 */
selected-button: rgba(255, 255, 255, 0.05),
selected-disabled-button: #1E293B, /* blueGray.800 */
disabled-button-toggle: #0F172A, /* blueGray.900 */
unselected-chip: #475569, /* blueGray.600 */
disabled-list-option: #E2E8F0, /* blueGray.200 */
tooltip: #64748B /* blueGray.500 */
)
)
); );
/* Use all-component-colors to only generate the colors */
@include mat.all-component-colors($dark-theme); @include mat.all-component-colors($dark-theme);
} }

View File

@@ -1,3 +1,3 @@
import { Version } from '@fuse/version/version'; import { Version } from '@fuse/version/version';
export const FUSE_VERSION = new Version('13.5.0').full; export const FUSE_VERSION = new Version('13.0.2').full;

View File

@@ -14,8 +14,8 @@ import { AppComponent } from 'app/app.component';
import { appRoutes } from 'app/app.routing'; import { appRoutes } from 'app/app.routing';
const routerConfig: ExtraOptions = { const routerConfig: ExtraOptions = {
preloadingStrategy : PreloadAllModules, scrollPositionRestoration: 'enabled',
scrollPositionRestoration: 'enabled' preloadingStrategy : PreloadAllModules
}; };
@NgModule({ @NgModule({

View File

@@ -1,11 +1,9 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
import { forkJoin, Observable } from 'rxjs'; import { forkJoin, Observable } from 'rxjs';
import { MessagesService } from 'app/layout/common/messages/messages.service'; import { map } from 'rxjs/operators';
import { NavigationService } from 'app/core/navigation/navigation.service'; import { InitialData } from 'app/app.types';
import { NotificationsService } from 'app/layout/common/notifications/notifications.service';
import { ShortcutsService } from 'app/layout/common/shortcuts/shortcuts.service';
import { UserService } from 'app/core/user/user.service';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@@ -15,13 +13,7 @@ export class InitialDataResolver implements Resolve<any>
/** /**
* Constructor * Constructor
*/ */
constructor( constructor(private _httpClient: HttpClient)
private _messagesService: MessagesService,
private _navigationService: NavigationService,
private _notificationsService: NotificationsService,
private _shortcutsService: ShortcutsService,
private _userService: UserService
)
{ {
} }
@@ -35,15 +27,29 @@ export class InitialDataResolver implements Resolve<any>
* @param route * @param route
* @param state * @param state
*/ */
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<InitialData>
{ {
// Fork join multiple API endpoint calls to wait all of them to finish // Fork join multiple API endpoint calls to wait all of them to finish
return forkJoin([ return forkJoin([
this._navigationService.get(), this._httpClient.get<any>('api/common/messages'),
this._messagesService.getAll(), this._httpClient.get<any>('api/common/navigation'),
this._notificationsService.getAll(), this._httpClient.get<any>('api/common/notifications'),
this._shortcutsService.getAll(), this._httpClient.get<any>('api/common/shortcuts'),
this._userService.get() this._httpClient.get<any>('api/common/user')
]); ]).pipe(
map(([messages, navigation, notifications, shortcuts, user]) => ({
messages,
navigation: {
compact : navigation.compact,
default : navigation.default,
futuristic: navigation.futuristic,
horizontal: navigation.horizontal
},
notifications,
shortcuts,
user
})
)
);
} }
} }

View File

@@ -5,19 +5,18 @@ import { LayoutComponent } from 'app/layout/layout.component';
import { InitialDataResolver } from 'app/app.resolvers'; import { InitialDataResolver } from 'app/app.resolvers';
// @formatter:off // @formatter:off
/* eslint-disable max-len */ // tslint:disable:max-line-length
/* eslint-disable @typescript-eslint/explicit-function-return-type */
export const appRoutes: Route[] = [ export const appRoutes: Route[] = [
// Redirect empty path to '/dashboards/project' // Redirect empty path to '/example'
{path: '', pathMatch : 'full', redirectTo: 'dashboards/project'}, {path: '', pathMatch : 'full', redirectTo: 'example'},
// Redirect signed in user to the '/dashboards/project' // Redirect signed in user to the '/example'
// //
// After the user signs in, the sign in page will redirect the user to the 'signed-in-redirect' // After the user signs in, the sign in page will redirect the user to the 'signed-in-redirect'
// path. Below is another redirection for that path to redirect the user to the desired // path. Below is another redirection for that path to redirect the user to the desired
// location. This is a small convenience to keep all main routes together here on this file. // location. This is a small convenience to keep all main routes together here on this file.
{path: 'signed-in-redirect', pathMatch : 'full', redirectTo: 'dashboards/project'}, {path: 'signed-in-redirect', pathMatch : 'full', redirectTo: 'example'},
// Auth routes for guests // Auth routes for guests
{ {
@@ -74,137 +73,7 @@ export const appRoutes: Route[] = [
initialData: InitialDataResolver, initialData: InitialDataResolver,
}, },
children : [ children : [
{path: 'example', loadChildren: () => import('app/modules/admin/example/example.module').then(m => m.ExampleModule)},
// Dashboards
{path: 'dashboards', children: [
{path: 'project', loadChildren: () => import('app/modules/admin/dashboards/project/project.module').then(m => m.ProjectModule)},
{path: 'analytics', loadChildren: () => import('app/modules/admin/dashboards/analytics/analytics.module').then(m => m.AnalyticsModule)},
{path: 'finance', loadChildren: () => import('app/modules/admin/dashboards/finance/finance.module').then(m => m.FinanceModule)},
{path: 'crypto', loadChildren: () => import('app/modules/admin/dashboards/crypto/crypto.module').then(m => m.CryptoModule)},
]},
// Apps
{path: 'apps', children: [
{path: 'academy', loadChildren: () => import('app/modules/admin/apps/academy/academy.module').then(m => m.AcademyModule)},
{path: 'calendar', loadChildren: () => import('app/modules/admin/apps/calendar/calendar.module').then(m => m.CalendarModule)},
{path: 'chat', loadChildren: () => import('app/modules/admin/apps/chat/chat.module').then(m => m.ChatModule)},
{path: 'contacts', loadChildren: () => import('app/modules/admin/apps/contacts/contacts.module').then(m => m.ContactsModule)},
{path: 'ecommerce', loadChildren: () => import('app/modules/admin/apps/ecommerce/ecommerce.module').then(m => m.ECommerceModule)},
{path: 'file-manager', loadChildren: () => import('app/modules/admin/apps/file-manager/file-manager.module').then(m => m.FileManagerModule)},
{path: 'help-center', loadChildren: () => import('app/modules/admin/apps/help-center/help-center.module').then(m => m.HelpCenterModule)},
{path: 'mailbox', loadChildren: () => import('app/modules/admin/apps/mailbox/mailbox.module').then(m => m.MailboxModule)},
{path: 'notes', loadChildren: () => import('app/modules/admin/apps/notes/notes.module').then(m => m.NotesModule)},
{path: 'scrumboard', loadChildren: () => import('app/modules/admin/apps/scrumboard/scrumboard.module').then(m => m.ScrumboardModule)},
{path: 'tasks', loadChildren: () => import('app/modules/admin/apps/tasks/tasks.module').then(m => m.TasksModule)},
]},
// Pages
{path: 'pages', children: [
// Activities
{path: 'activities', loadChildren: () => import('app/modules/admin/pages/activities/activities.module').then(m => m.ActivitiesModule)},
// Authentication
{path: 'authentication', loadChildren: () => import('app/modules/admin/pages/authentication/authentication.module').then(m => m.AuthenticationModule)},
// Coming Soon
{path: 'coming-soon', loadChildren: () => import('app/modules/admin/pages/coming-soon/coming-soon.module').then(m => m.ComingSoonModule)},
// Error
{path: 'error', children: [
{path: '404', loadChildren: () => import('app/modules/admin/pages/error/error-404/error-404.module').then(m => m.Error404Module)},
{path: '500', loadChildren: () => import('app/modules/admin/pages/error/error-500/error-500.module').then(m => m.Error500Module)}
]},
// Invoice
{path: 'invoice', children: [
{path: 'printable', children: [
{path: 'compact', loadChildren: () => import('app/modules/admin/pages/invoice/printable/compact/compact.module').then(m => m.CompactModule)},
{path: 'modern', loadChildren: () => import('app/modules/admin/pages/invoice/printable/modern/modern.module').then(m => m.ModernModule)}
]}
]},
// Maintenance
{path: 'maintenance', loadChildren: () => import('app/modules/admin/pages/maintenance/maintenance.module').then(m => m.MaintenanceModule)},
// Pricing
{path: 'pricing', children: [
{path: 'modern', loadChildren: () => import('app/modules/admin/pages/pricing/modern/modern.module').then(m => m.PricingModernModule)},
{path: 'simple', loadChildren: () => import('app/modules/admin/pages/pricing/simple/simple.module').then(m => m.PricingSimpleModule)},
{path: 'single', loadChildren: () => import('app/modules/admin/pages/pricing/single/single.module').then(m => m.PricingSingleModule)},
{path: 'table', loadChildren: () => import('app/modules/admin/pages/pricing/table/table.module').then(m => m.PricingTableModule)}
]},
// Profile
{path: 'profile', loadChildren: () => import('app/modules/admin/pages/profile/profile.module').then(m => m.ProfileModule)},
// Settings
{path: 'settings', loadChildren: () => import('app/modules/admin/pages/settings/settings.module').then(m => m.SettingsModule)},
]},
// User Interface
{path: 'ui', children: [
// Material Components
{path: 'material-components', loadChildren: () => import('app/modules/admin/ui/material-components/material-components.module').then(m => m.MaterialComponentsModule)},
// Fuse Components
{path: 'fuse-components', loadChildren: () => import('app/modules/admin/ui/fuse-components/fuse-components.module').then(m => m.FuseComponentsModule)},
// Other Components
{path: 'other-components', loadChildren: () => import('app/modules/admin/ui/other-components/other-components.module').then(m => m.OtherComponentsModule)},
// TailwindCSS
{path: 'tailwindcss', loadChildren: () => import('app/modules/admin/ui/tailwindcss/tailwindcss.module').then(m => m.TailwindCSSModule)},
// Advanced Search
{path: 'advanced-search', loadChildren: () => import('app/modules/admin/ui/advanced-search/advanced-search.module').then(m => m.AdvancedSearchModule)},
// Animations
{path: 'animations', loadChildren: () => import('app/modules/admin/ui/animations/animations.module').then(m => m.AnimationsModule)},
// Cards
{path: 'cards', loadChildren: () => import('app/modules/admin/ui/cards/cards.module').then(m => m.CardsModule)},
// Colors
{path: 'colors', loadChildren: () => import('app/modules/admin/ui/colors/colors.module').then(m => m.ColorsModule)},
// Confirmation Dialog
{path: 'confirmation-dialog', loadChildren: () => import('app/modules/admin/ui/confirmation-dialog/confirmation-dialog.module').then(m => m.ConfirmationDialogModule)},
// Datatable
{path: 'datatable', loadChildren: () => import('app/modules/admin/ui/datatable/datatable.module').then(m => m.DatatableModule)},
// Forms
{path: 'forms', children: [
{path: 'fields', loadChildren: () => import('app/modules/admin/ui/forms/fields/fields.module').then(m => m.FormsFieldsModule)},
{path: 'layouts', loadChildren: () => import('app/modules/admin/ui/forms/layouts/layouts.module').then(m => m.FormsLayoutsModule)},
{path: 'wizards', loadChildren: () => import('app/modules/admin/ui/forms/wizards/wizards.module').then(m => m.FormsWizardsModule)}
]},
// Icons
{path: 'icons', loadChildren: () => import('app/modules/admin/ui/icons/icons.module').then(m => m.IconsModule)},
// Page Layouts
{path: 'page-layouts', loadChildren: () => import('app/modules/admin/ui/page-layouts/page-layouts.module').then(m => m.PageLayoutsModule)},
// Typography
{path: 'typography', loadChildren: () => import('app/modules/admin/ui/typography/typography.module').then(m => m.TypographyModule)}
]},
// Documentation
{path: 'docs', children: [
// Changelog
{path: 'changelog', loadChildren: () => import('app/modules/admin/docs/changelog/changelog.module').then(m => m.ChangelogModule)},
// Guides
{path: 'guides', loadChildren: () => import('app/modules/admin/docs/guides/guides.module').then(m => m.GuidesModule)}
]},
// 404 & Catch all
{path: '404-not-found', pathMatch: 'full', loadChildren: () => import('app/modules/admin/pages/error/error-404/error-404.module').then(m => m.Error404Module)},
{path: '**', redirectTo: '404-not-found'}
] ]
} }
]; ];

19
src/app/app.types.ts Normal file
View File

@@ -0,0 +1,19 @@
import { FuseNavigationItem } from '@fuse/components/navigation';
import { Message } from 'app/layout/common/messages/messages.types';
import { Notification } from 'app/layout/common/notifications/notifications.types';
import { Shortcut } from 'app/layout/common/shortcuts/shortcuts.types';
import { User } from 'app/core/user/user.model';
export interface InitialData
{
messages: Message[];
navigation: {
compact: FuseNavigationItem[];
default: FuseNavigationItem[];
futuristic: FuseNavigationItem[];
horizontal: FuseNavigationItem[];
};
notifications: Notification[];
shortcuts: Shortcut[];
user: User;
}

View File

@@ -1,48 +0,0 @@
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, ReplaySubject } from 'rxjs';
import { tap } from 'rxjs/operators';
import { Navigation } from 'app/core/navigation/navigation.types';
@Injectable({
providedIn: 'root'
})
export class NavigationService
{
private _navigation: ReplaySubject<Navigation> = new ReplaySubject<Navigation>(1);
/**
* Constructor
*/
constructor(private _httpClient: HttpClient)
{
}
// -----------------------------------------------------------------------------------------------------
// @ Accessors
// -----------------------------------------------------------------------------------------------------
/**
* Getter for navigation
*/
get navigation$(): Observable<Navigation>
{
return this._navigation.asObservable();
}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
/**
* Get all navigation data
*/
get(): Observable<Navigation>
{
return this._httpClient.get<Navigation>('api/common/navigation').pipe(
tap((navigation) => {
this._navigation.next(navigation);
})
);
}
}

View File

@@ -1,9 +0,0 @@
import { FuseNavigationItem } from '@fuse/components/navigation';
export interface Navigation
{
compact: FuseNavigationItem[];
default: FuseNavigationItem[];
futuristic: FuseNavigationItem[];
horizontal: FuseNavigationItem[];
}

View File

@@ -27,6 +27,6 @@ export class TranslocoHttpLoader implements TranslocoLoader
*/ */
getTranslation(lang: string): Observable<Translation> getTranslation(lang: string): Observable<Translation>
{ {
return this._httpClient.get<Translation>(`./assets/i18n/${lang}.json`); return this._httpClient.get<Translation>(`/assets/i18n/${lang}.json`);
} }
} }

View File

@@ -23,7 +23,6 @@ import { TranslocoHttpLoader } from 'app/core/transloco/transloco.http-loader';
} }
], ],
defaultLang : 'en', defaultLang : 'en',
fallbackLang : 'en',
reRenderOnLangChange: true, reRenderOnLangChange: true,
prodMode : environment.production prodMode : environment.production
}) })

View File

@@ -1,8 +1,8 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { Observable, ReplaySubject } from 'rxjs'; import { Observable, ReplaySubject } from 'rxjs';
import { map, tap } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { User } from 'app/core/user/user.types'; import { User } from 'app/core/user/user.model';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@@ -42,18 +42,6 @@ export class UserService
// @ Public methods // @ Public methods
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
/**
* Get the current logged in user data
*/
get(): Observable<User>
{
return this._httpClient.get<User>('api/common/user').pipe(
tap((user) => {
this._user.next(user);
})
);
}
/** /**
* Update the user * Update the user
* *
@@ -63,6 +51,7 @@ export class UserService
{ {
return this._httpClient.patch<User>('api/common/user', {user}).pipe( return this._httpClient.patch<User>('api/common/user', {user}).pipe(
map((response) => { map((response) => {
// Execute the observable
this._user.next(response); this._user.next(response);
}) })
); );

View File

@@ -4,13 +4,13 @@ import { AvailableLangs, TranslocoService } from '@ngneat/transloco';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
@Component({ @Component({
selector : 'languages', selector : 'language',
templateUrl : './languages.component.html', templateUrl : './language.component.html',
encapsulation : ViewEncapsulation.None, encapsulation : ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
exportAs : 'languages' exportAs : 'language'
}) })
export class LanguagesComponent implements OnInit, OnDestroy export class LanguageComponent implements OnInit, OnDestroy
{ {
availableLangs: AvailableLangs; availableLangs: AvailableLangs;
activeLang: string; activeLang: string;

View File

@@ -2,12 +2,12 @@ import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { LanguagesComponent } from 'app/layout/common/languages/languages.component'; import { LanguageComponent } from 'app/layout/common/language/language.component';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
@NgModule({ @NgModule({
declarations: [ declarations: [
LanguagesComponent LanguageComponent
], ],
imports : [ imports : [
MatButtonModule, MatButtonModule,
@@ -16,9 +16,9 @@ import { SharedModule } from 'app/shared/shared.module';
SharedModule SharedModule
], ],
exports : [ exports : [
LanguagesComponent LanguageComponent
] ]
}) })
export class LanguagesModule export class LanguageModule
{ {
} }

View File

@@ -1,4 +1,4 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core';
import { Overlay, OverlayRef } from '@angular/cdk/overlay'; import { Overlay, OverlayRef } from '@angular/cdk/overlay';
import { TemplatePortal } from '@angular/cdk/portal'; import { TemplatePortal } from '@angular/cdk/portal';
import { MatButton } from '@angular/material/button'; import { MatButton } from '@angular/material/button';
@@ -14,12 +14,12 @@ import { MessagesService } from 'app/layout/common/messages/messages.service';
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
exportAs : 'messages' exportAs : 'messages'
}) })
export class MessagesComponent implements OnInit, OnDestroy export class MessagesComponent implements OnInit, OnChanges, OnDestroy
{ {
@Input() messages: Message[];
@ViewChild('messagesOrigin') private _messagesOrigin: MatButton; @ViewChild('messagesOrigin') private _messagesOrigin: MatButton;
@ViewChild('messagesPanel') private _messagesPanel: TemplateRef<any>; @ViewChild('messagesPanel') private _messagesPanel: TemplateRef<any>;
messages: Message[];
unreadCount: number = 0; unreadCount: number = 0;
private _overlayRef: OverlayRef; private _overlayRef: OverlayRef;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
@@ -40,6 +40,21 @@ export class MessagesComponent implements OnInit, OnDestroy
// @ Lifecycle hooks // @ Lifecycle hooks
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
/**
* On changes
*
* @param changes
*/
ngOnChanges(changes: SimpleChanges): void
{
// Messages
if ( 'messages' in changes )
{
// Store the messages on the service
this._messagesService.store(changes.messages.currentValue);
}
}
/** /**
* On init * On init
*/ */
@@ -167,7 +182,7 @@ export class MessagesComponent implements OnInit, OnDestroy
scrollStrategy : this._overlay.scrollStrategies.block(), scrollStrategy : this._overlay.scrollStrategies.block(),
positionStrategy: this._overlay.position() positionStrategy: this._overlay.position()
.flexibleConnectedTo(this._messagesOrigin._elementRef.nativeElement) .flexibleConnectedTo(this._messagesOrigin._elementRef.nativeElement)
.withLockedPosition(true) .withLockedPosition()
.withPush(true) .withPush(true)
.withPositions([ .withPositions([
{ {

View File

@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { Observable, ReplaySubject } from 'rxjs'; import { Observable, ReplaySubject } from 'rxjs';
import { Message } from 'app/layout/common/messages/messages.types'; import { Message } from 'app/layout/common/messages/messages.types';
import { map, switchMap, take, tap } from 'rxjs/operators'; import { map, switchMap, take } from 'rxjs/operators';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@@ -35,15 +35,17 @@ export class MessagesService
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
/** /**
* Get all messages * Store messages on the service
*
* @param messages
*/ */
getAll(): Observable<Message[]> store(messages: Message[]): Observable<Message[]>
{ {
return this._httpClient.get<Message[]>('api/common/messages').pipe( // Load the messages
tap((messages) => { this._messages.next(messages);
this._messages.next(messages);
}) // Return the messages
); return this.messages$;
} }
/** /**

View File

@@ -1,4 +1,4 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core';
import { Overlay, OverlayRef } from '@angular/cdk/overlay'; import { Overlay, OverlayRef } from '@angular/cdk/overlay';
import { TemplatePortal } from '@angular/cdk/portal'; import { TemplatePortal } from '@angular/cdk/portal';
import { MatButton } from '@angular/material/button'; import { MatButton } from '@angular/material/button';
@@ -14,12 +14,12 @@ import { NotificationsService } from 'app/layout/common/notifications/notificati
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
exportAs : 'notifications' exportAs : 'notifications'
}) })
export class NotificationsComponent implements OnInit, OnDestroy export class NotificationsComponent implements OnChanges, OnInit, OnDestroy
{ {
@Input() notifications: Notification[];
@ViewChild('notificationsOrigin') private _notificationsOrigin: MatButton; @ViewChild('notificationsOrigin') private _notificationsOrigin: MatButton;
@ViewChild('notificationsPanel') private _notificationsPanel: TemplateRef<any>; @ViewChild('notificationsPanel') private _notificationsPanel: TemplateRef<any>;
notifications: Notification[];
unreadCount: number = 0; unreadCount: number = 0;
private _overlayRef: OverlayRef; private _overlayRef: OverlayRef;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
@@ -40,6 +40,21 @@ export class NotificationsComponent implements OnInit, OnDestroy
// @ Lifecycle hooks // @ Lifecycle hooks
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
/**
* On changes
*
* @param changes
*/
ngOnChanges(changes: SimpleChanges): void
{
// Notifications
if ( 'notifications' in changes )
{
// Store the notifications on the service
this._notificationsService.store(changes.notifications.currentValue);
}
}
/** /**
* On init * On init
*/ */
@@ -167,7 +182,7 @@ export class NotificationsComponent implements OnInit, OnDestroy
scrollStrategy : this._overlay.scrollStrategies.block(), scrollStrategy : this._overlay.scrollStrategies.block(),
positionStrategy: this._overlay.position() positionStrategy: this._overlay.position()
.flexibleConnectedTo(this._notificationsOrigin._elementRef.nativeElement) .flexibleConnectedTo(this._notificationsOrigin._elementRef.nativeElement)
.withLockedPosition(true) .withLockedPosition()
.withPush(true) .withPush(true)
.withPositions([ .withPositions([
{ {

View File

@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { Observable, ReplaySubject } from 'rxjs'; import { Observable, ReplaySubject } from 'rxjs';
import { Notification } from 'app/layout/common/notifications/notifications.types'; import { Notification } from 'app/layout/common/notifications/notifications.types';
import { map, switchMap, take, tap } from 'rxjs/operators'; import { map, switchMap, take } from 'rxjs/operators';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
@@ -35,15 +35,17 @@ export class NotificationsService
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
/** /**
* Get all notifications * Store notifications on the service
*
* @param notifications
*/ */
getAll(): Observable<Notification[]> store(notifications: Notification[]): Observable<Notification[]>
{ {
return this._httpClient.get<Notification[]>('api/common/notifications').pipe( // Load the notifications
tap((notifications) => { this._notifications.next(notifications);
this._notifications.next(notifications);
}) // Return the notifications
); return this.notifications$;
} }
/** /**

View File

@@ -6,6 +6,7 @@
(click)="open()"> (click)="open()">
<mat-icon [svgIcon]="'heroicons_outline:search'"></mat-icon> <mat-icon [svgIcon]="'heroicons_outline:search'"></mat-icon>
</button> </button>
<div <div
class="absolute inset-0 flex items-center flex-shrink-0 z-99 bg-card" class="absolute inset-0 flex items-center flex-shrink-0 z-99 bg-card"
*ngIf="opened" *ngIf="opened"
@@ -22,36 +23,22 @@
(keydown)="onKeydown($event)" (keydown)="onKeydown($event)"
#barSearchInput> #barSearchInput>
<mat-autocomplete <mat-autocomplete
class="max-h-128 sm:px-2 border-t rounded-b shadow-md" class="max-h-128 border-t rounded-b shadow-md"
[disableRipple]="true" [disableRipple]="true"
#matAutocomplete="matAutocomplete"> #matAutocomplete="matAutocomplete">
<mat-option <mat-option
class="py-0 px-6 text-md pointer-events-none text-secondary bg-transparent" class="h-14 px-6 py-0 sm:px-8 text-md pointer-events-none text-secondary bg-transparent"
*ngIf="resultSets && !resultSets.length"> *ngIf="results && !results.length">
No results found! No results found!
</mat-option> </mat-option>
<ng-container *ngFor="let resultSet of resultSets; trackBy: trackByFn"> <ng-container *ngFor="let result of results; trackBy: trackByFn">
<mat-optgroup class="flex items-center mt-2 px-2"> <mat-option
<span class="text-sm font-semibold tracking-wider text-secondary">{{resultSet.label.toUpperCase()}}</span> class="group relative h-14 px-6 py-0 sm:px-8 text-md"
</mat-optgroup> [routerLink]="result.link">
<ng-container *ngFor="let result of resultSet.results; trackBy: trackByFn"> <ng-container
<mat-option [ngTemplateOutlet]="searchResult"
class="group relative mb-1 py-0 px-6 text-md rounded-md hover:bg-gray-100 dark:hover:bg-hover" [ngTemplateOutletContext]="{$implicit: result}"></ng-container>
[routerLink]="result.link"> </mat-option>
<!-- Contacts -->
<ng-container *ngIf="resultSet.id === 'contacts'">
<ng-container *ngTemplateOutlet="contactResult; context: {$implicit: result}"></ng-container>
</ng-container>
<!-- Pages -->
<ng-container *ngIf="resultSet.id === 'pages'">
<ng-container *ngTemplateOutlet="pageResult; context: {$implicit: result}"></ng-container>
</ng-container>
<!-- Tasks -->
<ng-container *ngIf="resultSet.id === 'tasks'">
<ng-container *ngTemplateOutlet="taskResult; context: {$implicit: result}"></ng-container>
</ng-container>
</mat-option>
</ng-container>
</ng-container> </ng-container>
</mat-autocomplete> </mat-autocomplete>
<button <button
@@ -82,89 +69,62 @@
[disableRipple]="true" [disableRipple]="true"
#matAutocomplete="matAutocomplete"> #matAutocomplete="matAutocomplete">
<mat-option <mat-option
class="py-0 px-6 text-md pointer-events-none text-secondary bg-transparent" class="h-14 px-5 py-0 text-md pointer-events-none text-secondary bg-transparent"
*ngIf="resultSets && !resultSets.length"> *ngIf="results && !results.length">
No results found! No results found!
</mat-option> </mat-option>
<ng-container *ngFor="let resultSet of resultSets; trackBy: trackByFn"> <ng-container *ngFor="let result of results; trackBy: trackByFn">
<mat-optgroup class="flex items-center mt-2 px-2"> <mat-option
<span class="text-sm font-semibold tracking-wider text-secondary">{{resultSet.label.toUpperCase()}}</span> class="group relative h-14 px-5 py-0 text-md"
</mat-optgroup> [routerLink]="result.link">
<ng-container *ngFor="let result of resultSet.results; trackBy: trackByFn"> <ng-container
<mat-option [ngTemplateOutlet]="searchResult"
class="group relative mb-1 py-0 px-6 text-md rounded-md hover:bg-gray-100 dark:hover:bg-hover" [ngTemplateOutletContext]="{$implicit: result}"></ng-container>
[routerLink]="result.link"> </mat-option>
<!-- Contacts -->
<ng-container *ngIf="resultSet.id === 'contacts'">
<ng-container *ngTemplateOutlet="contactResult; context: {$implicit: result}"></ng-container>
</ng-container>
<!-- Pages -->
<ng-container *ngIf="resultSet.id === 'pages'">
<ng-container *ngTemplateOutlet="pageResult; context: {$implicit: result}"></ng-container>
</ng-container>
<!-- Tasks -->
<ng-container *ngIf="resultSet.id === 'tasks'">
<ng-container *ngTemplateOutlet="taskResult; context: {$implicit: result}"></ng-container>
</ng-container>
</mat-option>
</ng-container>
</ng-container> </ng-container>
</mat-autocomplete> </mat-autocomplete>
</div> </div>
</ng-container> </ng-container>
<!-- Contact result template -->
<ng-template <ng-template
#contactResult #searchResult
let-result> let-result>
<div class="flex items-center">
<div class="flex flex-shrink-0 items-center justify-center w-8 h-8 rounded-full overflow-hidden bg-primary-100 dark:bg-primary-800">
<img
*ngIf="result.avatar"
[src]="result.avatar">
<mat-icon
class="m-0 icon-size-5 text-primary dark:text-primary-400"
*ngIf="!result.avatar"
[svgIcon]="'heroicons_outline:user-circle'"></mat-icon>
</div>
<div class="ml-3 truncate">
<span [innerHTML]="result.name"></span>
</div>
</div>
</ng-template>
<!-- Page result template --> <!-- Hover indicator -->
<ng-template <div class="absolute inset-y-0 left-0 hidden w-1 bg-primary group-hover:flex"></div>
#pageResult
let-result> <!-- Contact result -->
<div class="flex flex-col"> <ng-container *ngIf="result.resultType === 'contact'">
<div <div class="flex items-center">
class="truncate leading-normal" <div class="px-1.5 py-1 mr-4 text-xs font-semibold leading-normal rounded text-indigo-50 bg-indigo-600">Contact</div>
[innerHTML]="result.title"></div> <div class="overflow-hidden overflow-ellipsis">
<div class="truncate leading-normal text-sm text-secondary"> <span [innerHTML]="result.title"></span>
{{result.link}} </div>
</div> <div class="flex flex-shrink-0 items-center justify-center w-8 h-8 ml-auto rounded-full overflow-hidden bg-primary-100 dark:bg-black dark:bg-opacity-5">
</div> <img
</ng-template> *ngIf="result.avatar"
[src]="result.avatar">
<mat-icon
class="m-0 icon-size-5 text-primary"
*ngIf="!result.avatar"
[svgIcon]="'heroicons_outline:user-circle'"></mat-icon>
</div>
</div>
</ng-container>
<!-- Page result -->
<ng-container *ngIf="result.resultType === 'page'">
<div class="flex items-center">
<div class="px-1.5 py-1 mr-4 text-xs font-semibold leading-normal rounded text-teal-50 bg-teal-600">Page</div>
<div class="flex flex-col overflow-hidden overflow-ellipsis">
<span
class="overflow-hidden overflow-ellipsis whitespace-nowrap leading-normal"
[innerHTML]="result.title"></span>
<span
class="mt-1 text-secondary overflow-hidden overflow-ellipsis whitespace-nowrap leading-normal text-sm no-underline"
[routerLink]="result.link">{{result.link}}</span>
</div>
</div>
</ng-container>
<!-- Task result template -->
<ng-template
#taskResult
let-result>
<div class="flex items-center">
<ng-container *ngIf="result.completed">
<mat-icon
class="mr-0 text-primary dark:text-primary-400"
[svgIcon]="'heroicons_outline:check-circle'"></mat-icon>
</ng-container>
<ng-container *ngIf="!result.completed">
<mat-icon
class="mr-0 text-hint"
[svgIcon]="'heroicons_outline:check-circle'"></mat-icon>
</ng-container>
<div
class="ml-3 truncate leading-normal"
[ngClass]="{'line-through text-hint': result.completed}"
[innerHTML]="result.title"></div>
</div>
</ng-template> </ng-template>

View File

@@ -20,7 +20,7 @@ export class SearchComponent implements OnChanges, OnInit, OnDestroy
@Output() search: EventEmitter<any> = new EventEmitter<any>(); @Output() search: EventEmitter<any> = new EventEmitter<any>();
opened: boolean = false; opened: boolean = false;
resultSets: any[]; results: any[];
searchControl: FormControl = new FormControl(); searchControl: FormControl = new FormControl();
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
@@ -104,12 +104,12 @@ export class SearchComponent implements OnChanges, OnInit, OnDestroy
takeUntil(this._unsubscribeAll), takeUntil(this._unsubscribeAll),
map((value) => { map((value) => {
// Set the resultSets to null if there is no value or // Set the search results to null if there is no value or
// the length of the value is smaller than the minLength // the length of the value is smaller than the minLength
// so the autocomplete panel can be closed // so the autocomplete panel can be closed
if ( !value || value.length < this.minLength ) if ( !value || value.length < this.minLength )
{ {
this.resultSets = null; this.results = null;
} }
// Continue // Continue
@@ -121,13 +121,13 @@ export class SearchComponent implements OnChanges, OnInit, OnDestroy
) )
.subscribe((value) => { .subscribe((value) => {
this._httpClient.post('api/common/search', {query: value}) this._httpClient.post('api/common/search', {query: value})
.subscribe((resultSets: any) => { .subscribe((response: any) => {
// Store the result sets // Store the results
this.resultSets = resultSets; this.results = response.results;
// Execute the event // Execute the event
this.search.next(resultSets); this.search.next(this.results);
}); });
}); });
} }

View File

@@ -21,15 +21,7 @@
[svgIcon]="'heroicons_solid:x'"></mat-icon> [svgIcon]="'heroicons_solid:x'"></mat-icon>
</button> </button>
</div> </div>
<div class="flex items-center text-lg font-medium leading-10"> <div class="text-lg font-medium leading-10">Shortcuts</div>
<span class="">Shortcuts</span>
<ng-container *ngIf="mode !== 'view'">
<span class="ml-1">
<ng-container *ngIf="mode === 'add'">- Add new</ng-container>
<ng-container *ngIf="mode === 'modify' || mode === 'edit'">- Editing</ng-container>
</span>
</ng-container>
</div>
<div class="ml-auto"> <div class="ml-auto">
<!-- View mode --> <!-- View mode -->

View File

@@ -1,4 +1,4 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Overlay, OverlayRef } from '@angular/cdk/overlay'; import { Overlay, OverlayRef } from '@angular/cdk/overlay';
import { TemplatePortal } from '@angular/cdk/portal'; import { TemplatePortal } from '@angular/cdk/portal';
@@ -15,14 +15,14 @@ import { ShortcutsService } from 'app/layout/common/shortcuts/shortcuts.service'
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
exportAs : 'shortcuts' exportAs : 'shortcuts'
}) })
export class ShortcutsComponent implements OnInit, OnDestroy export class ShortcutsComponent implements OnChanges, OnInit, OnDestroy
{ {
@Input() shortcuts: Shortcut[];
@ViewChild('shortcutsOrigin') private _shortcutsOrigin: MatButton; @ViewChild('shortcutsOrigin') private _shortcutsOrigin: MatButton;
@ViewChild('shortcutsPanel') private _shortcutsPanel: TemplateRef<any>; @ViewChild('shortcutsPanel') private _shortcutsPanel: TemplateRef<any>;
mode: 'view' | 'modify' | 'add' | 'edit' = 'view'; mode: 'view' | 'modify' | 'add' | 'edit' = 'view';
shortcutForm: FormGroup; shortcutForm: FormGroup;
shortcuts: Shortcut[];
private _overlayRef: OverlayRef; private _overlayRef: OverlayRef;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
@@ -43,6 +43,21 @@ export class ShortcutsComponent implements OnInit, OnDestroy
// @ Lifecycle hooks // @ Lifecycle hooks
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
/**
* On changes
*
* @param changes
*/
ngOnChanges(changes: SimpleChanges): void
{
// Shortcuts
if ( 'shortcuts' in changes )
{
// Store the shortcuts on the service
this._shortcutsService.store(changes.shortcuts.currentValue);
}
}
/** /**
* On init * On init
*/ */
@@ -221,7 +236,7 @@ export class ShortcutsComponent implements OnInit, OnDestroy
scrollStrategy : this._overlay.scrollStrategies.block(), scrollStrategy : this._overlay.scrollStrategies.block(),
positionStrategy: this._overlay.position() positionStrategy: this._overlay.position()
.flexibleConnectedTo(this._shortcutsOrigin._elementRef.nativeElement) .flexibleConnectedTo(this._shortcutsOrigin._elementRef.nativeElement)
.withLockedPosition(true) .withLockedPosition()
.withPush(true) .withPush(true)
.withPositions([ .withPositions([
{ {

View File

@@ -1,7 +1,7 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http'; import { HttpClient } from '@angular/common/http';
import { Observable, ReplaySubject } from 'rxjs'; import { Observable, ReplaySubject } from 'rxjs';
import { map, switchMap, take, tap } from 'rxjs/operators'; import { map, switchMap, take } from 'rxjs/operators';
import { Shortcut } from 'app/layout/common/shortcuts/shortcuts.types'; import { Shortcut } from 'app/layout/common/shortcuts/shortcuts.types';
@Injectable({ @Injectable({
@@ -35,15 +35,17 @@ export class ShortcutsService
// ----------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------
/** /**
* Get all messages * Store shortcuts on the service
*
* @param shortcuts
*/ */
getAll(): Observable<Shortcut[]> store(shortcuts: Shortcut[]): Observable<Shortcut[]>
{ {
return this._httpClient.get<Shortcut[]>('api/common/shortcuts').pipe( // Load the shortcuts
tap((shortcuts) => { this._shortcuts.next(shortcuts);
this._shortcuts.next(shortcuts);
}) // Return the shortcuts
); return this.shortcuts$;
} }
/** /**

View File

@@ -3,17 +3,17 @@ import { Router } from '@angular/router';
import { BooleanInput } from '@angular/cdk/coercion'; import { BooleanInput } from '@angular/cdk/coercion';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { User } from 'app/core/user/user.types'; import { User } from 'app/core/user/user.model';
import { UserService } from 'app/core/user/user.service'; import { UserService } from 'app/core/user/user.service';
@Component({ @Component({
selector : 'user', selector : 'user-menu',
templateUrl : './user.component.html', templateUrl : './user-menu.component.html',
encapsulation : ViewEncapsulation.None, encapsulation : ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
exportAs : 'user' exportAs : 'userMenu'
}) })
export class UserComponent implements OnInit, OnDestroy export class UserMenuComponent implements OnInit, OnDestroy
{ {
/* eslint-disable @typescript-eslint/naming-convention */ /* eslint-disable @typescript-eslint/naming-convention */
static ngAcceptInputType_showAvatar: BooleanInput; static ngAcceptInputType_showAvatar: BooleanInput;

View File

@@ -3,12 +3,12 @@ import { MatButtonModule } from '@angular/material/button';
import { MatDividerModule } from '@angular/material/divider'; import { MatDividerModule } from '@angular/material/divider';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { UserComponent } from 'app/layout/common/user/user.component'; import { UserMenuComponent } from 'app/layout/common/user-menu/user-menu.component';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
@NgModule({ @NgModule({
declarations: [ declarations: [
UserComponent UserMenuComponent
], ],
imports : [ imports : [
MatButtonModule, MatButtonModule,
@@ -18,9 +18,9 @@ import { SharedModule } from 'app/shared/shared.module';
SharedModule SharedModule
], ],
exports : [ exports : [
UserComponent UserMenuComponent
] ]
}) })
export class UserModule export class UserMenuModule
{ {
} }

View File

@@ -54,7 +54,7 @@
</div> </div>
<fuse-drawer <fuse-drawer
class="w-screen min-w-screen sm:w-100 sm:min-w-100" class="w-100 min-w-100"
fixed fixed
transparentOverlay transparentOverlay
[mode]="'over'" [mode]="'over'"
@@ -74,17 +74,17 @@
<!-- Theme --> <!-- Theme -->
<div class="text-md font-semibold text-secondary">THEME</div> <div class="text-md font-semibold text-secondary">THEME</div>
<div class="grid grid-cols-2 sm:grid-cols-3 gap-3 mt-6"> <div class="grid grid-cols-3 gap-3 mt-6">
<ng-container *ngFor="let theme of themes"> <ng-container *ngFor="let theme of themes">
<div <div
class="flex items-center justify-center px-4 py-3 rounded-full cursor-pointer ring-inset ring-primary bg-hover" class="flex items-center px-4 py-3 rounded-full cursor-pointer ring-inset ring-primary bg-hover"
[class.ring-2]="config.theme === theme[0]" [class.ring-2]="config.theme === theme[0]"
(click)="setTheme(theme[0])"> (click)="setTheme(theme[0])">
<div <div
class="flex-0 w-3 h-3 rounded-full" class="w-4 h-4 rounded-full"
[style.background-color]="theme[1].primary"></div> [style.background-color]="theme[1].primary"></div>
<div <div
class="ml-2.5 font-medium leading-5 truncate" class="ml-2.5 font-medium leading-5"
[class.text-secondary]="config.theme !== theme[0]"> [class.text-secondary]="config.theme !== theme[0]">
{{theme[0] | titlecase}} {{theme[0] | titlecase}}
</div> </div>

View File

@@ -6,7 +6,7 @@
class="dark bg-gray-900 print:hidden" class="dark bg-gray-900 print:hidden"
[mode]="'over'" [mode]="'over'"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.default" [navigation]="data.navigation.default"
[opened]="false"> [opened]="false">
<!-- Navigation header hook --> <!-- Navigation header hook -->
<ng-container fuseVerticalNavigationContentHeader> <ng-container fuseVerticalNavigationContentHeader>
@@ -50,7 +50,7 @@
<fuse-horizontal-navigation <fuse-horizontal-navigation
class="mr-2" class="mr-2"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.horizontal"></fuse-horizontal-navigation> [navigation]="data.navigation.horizontal"></fuse-horizontal-navigation>
</ng-container> </ng-container>
<!-- Navigation toggle button --> <!-- Navigation toggle button -->
<ng-container *ngIf="isScreenSmall"> <ng-container *ngIf="isScreenSmall">
@@ -62,14 +62,14 @@
</button> </button>
</ng-container> </ng-container>
<!-- Components --> <!-- Components -->
<div class="flex items-center pl-2 ml-auto space-x-1 sm:space-x-2"> <div class="flex items-center pl-2 ml-auto space-x-2">
<languages></languages> <language></language>
<fuse-fullscreen class="hidden md:block"></fuse-fullscreen> <fuse-fullscreen></fuse-fullscreen>
<search [appearance]="'bar'"></search> <search [appearance]="'bar'"></search>
<shortcuts></shortcuts> <shortcuts [shortcuts]="data.shortcuts"></shortcuts>
<messages></messages> <messages [messages]="data.messages"></messages>
<notifications></notifications> <notifications [notifications]="data.notifications"></notifications>
<user></user> <user-menu></user-menu>
</div> </div>
</div> </div>

View File

@@ -4,8 +4,7 @@ import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
import { Navigation } from 'app/core/navigation/navigation.types'; import { InitialData } from 'app/app.types';
import { NavigationService } from 'app/core/navigation/navigation.service';
@Component({ @Component({
selector : 'centered-layout', selector : 'centered-layout',
@@ -14,7 +13,7 @@ import { NavigationService } from 'app/core/navigation/navigation.service';
}) })
export class CenteredLayoutComponent implements OnInit, OnDestroy export class CenteredLayoutComponent implements OnInit, OnDestroy
{ {
navigation: Navigation; data: InitialData;
isScreenSmall: boolean; isScreenSmall: boolean;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
@@ -24,7 +23,6 @@ export class CenteredLayoutComponent implements OnInit, OnDestroy
constructor( constructor(
private _activatedRoute: ActivatedRoute, private _activatedRoute: ActivatedRoute,
private _router: Router, private _router: Router,
private _navigationService: NavigationService,
private _fuseMediaWatcherService: FuseMediaWatcherService, private _fuseMediaWatcherService: FuseMediaWatcherService,
private _fuseNavigationService: FuseNavigationService private _fuseNavigationService: FuseNavigationService
) )
@@ -52,12 +50,10 @@ export class CenteredLayoutComponent implements OnInit, OnDestroy
*/ */
ngOnInit(): void ngOnInit(): void
{ {
// Subscribe to navigation data // Subscribe to the resolved route data
this._navigationService.navigation$ this._activatedRoute.data.subscribe((data: Data) => {
.pipe(takeUntil(this._unsubscribeAll)) this.data = data.initialData;
.subscribe((navigation: Navigation) => { });
this.navigation = navigation;
});
// Subscribe to media changes // Subscribe to media changes
this._fuseMediaWatcherService.onMediaChange$ this._fuseMediaWatcherService.onMediaChange$

View File

@@ -7,12 +7,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { FuseFullscreenModule } from '@fuse/components/fullscreen'; import { FuseFullscreenModule } from '@fuse/components/fullscreen';
import { FuseNavigationModule } from '@fuse/components/navigation'; import { FuseNavigationModule } from '@fuse/components/navigation';
import { LanguagesModule } from 'app/layout/common/languages/languages.module'; import { LanguageModule } from 'app/layout/common/language/language.module';
import { MessagesModule } from 'app/layout/common/messages/messages.module'; import { MessagesModule } from 'app/layout/common/messages/messages.module';
import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; import { NotificationsModule } from 'app/layout/common/notifications/notifications.module';
import { SearchModule } from 'app/layout/common/search/search.module'; import { SearchModule } from 'app/layout/common/search/search.module';
import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module';
import { UserModule } from 'app/layout/common/user/user.module'; import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
import { CenteredLayoutComponent } from 'app/layout/layouts/horizontal/centered/centered.component'; import { CenteredLayoutComponent } from 'app/layout/layouts/horizontal/centered/centered.component';
@@ -29,12 +29,12 @@ import { CenteredLayoutComponent } from 'app/layout/layouts/horizontal/centered/
MatMenuModule, MatMenuModule,
FuseFullscreenModule, FuseFullscreenModule,
FuseNavigationModule, FuseNavigationModule,
LanguagesModule, LanguageModule,
MessagesModule, MessagesModule,
NotificationsModule, NotificationsModule,
SearchModule, SearchModule,
ShortcutsModule, ShortcutsModule,
UserModule, UserMenuModule,
SharedModule SharedModule
], ],
exports : [ exports : [

View File

@@ -4,7 +4,7 @@
class="dark bg-gray-900 print:hidden" class="dark bg-gray-900 print:hidden"
[mode]="'over'" [mode]="'over'"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.default" [navigation]="data.navigation.default"
[opened]="false"> [opened]="false">
<!-- Navigation header hook --> <!-- Navigation header hook -->
<ng-container fuseVerticalNavigationContentHeader> <ng-container fuseVerticalNavigationContentHeader>
@@ -45,14 +45,14 @@
</button> </button>
</ng-container> </ng-container>
<!-- Components --> <!-- Components -->
<div class="flex items-center pl-2 ml-auto space-x-1 sm:space-x-2"> <div class="flex items-center pl-2 ml-auto space-x-2">
<languages></languages> <language></language>
<fuse-fullscreen class="hidden md:block"></fuse-fullscreen> <fuse-fullscreen></fuse-fullscreen>
<search [appearance]="'bar'"></search> <search [appearance]="'bar'"></search>
<shortcuts></shortcuts> <shortcuts [shortcuts]="data.shortcuts"></shortcuts>
<messages></messages> <messages [messages]="data.messages"></messages>
<notifications></notifications> <notifications [notifications]="data.notifications"></notifications>
<user></user> <user-menu></user-menu>
</div> </div>
</div> </div>
</div> </div>
@@ -63,7 +63,7 @@
<fuse-horizontal-navigation <fuse-horizontal-navigation
class="-mx-4" class="-mx-4"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.horizontal"></fuse-horizontal-navigation> [navigation]="data.navigation.horizontal"></fuse-horizontal-navigation>
</div> </div>
</div> </div>
</ng-container> </ng-container>

View File

@@ -1,11 +1,10 @@
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Data, Router } from '@angular/router';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
import { Navigation } from 'app/core/navigation/navigation.types'; import { InitialData } from 'app/app.types';
import { NavigationService } from 'app/core/navigation/navigation.service';
@Component({ @Component({
selector : 'enterprise-layout', selector : 'enterprise-layout',
@@ -14,8 +13,8 @@ import { NavigationService } from 'app/core/navigation/navigation.service';
}) })
export class EnterpriseLayoutComponent implements OnInit, OnDestroy export class EnterpriseLayoutComponent implements OnInit, OnDestroy
{ {
data: InitialData;
isScreenSmall: boolean; isScreenSmall: boolean;
navigation: Navigation;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
/** /**
@@ -24,7 +23,6 @@ export class EnterpriseLayoutComponent implements OnInit, OnDestroy
constructor( constructor(
private _activatedRoute: ActivatedRoute, private _activatedRoute: ActivatedRoute,
private _router: Router, private _router: Router,
private _navigationService: NavigationService,
private _fuseMediaWatcherService: FuseMediaWatcherService, private _fuseMediaWatcherService: FuseMediaWatcherService,
private _fuseNavigationService: FuseNavigationService private _fuseNavigationService: FuseNavigationService
) )
@@ -52,12 +50,10 @@ export class EnterpriseLayoutComponent implements OnInit, OnDestroy
*/ */
ngOnInit(): void ngOnInit(): void
{ {
// Subscribe to navigation data // Subscribe to the resolved route data
this._navigationService.navigation$ this._activatedRoute.data.subscribe((data: Data) => {
.pipe(takeUntil(this._unsubscribeAll)) this.data = data.initialData;
.subscribe((navigation: Navigation) => { });
this.navigation = navigation;
});
// Subscribe to media changes // Subscribe to media changes
this._fuseMediaWatcherService.onMediaChange$ this._fuseMediaWatcherService.onMediaChange$

View File

@@ -7,12 +7,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { FuseFullscreenModule } from '@fuse/components/fullscreen'; import { FuseFullscreenModule } from '@fuse/components/fullscreen';
import { FuseNavigationModule } from '@fuse/components/navigation'; import { FuseNavigationModule } from '@fuse/components/navigation';
import { LanguagesModule } from 'app/layout/common/languages/languages.module'; import { LanguageModule } from 'app/layout/common/language/language.module';
import { MessagesModule } from 'app/layout/common/messages/messages.module'; import { MessagesModule } from 'app/layout/common/messages/messages.module';
import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; import { NotificationsModule } from 'app/layout/common/notifications/notifications.module';
import { SearchModule } from 'app/layout/common/search/search.module'; import { SearchModule } from 'app/layout/common/search/search.module';
import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module';
import { UserModule } from 'app/layout/common/user/user.module'; import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
import { EnterpriseLayoutComponent } from 'app/layout/layouts/horizontal/enterprise/enterprise.component'; import { EnterpriseLayoutComponent } from 'app/layout/layouts/horizontal/enterprise/enterprise.component';
@@ -29,12 +29,12 @@ import { EnterpriseLayoutComponent } from 'app/layout/layouts/horizontal/enterpr
MatMenuModule, MatMenuModule,
FuseFullscreenModule, FuseFullscreenModule,
FuseNavigationModule, FuseNavigationModule,
LanguagesModule, LanguageModule,
MessagesModule, MessagesModule,
NotificationsModule, NotificationsModule,
SearchModule, SearchModule,
ShortcutsModule, ShortcutsModule,
UserModule, UserMenuModule,
SharedModule SharedModule
], ],
exports : [ exports : [

View File

@@ -4,7 +4,7 @@
class="dark bg-gray-900 print:hidden" class="dark bg-gray-900 print:hidden"
[mode]="'over'" [mode]="'over'"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.default" [navigation]="data.navigation.default"
[opened]="false"> [opened]="false">
<!-- Navigation header hook --> <!-- Navigation header hook -->
<ng-container fuseVerticalNavigationContentHeader> <ng-container fuseVerticalNavigationContentHeader>
@@ -51,14 +51,14 @@
</button> </button>
</ng-container> </ng-container>
<!-- Components --> <!-- Components -->
<div class="flex items-center pl-2 ml-auto space-x-1 sm:space-x-2"> <div class="flex items-center pl-2 ml-auto space-x-2">
<languages></languages> <language></language>
<fuse-fullscreen class="hidden md:block"></fuse-fullscreen> <fuse-fullscreen></fuse-fullscreen>
<search [appearance]="'bar'"></search> <search [appearance]="'bar'"></search>
<shortcuts></shortcuts> <shortcuts [shortcuts]="data.shortcuts"></shortcuts>
<messages></messages> <messages [messages]="data.messages"></messages>
<notifications></notifications> <notifications [notifications]="data.notifications"></notifications>
<user></user> <user-menu></user-menu>
</div> </div>
</div> </div>
<!-- Bottom bar --> <!-- Bottom bar -->
@@ -66,7 +66,7 @@
<div class="relative flex flex-auto flex-0 items-center h-16 px-4"> <div class="relative flex flex-auto flex-0 items-center h-16 px-4">
<fuse-horizontal-navigation <fuse-horizontal-navigation
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.horizontal"></fuse-horizontal-navigation> [navigation]="data.navigation.horizontal"></fuse-horizontal-navigation>
</div> </div>
</ng-container> </ng-container>
</div> </div>

View File

@@ -1,11 +1,10 @@
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Data, Router } from '@angular/router';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
import { Navigation } from 'app/core/navigation/navigation.types'; import { InitialData } from 'app/app.types';
import { NavigationService } from 'app/core/navigation/navigation.service';
@Component({ @Component({
selector : 'material-layout', selector : 'material-layout',
@@ -14,8 +13,8 @@ import { NavigationService } from 'app/core/navigation/navigation.service';
}) })
export class MaterialLayoutComponent implements OnInit, OnDestroy export class MaterialLayoutComponent implements OnInit, OnDestroy
{ {
data: InitialData;
isScreenSmall: boolean; isScreenSmall: boolean;
navigation: Navigation;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
/** /**
@@ -24,7 +23,6 @@ export class MaterialLayoutComponent implements OnInit, OnDestroy
constructor( constructor(
private _activatedRoute: ActivatedRoute, private _activatedRoute: ActivatedRoute,
private _router: Router, private _router: Router,
private _navigationService: NavigationService,
private _fuseMediaWatcherService: FuseMediaWatcherService, private _fuseMediaWatcherService: FuseMediaWatcherService,
private _fuseNavigationService: FuseNavigationService private _fuseNavigationService: FuseNavigationService
) )
@@ -52,12 +50,10 @@ export class MaterialLayoutComponent implements OnInit, OnDestroy
*/ */
ngOnInit(): void ngOnInit(): void
{ {
// Subscribe to navigation data // Subscribe to the resolved route data
this._navigationService.navigation$ this._activatedRoute.data.subscribe((data: Data) => {
.pipe(takeUntil(this._unsubscribeAll)) this.data = data.initialData;
.subscribe((navigation: Navigation) => { });
this.navigation = navigation;
});
// Subscribe to media changes // Subscribe to media changes
this._fuseMediaWatcherService.onMediaChange$ this._fuseMediaWatcherService.onMediaChange$

View File

@@ -7,12 +7,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { FuseFullscreenModule } from '@fuse/components/fullscreen'; import { FuseFullscreenModule } from '@fuse/components/fullscreen';
import { FuseNavigationModule } from '@fuse/components/navigation'; import { FuseNavigationModule } from '@fuse/components/navigation';
import { LanguagesModule } from 'app/layout/common/languages/languages.module'; import { LanguageModule } from 'app/layout/common/language/language.module';
import { MessagesModule } from 'app/layout/common/messages/messages.module'; import { MessagesModule } from 'app/layout/common/messages/messages.module';
import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; import { NotificationsModule } from 'app/layout/common/notifications/notifications.module';
import { SearchModule } from 'app/layout/common/search/search.module'; import { SearchModule } from 'app/layout/common/search/search.module';
import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module';
import { UserModule } from 'app/layout/common/user/user.module'; import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
import { MaterialLayoutComponent } from 'app/layout/layouts/horizontal/material/material.component'; import { MaterialLayoutComponent } from 'app/layout/layouts/horizontal/material/material.component';
@@ -29,12 +29,12 @@ import { MaterialLayoutComponent } from 'app/layout/layouts/horizontal/material/
MatMenuModule, MatMenuModule,
FuseFullscreenModule, FuseFullscreenModule,
FuseNavigationModule, FuseNavigationModule,
LanguagesModule, LanguageModule,
MessagesModule, MessagesModule,
NotificationsModule, NotificationsModule,
SearchModule, SearchModule,
ShortcutsModule, ShortcutsModule,
UserModule, UserMenuModule,
SharedModule SharedModule
], ],
exports : [ exports : [

View File

@@ -4,7 +4,7 @@
class="dark bg-gray-900 print:hidden" class="dark bg-gray-900 print:hidden"
[mode]="'over'" [mode]="'over'"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.default" [navigation]="data.navigation.default"
[opened]="false"> [opened]="false">
<!-- Navigation header hook --> <!-- Navigation header hook -->
<ng-container fuseVerticalNavigationContentHeader> <ng-container fuseVerticalNavigationContentHeader>
@@ -43,7 +43,7 @@
<fuse-horizontal-navigation <fuse-horizontal-navigation
class="mr-2" class="mr-2"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.horizontal"></fuse-horizontal-navigation> [navigation]="data.navigation.horizontal"></fuse-horizontal-navigation>
</ng-container> </ng-container>
<!-- Navigation toggle button --> <!-- Navigation toggle button -->
<ng-container *ngIf="isScreenSmall"> <ng-container *ngIf="isScreenSmall">
@@ -54,14 +54,14 @@
</button> </button>
</ng-container> </ng-container>
<!-- Components --> <!-- Components -->
<div class="flex items-center pl-2 ml-auto space-x-1 sm:space-x-2"> <div class="flex items-center pl-2 ml-auto space-x-2">
<languages></languages> <language></language>
<fuse-fullscreen class="hidden md:block"></fuse-fullscreen> <fuse-fullscreen></fuse-fullscreen>
<search [appearance]="'bar'"></search> <search [appearance]="'bar'"></search>
<shortcuts></shortcuts> <shortcuts [shortcuts]="data.shortcuts"></shortcuts>
<messages></messages> <messages [messages]="data.messages"></messages>
<notifications></notifications> <notifications [notifications]="data.notifications"></notifications>
<user></user> <user-menu></user-menu>
</div> </div>
</div> </div>

View File

@@ -1,11 +1,10 @@
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Data, Router } from '@angular/router';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
import { Navigation } from 'app/core/navigation/navigation.types'; import { InitialData } from 'app/app.types';
import { NavigationService } from 'app/core/navigation/navigation.service';
@Component({ @Component({
selector : 'modern-layout', selector : 'modern-layout',
@@ -14,8 +13,8 @@ import { NavigationService } from 'app/core/navigation/navigation.service';
}) })
export class ModernLayoutComponent implements OnInit, OnDestroy export class ModernLayoutComponent implements OnInit, OnDestroy
{ {
data: InitialData;
isScreenSmall: boolean; isScreenSmall: boolean;
navigation: Navigation;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
/** /**
@@ -24,7 +23,6 @@ export class ModernLayoutComponent implements OnInit, OnDestroy
constructor( constructor(
private _activatedRoute: ActivatedRoute, private _activatedRoute: ActivatedRoute,
private _router: Router, private _router: Router,
private _navigationService: NavigationService,
private _fuseMediaWatcherService: FuseMediaWatcherService, private _fuseMediaWatcherService: FuseMediaWatcherService,
private _fuseNavigationService: FuseNavigationService private _fuseNavigationService: FuseNavigationService
) )
@@ -52,12 +50,10 @@ export class ModernLayoutComponent implements OnInit, OnDestroy
*/ */
ngOnInit(): void ngOnInit(): void
{ {
// Subscribe to navigation data // Subscribe to the resolved route data
this._navigationService.navigation$ this._activatedRoute.data.subscribe((data: Data) => {
.pipe(takeUntil(this._unsubscribeAll)) this.data = data.initialData;
.subscribe((navigation: Navigation) => { });
this.navigation = navigation;
});
// Subscribe to media changes // Subscribe to media changes
this._fuseMediaWatcherService.onMediaChange$ this._fuseMediaWatcherService.onMediaChange$

View File

@@ -7,12 +7,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { FuseFullscreenModule } from '@fuse/components/fullscreen'; import { FuseFullscreenModule } from '@fuse/components/fullscreen';
import { FuseNavigationModule } from '@fuse/components/navigation'; import { FuseNavigationModule } from '@fuse/components/navigation';
import { LanguagesModule } from 'app/layout/common/languages/languages.module'; import { LanguageModule } from 'app/layout/common/language/language.module';
import { MessagesModule } from 'app/layout/common/messages/messages.module'; import { MessagesModule } from 'app/layout/common/messages/messages.module';
import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; import { NotificationsModule } from 'app/layout/common/notifications/notifications.module';
import { SearchModule } from 'app/layout/common/search/search.module'; import { SearchModule } from 'app/layout/common/search/search.module';
import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module';
import { UserModule } from 'app/layout/common/user/user.module'; import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
import { ModernLayoutComponent } from 'app/layout/layouts/horizontal/modern/modern.component'; import { ModernLayoutComponent } from 'app/layout/layouts/horizontal/modern/modern.component';
@@ -29,12 +29,12 @@ import { ModernLayoutComponent } from 'app/layout/layouts/horizontal/modern/mode
MatMenuModule, MatMenuModule,
FuseFullscreenModule, FuseFullscreenModule,
FuseNavigationModule, FuseNavigationModule,
LanguagesModule, LanguageModule,
MessagesModule, MessagesModule,
NotificationsModule, NotificationsModule,
SearchModule, SearchModule,
ShortcutsModule, ShortcutsModule,
UserModule, UserMenuModule,
SharedModule SharedModule
], ],
exports : [ exports : [

View File

@@ -3,7 +3,7 @@
class="dark bg-gray-900 print:hidden" class="dark bg-gray-900 print:hidden"
[mode]="isScreenSmall ? 'over' : 'side'" [mode]="isScreenSmall ? 'over' : 'side'"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.default" [navigation]="data.navigation.default"
[opened]="!isScreenSmall"> [opened]="!isScreenSmall">
<!-- Navigation header hook --> <!-- Navigation header hook -->
<ng-container fuseVerticalNavigationContentHeader> <ng-container fuseVerticalNavigationContentHeader>
@@ -35,14 +35,14 @@
<mat-icon [svgIcon]="'heroicons_outline:menu'"></mat-icon> <mat-icon [svgIcon]="'heroicons_outline:menu'"></mat-icon>
</button> </button>
<!-- Components --> <!-- Components -->
<div class="flex items-center pl-2 ml-auto space-x-1 sm:space-x-2"> <div class="flex items-center pl-2 ml-auto space-x-2">
<languages></languages> <language></language>
<fuse-fullscreen class="hidden md:block"></fuse-fullscreen> <fuse-fullscreen></fuse-fullscreen>
<search [appearance]="'bar'"></search> <search [appearance]="'bar'"></search>
<shortcuts></shortcuts> <shortcuts [shortcuts]="data.shortcuts"></shortcuts>
<messages></messages> <messages [messages]="data.messages"></messages>
<notifications></notifications> <notifications [notifications]="data.notifications"></notifications>
<user></user> <user-menu></user-menu>
</div> </div>
</div> </div>

View File

@@ -1,11 +1,10 @@
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Data, Router } from '@angular/router';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
import { Navigation } from 'app/core/navigation/navigation.types'; import { InitialData } from 'app/app.types';
import { NavigationService } from 'app/core/navigation/navigation.service';
@Component({ @Component({
selector : 'classic-layout', selector : 'classic-layout',
@@ -14,8 +13,8 @@ import { NavigationService } from 'app/core/navigation/navigation.service';
}) })
export class ClassicLayoutComponent implements OnInit, OnDestroy export class ClassicLayoutComponent implements OnInit, OnDestroy
{ {
data: InitialData;
isScreenSmall: boolean; isScreenSmall: boolean;
navigation: Navigation;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
/** /**
@@ -24,7 +23,6 @@ export class ClassicLayoutComponent implements OnInit, OnDestroy
constructor( constructor(
private _activatedRoute: ActivatedRoute, private _activatedRoute: ActivatedRoute,
private _router: Router, private _router: Router,
private _navigationService: NavigationService,
private _fuseMediaWatcherService: FuseMediaWatcherService, private _fuseMediaWatcherService: FuseMediaWatcherService,
private _fuseNavigationService: FuseNavigationService private _fuseNavigationService: FuseNavigationService
) )
@@ -52,12 +50,10 @@ export class ClassicLayoutComponent implements OnInit, OnDestroy
*/ */
ngOnInit(): void ngOnInit(): void
{ {
// Subscribe to navigation data // Subscribe to the resolved route data
this._navigationService.navigation$ this._activatedRoute.data.subscribe((data: Data) => {
.pipe(takeUntil(this._unsubscribeAll)) this.data = data.initialData;
.subscribe((navigation: Navigation) => { });
this.navigation = navigation;
});
// Subscribe to media changes // Subscribe to media changes
this._fuseMediaWatcherService.onMediaChange$ this._fuseMediaWatcherService.onMediaChange$

View File

@@ -7,12 +7,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { FuseFullscreenModule } from '@fuse/components/fullscreen'; import { FuseFullscreenModule } from '@fuse/components/fullscreen';
import { FuseNavigationModule } from '@fuse/components/navigation'; import { FuseNavigationModule } from '@fuse/components/navigation';
import { LanguagesModule } from 'app/layout/common/languages/languages.module'; import { LanguageModule } from 'app/layout/common/language/language.module';
import { MessagesModule } from 'app/layout/common/messages/messages.module'; import { MessagesModule } from 'app/layout/common/messages/messages.module';
import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; import { NotificationsModule } from 'app/layout/common/notifications/notifications.module';
import { SearchModule } from 'app/layout/common/search/search.module'; import { SearchModule } from 'app/layout/common/search/search.module';
import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module';
import { UserModule } from 'app/layout/common/user/user.module'; import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
import { ClassicLayoutComponent } from 'app/layout/layouts/vertical/classic/classic.component'; import { ClassicLayoutComponent } from 'app/layout/layouts/vertical/classic/classic.component';
@@ -29,12 +29,12 @@ import { ClassicLayoutComponent } from 'app/layout/layouts/vertical/classic/clas
MatMenuModule, MatMenuModule,
FuseFullscreenModule, FuseFullscreenModule,
FuseNavigationModule, FuseNavigationModule,
LanguagesModule, LanguageModule,
MessagesModule, MessagesModule,
NotificationsModule, NotificationsModule,
SearchModule, SearchModule,
ShortcutsModule, ShortcutsModule,
UserModule, UserMenuModule,
SharedModule SharedModule
], ],
exports : [ exports : [

View File

@@ -3,7 +3,7 @@
class="dark bg-gray-900 print:hidden" class="dark bg-gray-900 print:hidden"
[mode]="isScreenSmall ? 'over' : 'side'" [mode]="isScreenSmall ? 'over' : 'side'"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.default" [navigation]="data.navigation.default"
[opened]="!isScreenSmall"> [opened]="!isScreenSmall">
<!-- Navigation header hook --> <!-- Navigation header hook -->
<ng-container fuseVerticalNavigationContentHeader> <ng-container fuseVerticalNavigationContentHeader>
@@ -16,8 +16,8 @@
</div> </div>
<!-- Components --> <!-- Components -->
<div class="flex items-center ml-auto"> <div class="flex items-center ml-auto">
<notifications></notifications> <notifications [notifications]="data.notifications"></notifications>
<user [showAvatar]="false"></user> <user-menu [showAvatar]="false"></user-menu>
</div> </div>
</div> </div>
<!-- User --> <!-- User -->
@@ -25,20 +25,20 @@
<div class="relative w-24 h-24"> <div class="relative w-24 h-24">
<img <img
class="w-full h-full rounded-full" class="w-full h-full rounded-full"
*ngIf="user.avatar" *ngIf="data.user.avatar"
[src]="user.avatar" [src]="data.user.avatar"
alt="User avatar"> alt="User avatar">
<mat-icon <mat-icon
class="icon-size-24" class="icon-size-24"
*ngIf="!user.avatar" *ngIf="!data.user.avatar"
[svgIcon]="'heroicons_solid:user-circle'"></mat-icon> [svgIcon]="'heroicons_solid:user-circle'"></mat-icon>
</div> </div>
<div class="flex flex-col items-center justify-center w-full mt-6"> <div class="flex flex-col items-center justify-center w-full mt-6">
<div class="w-full whitespace-nowrap overflow-ellipsis overflow-hidden text-center leading-normal font-medium"> <div class="w-full whitespace-nowrap overflow-ellipsis overflow-hidden text-center leading-normal font-medium">
{{user.name}} {{data.user.name}}
</div> </div>
<div class="w-full mt-0.5 whitespace-nowrap overflow-ellipsis overflow-hidden text-center text-md leading-normal font-medium text-secondary"> <div class="w-full mt-0.5 whitespace-nowrap overflow-ellipsis overflow-hidden text-center text-md leading-normal font-medium text-secondary">
{{user.email}} {{data.user.email}}
</div> </div>
</div> </div>
</div> </div>
@@ -65,12 +65,12 @@
<mat-icon [svgIcon]="'heroicons_outline:menu'"></mat-icon> <mat-icon [svgIcon]="'heroicons_outline:menu'"></mat-icon>
</button> </button>
<!-- Components --> <!-- Components -->
<div class="flex items-center pl-2 ml-auto space-x-1 sm:space-x-2"> <div class="flex items-center pl-2 ml-auto space-x-2">
<languages></languages> <language></language>
<fuse-fullscreen class="hidden md:block"></fuse-fullscreen> <fuse-fullscreen></fuse-fullscreen>
<search [appearance]="'bar'"></search> <search [appearance]="'bar'"></search>
<shortcuts></shortcuts> <shortcuts [shortcuts]="data.shortcuts"></shortcuts>
<messages></messages> <messages [messages]="data.messages"></messages>
</div> </div>
</div> </div>

View File

@@ -1,13 +1,10 @@
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Data, Router } from '@angular/router';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
import { Navigation } from 'app/core/navigation/navigation.types'; import { InitialData } from 'app/app.types';
import { NavigationService } from 'app/core/navigation/navigation.service';
import { User } from 'app/core/user/user.types';
import { UserService } from 'app/core/user/user.service';
@Component({ @Component({
selector : 'classy-layout', selector : 'classy-layout',
@@ -16,9 +13,8 @@ import { UserService } from 'app/core/user/user.service';
}) })
export class ClassyLayoutComponent implements OnInit, OnDestroy export class ClassyLayoutComponent implements OnInit, OnDestroy
{ {
data: InitialData;
isScreenSmall: boolean; isScreenSmall: boolean;
navigation: Navigation;
user: User;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
/** /**
@@ -27,8 +23,6 @@ export class ClassyLayoutComponent implements OnInit, OnDestroy
constructor( constructor(
private _activatedRoute: ActivatedRoute, private _activatedRoute: ActivatedRoute,
private _router: Router, private _router: Router,
private _navigationService: NavigationService,
private _userService: UserService,
private _fuseMediaWatcherService: FuseMediaWatcherService, private _fuseMediaWatcherService: FuseMediaWatcherService,
private _fuseNavigationService: FuseNavigationService private _fuseNavigationService: FuseNavigationService
) )
@@ -56,19 +50,10 @@ export class ClassyLayoutComponent implements OnInit, OnDestroy
*/ */
ngOnInit(): void ngOnInit(): void
{ {
// Subscribe to navigation data // Subscribe to the resolved route data
this._navigationService.navigation$ this._activatedRoute.data.subscribe((data: Data) => {
.pipe(takeUntil(this._unsubscribeAll)) this.data = data.initialData;
.subscribe((navigation: Navigation) => { });
this.navigation = navigation;
});
// Subscribe to the user service
this._userService.user$
.pipe((takeUntil(this._unsubscribeAll)))
.subscribe((user: User) => {
this.user = user;
});
// Subscribe to media changes // Subscribe to media changes
this._fuseMediaWatcherService.onMediaChange$ this._fuseMediaWatcherService.onMediaChange$

View File

@@ -7,12 +7,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { FuseNavigationModule } from '@fuse/components/navigation'; import { FuseNavigationModule } from '@fuse/components/navigation';
import { FuseFullscreenModule } from '@fuse/components/fullscreen/fullscreen.module'; import { FuseFullscreenModule } from '@fuse/components/fullscreen/fullscreen.module';
import { LanguagesModule } from 'app/layout/common/languages/languages.module'; import { LanguageModule } from 'app/layout/common/language/language.module';
import { MessagesModule } from 'app/layout/common/messages/messages.module'; import { MessagesModule } from 'app/layout/common/messages/messages.module';
import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; import { NotificationsModule } from 'app/layout/common/notifications/notifications.module';
import { SearchModule } from 'app/layout/common/search/search.module'; import { SearchModule } from 'app/layout/common/search/search.module';
import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module';
import { UserModule } from 'app/layout/common/user/user.module'; import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
import { ClassyLayoutComponent } from 'app/layout/layouts/vertical/classy/classy.component'; import { ClassyLayoutComponent } from 'app/layout/layouts/vertical/classy/classy.component';
@@ -29,12 +29,12 @@ import { ClassyLayoutComponent } from 'app/layout/layouts/vertical/classy/classy
MatMenuModule, MatMenuModule,
FuseFullscreenModule, FuseFullscreenModule,
FuseNavigationModule, FuseNavigationModule,
LanguagesModule, LanguageModule,
MessagesModule, MessagesModule,
NotificationsModule, NotificationsModule,
SearchModule, SearchModule,
ShortcutsModule, ShortcutsModule,
UserModule, UserMenuModule,
SharedModule SharedModule
], ],
exports : [ exports : [

View File

@@ -4,7 +4,7 @@
[appearance]="'compact'" [appearance]="'compact'"
[mode]="isScreenSmall ? 'over' : 'side'" [mode]="isScreenSmall ? 'over' : 'side'"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.compact" [navigation]="data.navigation.compact"
[opened]="!isScreenSmall"> [opened]="!isScreenSmall">
<!-- Navigation header hook --> <!-- Navigation header hook -->
<ng-container fuseVerticalNavigationContentHeader> <ng-container fuseVerticalNavigationContentHeader>
@@ -30,14 +30,14 @@
<mat-icon [svgIcon]="'heroicons_outline:menu'"></mat-icon> <mat-icon [svgIcon]="'heroicons_outline:menu'"></mat-icon>
</button> </button>
<!-- Components --> <!-- Components -->
<div class="flex items-center pl-2 ml-auto space-x-1 sm:space-x-2"> <div class="flex items-center pl-2 ml-auto space-x-2">
<languages></languages> <language></language>
<fuse-fullscreen class="hidden md:block"></fuse-fullscreen> <fuse-fullscreen></fuse-fullscreen>
<search [appearance]="'bar'"></search> <search [appearance]="'bar'"></search>
<shortcuts></shortcuts> <shortcuts [shortcuts]="data.shortcuts"></shortcuts>
<messages></messages> <messages [messages]="data.messages"></messages>
<notifications></notifications> <notifications [notifications]="data.notifications"></notifications>
<user></user> <user-menu></user-menu>
</div> </div>
</div> </div>

View File

@@ -1,11 +1,10 @@
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Data, Router } from '@angular/router';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
import { Navigation } from 'app/core/navigation/navigation.types'; import { InitialData } from 'app/app.types';
import { NavigationService } from 'app/core/navigation/navigation.service';
@Component({ @Component({
selector : 'compact-layout', selector : 'compact-layout',
@@ -14,8 +13,8 @@ import { NavigationService } from 'app/core/navigation/navigation.service';
}) })
export class CompactLayoutComponent implements OnInit, OnDestroy export class CompactLayoutComponent implements OnInit, OnDestroy
{ {
data: InitialData;
isScreenSmall: boolean; isScreenSmall: boolean;
navigation: Navigation;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
/** /**
@@ -24,7 +23,6 @@ export class CompactLayoutComponent implements OnInit, OnDestroy
constructor( constructor(
private _activatedRoute: ActivatedRoute, private _activatedRoute: ActivatedRoute,
private _router: Router, private _router: Router,
private _navigationService: NavigationService,
private _fuseMediaWatcherService: FuseMediaWatcherService, private _fuseMediaWatcherService: FuseMediaWatcherService,
private _fuseNavigationService: FuseNavigationService private _fuseNavigationService: FuseNavigationService
) )
@@ -52,12 +50,10 @@ export class CompactLayoutComponent implements OnInit, OnDestroy
*/ */
ngOnInit(): void ngOnInit(): void
{ {
// Subscribe to navigation data // Subscribe to the resolved route data
this._navigationService.navigation$ this._activatedRoute.data.subscribe((data: Data) => {
.pipe(takeUntil(this._unsubscribeAll)) this.data = data.initialData;
.subscribe((navigation: Navigation) => { });
this.navigation = navigation;
});
// Subscribe to media changes // Subscribe to media changes
this._fuseMediaWatcherService.onMediaChange$ this._fuseMediaWatcherService.onMediaChange$

View File

@@ -7,12 +7,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { FuseFullscreenModule } from '@fuse/components/fullscreen'; import { FuseFullscreenModule } from '@fuse/components/fullscreen';
import { FuseNavigationModule } from '@fuse/components/navigation'; import { FuseNavigationModule } from '@fuse/components/navigation';
import { LanguagesModule } from 'app/layout/common/languages/languages.module'; import { LanguageModule } from 'app/layout/common/language/language.module';
import { MessagesModule } from 'app/layout/common/messages/messages.module'; import { MessagesModule } from 'app/layout/common/messages/messages.module';
import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; import { NotificationsModule } from 'app/layout/common/notifications/notifications.module';
import { SearchModule } from 'app/layout/common/search/search.module'; import { SearchModule } from 'app/layout/common/search/search.module';
import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module';
import { UserModule } from 'app/layout/common/user/user.module'; import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
import { CompactLayoutComponent } from 'app/layout/layouts/vertical/compact/compact.component'; import { CompactLayoutComponent } from 'app/layout/layouts/vertical/compact/compact.component';
@@ -29,12 +29,12 @@ import { CompactLayoutComponent } from 'app/layout/layouts/vertical/compact/comp
MatMenuModule, MatMenuModule,
FuseFullscreenModule, FuseFullscreenModule,
FuseNavigationModule, FuseNavigationModule,
LanguagesModule, LanguageModule,
MessagesModule, MessagesModule,
NotificationsModule, NotificationsModule,
SearchModule, SearchModule,
ShortcutsModule, ShortcutsModule,
UserModule, UserMenuModule,
SharedModule SharedModule
], ],
exports : [ exports : [

View File

@@ -4,7 +4,7 @@
[appearance]="navigationAppearance" [appearance]="navigationAppearance"
[mode]="isScreenSmall ? 'over' : 'side'" [mode]="isScreenSmall ? 'over' : 'side'"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.default" [navigation]="data.navigation.default"
[opened]="!isScreenSmall"> [opened]="!isScreenSmall">
<!-- Navigation header hook --> <!-- Navigation header hook -->
<ng-container fuseVerticalNavigationContentHeader> <ng-container fuseVerticalNavigationContentHeader>
@@ -39,14 +39,14 @@
</button> </button>
</div> </div>
<!-- Components --> <!-- Components -->
<div class="flex items-center pl-2 ml-auto space-x-1 sm:space-x-2"> <div class="flex items-center pl-2 ml-auto space-x-2">
<languages></languages> <language></language>
<fuse-fullscreen class="hidden md:block"></fuse-fullscreen> <fuse-fullscreen></fuse-fullscreen>
<search [appearance]="'bar'"></search> <search [appearance]="'bar'"></search>
<shortcuts></shortcuts> <shortcuts [shortcuts]="data.shortcuts"></shortcuts>
<messages></messages> <messages [messages]="data.messages"></messages>
<notifications></notifications> <notifications [notifications]="data.notifications"></notifications>
<user></user> <user-menu></user-menu>
</div> </div>
</div> </div>

View File

@@ -1,11 +1,10 @@
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Data, Router } from '@angular/router';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
import { Navigation } from 'app/core/navigation/navigation.types'; import { InitialData } from 'app/app.types';
import { NavigationService } from 'app/core/navigation/navigation.service';
@Component({ @Component({
selector : 'dense-layout', selector : 'dense-layout',
@@ -14,8 +13,8 @@ import { NavigationService } from 'app/core/navigation/navigation.service';
}) })
export class DenseLayoutComponent implements OnInit, OnDestroy export class DenseLayoutComponent implements OnInit, OnDestroy
{ {
data: InitialData;
isScreenSmall: boolean; isScreenSmall: boolean;
navigation: Navigation;
navigationAppearance: 'default' | 'dense' = 'dense'; navigationAppearance: 'default' | 'dense' = 'dense';
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
@@ -25,7 +24,6 @@ export class DenseLayoutComponent implements OnInit, OnDestroy
constructor( constructor(
private _activatedRoute: ActivatedRoute, private _activatedRoute: ActivatedRoute,
private _router: Router, private _router: Router,
private _navigationService: NavigationService,
private _fuseMediaWatcherService: FuseMediaWatcherService, private _fuseMediaWatcherService: FuseMediaWatcherService,
private _fuseNavigationService: FuseNavigationService private _fuseNavigationService: FuseNavigationService
) )
@@ -53,12 +51,10 @@ export class DenseLayoutComponent implements OnInit, OnDestroy
*/ */
ngOnInit(): void ngOnInit(): void
{ {
// Subscribe to navigation data // Subscribe to the resolved route data
this._navigationService.navigation$ this._activatedRoute.data.subscribe((data: Data) => {
.pipe(takeUntil(this._unsubscribeAll)) this.data = data.initialData;
.subscribe((navigation: Navigation) => { });
this.navigation = navigation;
});
// Subscribe to media changes // Subscribe to media changes
this._fuseMediaWatcherService.onMediaChange$ this._fuseMediaWatcherService.onMediaChange$

View File

@@ -7,12 +7,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { FuseFullscreenModule } from '@fuse/components/fullscreen'; import { FuseFullscreenModule } from '@fuse/components/fullscreen';
import { FuseNavigationModule } from '@fuse/components/navigation'; import { FuseNavigationModule } from '@fuse/components/navigation';
import { LanguagesModule } from 'app/layout/common/languages/languages.module'; import { LanguageModule } from 'app/layout/common/language/language.module';
import { MessagesModule } from 'app/layout/common/messages/messages.module'; import { MessagesModule } from 'app/layout/common/messages/messages.module';
import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; import { NotificationsModule } from 'app/layout/common/notifications/notifications.module';
import { SearchModule } from 'app/layout/common/search/search.module'; import { SearchModule } from 'app/layout/common/search/search.module';
import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module';
import { UserModule } from 'app/layout/common/user/user.module'; import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
import { DenseLayoutComponent } from 'app/layout/layouts/vertical/dense/dense.component'; import { DenseLayoutComponent } from 'app/layout/layouts/vertical/dense/dense.component';
@@ -29,12 +29,12 @@ import { DenseLayoutComponent } from 'app/layout/layouts/vertical/dense/dense.co
MatMenuModule, MatMenuModule,
FuseFullscreenModule, FuseFullscreenModule,
FuseNavigationModule, FuseNavigationModule,
LanguagesModule, LanguageModule,
MessagesModule, MessagesModule,
NotificationsModule, NotificationsModule,
SearchModule, SearchModule,
ShortcutsModule, ShortcutsModule,
UserModule, UserMenuModule,
SharedModule SharedModule
], ],
exports : [ exports : [

View File

@@ -3,7 +3,7 @@
class="dark bg-indigo-800 text-white print:hidden" class="dark bg-indigo-800 text-white print:hidden"
[mode]="isScreenSmall ? 'over' : 'side'" [mode]="isScreenSmall ? 'over' : 'side'"
[name]="'mainNavigation'" [name]="'mainNavigation'"
[navigation]="navigation.futuristic" [navigation]="data.navigation.futuristic"
[opened]="!isScreenSmall"> [opened]="!isScreenSmall">
<!-- Navigation header hook --> <!-- Navigation header hook -->
<ng-container fuseVerticalNavigationHeader> <ng-container fuseVerticalNavigationHeader>
@@ -18,10 +18,10 @@
<ng-container fuseVerticalNavigationFooter> <ng-container fuseVerticalNavigationFooter>
<!-- User --> <!-- User -->
<div class="flex items-center w-full px-6 py-8 border-t"> <div class="flex items-center w-full px-6 py-8 border-t">
<user></user> <user-menu></user-menu>
<div class="flex flex-col w-full ml-4 overflow-hidden"> <div class="flex flex-col w-full ml-4 overflow-hidden">
<div class="w-full whitespace-nowrap overflow-ellipsis overflow-hidden leading-normal text-current opacity-80"> <div class="w-full whitespace-nowrap overflow-ellipsis overflow-hidden leading-normal text-current opacity-80">
{{user.name}} {{data.user.name}}
</div> </div>
<div class="w-full mt-0.5 whitespace-nowrap text-sm overflow-ellipsis overflow-hidden leading-normal text-current opacity-50"> <div class="w-full mt-0.5 whitespace-nowrap text-sm overflow-ellipsis overflow-hidden leading-normal text-current opacity-50">
brian.hughes@company.com brian.hughes@company.com
@@ -44,13 +44,13 @@
<mat-icon [svgIcon]="'heroicons_outline:menu'"></mat-icon> <mat-icon [svgIcon]="'heroicons_outline:menu'"></mat-icon>
</button> </button>
<!-- Components --> <!-- Components -->
<div class="flex items-center pl-2 ml-auto space-x-1 sm:space-x-2"> <div class="flex items-center pl-2 ml-auto space-x-2">
<languages></languages> <language></language>
<fuse-fullscreen class="hidden md:block"></fuse-fullscreen> <fuse-fullscreen></fuse-fullscreen>
<search [appearance]="'bar'"></search> <search [appearance]="'bar'"></search>
<shortcuts></shortcuts> <shortcuts [shortcuts]="data.shortcuts"></shortcuts>
<messages></messages> <messages [messages]="data.messages"></messages>
<notifications></notifications> <notifications [notifications]="data.notifications"></notifications>
</div> </div>
</div> </div>

View File

@@ -1,13 +1,10 @@
import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; import { Component, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router'; import { ActivatedRoute, Data, Router } from '@angular/router';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators'; import { takeUntil } from 'rxjs/operators';
import { FuseMediaWatcherService } from '@fuse/services/media-watcher'; import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation'; import { FuseNavigationService, FuseVerticalNavigationComponent } from '@fuse/components/navigation';
import { Navigation } from 'app/core/navigation/navigation.types'; import { InitialData } from 'app/app.types';
import { NavigationService } from 'app/core/navigation/navigation.service';
import { User } from 'app/core/user/user.types';
import { UserService } from 'app/core/user/user.service';
@Component({ @Component({
selector : 'futuristic-layout', selector : 'futuristic-layout',
@@ -16,9 +13,8 @@ import { UserService } from 'app/core/user/user.service';
}) })
export class FuturisticLayoutComponent implements OnInit, OnDestroy export class FuturisticLayoutComponent implements OnInit, OnDestroy
{ {
data: InitialData;
isScreenSmall: boolean; isScreenSmall: boolean;
navigation: Navigation;
user: User;
private _unsubscribeAll: Subject<any> = new Subject<any>(); private _unsubscribeAll: Subject<any> = new Subject<any>();
/** /**
@@ -27,8 +23,6 @@ export class FuturisticLayoutComponent implements OnInit, OnDestroy
constructor( constructor(
private _activatedRoute: ActivatedRoute, private _activatedRoute: ActivatedRoute,
private _router: Router, private _router: Router,
private _navigationService: NavigationService,
private _userService: UserService,
private _fuseMediaWatcherService: FuseMediaWatcherService, private _fuseMediaWatcherService: FuseMediaWatcherService,
private _fuseNavigationService: FuseNavigationService private _fuseNavigationService: FuseNavigationService
) )
@@ -56,19 +50,10 @@ export class FuturisticLayoutComponent implements OnInit, OnDestroy
*/ */
ngOnInit(): void ngOnInit(): void
{ {
// Subscribe to navigation data // Subscribe to the resolved route data
this._navigationService.navigation$ this._activatedRoute.data.subscribe((data: Data) => {
.pipe(takeUntil(this._unsubscribeAll)) this.data = data.initialData;
.subscribe((navigation: Navigation) => { });
this.navigation = navigation;
});
// Subscribe to the user service
this._userService.user$
.pipe((takeUntil(this._unsubscribeAll)))
.subscribe((user: User) => {
this.user = user;
});
// Subscribe to media changes // Subscribe to media changes
this._fuseMediaWatcherService.onMediaChange$ this._fuseMediaWatcherService.onMediaChange$

View File

@@ -7,12 +7,12 @@ import { MatIconModule } from '@angular/material/icon';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
import { FuseFullscreenModule } from '@fuse/components/fullscreen'; import { FuseFullscreenModule } from '@fuse/components/fullscreen';
import { FuseNavigationModule } from '@fuse/components/navigation'; import { FuseNavigationModule } from '@fuse/components/navigation';
import { LanguagesModule } from 'app/layout/common/languages/languages.module'; import { LanguageModule } from 'app/layout/common/language/language.module';
import { MessagesModule } from 'app/layout/common/messages/messages.module'; import { MessagesModule } from 'app/layout/common/messages/messages.module';
import { NotificationsModule } from 'app/layout/common/notifications/notifications.module'; import { NotificationsModule } from 'app/layout/common/notifications/notifications.module';
import { SearchModule } from 'app/layout/common/search/search.module'; import { SearchModule } from 'app/layout/common/search/search.module';
import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module'; import { ShortcutsModule } from 'app/layout/common/shortcuts/shortcuts.module';
import { UserModule } from 'app/layout/common/user/user.module'; import { UserMenuModule } from 'app/layout/common/user-menu/user-menu.module';
import { SharedModule } from 'app/shared/shared.module'; import { SharedModule } from 'app/shared/shared.module';
import { FuturisticLayoutComponent } from 'app/layout/layouts/vertical/futuristic/futuristic.component'; import { FuturisticLayoutComponent } from 'app/layout/layouts/vertical/futuristic/futuristic.component';
@@ -29,12 +29,12 @@ import { FuturisticLayoutComponent } from 'app/layout/layouts/vertical/futuristi
MatMenuModule, MatMenuModule,
FuseFullscreenModule, FuseFullscreenModule,
FuseNavigationModule, FuseNavigationModule,
LanguagesModule, LanguageModule,
MessagesModule, MessagesModule,
NotificationsModule, NotificationsModule,
SearchModule, SearchModule,
ShortcutsModule, ShortcutsModule,
UserModule, UserMenuModule,
SharedModule SharedModule
], ],
exports : [ exports : [

Some files were not shown because too many files have changed in this diff Show More