mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2024-10-30 01:08:47 +00:00
Finalized standalone components conversion
This commit is contained in:
parent
5d42763f1b
commit
e23a21eedf
46298
package-lock.json
generated
46298
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
130
package.json
130
package.json
|
@ -1,66 +1,66 @@
|
|||
{
|
||||
"name": "fuse-angular",
|
||||
"version": "18.0.0",
|
||||
"description": "Fuse - Angular Admin Template and Starter Project",
|
||||
"author": "https://themeforest.net/user/srcn",
|
||||
"license": "https://themeforest.net/licenses/standard",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve",
|
||||
"build": "ng build",
|
||||
"watch": "ng build --watch --configuration development",
|
||||
"test": "ng test"
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular/animations": "16.0.0",
|
||||
"@angular/cdk": "16.0.0",
|
||||
"@angular/common": "16.0.0",
|
||||
"@angular/compiler": "16.0.0",
|
||||
"@angular/core": "16.0.0",
|
||||
"@angular/forms": "16.0.0",
|
||||
"@angular/material": "16.0.0",
|
||||
"@angular/material-luxon-adapter": "16.0.0",
|
||||
"@angular/platform-browser": "16.0.0",
|
||||
"@angular/platform-browser-dynamic": "16.0.0",
|
||||
"@angular/router": "16.0.0",
|
||||
"@ngneat/transloco": "4.2.6",
|
||||
"apexcharts": "3.40.0",
|
||||
"crypto-js": "3.3.0",
|
||||
"highlight.js": "11.8.0",
|
||||
"lodash-es": "4.17.21",
|
||||
"luxon": "3.3.0",
|
||||
"ng-apexcharts": "1.7.6",
|
||||
"ngx-quill": "21.0.0",
|
||||
"perfect-scrollbar": "1.5.5",
|
||||
"quill": "1.3.7",
|
||||
"rxjs": "7.8.1",
|
||||
"tslib": "2.5.0",
|
||||
"zone.js": "0.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "16.0.0",
|
||||
"@angular/cli": "16.0.0",
|
||||
"@angular/compiler-cli": "16.0.0",
|
||||
"@tailwindcss/typography": "0.5.9",
|
||||
"@types/chroma-js": "2.4.0",
|
||||
"@types/crypto-js": "3.1.47",
|
||||
"@types/highlight.js": "10.1.0",
|
||||
"@types/jasmine": "4.3.1",
|
||||
"@types/lodash": "4.14.194",
|
||||
"@types/lodash-es": "4.17.7",
|
||||
"@types/luxon": "3.3.0",
|
||||
"autoprefixer": "10.4.14",
|
||||
"chroma-js": "2.4.2",
|
||||
"jasmine-core": "4.6.0",
|
||||
"karma": "6.4.2",
|
||||
"karma-chrome-launcher": "3.2.0",
|
||||
"karma-coverage": "2.2.0",
|
||||
"karma-jasmine": "5.1.0",
|
||||
"karma-jasmine-html-reporter": "2.0.0",
|
||||
"lodash": "4.17.21",
|
||||
"postcss": "8.4.23",
|
||||
"tailwindcss": "3.3.2",
|
||||
"typescript": "4.9.5"
|
||||
}
|
||||
}
|
||||
"name": "fuse-angular",
|
||||
"version": "18.0.0",
|
||||
"description": "Fuse - Angular Admin Template and Starter Project",
|
||||
"author": "https://themeforest.net/user/srcn",
|
||||
"license": "https://themeforest.net/licenses/standard",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "ng serve",
|
||||
"build": "ng build",
|
||||
"watch": "ng build --watch --configuration development",
|
||||
"test": "ng test"
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular/animations": "16.0.3",
|
||||
"@angular/cdk": "16.0.2",
|
||||
"@angular/common": "16.0.3",
|
||||
"@angular/compiler": "16.0.3",
|
||||
"@angular/core": "16.0.3",
|
||||
"@angular/forms": "16.0.3",
|
||||
"@angular/material": "16.0.2",
|
||||
"@angular/material-luxon-adapter": "16.0.2",
|
||||
"@angular/platform-browser": "16.0.3",
|
||||
"@angular/platform-browser-dynamic": "16.0.3",
|
||||
"@angular/router": "16.0.3",
|
||||
"@ngneat/transloco": "4.2.7",
|
||||
"apexcharts": "3.40.0",
|
||||
"crypto-js": "3.3.0",
|
||||
"highlight.js": "11.8.0",
|
||||
"lodash-es": "4.17.21",
|
||||
"luxon": "3.3.0",
|
||||
"ng-apexcharts": "1.7.6",
|
||||
"ngx-quill": "22.0.0",
|
||||
"perfect-scrollbar": "1.5.5",
|
||||
"quill": "1.3.7",
|
||||
"rxjs": "7.8.1",
|
||||
"tslib": "2.5.2",
|
||||
"zone.js": "0.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "16.0.3",
|
||||
"@angular/cli": "16.0.3",
|
||||
"@angular/compiler-cli": "16.0.3",
|
||||
"@tailwindcss/typography": "0.5.9",
|
||||
"@types/chroma-js": "2.4.0",
|
||||
"@types/crypto-js": "3.1.47",
|
||||
"@types/highlight.js": "10.1.0",
|
||||
"@types/jasmine": "4.3.2",
|
||||
"@types/lodash": "4.14.195",
|
||||
"@types/lodash-es": "4.17.7",
|
||||
"@types/luxon": "3.3.0",
|
||||
"autoprefixer": "10.4.14",
|
||||
"chroma-js": "2.4.2",
|
||||
"jasmine-core": "5.0.0",
|
||||
"karma": "6.4.2",
|
||||
"karma-chrome-launcher": "3.2.0",
|
||||
"karma-coverage": "2.2.0",
|
||||
"karma-jasmine": "5.1.0",
|
||||
"karma-jasmine-html-reporter": "2.0.0",
|
||||
"lodash": "4.17.21",
|
||||
"postcss": "8.4.24",
|
||||
"tailwindcss": "3.3.2",
|
||||
"typescript": "5.0.4"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { Observable, ReplaySubject } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseAlertService
|
||||
{
|
||||
private readonly _onDismiss: ReplaySubject<string> = new ReplaySubject<string>(1);
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { FuseDrawerComponent } from '@fuse/components/drawer/drawer.component';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseDrawerService
|
||||
{
|
||||
private _componentRegistry: Map<string, FuseDrawerComponent> = new Map<string, FuseDrawerComponent>();
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import hljs from 'highlight.js';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseHighlightService
|
||||
{
|
||||
/**
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { FuseNavigationItem } from '@fuse/components/navigation/navigation.types';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseNavigationService
|
||||
{
|
||||
private _componentRegistry: Map<string, any> = new Map<string, any>();
|
||||
|
|
|
@ -1,51 +0,0 @@
|
|||
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 { FuseConfirmationModule } from '@fuse/services/confirmation';
|
||||
import { FuseLoadingModule } from '@fuse/services/loading';
|
||||
import { FuseMediaWatcherModule } from '@fuse/services/media-watcher/media-watcher.module';
|
||||
import { FusePlatformModule } from '@fuse/services/platform/platform.module';
|
||||
import { FuseSplashScreenModule } from '@fuse/services/splash-screen/splash-screen.module';
|
||||
import { FuseUtilsModule } from '@fuse/services/utils/utils.module';
|
||||
|
||||
@NgModule({
|
||||
imports : [
|
||||
FuseConfirmationModule,
|
||||
FuseLoadingModule,
|
||||
FuseMediaWatcherModule,
|
||||
FusePlatformModule,
|
||||
FuseSplashScreenModule,
|
||||
FuseUtilsModule,
|
||||
],
|
||||
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
|
||||
provide : MAT_FORM_FIELD_DEFAULT_OPTIONS,
|
||||
useValue: {
|
||||
appearance: 'fill',
|
||||
},
|
||||
},
|
||||
],
|
||||
})
|
||||
export class FuseModule
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(@Optional() @SkipSelf() parentModule?: FuseModule)
|
||||
{
|
||||
if ( parentModule )
|
||||
{
|
||||
throw new Error('FuseModule has already been loaded. Import this module in the AppModule only!');
|
||||
}
|
||||
}
|
||||
}
|
108
src/@fuse/fuse.provider.ts
Normal file
108
src/@fuse/fuse.provider.ts
Normal file
|
@ -0,0 +1,108 @@
|
|||
import { provideHttpClient, withInterceptors } from '@angular/common/http';
|
||||
import { APP_INITIALIZER, ENVIRONMENT_INITIALIZER, EnvironmentProviders, importProvidersFrom, inject, Provider } from '@angular/core';
|
||||
import { MATERIAL_SANITY_CHECKS } from '@angular/material/core';
|
||||
import { MatDialogModule } from '@angular/material/dialog';
|
||||
import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
|
||||
import { FUSE_MOCK_API_DEFAULT_DELAY, mockApiInterceptor } from '@fuse/lib/mock-api';
|
||||
import { FuseConfig } from '@fuse/services/config';
|
||||
import { FUSE_CONFIG } from '@fuse/services/config/config.constants';
|
||||
import { FuseConfirmationService } from '@fuse/services/confirmation';
|
||||
import { fuseLoadingInterceptor, FuseLoadingService } from '@fuse/services/loading';
|
||||
import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
|
||||
import { FusePlatformService } from '@fuse/services/platform';
|
||||
import { FuseSplashScreenService } from '@fuse/services/splash-screen';
|
||||
import { FuseUtilsService } from '@fuse/services/utils';
|
||||
|
||||
export type FuseProviderConfig = {
|
||||
mockApi?: {
|
||||
delay?: number;
|
||||
services?: any[];
|
||||
},
|
||||
fuse?: FuseConfig
|
||||
}
|
||||
|
||||
/**
|
||||
* Fuse provider
|
||||
*/
|
||||
export const provideFuse = (config: FuseProviderConfig): Array<Provider | EnvironmentProviders> =>
|
||||
{
|
||||
// Base providers
|
||||
const providers: Array<Provider | EnvironmentProviders> = [
|
||||
{
|
||||
// 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
|
||||
provide : MAT_FORM_FIELD_DEFAULT_OPTIONS,
|
||||
useValue: {
|
||||
appearance: 'fill',
|
||||
},
|
||||
},
|
||||
{
|
||||
provide : FUSE_MOCK_API_DEFAULT_DELAY,
|
||||
useValue: config?.mockApi?.delay ?? 0,
|
||||
},
|
||||
{
|
||||
provide : FUSE_CONFIG,
|
||||
useValue: config?.fuse ?? {},
|
||||
},
|
||||
|
||||
importProvidersFrom(MatDialogModule),
|
||||
{
|
||||
provide : ENVIRONMENT_INITIALIZER,
|
||||
useValue: () => inject(FuseConfirmationService),
|
||||
multi : true,
|
||||
},
|
||||
|
||||
provideHttpClient(withInterceptors([fuseLoadingInterceptor])),
|
||||
{
|
||||
provide : ENVIRONMENT_INITIALIZER,
|
||||
useValue: () => inject(FuseLoadingService),
|
||||
multi : true,
|
||||
},
|
||||
|
||||
{
|
||||
provide : ENVIRONMENT_INITIALIZER,
|
||||
useValue: () => inject(FuseMediaWatcherService),
|
||||
multi : true,
|
||||
},
|
||||
{
|
||||
provide : ENVIRONMENT_INITIALIZER,
|
||||
useValue: () => inject(FusePlatformService),
|
||||
multi : true,
|
||||
},
|
||||
{
|
||||
provide : ENVIRONMENT_INITIALIZER,
|
||||
useValue: () => inject(FuseSplashScreenService),
|
||||
multi : true,
|
||||
},
|
||||
{
|
||||
provide : ENVIRONMENT_INITIALIZER,
|
||||
useValue: () => inject(FuseUtilsService),
|
||||
multi : true,
|
||||
},
|
||||
];
|
||||
|
||||
// Mock Api services
|
||||
if ( config?.mockApi?.services )
|
||||
{
|
||||
providers.push(
|
||||
provideHttpClient(withInterceptors([mockApiInterceptor])),
|
||||
{
|
||||
provide : APP_INITIALIZER,
|
||||
deps : [...config.mockApi.services],
|
||||
useFactory: () => (): any => null,
|
||||
multi : true,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
// Return the providers
|
||||
return providers;
|
||||
};
|
|
@ -1 +1 @@
|
|||
export * from './fuse.module';
|
||||
export * from './fuse.provider';
|
||||
|
|
|
@ -1,96 +1,77 @@
|
|||
import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';
|
||||
import { Inject, Injectable } from '@angular/core';
|
||||
import { HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpRequest, HttpResponse } from '@angular/common/http';
|
||||
import { inject } from '@angular/core';
|
||||
import { FUSE_MOCK_API_DEFAULT_DELAY } from '@fuse/lib/mock-api/mock-api.constants';
|
||||
import { FuseMockApiService } from '@fuse/lib/mock-api/mock-api.service';
|
||||
import { delay, Observable, of, switchMap, throwError } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class FuseMockApiInterceptor implements HttpInterceptor
|
||||
export const mockApiInterceptor = (request: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> =>
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(
|
||||
@Inject(FUSE_MOCK_API_DEFAULT_DELAY) private _defaultDelay: number,
|
||||
private _fuseMockApiService: FuseMockApiService,
|
||||
)
|
||||
const defaultDelay = inject(FUSE_MOCK_API_DEFAULT_DELAY);
|
||||
const fuseMockApiService = inject(FuseMockApiService);
|
||||
|
||||
// Try to get the request handler
|
||||
const {
|
||||
handler,
|
||||
urlParams,
|
||||
} = fuseMockApiService.findHandler(request.method.toUpperCase(), request.url);
|
||||
|
||||
// Pass through if the request handler does not exist
|
||||
if ( !handler )
|
||||
{
|
||||
return next(request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercept
|
||||
*
|
||||
* @param request
|
||||
* @param next
|
||||
*/
|
||||
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
|
||||
{
|
||||
// Try to get the request handler
|
||||
const {
|
||||
handler,
|
||||
urlParams,
|
||||
} = this._fuseMockApiService.findHandler(request.method.toUpperCase(), request.url);
|
||||
// Set the intercepted request on the handler
|
||||
handler.request = request;
|
||||
|
||||
// Pass through if the request handler does not exist
|
||||
if ( !handler )
|
||||
// Set the url params on the handler
|
||||
handler.urlParams = urlParams;
|
||||
|
||||
// Subscribe to the response function observable
|
||||
return handler.response.pipe(
|
||||
delay(handler.delay ?? defaultDelay ?? 0),
|
||||
switchMap((response) =>
|
||||
{
|
||||
return next.handle(request);
|
||||
}
|
||||
|
||||
// Set the intercepted request on the handler
|
||||
handler.request = request;
|
||||
|
||||
// Set the url params on the handler
|
||||
handler.urlParams = urlParams;
|
||||
|
||||
// Subscribe to the response function observable
|
||||
return handler.response.pipe(
|
||||
delay(handler.delay ?? this._defaultDelay ?? 0),
|
||||
switchMap((response) =>
|
||||
// If there is no response data,
|
||||
// throw an error response
|
||||
if ( !response )
|
||||
{
|
||||
// If there is no response data,
|
||||
// throw an error response
|
||||
if ( !response )
|
||||
{
|
||||
response = new HttpErrorResponse({
|
||||
error : 'NOT FOUND',
|
||||
status : 404,
|
||||
statusText: 'NOT FOUND',
|
||||
});
|
||||
|
||||
return throwError(response);
|
||||
}
|
||||
|
||||
// Parse the response data
|
||||
const data = {
|
||||
status: response[0],
|
||||
body : response[1],
|
||||
};
|
||||
|
||||
// If the status code is in between 200 and 300,
|
||||
// return a success response
|
||||
if ( data.status >= 200 && data.status < 300 )
|
||||
{
|
||||
response = new HttpResponse({
|
||||
body : data.body,
|
||||
status : data.status,
|
||||
statusText: 'OK',
|
||||
});
|
||||
|
||||
return of(response);
|
||||
}
|
||||
|
||||
// For other status codes,
|
||||
// throw an error response
|
||||
response = new HttpErrorResponse({
|
||||
error : data.body.error,
|
||||
status : data.status,
|
||||
statusText: 'ERROR',
|
||||
error : 'NOT FOUND',
|
||||
status : 404,
|
||||
statusText: 'NOT FOUND',
|
||||
});
|
||||
|
||||
return throwError(response);
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the response data
|
||||
const data = {
|
||||
status: response[0],
|
||||
body : response[1],
|
||||
};
|
||||
|
||||
// If the status code is in between 200 and 300,
|
||||
// return a success response
|
||||
if ( data.status >= 200 && data.status < 300 )
|
||||
{
|
||||
response = new HttpResponse({
|
||||
body : data.body,
|
||||
status : data.status,
|
||||
statusText: 'OK',
|
||||
});
|
||||
|
||||
return of(response);
|
||||
}
|
||||
|
||||
// For other status codes,
|
||||
// throw an error response
|
||||
response = new HttpErrorResponse({
|
||||
error : data.body.error,
|
||||
status : data.status,
|
||||
statusText: 'ERROR',
|
||||
});
|
||||
|
||||
return throwError(response);
|
||||
}));
|
||||
};
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
||||
import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';
|
||||
import { FUSE_MOCK_API_DEFAULT_DELAY } from '@fuse/lib/mock-api/mock-api.constants';
|
||||
import { FuseMockApiInterceptor } from '@fuse/lib/mock-api/mock-api.interceptor';
|
||||
|
||||
@NgModule({
|
||||
providers: [
|
||||
{
|
||||
provide : HTTP_INTERCEPTORS,
|
||||
useClass: FuseMockApiInterceptor,
|
||||
multi : true,
|
||||
},
|
||||
],
|
||||
})
|
||||
export class FuseMockApiModule
|
||||
{
|
||||
/**
|
||||
* FuseMockApi module default configuration.
|
||||
*
|
||||
* @param mockApiServices - Array of services that register mock API handlers
|
||||
* @param config - Configuration options
|
||||
* @param config.delay - Default delay value in milliseconds to apply all responses
|
||||
*/
|
||||
static forRoot(mockApiServices: any[], config?: { delay?: number }): ModuleWithProviders<FuseMockApiModule>
|
||||
{
|
||||
return {
|
||||
ngModule : FuseMockApiModule,
|
||||
providers: [
|
||||
{
|
||||
provide : APP_INITIALIZER,
|
||||
deps : [...mockApiServices],
|
||||
useFactory: () => (): any => null,
|
||||
multi : true,
|
||||
},
|
||||
{
|
||||
provide : FUSE_MOCK_API_DEFAULT_DELAY,
|
||||
useValue: config?.delay ?? 0,
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
}
|
|
@ -3,9 +3,7 @@ import { FuseMockApiHandler } from '@fuse/lib/mock-api/mock-api.request-handler'
|
|||
import { FuseMockApiMethods } from '@fuse/lib/mock-api/mock-api.types';
|
||||
import { compact, fromPairs } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseMockApiService
|
||||
{
|
||||
private _handlers: { [key: string]: Map<string, FuseMockApiHandler> } = {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
export * from '@fuse/lib/mock-api/mock-api.constants';
|
||||
export * from '@fuse/lib/mock-api/mock-api.module';
|
||||
export * from '@fuse/lib/mock-api/mock-api.interceptor';
|
||||
export * from '@fuse/lib/mock-api/mock-api.service';
|
||||
export * from '@fuse/lib/mock-api/mock-api.types';
|
||||
export * from '@fuse/lib/mock-api/mock-api.utils';
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
import { InjectionToken } from '@angular/core';
|
||||
|
||||
export const FUSE_APP_CONFIG = new InjectionToken<any>('FUSE_APP_CONFIG');
|
||||
export const FUSE_CONFIG = new InjectionToken<any>('FUSE_APP_CONFIG');
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
import { ModuleWithProviders, NgModule } from '@angular/core';
|
||||
import { FUSE_APP_CONFIG } from '@fuse/services/config/config.constants';
|
||||
import { FuseConfigService } from '@fuse/services/config/config.service';
|
||||
|
||||
@NgModule()
|
||||
export class FuseConfigModule
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(private _fuseConfigService: FuseConfigService)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* forRoot method for setting user configuration
|
||||
*
|
||||
* @param config
|
||||
*/
|
||||
static forRoot(config: any): ModuleWithProviders<FuseConfigModule>
|
||||
{
|
||||
return {
|
||||
ngModule : FuseConfigModule,
|
||||
providers: [
|
||||
{
|
||||
provide : FUSE_APP_CONFIG,
|
||||
useValue: config,
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
}
|
|
@ -1,11 +1,9 @@
|
|||
import { Inject, Injectable } from '@angular/core';
|
||||
import { FUSE_APP_CONFIG } from '@fuse/services/config/config.constants';
|
||||
import { FUSE_CONFIG } from '@fuse/services/config/config.constants';
|
||||
import { merge } from 'lodash-es';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseConfigService
|
||||
{
|
||||
private _config: BehaviorSubject<any>;
|
||||
|
@ -13,7 +11,7 @@ export class FuseConfigService
|
|||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(@Inject(FUSE_APP_CONFIG) config: any)
|
||||
constructor(@Inject(FUSE_CONFIG) config: any)
|
||||
{
|
||||
// Private
|
||||
this._config = new BehaviorSubject(config);
|
||||
|
|
18
src/@fuse/services/config/config.types.ts
Normal file
18
src/@fuse/services/config/config.types.ts
Normal file
|
@ -0,0 +1,18 @@
|
|||
// Types
|
||||
export type Scheme = 'auto' | 'dark' | 'light';
|
||||
export type Screens = { [key: string]: string };
|
||||
export type Theme = 'theme-default' | string;
|
||||
export type Themes = { id: string; name: string }[];
|
||||
|
||||
/**
|
||||
* AppConfig interface. Update this interface to strictly type your config
|
||||
* object.
|
||||
*/
|
||||
export interface FuseConfig
|
||||
{
|
||||
layout: string;
|
||||
scheme: Scheme;
|
||||
screens: Screens;
|
||||
theme: Theme;
|
||||
themes: Themes;
|
||||
}
|
|
@ -1,2 +1,2 @@
|
|||
export * from '@fuse/services/config/config.module';
|
||||
export * from '@fuse/services/config/config.service';
|
||||
export * from '@fuse/services/config/config.types';
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
import { CommonModule } from '@angular/common';
|
||||
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';
|
||||
|
||||
@NgModule({
|
||||
imports : [
|
||||
MatButtonModule,
|
||||
MatDialogModule,
|
||||
MatIconModule,
|
||||
CommonModule,
|
||||
FuseConfirmationDialogComponent,
|
||||
],
|
||||
providers: [
|
||||
FuseConfirmationService,
|
||||
],
|
||||
})
|
||||
export class FuseConfirmationModule
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(private _fuseConfirmationService: FuseConfirmationService)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,12 +1,13 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { inject, Injectable } from '@angular/core';
|
||||
import { MatDialog, MatDialogRef } from '@angular/material/dialog';
|
||||
import { FuseConfirmationConfig } from '@fuse/services/confirmation/confirmation.types';
|
||||
import { FuseConfirmationDialogComponent } from '@fuse/services/confirmation/dialog/dialog.component';
|
||||
import { merge } from 'lodash-es';
|
||||
|
||||
@Injectable()
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseConfirmationService
|
||||
{
|
||||
private _matDialog: MatDialog = inject(MatDialog);
|
||||
private _defaultConfig: FuseConfirmationConfig = {
|
||||
title : 'Confirm action',
|
||||
message : 'Are you sure you want to confirm this action?',
|
||||
|
@ -32,9 +33,7 @@ export class FuseConfirmationService
|
|||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(
|
||||
private _matDialog: MatDialog,
|
||||
)
|
||||
constructor()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,2 @@
|
|||
export * from '@fuse/services/confirmation/confirmation.module';
|
||||
export * from '@fuse/services/confirmation/confirmation.service';
|
||||
export * from '@fuse/services/confirmation/confirmation.types';
|
||||
|
|
|
@ -1,50 +1,33 @@
|
|||
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';
|
||||
import { inject } from '@angular/core';
|
||||
import { FuseLoadingService } from '@fuse/services/loading/loading.service';
|
||||
import { finalize, Observable } from 'rxjs';
|
||||
import { finalize, Observable, take } from 'rxjs';
|
||||
|
||||
@Injectable()
|
||||
export class FuseLoadingInterceptor implements HttpInterceptor
|
||||
export const fuseLoadingInterceptor = (req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> =>
|
||||
{
|
||||
handleRequestsAutomatically: boolean;
|
||||
const fuseLoadingService = inject(FuseLoadingService);
|
||||
let handleRequestsAutomatically = false;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(
|
||||
private _fuseLoadingService: FuseLoadingService,
|
||||
)
|
||||
{
|
||||
// Subscribe to the auto
|
||||
this._fuseLoadingService.auto$
|
||||
.subscribe((value) =>
|
||||
{
|
||||
this.handleRequestsAutomatically = value;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercept
|
||||
*
|
||||
* @param req
|
||||
* @param next
|
||||
*/
|
||||
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
|
||||
{
|
||||
// If the Auto mode is turned off, do nothing
|
||||
if ( !this.handleRequestsAutomatically )
|
||||
fuseLoadingService.auto$
|
||||
.pipe(take(1))
|
||||
.subscribe((value) =>
|
||||
{
|
||||
return next.handle(req);
|
||||
}
|
||||
handleRequestsAutomatically = value;
|
||||
});
|
||||
|
||||
// Set the loading status to true
|
||||
this._fuseLoadingService._setLoadingStatus(true, req.url);
|
||||
|
||||
return next.handle(req).pipe(
|
||||
finalize(() =>
|
||||
{
|
||||
// Set the status to false if there are any errors or the request is completed
|
||||
this._fuseLoadingService._setLoadingStatus(false, req.url);
|
||||
}));
|
||||
// If the Auto mode is turned off, do nothing
|
||||
if ( !handleRequestsAutomatically )
|
||||
{
|
||||
return next(req);
|
||||
}
|
||||
}
|
||||
|
||||
// Set the loading status to true
|
||||
fuseLoadingService._setLoadingStatus(true, req.url);
|
||||
|
||||
return next(req).pipe(
|
||||
finalize(() =>
|
||||
{
|
||||
// Set the status to false if there are any errors or the request is completed
|
||||
fuseLoadingService._setLoadingStatus(false, req.url);
|
||||
}));
|
||||
};
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
import { HTTP_INTERCEPTORS } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { FuseLoadingInterceptor } from '@fuse/services/loading/loading.interceptor';
|
||||
|
||||
@NgModule({
|
||||
providers: [
|
||||
{
|
||||
provide : HTTP_INTERCEPTORS,
|
||||
useClass: FuseLoadingInterceptor,
|
||||
multi : true,
|
||||
},
|
||||
],
|
||||
})
|
||||
export class FuseLoadingModule
|
||||
{
|
||||
}
|
|
@ -2,9 +2,7 @@ import { HttpClient } from '@angular/common/http';
|
|||
import { Injectable } from '@angular/core';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseLoadingService
|
||||
{
|
||||
private _auto$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
export * from '@fuse/services/loading/loading.service';
|
||||
export * from '@fuse/services/loading/loading.module';
|
||||
export * from '@fuse/services/loading/loading.interceptor';
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { FuseMediaWatcherService } from '@fuse/services/media-watcher/media-watcher.service';
|
||||
|
||||
@NgModule({
|
||||
providers: [
|
||||
FuseMediaWatcherService,
|
||||
],
|
||||
})
|
||||
export class FuseMediaWatcherModule
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(private _fuseMediaWatcherService: FuseMediaWatcherService)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -4,7 +4,7 @@ import { FuseConfigService } from '@fuse/services/config';
|
|||
import { fromPairs } from 'lodash-es';
|
||||
import { map, Observable, ReplaySubject, switchMap } from 'rxjs';
|
||||
|
||||
@Injectable()
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseMediaWatcherService
|
||||
{
|
||||
private _onMediaChange: ReplaySubject<{ matchingAliases: string[]; matchingQueries: any }> = new ReplaySubject<{ matchingAliases: string[]; matchingQueries: any }>(1);
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
export * from '@fuse/services/media-watcher/media-watcher.module';
|
||||
export * from '@fuse/services/media-watcher/media-watcher.service';
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { FusePlatformService } from '@fuse/services/platform/platform.service';
|
||||
|
||||
@NgModule({
|
||||
providers: [
|
||||
FusePlatformService,
|
||||
],
|
||||
})
|
||||
export class FusePlatformModule
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(private _fusePlatformService: FusePlatformService)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,9 +1,7 @@
|
|||
import { Platform } from '@angular/cdk/platform';
|
||||
import { Injectable } from '@angular/core';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FusePlatformService
|
||||
{
|
||||
osName = 'os-unknown';
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
export * from '@fuse/services/splash-screen/splash-screen.module';
|
||||
export * from '@fuse/services/splash-screen/splash-screen.service';
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { FuseSplashScreenService } from '@fuse/services/splash-screen/splash-screen.service';
|
||||
|
||||
@NgModule({
|
||||
providers: [
|
||||
FuseSplashScreenService,
|
||||
],
|
||||
})
|
||||
export class FuseSplashScreenModule
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(private _fuseSplashScreenService: FuseSplashScreenService)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -3,7 +3,7 @@ import { Inject, Injectable } from '@angular/core';
|
|||
import { NavigationEnd, Router } from '@angular/router';
|
||||
import { filter, take } from 'rxjs';
|
||||
|
||||
@Injectable()
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseSplashScreenService
|
||||
{
|
||||
/**
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
export * from '@fuse/services/utils/utils.module';
|
||||
export * from '@fuse/services/utils/utils.service';
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { FuseUtilsService } from '@fuse/services/utils/utils.service';
|
||||
|
||||
@NgModule({
|
||||
providers: [
|
||||
FuseUtilsService,
|
||||
],
|
||||
})
|
||||
export class FuseUtilsModule
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(private _fuseUtilsService: FuseUtilsService)
|
||||
{
|
||||
}
|
||||
}
|
|
@ -1,9 +1,7 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { IsActiveMatchOptions } from '@angular/router';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FuseUtilsService
|
||||
{
|
||||
/**
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,3 +1,3 @@
|
|||
import { Version } from '@fuse/version/version';
|
||||
|
||||
export const FUSE_VERSION = new Version('17.2.0').full;
|
||||
export const FUSE_VERSION = new Version('18.0.0').full;
|
||||
|
|
93
src/app/app.config.ts
Normal file
93
src/app/app.config.ts
Normal file
|
@ -0,0 +1,93 @@
|
|||
import { provideHttpClient } from '@angular/common/http';
|
||||
import { ApplicationConfig } from '@angular/core';
|
||||
import { LuxonDateAdapter } from '@angular/material-luxon-adapter';
|
||||
import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
|
||||
import { provideAnimations } from '@angular/platform-browser/animations';
|
||||
import { PreloadAllModules, provideRouter, withInMemoryScrolling, withPreloading } from '@angular/router';
|
||||
import { provideFuse } from '@fuse';
|
||||
import { appRoutes } from 'app/app.routes';
|
||||
import { provideAuth } from 'app/core/auth/auth.provider';
|
||||
import { provideIcons } from 'app/core/icons/icons.provider';
|
||||
import { provideTransloco } from 'app/core/transloco/transloco.provider';
|
||||
import { mockApiServices } from 'app/mock-api';
|
||||
|
||||
export const appConfig: ApplicationConfig = {
|
||||
providers: [
|
||||
provideAnimations(),
|
||||
provideHttpClient(),
|
||||
provideRouter(appRoutes,
|
||||
withPreloading(PreloadAllModules),
|
||||
withInMemoryScrolling({scrollPositionRestoration: 'enabled'}),
|
||||
),
|
||||
|
||||
// Material Date Adapter
|
||||
{
|
||||
provide : DateAdapter,
|
||||
useClass: LuxonDateAdapter,
|
||||
},
|
||||
{
|
||||
provide : MAT_DATE_FORMATS,
|
||||
useValue: {
|
||||
parse : {
|
||||
dateInput: 'D',
|
||||
},
|
||||
display: {
|
||||
dateInput : 'DDD',
|
||||
monthYearLabel : 'LLL yyyy',
|
||||
dateA11yLabel : 'DD',
|
||||
monthYearA11yLabel: 'LLLL yyyy',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// Transloco Config
|
||||
provideTransloco(),
|
||||
|
||||
// Fuse
|
||||
provideAuth(),
|
||||
provideIcons(),
|
||||
provideFuse({
|
||||
mockApi: {
|
||||
delay : 0,
|
||||
services: mockApiServices,
|
||||
},
|
||||
fuse : {
|
||||
layout : 'classy',
|
||||
scheme : 'light',
|
||||
screens: {
|
||||
sm: '600px',
|
||||
md: '960px',
|
||||
lg: '1280px',
|
||||
xl: '1440px',
|
||||
},
|
||||
theme : 'theme-default',
|
||||
themes : [
|
||||
{
|
||||
id : 'theme-default',
|
||||
name: 'Default',
|
||||
},
|
||||
{
|
||||
id : 'theme-brand',
|
||||
name: 'Brand',
|
||||
},
|
||||
{
|
||||
id : 'theme-teal',
|
||||
name: 'Teal',
|
||||
},
|
||||
{
|
||||
id : 'theme-rose',
|
||||
name: 'Rose',
|
||||
},
|
||||
{
|
||||
id : 'theme-purple',
|
||||
name: 'Purple',
|
||||
},
|
||||
{
|
||||
id : 'theme-amber',
|
||||
name: 'Amber',
|
||||
},
|
||||
],
|
||||
},
|
||||
}),
|
||||
],
|
||||
};
|
|
@ -101,108 +101,104 @@ export const appRoutes: Route[] = [
|
|||
{path: 'pages', children: [
|
||||
|
||||
// Activities
|
||||
{path: 'activities', loadChildren: () => import('app/modules/admin/pages/activities/activities.module').then(m => m.ActivitiesModule)},
|
||||
{path: 'activities', loadChildren: () => import('app/modules/admin/pages/activities/activities.routes')},
|
||||
|
||||
// Authentication
|
||||
{path: 'authentication', loadChildren: () => import('app/modules/admin/pages/authentication/authentication.module').then(m => m.AuthenticationModule)},
|
||||
{path: 'authentication', loadChildren: () => import('app/modules/admin/pages/authentication/authentication.routes')},
|
||||
|
||||
// Coming Soon
|
||||
{path: 'coming-soon', loadChildren: () => import('app/modules/admin/pages/coming-soon/coming-soon.module').then(m => m.ComingSoonModule)},
|
||||
{path: 'coming-soon', loadChildren: () => import('app/modules/admin/pages/coming-soon/coming-soon.routes')},
|
||||
|
||||
// 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)}
|
||||
{path: '404', loadChildren: () => import('app/modules/admin/pages/error/error-404/error-404.routes')},
|
||||
{path: '500', loadChildren: () => import('app/modules/admin/pages/error/error-500/error-500.routes')}
|
||||
]},
|
||||
|
||||
// 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)}
|
||||
{path: 'compact', loadChildren: () => import('app/modules/admin/pages/invoice/printable/compact/compact.routes')},
|
||||
{path: 'modern', loadChildren: () => import('app/modules/admin/pages/invoice/printable/modern/modern.routes')}
|
||||
]}
|
||||
]},
|
||||
|
||||
// Maintenance
|
||||
{path: 'maintenance', loadChildren: () => import('app/modules/admin/pages/maintenance/maintenance.module').then(m => m.MaintenanceModule)},
|
||||
{path: 'maintenance', loadChildren: () => import('app/modules/admin/pages/maintenance/maintenance.routes')},
|
||||
|
||||
// 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)}
|
||||
{path: 'modern', loadChildren: () => import('app/modules/admin/pages/pricing/modern/modern.routes')},
|
||||
{path: 'simple', loadChildren: () => import('app/modules/admin/pages/pricing/simple/simple.routes')},
|
||||
{path: 'single', loadChildren: () => import('app/modules/admin/pages/pricing/single/single.routes')},
|
||||
{path: 'table', loadChildren: () => import('app/modules/admin/pages/pricing/table/table.routes')}
|
||||
]},
|
||||
|
||||
// Profile
|
||||
{path: 'profile', loadChildren: () => import('app/modules/admin/pages/profile/profile.module').then(m => m.ProfileModule)},
|
||||
{path: 'profile', loadChildren: () => import('app/modules/admin/pages/profile/profile.routes')},
|
||||
|
||||
// Settings
|
||||
{path: 'settings', loadChildren: () => import('app/modules/admin/pages/settings/settings.module').then(m => m.SettingsModule)},
|
||||
{path: 'settings', loadChildren: () => import('app/modules/admin/pages/settings/settings.routes')},
|
||||
]},
|
||||
|
||||
// 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)},
|
||||
{path: 'material-components', loadChildren: () => import('app/modules/admin/ui/material-components/material-components.routes')},
|
||||
|
||||
// Fuse Components
|
||||
{path: 'fuse-components', loadChildren: () => import('app/modules/admin/ui/fuse-components/fuse-components.module').then(m => m.FuseComponentsModule)},
|
||||
{path: 'fuse-components', loadChildren: () => import('app/modules/admin/ui/fuse-components/fuse-components.routes')},
|
||||
|
||||
// Other Components
|
||||
{path: 'other-components', loadChildren: () => import('app/modules/admin/ui/other-components/other-components.module').then(m => m.OtherComponentsModule)},
|
||||
{path: 'other-components', loadChildren: () => import('app/modules/admin/ui/other-components/other-components.routes')},
|
||||
|
||||
// TailwindCSS
|
||||
{path: 'tailwindcss', loadChildren: () => import('app/modules/admin/ui/tailwindcss/tailwindcss.module').then(m => m.TailwindCSSModule)},
|
||||
{path: 'tailwindcss', loadChildren: () => import('app/modules/admin/ui/tailwindcss/tailwindcss.routes')},
|
||||
|
||||
// Advanced Search
|
||||
{path: 'advanced-search', loadChildren: () => import('app/modules/admin/ui/advanced-search/advanced-search.module').then(m => m.AdvancedSearchModule)},
|
||||
{path: 'advanced-search', loadChildren: () => import('app/modules/admin/ui/advanced-search/advanced-search.routes')},
|
||||
|
||||
// Animations
|
||||
{path: 'animations', loadChildren: () => import('app/modules/admin/ui/animations/animations.module').then(m => m.AnimationsModule)},
|
||||
{path: 'animations', loadChildren: () => import('app/modules/admin/ui/animations/animations.routes')},
|
||||
|
||||
// Cards
|
||||
{path: 'cards', loadChildren: () => import('app/modules/admin/ui/cards/cards.module').then(m => m.CardsModule)},
|
||||
{path: 'cards', loadChildren: () => import('app/modules/admin/ui/cards/cards.routes')},
|
||||
|
||||
// Colors
|
||||
{path: 'colors', loadChildren: () => import('app/modules/admin/ui/colors/colors.module').then(m => m.ColorsModule)},
|
||||
{path: 'colors', loadChildren: () => import('app/modules/admin/ui/colors/colors.routes')},
|
||||
|
||||
// Confirmation Dialog
|
||||
{path: 'confirmation-dialog', loadChildren: () => import('app/modules/admin/ui/confirmation-dialog/confirmation-dialog.module').then(m => m.ConfirmationDialogModule)},
|
||||
{path: 'confirmation-dialog', loadChildren: () => import('app/modules/admin/ui/confirmation-dialog/confirmation-dialog.routes')},
|
||||
|
||||
// Datatable
|
||||
{path: 'datatable', loadChildren: () => import('app/modules/admin/ui/datatable/datatable.module').then(m => m.DatatableModule)},
|
||||
{path: 'datatable', loadChildren: () => import('app/modules/admin/ui/datatable/datatable.routes')},
|
||||
|
||||
// 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)}
|
||||
]},
|
||||
{path: 'forms', loadChildren: () => import('app/modules/admin/ui/forms/forms.routes')},
|
||||
|
||||
// Icons
|
||||
{path: 'icons', loadChildren: () => import('app/modules/admin/ui/icons/icons.module').then(m => m.IconsModule)},
|
||||
{path: 'icons', loadChildren: () => import('app/modules/admin/ui/icons/icons.routes')},
|
||||
|
||||
// Page Layouts
|
||||
{path: 'page-layouts', loadChildren: () => import('app/modules/admin/ui/page-layouts/page-layouts.module').then(m => m.PageLayoutsModule)},
|
||||
{path: 'page-layouts', loadChildren: () => import('app/modules/admin/ui/page-layouts/page-layouts.routes')},
|
||||
|
||||
// Typography
|
||||
{path: 'typography', loadChildren: () => import('app/modules/admin/ui/typography/typography.module').then(m => m.TypographyModule)}
|
||||
{path: 'typography', loadChildren: () => import('app/modules/admin/ui/typography/typography.routes')}
|
||||
]},
|
||||
|
||||
// Documentation
|
||||
{path: 'docs', children: [
|
||||
|
||||
// Changelog
|
||||
{path: 'changelog', loadChildren: () => import('app/modules/admin/docs/changelog/changelog.module').then(m => m.ChangelogModule)},
|
||||
{path: 'changelog', loadChildren: () => import('app/modules/admin/docs/changelog/changelog.routes')},
|
||||
|
||||
// Guides
|
||||
{path: 'guides', loadChildren: () => import('app/modules/admin/docs/guides/guides.module').then(m => m.GuidesModule)}
|
||||
{path: 'guides', loadChildren: () => import('app/modules/admin/docs/guides/guides.routes')}
|
||||
]},
|
||||
|
||||
// 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: '404-not-found', pathMatch: 'full', loadChildren: () => import('app/modules/admin/pages/error/error-404/error-404.routes')},
|
||||
{path: '**', redirectTo: '404-not-found'}
|
||||
]
|
||||
}
|
|
@ -1,61 +1,52 @@
|
|||
import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { HttpErrorResponse, HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';
|
||||
import { inject } from '@angular/core';
|
||||
import { AuthService } from 'app/core/auth/auth.service';
|
||||
import { AuthUtils } from 'app/core/auth/auth.utils';
|
||||
import { catchError, Observable, throwError } from 'rxjs';
|
||||
|
||||
@Injectable()
|
||||
export class AuthInterceptor implements HttpInterceptor
|
||||
/**
|
||||
* Intercept
|
||||
*
|
||||
* @param req
|
||||
* @param next
|
||||
*/
|
||||
export const authInterceptor = (req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> =>
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(private _authService: AuthService)
|
||||
const authService = inject(AuthService);
|
||||
|
||||
// Clone the request object
|
||||
let newReq = req.clone();
|
||||
|
||||
// Request
|
||||
//
|
||||
// If the access token didn't expire, add the Authorization header.
|
||||
// We won't add the Authorization header if the access token expired.
|
||||
// This will force the server to return a "401 Unauthorized" response
|
||||
// for the protected API routes which our response interceptor will
|
||||
// catch and delete the access token from the local storage while logging
|
||||
// the user out from the app.
|
||||
if ( authService.accessToken && !AuthUtils.isTokenExpired(authService.accessToken) )
|
||||
{
|
||||
newReq = req.clone({
|
||||
headers: req.headers.set('Authorization', 'Bearer ' + authService.accessToken),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercept
|
||||
*
|
||||
* @param req
|
||||
* @param next
|
||||
*/
|
||||
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
|
||||
{
|
||||
// Clone the request object
|
||||
let newReq = req.clone();
|
||||
|
||||
// Request
|
||||
//
|
||||
// If the access token didn't expire, add the Authorization header.
|
||||
// We won't add the Authorization header if the access token expired.
|
||||
// This will force the server to return a "401 Unauthorized" response
|
||||
// for the protected API routes which our response interceptor will
|
||||
// catch and delete the access token from the local storage while logging
|
||||
// the user out from the app.
|
||||
if ( this._authService.accessToken && !AuthUtils.isTokenExpired(this._authService.accessToken) )
|
||||
// Response
|
||||
return next(newReq).pipe(
|
||||
catchError((error) =>
|
||||
{
|
||||
newReq = req.clone({
|
||||
headers: req.headers.set('Authorization', 'Bearer ' + this._authService.accessToken),
|
||||
});
|
||||
}
|
||||
|
||||
// Response
|
||||
return next.handle(newReq).pipe(
|
||||
catchError((error) =>
|
||||
// Catch "401 Unauthorized" responses
|
||||
if ( error instanceof HttpErrorResponse && error.status === 401 )
|
||||
{
|
||||
// Catch "401 Unauthorized" responses
|
||||
if ( error instanceof HttpErrorResponse && error.status === 401 )
|
||||
{
|
||||
// Sign out
|
||||
this._authService.signOut();
|
||||
// Sign out
|
||||
authService.signOut();
|
||||
|
||||
// Reload the app
|
||||
location.reload();
|
||||
}
|
||||
// Reload the app
|
||||
location.reload();
|
||||
}
|
||||
|
||||
return throwError(error);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
return throwError(error);
|
||||
}),
|
||||
);
|
||||
};
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { AuthInterceptor } from 'app/core/auth/auth.interceptor';
|
||||
import { AuthService } from 'app/core/auth/auth.service';
|
||||
|
||||
@NgModule({
|
||||
imports : [
|
||||
HttpClientModule,
|
||||
],
|
||||
providers: [
|
||||
AuthService,
|
||||
{
|
||||
provide : HTTP_INTERCEPTORS,
|
||||
useClass: AuthInterceptor,
|
||||
multi : true,
|
||||
},
|
||||
],
|
||||
})
|
||||
export class AuthModule
|
||||
{
|
||||
}
|
16
src/app/core/auth/auth.provider.ts
Normal file
16
src/app/core/auth/auth.provider.ts
Normal file
|
@ -0,0 +1,16 @@
|
|||
import { provideHttpClient, withInterceptors } from '@angular/common/http';
|
||||
import { ENVIRONMENT_INITIALIZER, EnvironmentProviders, inject, Provider } from '@angular/core';
|
||||
import { authInterceptor } from 'app/core/auth/auth.interceptor';
|
||||
import { AuthService } from 'app/core/auth/auth.service';
|
||||
|
||||
export const provideAuth = (): Array<Provider | EnvironmentProviders> =>
|
||||
{
|
||||
return [
|
||||
provideHttpClient(withInterceptors([authInterceptor])),
|
||||
{
|
||||
provide : ENVIRONMENT_INITIALIZER,
|
||||
useValue: () => inject(AuthService),
|
||||
multi : true,
|
||||
},
|
||||
];
|
||||
};
|
|
@ -4,7 +4,7 @@ import { AuthUtils } from 'app/core/auth/auth.utils';
|
|||
import { UserService } from 'app/core/user/user.service';
|
||||
import { catchError, Observable, of, switchMap, throwError } from 'rxjs';
|
||||
|
||||
@Injectable()
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class AuthService
|
||||
{
|
||||
private _authenticated: boolean = false;
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
import { Layout } from 'app/layout/layout.types';
|
||||
|
||||
// Types
|
||||
export type Scheme = 'auto' | 'dark' | 'light';
|
||||
export type Screens = { [key: string]: string };
|
||||
export type Theme = 'theme-default' | string;
|
||||
export type Themes = { id: string; name: string }[];
|
||||
|
||||
/**
|
||||
* AppConfig interface. Update this interface to strictly type your config
|
||||
* object.
|
||||
*/
|
||||
export interface AppConfig
|
||||
{
|
||||
layout: Layout;
|
||||
scheme: Scheme;
|
||||
screens: Screens;
|
||||
theme: Theme;
|
||||
themes: Themes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Default configuration for the entire application. This object is used by
|
||||
* FuseConfigService to set the default configuration.
|
||||
*
|
||||
* If you need to store global configuration for your app, you can use this
|
||||
* object to set the defaults. To access, update and reset the config, use
|
||||
* FuseConfigService and its methods.
|
||||
*
|
||||
* "Screens" are carried over to the BreakpointObserver for accessing them within
|
||||
* components, and they are required.
|
||||
*
|
||||
* "Themes" are required for Tailwind to generate themes.
|
||||
*/
|
||||
export const appConfig: AppConfig = {
|
||||
layout : 'classy',
|
||||
scheme : 'light',
|
||||
screens: {
|
||||
sm: '600px',
|
||||
md: '960px',
|
||||
lg: '1280px',
|
||||
xl: '1440px',
|
||||
},
|
||||
theme : 'theme-default',
|
||||
themes : [
|
||||
{
|
||||
id : 'theme-default',
|
||||
name: 'Default',
|
||||
},
|
||||
{
|
||||
id : 'theme-brand',
|
||||
name: 'Brand',
|
||||
},
|
||||
{
|
||||
id : 'theme-teal',
|
||||
name: 'Teal',
|
||||
},
|
||||
{
|
||||
id : 'theme-rose',
|
||||
name: 'Rose',
|
||||
},
|
||||
{
|
||||
id : 'theme-purple',
|
||||
name: 'Purple',
|
||||
},
|
||||
{
|
||||
id : 'theme-amber',
|
||||
name: 'Amber',
|
||||
},
|
||||
],
|
||||
};
|
|
@ -1,28 +0,0 @@
|
|||
import { NgModule, Optional, SkipSelf } from '@angular/core';
|
||||
import { AuthModule } from 'app/core/auth/auth.module';
|
||||
import { IconsModule } from 'app/core/icons/icons.module';
|
||||
import { TranslocoCoreModule } from 'app/core/transloco/transloco.module';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
AuthModule,
|
||||
IconsModule,
|
||||
TranslocoCoreModule,
|
||||
],
|
||||
})
|
||||
export class CoreModule
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(
|
||||
@Optional() @SkipSelf() parentModule?: CoreModule,
|
||||
)
|
||||
{
|
||||
// Do not allow multiple injections
|
||||
if ( parentModule )
|
||||
{
|
||||
throw new Error('CoreModule has already been loaded. Import this module in the AppModule only.');
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { MatIconRegistry } from '@angular/material/icon';
|
||||
import { DomSanitizer } from '@angular/platform-browser';
|
||||
|
||||
@NgModule()
|
||||
export class IconsModule
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor(
|
||||
private _domSanitizer: DomSanitizer,
|
||||
private _matIconRegistry: MatIconRegistry,
|
||||
)
|
||||
{
|
||||
// Register icon sets
|
||||
this._matIconRegistry.addSvgIconSet(this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/material-twotone.svg'));
|
||||
this._matIconRegistry.addSvgIconSetInNamespace('mat_outline', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/material-outline.svg'));
|
||||
this._matIconRegistry.addSvgIconSetInNamespace('mat_solid', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/material-solid.svg'));
|
||||
this._matIconRegistry.addSvgIconSetInNamespace('feather', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/feather.svg'));
|
||||
this._matIconRegistry.addSvgIconSetInNamespace('heroicons_outline', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/heroicons-outline.svg'));
|
||||
this._matIconRegistry.addSvgIconSetInNamespace('heroicons_solid', this._domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/heroicons-solid.svg'));
|
||||
}
|
||||
}
|
13
src/app/core/icons/icons.provider.ts
Normal file
13
src/app/core/icons/icons.provider.ts
Normal file
|
@ -0,0 +1,13 @@
|
|||
import { ENVIRONMENT_INITIALIZER, EnvironmentProviders, inject, Provider } from '@angular/core';
|
||||
import { IconsService } from 'app/core/icons/icons.service';
|
||||
|
||||
export const provideIcons = (): Array<Provider | EnvironmentProviders> =>
|
||||
{
|
||||
return [
|
||||
{
|
||||
provide : ENVIRONMENT_INITIALIZER,
|
||||
useValue: () => inject(IconsService),
|
||||
multi : true,
|
||||
},
|
||||
];
|
||||
};
|
24
src/app/core/icons/icons.service.ts
Normal file
24
src/app/core/icons/icons.service.ts
Normal file
|
@ -0,0 +1,24 @@
|
|||
import { inject, Injectable } from '@angular/core';
|
||||
import { MatIconRegistry } from '@angular/material/icon';
|
||||
import { DomSanitizer } from '@angular/platform-browser';
|
||||
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class IconsService
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*/
|
||||
constructor()
|
||||
{
|
||||
const domSanitizer = inject(DomSanitizer);
|
||||
const matIconRegistry = inject(MatIconRegistry);
|
||||
|
||||
// Register icon sets
|
||||
matIconRegistry.addSvgIconSet(domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/material-twotone.svg'));
|
||||
matIconRegistry.addSvgIconSetInNamespace('mat_outline', domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/material-outline.svg'));
|
||||
matIconRegistry.addSvgIconSetInNamespace('mat_solid', domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/material-solid.svg'));
|
||||
matIconRegistry.addSvgIconSetInNamespace('feather', domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/feather.svg'));
|
||||
matIconRegistry.addSvgIconSetInNamespace('heroicons_outline', domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/heroicons-outline.svg'));
|
||||
matIconRegistry.addSvgIconSetInNamespace('heroicons_solid', domSanitizer.bypassSecurityTrustResourceUrl('assets/icons/heroicons-solid.svg'));
|
||||
}
|
||||
}
|
|
@ -3,9 +3,7 @@ import { Injectable } from '@angular/core';
|
|||
import { Navigation } from 'app/core/navigation/navigation.types';
|
||||
import { Observable, ReplaySubject, tap } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class NavigationService
|
||||
{
|
||||
private _navigation: ReplaySubject<Navigation> = new ReplaySubject<Navigation>(1);
|
||||
|
|
|
@ -3,9 +3,7 @@ import { Injectable } from '@angular/core';
|
|||
import { Translation, TranslocoLoader } from '@ngneat/transloco';
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class TranslocoHttpLoader implements TranslocoLoader
|
||||
{
|
||||
/**
|
||||
|
|
|
@ -1,12 +1,11 @@
|
|||
import { APP_INITIALIZER, NgModule } from '@angular/core';
|
||||
import { Translation, TRANSLOCO_CONFIG, TRANSLOCO_LOADER, translocoConfig, TranslocoModule, TranslocoService } from '@ngneat/transloco';
|
||||
import { APP_INITIALIZER, EnvironmentProviders, importProvidersFrom, inject, Provider } from '@angular/core';
|
||||
import { TRANSLOCO_CONFIG, TRANSLOCO_LOADER, translocoConfig, TranslocoModule, TranslocoService } from '@ngneat/transloco';
|
||||
import { TranslocoHttpLoader } from 'app/core/transloco/transloco.http-loader';
|
||||
|
||||
@NgModule({
|
||||
exports : [
|
||||
TranslocoModule,
|
||||
],
|
||||
providers: [
|
||||
export const provideTransloco = (): Array<Provider | EnvironmentProviders> =>
|
||||
{
|
||||
return [
|
||||
importProvidersFrom(TranslocoModule),
|
||||
{
|
||||
// Provide the default Transloco configuration
|
||||
provide : TRANSLOCO_CONFIG,
|
||||
|
@ -35,17 +34,15 @@ import { TranslocoHttpLoader } from 'app/core/transloco/transloco.http-loader';
|
|||
{
|
||||
// Preload the default language before the app starts to prevent empty/jumping content
|
||||
provide : APP_INITIALIZER,
|
||||
deps : [TranslocoService],
|
||||
useFactory: (translocoService: TranslocoService): any => (): Promise<Translation> =>
|
||||
useFactory: () =>
|
||||
{
|
||||
const translocoService = inject(TranslocoService);
|
||||
const defaultLang = translocoService.getDefaultLang();
|
||||
translocoService.setActiveLang(defaultLang);
|
||||
return translocoService.load(defaultLang).toPromise();
|
||||
|
||||
return () => translocoService.load(defaultLang).toPromise();
|
||||
},
|
||||
multi : true,
|
||||
},
|
||||
],
|
||||
})
|
||||
export class TranslocoCoreModule
|
||||
{
|
||||
}
|
||||
];
|
||||
};
|
|
@ -3,9 +3,7 @@ import { Injectable } from '@angular/core';
|
|||
import { User } from 'app/core/user/user.types';
|
||||
import { map, Observable, ReplaySubject, tap } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class UserService
|
||||
{
|
||||
private _user: ReplaySubject<User> = new ReplaySubject<User>(1);
|
||||
|
|
|
@ -3,9 +3,7 @@ import { Injectable } from '@angular/core';
|
|||
import { Message } from 'app/layout/common/messages/messages.types';
|
||||
import { map, Observable, ReplaySubject, switchMap, take, tap } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class MessagesService
|
||||
{
|
||||
private _messages: ReplaySubject<Message[]> = new ReplaySubject<Message[]>(1);
|
||||
|
|
|
@ -3,9 +3,7 @@ import { Injectable } from '@angular/core';
|
|||
import { Notification } from 'app/layout/common/notifications/notifications.types';
|
||||
import { map, Observable, ReplaySubject, switchMap, take, tap } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class NotificationsService
|
||||
{
|
||||
private _notifications: ReplaySubject<Notification[]> = new ReplaySubject<Notification[]>(1);
|
||||
|
|
|
@ -3,9 +3,7 @@ import { Injectable } from '@angular/core';
|
|||
import { Chat } from 'app/layout/common/quick-chat/quick-chat.types';
|
||||
import { BehaviorSubject, map, Observable, of, switchMap, tap, throwError } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class QuickChatService
|
||||
{
|
||||
private _chat: BehaviorSubject<Chat> = new BehaviorSubject(null);
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
import { Overlay } from '@angular/cdk/overlay';
|
||||
import { NgClass, NgFor, NgIf, NgTemplateOutlet } from '@angular/common';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { Component, ElementRef, EventEmitter, HostBinding, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges, ViewChild, ViewEncapsulation } from '@angular/core';
|
||||
import { Component, ElementRef, EventEmitter, HostBinding, inject, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges, ViewChild, ViewEncapsulation } from '@angular/core';
|
||||
import { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
|
||||
import { MatAutocomplete, MatAutocompleteModule } from '@angular/material/autocomplete';
|
||||
import { MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MatAutocomplete, MatAutocompleteModule } from '@angular/material/autocomplete';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatOptionModule } from '@angular/material/core';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
|
@ -20,6 +21,16 @@ import { debounceTime, filter, map, Subject, takeUntil } from 'rxjs';
|
|||
animations : fuseAnimations,
|
||||
standalone : true,
|
||||
imports : [NgIf, MatButtonModule, MatIconModule, FormsModule, MatAutocompleteModule, ReactiveFormsModule, MatOptionModule, NgFor, RouterLink, NgTemplateOutlet, MatFormFieldModule, MatInputModule, NgClass],
|
||||
providers : [
|
||||
{
|
||||
provide : MAT_AUTOCOMPLETE_SCROLL_STRATEGY,
|
||||
useFactory: () =>
|
||||
{
|
||||
const overlay = inject(Overlay);
|
||||
return () => overlay.scrollStrategies.block();
|
||||
},
|
||||
},
|
||||
],
|
||||
})
|
||||
export class SearchComponent implements OnChanges, OnInit, OnDestroy
|
||||
{
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
import { BlockScrollStrategy, Overlay } from '@angular/cdk/overlay';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MAT_AUTOCOMPLETE_SCROLL_STRATEGY, MatAutocompleteModule } from '@angular/material/autocomplete';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchComponent } from 'app/layout/common/search/search.component';
|
||||
|
||||
@NgModule({
|
||||
imports : [
|
||||
RouterModule.forChild([]),
|
||||
MatAutocompleteModule,
|
||||
MatButtonModule,
|
||||
MatFormFieldModule,
|
||||
MatIconModule,
|
||||
MatInputModule,
|
||||
SearchComponent,
|
||||
],
|
||||
exports : [
|
||||
SearchComponent,
|
||||
],
|
||||
providers: [
|
||||
{
|
||||
provide : MAT_AUTOCOMPLETE_SCROLL_STRATEGY,
|
||||
useFactory: (overlay: Overlay) => (): BlockScrollStrategy => overlay.scrollStrategies.block(),
|
||||
deps : [Overlay],
|
||||
},
|
||||
],
|
||||
})
|
||||
export class SearchModule
|
||||
{
|
||||
}
|
|
@ -5,9 +5,8 @@ import { MatIconModule } from '@angular/material/icon';
|
|||
import { MatTooltipModule } from '@angular/material/tooltip';
|
||||
import { Router } from '@angular/router';
|
||||
import { FuseDrawerComponent } from '@fuse/components/drawer';
|
||||
import { FuseConfigService } from '@fuse/services/config';
|
||||
import { AppConfig, Scheme, Theme, Themes } from 'app/core/config/app.config';
|
||||
import { Layout } from 'app/layout/layout.types';
|
||||
import { FuseConfig, FuseConfigService, Scheme, Theme, Themes } from '@fuse/services/config';
|
||||
|
||||
import { Subject, takeUntil } from 'rxjs';
|
||||
|
||||
@Component({
|
||||
|
@ -36,8 +35,8 @@ import { Subject, takeUntil } from 'rxjs';
|
|||
})
|
||||
export class SettingsComponent implements OnInit, OnDestroy
|
||||
{
|
||||
config: AppConfig;
|
||||
layout: Layout;
|
||||
config: FuseConfig;
|
||||
layout: string;
|
||||
scheme: 'dark' | 'light';
|
||||
theme: string;
|
||||
themes: Themes;
|
||||
|
@ -65,7 +64,7 @@ export class SettingsComponent implements OnInit, OnDestroy
|
|||
// Subscribe to config changes
|
||||
this._fuseConfigService.config$
|
||||
.pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe((config: AppConfig) =>
|
||||
.subscribe((config: FuseConfig) =>
|
||||
{
|
||||
// Store the config
|
||||
this.config = config;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { Injectable } from '@angular/core';
|
|||
import { Shortcut } from 'app/layout/common/shortcuts/shortcuts.types';
|
||||
import { map, Observable, ReplaySubject, switchMap, take, tap } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ShortcutsService
|
||||
{
|
||||
private _shortcuts: ReplaySubject<Shortcut[]> = new ReplaySubject<Shortcut[]>(1);
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
import { DOCUMENT, NgIf } from '@angular/common';
|
||||
import { Component, Inject, OnDestroy, OnInit, Renderer2, ViewEncapsulation } from '@angular/core';
|
||||
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
||||
import { FuseConfigService } from '@fuse/services/config';
|
||||
import { FuseConfig, FuseConfigService } from '@fuse/services/config';
|
||||
import { FuseMediaWatcherService } from '@fuse/services/media-watcher';
|
||||
import { FusePlatformService } from '@fuse/services/platform';
|
||||
import { FUSE_VERSION } from '@fuse/version';
|
||||
import { AppConfig } from 'app/core/config/app.config';
|
||||
import { Layout } from 'app/layout/layout.types';
|
||||
import { combineLatest, filter, map, Subject, takeUntil } from 'rxjs';
|
||||
import { SettingsComponent } from './common/settings/settings.component';
|
||||
import { EmptyLayoutComponent } from './layouts/empty/empty.component';
|
||||
|
@ -31,8 +29,8 @@ import { ThinLayoutComponent } from './layouts/vertical/thin/thin.component';
|
|||
})
|
||||
export class LayoutComponent implements OnInit, OnDestroy
|
||||
{
|
||||
config: AppConfig;
|
||||
layout: Layout;
|
||||
config: FuseConfig;
|
||||
layout: string;
|
||||
scheme: 'dark' | 'light';
|
||||
theme: string;
|
||||
private _unsubscribeAll: Subject<any> = new Subject<any>();
|
||||
|
@ -97,7 +95,7 @@ export class LayoutComponent implements OnInit, OnDestroy
|
|||
// Subscribe to config changes
|
||||
this._fuseConfigService.config$
|
||||
.pipe(takeUntil(this._unsubscribeAll))
|
||||
.subscribe((config: AppConfig) =>
|
||||
.subscribe((config: FuseConfig) =>
|
||||
{
|
||||
// Store the config
|
||||
this.config = config;
|
||||
|
@ -154,7 +152,7 @@ export class LayoutComponent implements OnInit, OnDestroy
|
|||
|
||||
// 2. Get the query parameter from the current route and
|
||||
// set the layout and save the layout to the config
|
||||
const layoutFromQueryParam = (route.snapshot.queryParamMap.get('layout') as Layout);
|
||||
const layoutFromQueryParam = route.snapshot.queryParamMap.get('layout');
|
||||
if ( layoutFromQueryParam )
|
||||
{
|
||||
this.layout = layoutFromQueryParam;
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { LayoutComponent } from 'app/layout/layout.component';
|
||||
|
||||
import { CenteredLayoutModule } from 'app/layout/layouts/horizontal/centered/centered.module';
|
||||
import { EnterpriseLayoutModule } from 'app/layout/layouts/horizontal/enterprise/enterprise.module';
|
||||
import { MaterialLayoutModule } from 'app/layout/layouts/horizontal/material/material.module';
|
||||
import { ModernLayoutModule } from 'app/layout/layouts/horizontal/modern/modern.module';
|
||||
import { ClassicLayoutModule } from 'app/layout/layouts/vertical/classic/classic.module';
|
||||
import { ClassyLayoutModule } from 'app/layout/layouts/vertical/classy/classy.module';
|
||||
import { CompactLayoutModule } from 'app/layout/layouts/vertical/compact/compact.module';
|
||||
import { DenseLayoutModule } from 'app/layout/layouts/vertical/dense/dense.module';
|
||||
import { FuturisticLayoutModule } from 'app/layout/layouts/vertical/futuristic/futuristic.module';
|
||||
import { ThinLayoutModule } from 'app/layout/layouts/vertical/thin/thin.module';
|
||||
|
||||
const layoutModules = [
|
||||
// Horizontal navigation
|
||||
CenteredLayoutModule,
|
||||
EnterpriseLayoutModule,
|
||||
MaterialLayoutModule,
|
||||
ModernLayoutModule,
|
||||
// Vertical navigation
|
||||
ClassicLayoutModule,
|
||||
ClassyLayoutModule,
|
||||
CompactLayoutModule,
|
||||
DenseLayoutModule,
|
||||
FuturisticLayoutModule,
|
||||
ThinLayoutModule,
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
...layoutModules,
|
||||
LayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
LayoutComponent,
|
||||
...layoutModules,
|
||||
],
|
||||
})
|
||||
export class LayoutModule
|
||||
{
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
export type Layout =
|
||||
| 'empty'
|
||||
// Horizontal
|
||||
| 'centered'
|
||||
| 'enterprise'
|
||||
| 'material'
|
||||
| 'modern'
|
||||
// Vertical
|
||||
| 'classic'
|
||||
| 'classy'
|
||||
| 'compact'
|
||||
| 'dense'
|
||||
| 'futuristic'
|
||||
| 'thin';
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { CenteredLayoutComponent } from 'app/layout/layouts/horizontal/centered/centered.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
CenteredLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
CenteredLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class CenteredLayoutModule
|
||||
{
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { EnterpriseLayoutComponent } from 'app/layout/layouts/horizontal/enterprise/enterprise.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
EnterpriseLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
EnterpriseLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class EnterpriseLayoutModule
|
||||
{
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { MaterialLayoutComponent } from 'app/layout/layouts/horizontal/material/material.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
MaterialLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
MaterialLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class MaterialLayoutModule
|
||||
{
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { ModernLayoutComponent } from 'app/layout/layouts/horizontal/modern/modern.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
ModernLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
ModernLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class ModernLayoutModule
|
||||
{
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { ClassicLayoutComponent } from 'app/layout/layouts/vertical/classic/classic.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
ClassicLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
ClassicLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class ClassicLayoutModule
|
||||
{
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { ClassyLayoutComponent } from 'app/layout/layouts/vertical/classy/classy.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
ClassyLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
ClassyLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class ClassyLayoutModule
|
||||
{
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { CompactLayoutComponent } from 'app/layout/layouts/vertical/compact/compact.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
CompactLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
CompactLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class CompactLayoutModule
|
||||
{
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { DenseLayoutComponent } from 'app/layout/layouts/vertical/dense/dense.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
DenseLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
DenseLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class DenseLayoutModule
|
||||
{
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { FuturisticLayoutComponent } from 'app/layout/layouts/vertical/futuristic/futuristic.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
FuturisticLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
FuturisticLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class FuturisticLayoutModule
|
||||
{
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
import { HttpClientModule } from '@angular/common/http';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatMenuModule } from '@angular/material/menu';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import { SearchModule } from 'app/layout/common/search/search.module';
|
||||
|
||||
import { ThinLayoutComponent } from 'app/layout/layouts/vertical/thin/thin.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
HttpClientModule,
|
||||
RouterModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
MatIconModule,
|
||||
MatMenuModule,
|
||||
SearchModule,
|
||||
ThinLayoutComponent,
|
||||
],
|
||||
exports: [
|
||||
ThinLayoutComponent,
|
||||
],
|
||||
})
|
||||
export class ThinLayoutModule
|
||||
{
|
||||
}
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api/mock-api.service';
|
|||
import { categories as categoriesData, courses as coursesData, demoCourseSteps as demoCourseStepsData } from 'app/mock-api/apps/academy/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class AcademyMockApi
|
||||
{
|
||||
private _categories: any[] = categoriesData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { chats as chatsData, contacts as contactsData, messages as messagesData, profile as profileData } from 'app/mock-api/apps/chat/data';
|
||||
import { assign, cloneDeep, omit } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ChatMockApi
|
||||
{
|
||||
private _chats: any[] = chatsData;
|
||||
|
|
|
@ -4,9 +4,7 @@ import { contacts as contactsData, countries as countriesData, tags as tagsData
|
|||
import { assign, cloneDeep } from 'lodash-es';
|
||||
import { from, map } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ContactsMockApi
|
||||
{
|
||||
private _contacts: any[] = contactsData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
|
|||
import { brands as brandsData, categories as categoriesData, products as productsData, tags as tagsData, vendors as vendorsData } from 'app/mock-api/apps/ecommerce/inventory/data';
|
||||
import { assign, cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ECommerceInventoryMockApi
|
||||
{
|
||||
private _categories: any[] = categoriesData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api/mock-api.service';
|
|||
import { items as itemsData } from 'app/mock-api/apps/file-manager/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FileManagerMockApi
|
||||
{
|
||||
private _items: any[] = itemsData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { faqCategories as faqCategoriesData, faqs as faqsData, guideCategories as guideCategoriesData, guideContent as guideContentData, guides as guidesData } from 'app/mock-api/apps/help-center/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class HelpCenterMockApi
|
||||
{
|
||||
private _faqCategories: any[] = faqCategoriesData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
|
|||
import { filters as filtersData, folders as foldersData, labels as labelsData, mails as mailsData, settings as settingsData } from 'app/mock-api/apps/mailbox/data';
|
||||
import { assign, cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class MailboxMockApi
|
||||
{
|
||||
private _filters: any[] = filtersData;
|
||||
|
|
|
@ -4,9 +4,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api/mock-api.service';
|
|||
import { labels as labelsData, notes as notesData } from 'app/mock-api/apps/notes/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class NotesMockApi
|
||||
{
|
||||
private _labels: any[] = labelsData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
|
|||
import { boards as boardsData, cards as cardsData, labels as labelsData, lists as listsData, members as membersData } from 'app/mock-api/apps/scrumboard/data';
|
||||
import { assign, cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ScrumboardMockApi
|
||||
{
|
||||
// Private
|
||||
|
|
|
@ -4,9 +4,7 @@ import { FuseMockApiUtils } from '@fuse/lib/mock-api/mock-api.utils';
|
|||
import { tags as tagsData, tasks as tasksData } from 'app/mock-api/apps/tasks/data';
|
||||
import { assign, cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class TasksMockApi
|
||||
{
|
||||
private _tags: any[] = tagsData;
|
||||
|
|
|
@ -6,9 +6,7 @@ import Utf8 from 'crypto-js/enc-utf8';
|
|||
import HmacSHA256 from 'crypto-js/hmac-sha256';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class AuthMockApi
|
||||
{
|
||||
private readonly _secret: any;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
|
|||
import { messages as messagesData } from 'app/mock-api/common/messages/data';
|
||||
import { assign, cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class MessagesMockApi
|
||||
{
|
||||
private _messages: any = messagesData;
|
||||
|
|
|
@ -4,9 +4,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { compactNavigation, defaultNavigation, futuristicNavigation, horizontalNavigation } from 'app/mock-api/common/navigation/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class NavigationMockApi
|
||||
{
|
||||
private readonly _compactNavigation: FuseNavigationItem[] = compactNavigation;
|
||||
|
|
|
@ -967,7 +967,7 @@ export const defaultNavigation: FuseNavigationItem[] = [
|
|||
icon : 'heroicons_outline:speakerphone',
|
||||
link : '/docs/changelog',
|
||||
badge: {
|
||||
title : '17.2.0',
|
||||
title : '18.0.0',
|
||||
classes: 'px-2 bg-yellow-300 text-black rounded-full',
|
||||
},
|
||||
},
|
||||
|
@ -978,6 +978,27 @@ export const defaultNavigation: FuseNavigationItem[] = [
|
|||
icon : 'heroicons_outline:book-open',
|
||||
link : '/docs/guides',
|
||||
},
|
||||
{
|
||||
id : 'user-interface.material-components',
|
||||
title: 'Material Components',
|
||||
type : 'basic',
|
||||
icon : 'heroicons_outline:chip',
|
||||
link : '/ui/material-components',
|
||||
},
|
||||
{
|
||||
id : 'user-interface.fuse-components',
|
||||
title: 'Fuse Components',
|
||||
type : 'basic',
|
||||
icon : 'heroicons_outline:chip',
|
||||
link : '/ui/fuse-components',
|
||||
},
|
||||
{
|
||||
id : 'user-interface.other-components',
|
||||
title: 'Other Components',
|
||||
type : 'basic',
|
||||
icon : 'heroicons_outline:chip',
|
||||
link : '/ui/other-components',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
|
|||
import { notifications as notificationsData } from 'app/mock-api/common/notifications/data';
|
||||
import { assign, cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class NotificationsMockApi
|
||||
{
|
||||
private _notifications: any = notificationsData;
|
||||
|
|
|
@ -6,9 +6,7 @@ import { tasks } from 'app/mock-api/apps/tasks/data';
|
|||
import { defaultNavigation } from 'app/mock-api/common/navigation/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class SearchMockApi
|
||||
{
|
||||
private readonly _defaultNavigation: FuseNavigationItem[] = defaultNavigation;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
|
|||
import { shortcuts as shortcutsData } from 'app/mock-api/common/shortcuts/data';
|
||||
import { assign, cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ShortcutsMockApi
|
||||
{
|
||||
private _shortcuts: any = shortcutsData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { user as userData } from 'app/mock-api/common/user/data';
|
||||
import { assign, cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class UserMockApi
|
||||
{
|
||||
private _user: any = userData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { analytics as analyticsData } from 'app/mock-api/dashboards/analytics/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class AnalyticsMockApi
|
||||
{
|
||||
private _analytics: any = analyticsData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { crypto as cryptoData } from 'app/mock-api/dashboards/crypto/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class CryptoMockApi
|
||||
{
|
||||
private _crypto: any = cryptoData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { finance as financeData } from 'app/mock-api/dashboards/finance/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FinanceMockApi
|
||||
{
|
||||
private _finance: any = financeData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { project as projectData } from 'app/mock-api/dashboards/project/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ProjectMockApi
|
||||
{
|
||||
private _project: any = projectData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { activities as activitiesData } from 'app/mock-api/pages/activities/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ActivitiesMockApi
|
||||
{
|
||||
private _activities: any = activitiesData;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { FuseMockApiService } from '@fuse/lib/mock-api';
|
|||
import { feather, heroicons, material } from 'app/mock-api/ui/icons/data';
|
||||
import { cloneDeep } from 'lodash-es';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class IconsMockApi
|
||||
{
|
||||
private readonly _feather: any = feather;
|
||||
|
|
|
@ -3,9 +3,7 @@ import { Injectable } from '@angular/core';
|
|||
import { Category, Course } from 'app/modules/admin/apps/academy/academy.types';
|
||||
import { BehaviorSubject, map, Observable, of, switchMap, tap, throwError } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class AcademyService
|
||||
{
|
||||
// Private
|
||||
|
|
|
@ -3,9 +3,7 @@ import { Injectable } from '@angular/core';
|
|||
import { Chat, Contact, Profile } from 'app/modules/admin/apps/chat/chat.types';
|
||||
import { BehaviorSubject, filter, map, Observable, of, switchMap, take, tap, throwError } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root',
|
||||
})
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class ChatService
|
||||
{
|
||||
private _chat: BehaviorSubject<Chat> = new BehaviorSubject(null);
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
|
||||
import { MatLuxonDateModule } from '@angular/material-luxon-adapter';
|
||||
import { RouterOutlet } from '@angular/router';
|
||||
|
||||
@Component({
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user