@dflat-core/web 1.0.60 → 1.0.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"dflat-core-web-core-services.mjs","names":["i1.LocalStoreManager","i1.LocalStoreManager","i1.PermissionService","i1.HeadersService","i2.BusMessageService","i5.LocalStoreManager","i6.MenuService","i1.AuthService","i2.MenuService","i3","i1.LocalStoreManager","i1.LocalStoreManager","i2.NotificationsService","i3.BusMessageService","i3.NotificationMqService","i4.AuthService","i5","i1.BusMessageService","i2.LocalStoreManager","i1","i2.AuthService","observableEmpty","observableThrowError","i1","i1","i2.UserService","i1.PermissionService"],"sources":["../../core-services/src/lib/services/appConfig.service.ts","../../core-services/src/lib/services/app-keys.ts","../../core-services/src/lib/services/server-url.ts","../../core-services/src/lib/services/local-store-manager.service.ts","../../core-services/src/lib/services/headers.service.ts","../../core-services/src/lib/services/busmessage.service.ts","../../core-services/src/lib/services/permission.service.ts","../../core-services/src/lib/services/menu.service.ts","../../core-services/src/lib/services/auth.service.ts","../../core-services/src/lib/services/auth-guard.service.ts","../../core-services/src/lib/services/external-login.service.ts","../../core-services/src/lib/services/breadcrumb.service.ts","../../core-services/src/lib/services/filter.service.ts","../../core-services/src/lib/services/geolocation.service.ts","../../core-services/src/lib/services/notifications.service.ts","../../core-services/src/lib/services/hub.service.ts","../../core-services/src/lib/services/init-cache.service.ts","../../core-services/src/lib/services/message.service.ts","../../core-services/src/lib/services/screen.service.ts","../../core-services/src/lib/services/user.service.ts","../../core-services/src/lib/core-services.module.ts","../../core-services/src/lib/services/auth.interceptor.ts","../../core-services/src/lib/services/can-activate-guard.service.ts","../../core-services/src/lib/services/string.function.ts","../../core-services/src/lib/services/module-menu-services.token.ts","../../core-services/src/lib/model/model.ts","../../core-services/src/lib/services/application-menu.service.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class AppConfiguration {\r\n searchText = \"\";\r\n isSearchAllowed = false;\r\n\r\n constructor( ) {\r\n }\r\n\r\n}\r\n","\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class AppKeys {\r\n public static readonly CURRENT_USER = \"current_user\";\r\n public static readonly ACCESS_TOKEN = \"access_token\";\r\n public static readonly REFRESH_TOKEN = \"refresh_token\";\r\n public static readonly TOKEN_EXPIRES_IN = \"expires_in\";\r\n public static readonly REMEMBER_ME = \"remember_me\";\r\n public static readonly PERMISSIONS = \"permissions\";\r\n public static readonly LAST_GEOLOCATIONS = \"geolocations\";\r\n \r\n public static readonly REFERENCE_SUPPLIER_ID = \"refsuppid\";\r\n public static readonly USER_COMPANY_ID = \"companyid\";\r\n public static readonly SELECTED_COMPANY = \"selectedcompany\";\r\n}","export class ServerUrl {\r\n static isProduction: boolean = false;\r\n\r\n // POUR TESTER L'ENVIRONNEMENT DE PROD EN LOCAL DECOMMENTER LES LIGNES\r\n // static baseUrl = (ServerUrl.isProduction ? 'http://localhost:56407' : 'http://localhost:56407');\r\n static baseUrl = (ServerUrl.isProduction ? '' : 'http://localhost:56407');\r\n static apiUrl = ServerUrl.baseUrl + '/api';\r\n static hubUrl = ServerUrl.baseUrl + '/hub';\r\n\r\n static loginPath = '/Account/Login';\r\n static connectPath = '/Account/Connect';\r\n static connectExternalPath = '/Account/ConnectExternal';\r\n static loginProvidersPath = '/Account/GetLoginProviders';\r\n static registerPath = '/Account/Register';\r\n static activatePath = '/Account/Activate';\r\n static refreshPath = '/Account/RefreshToken';\r\n static disconnectPath = '/Account/Disconnect';\r\n}\r\n","import { Observable, Subject } from 'rxjs';\r\n\r\nimport { Utilities } from '@dflat-core/web/core';\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class LocalStoreManager {\r\n\r\n private static syncListenerInitialised = false;\r\n private syncKeys: string[] = [];\r\n private initEvent = new Subject();\r\n\r\n private reservedKeys: string[] = ['sync_keys', 'addToSyncKeys', 'removeFromSyncKeys',\r\n 'getSessionStorage', 'setSessionStorage', 'addToSessionStorage', 'removeFromSessionStorage', 'clearAllSessionsStorage'];\r\n\r\n public static readonly DBKEY_USER_DATA = \"user_data\";\r\n private static readonly DBKEY_SYNC_KEYS = \"sync_keys\";\r\n\r\n\r\n //Todo: Implement EventListeners for the various event operations and a SessionStorageEvent for specific data keys\r\n\r\n public initialiseStorageSyncListener() {\r\n if (LocalStoreManager.syncListenerInitialised == true)\r\n return;\r\n\r\n LocalStoreManager.syncListenerInitialised = true;\r\n window.addEventListener(\"storage\", this.sessionStorageTransferHandler, false);\r\n this.syncSessionStorage();\r\n }\r\n\r\n\r\n\r\n public deinitialiseStorageSyncListener() {\r\n window.removeEventListener(\"storage\", this.sessionStorageTransferHandler, false);\r\n LocalStoreManager.syncListenerInitialised = false;\r\n }\r\n\r\n\r\n private sessionStorageTransferHandler = (event: StorageEvent) => {\r\n if (!event.newValue)\r\n return;\r\n\r\n if (event.key == 'getSessionStorage') {\r\n\r\n if (sessionStorage.length) {\r\n this.localStorageSetItem('setSessionStorage', sessionStorage);\r\n localStorage.removeItem('setSessionStorage');\r\n }\r\n }\r\n else if (event.key == 'setSessionStorage') {\r\n\r\n if (!this.syncKeys.length)\r\n this.loadSyncKeys();\r\n\r\n let data = JSON.parse(event.newValue);\r\n //console.info(\"Set => Key: Transfer setSessionStorage\" + \", data: \" + JSON.stringify(data));\r\n\r\n for (let key in data) {\r\n\r\n if (this.syncKeysContains(key))\r\n this.sessionStorageSetItem(key, JSON.parse(data[key]));\r\n }\r\n\r\n this.onInit();\r\n }\r\n else if (event.key === 'addToSessionStorage') {\r\n\r\n let data = JSON.parse(event.newValue);\r\n\r\n //console.warn(\"Set => Key: Transfer addToSessionStorage\" + \", data: \" + JSON.stringify(data));\r\n\r\n this.addToSessionStorageHelper(data[\"data\"], data[\"key\"]);\r\n }\r\n else if (event.key === 'removeFromSessionStorage') {\r\n\r\n this.removeFromSessionStorageHelper(event.newValue);\r\n }\r\n else if (event.key === 'clearAllSessionsStorage' && sessionStorage.length) {\r\n\r\n this.clearInstanceSessionStorage();\r\n }\r\n else if (event.key === 'addToSyncKeys') {\r\n\r\n this.addToSyncKeysHelper(event.newValue);\r\n }\r\n else if (event.key === 'removeFromSyncKeys') {\r\n\r\n this.removeFromSyncKeysHelper(event.newValue);\r\n }\r\n }\r\n\r\n private syncSessionStorage() {\r\n\r\n localStorage.setItem('getSessionStorage', '_dummy');\r\n localStorage.removeItem('getSessionStorage');\r\n }\r\n\r\n\r\n public clearAllStorage() {\r\n this.clearAllSessionsStorage();\r\n this.clearLocalStorage();\r\n }\r\n\r\n\r\n public clearAllSessionsStorage() {\r\n this.clearInstanceSessionStorage();\r\n localStorage.removeItem(LocalStoreManager.DBKEY_SYNC_KEYS);\r\n localStorage.setItem('clearAllSessionsStorage', '_dummy');\r\n localStorage.removeItem('clearAllSessionsStorage');\r\n }\r\n\r\n\r\n public clearInstanceSessionStorage() {\r\n\r\n sessionStorage.clear();\r\n this.syncKeys = [];\r\n }\r\n\r\n\r\n public clearLocalStorage() {\r\n localStorage.clear();\r\n }\r\n\r\n\r\n private addToSessionStorage(data: any, key: string) {\r\n this.addToSessionStorageHelper(data, key);\r\n this.addToSyncKeysBackup(key);\r\n\r\n this.localStorageSetItem('addToSessionStorage', { key: key, data: data });\r\n localStorage.removeItem('addToSessionStorage');\r\n }\r\n\r\n private addToSessionStorageHelper(data: any, key: string) {\r\n\r\n this.addToSyncKeysHelper(key);\r\n this.sessionStorageSetItem(key, data);\r\n }\r\n\r\n\r\n private removeFromSessionStorage(keyToRemove: string) {\r\n this.removeFromSessionStorageHelper(keyToRemove);\r\n this.removeFromSyncKeysBackup(keyToRemove);\r\n\r\n localStorage.setItem('removeFromSessionStorage', keyToRemove);\r\n localStorage.removeItem('removeFromSessionStorage');\r\n }\r\n\r\n private removeFromSessionStorageHelper(keyToRemove: string) {\r\n sessionStorage.removeItem(keyToRemove);\r\n this.removeFromSyncKeysHelper(keyToRemove);\r\n }\r\n\r\n\r\n private testForInvalidKeys(key: string) {\r\n if (!key)\r\n throw new Error(\"key cannot be empty\")\r\n\r\n if (this.reservedKeys.some(x => x === key))\r\n throw new Error(`The storage key \"${key}\" is reserved and cannot be used. Please use a different key`);\r\n }\r\n\r\n private syncKeysContains(key: string) {\r\n return this.syncKeys.some(x => x === key);\r\n }\r\n\r\n\r\n private loadSyncKeys() {\r\n if (this.syncKeys.length)\r\n return;\r\n\r\n this.syncKeys = this.getSyncKeysFromStorage();\r\n }\r\n\r\n\r\n private getSyncKeysFromStorage(defaultValue: string[] = []): string[] {\r\n let data = this.localStorageGetItem(LocalStoreManager.DBKEY_SYNC_KEYS);\r\n\r\n if (data == null)\r\n return defaultValue;\r\n else\r\n return <string[]>data;\r\n }\r\n\r\n\r\n private addToSyncKeys(key: string) {\r\n this.addToSyncKeysHelper(key);\r\n this.addToSyncKeysBackup(key);\r\n\r\n localStorage.setItem('addToSyncKeys', key);\r\n localStorage.removeItem('addToSyncKeys');\r\n }\r\n\r\n\r\n private addToSyncKeysBackup(key: string) {\r\n let storedSyncKeys = this.getSyncKeysFromStorage();\r\n\r\n if (!storedSyncKeys.some(x => x === key)) {\r\n storedSyncKeys.push(key);\r\n this.localStorageSetItem(LocalStoreManager.DBKEY_SYNC_KEYS, storedSyncKeys);\r\n }\r\n }\r\n\r\n private removeFromSyncKeysBackup(key: string) {\r\n\r\n let storedSyncKeys = this.getSyncKeysFromStorage();\r\n let index = storedSyncKeys.indexOf(key);\r\n\r\n if (index > -1) {\r\n storedSyncKeys.splice(index, 1);\r\n this.localStorageSetItem(LocalStoreManager.DBKEY_SYNC_KEYS, storedSyncKeys);\r\n }\r\n }\r\n\r\n\r\n private addToSyncKeysHelper(key: string) {\r\n if (!this.syncKeysContains(key))\r\n this.syncKeys.push(key);\r\n }\r\n\r\n\r\n private removeFromSyncKeys(key: string) {\r\n this.removeFromSyncKeysHelper(key);\r\n this.removeFromSyncKeysBackup(key);\r\n\r\n localStorage.setItem('removeFromSyncKeys', key);\r\n localStorage.removeItem('removeFromSyncKeys');\r\n }\r\n\r\n\r\n private removeFromSyncKeysHelper(key: string) {\r\n let index = this.syncKeys.indexOf(key);\r\n\r\n if (index > -1) {\r\n this.syncKeys.splice(index, 1);\r\n }\r\n }\r\n\r\n\r\n public saveSessionData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSyncKeys(key);\r\n localStorage.removeItem(key);\r\n this.sessionStorageSetItem(key, data);\r\n }\r\n\r\n\r\n public saveSyncedSessionData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n localStorage.removeItem(key);\r\n this.addToSessionStorage(data, key);\r\n }\r\n\r\n\r\n public savePermanentData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSessionStorage(key);\r\n this.localStorageSetItem(key, data);\r\n }\r\n\r\n\r\n\r\n public moveDataToSessionStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.getData(key);\r\n\r\n if (data == null)\r\n return;\r\n\r\n this.saveSessionData(data, key);\r\n }\r\n\r\n\r\n public moveDataToSyncedSessionStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.getData(key);\r\n\r\n if (data == null)\r\n return;\r\n\r\n this.saveSyncedSessionData(data, key);\r\n }\r\n\r\n\r\n public moveDataToPermanentStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.getData(key);\r\n\r\n if (data == null)\r\n return;\r\n\r\n this.savePermanentData(data, key);\r\n }\r\n\r\n\r\n public exists(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n let data = sessionStorage.getItem(key);\r\n\r\n if (data == null)\r\n data = localStorage.getItem(key);\r\n\r\n return data != null;\r\n }\r\n\r\n\r\n public getData(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.sessionStorageGetItem(key);\r\n\r\n if (data == null)\r\n data = this.localStorageGetItem(key);\r\n\r\n return data;\r\n }\r\n\r\n\r\n public getDataObject<T>(key = LocalStoreManager.DBKEY_USER_DATA, isDateType = false): T {\r\n let data = this.getData(key);\r\n\r\n if (data != null) {\r\n if (isDateType)\r\n data = new Date(data);\r\n\r\n return <T>data;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n\r\n public deleteData(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSessionStorage(key);\r\n localStorage.removeItem(key);\r\n }\r\n\r\n private localStorageSetItem(key: string, data: any) {\r\n localStorage.setItem(key, JSON.stringify(data));\r\n }\r\n\r\n private sessionStorageSetItem(key: string, data: any) {\r\n sessionStorage.setItem(key, JSON.stringify(data));\r\n }\r\n\r\n private localStorageGetItem(key: string) {\r\n return Utilities.JSonTryParse(localStorage.getItem(key));\r\n }\r\n\r\n private sessionStorageGetItem(key: string) {\r\n return Utilities.JSonTryParse(sessionStorage.getItem(key));\r\n }\r\n\r\n private onInit() {\r\n setTimeout(() => {\r\n this.initEvent.next({});\r\n this.initEvent.complete();\r\n });\r\n }\r\n\r\n public getInitEvent(): Observable<{}> {\r\n return this.initEvent.asObservable();\r\n }\r\n}\r\n","\r\nimport { Injectable } from '@angular/core';\r\nimport { HttpHeaders } from '@angular/common/http';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { AppKeys } from './app-keys';\r\nimport { Utilities } from '@dflat-core/web/core';\r\n@Injectable()\r\nexport class HeadersService {\r\n\r\n\r\n constructor(private localStorage: LocalStoreManager) { }\r\n\r\n // for requesting secure data using json\r\n authJsonHeaders() {\r\n let result: HttpHeaders = new HttpHeaders()\r\n .set('Content-Type', 'application/json')\r\n .set('Accept', 'application/json')\r\n .set('Authorization', `Bearer ${this.geJWTToken}`);\r\n return result;\r\n }\r\n\r\n // for requesting secure data from a form post\r\n authFormHeaders() {\r\n let result: HttpHeaders = new HttpHeaders()\r\n .set('Content-Type', 'application/x-www-form-urlencoded')\r\n .set('Accept', 'application/json')\r\n .set('Authorization', `Bearer ${this.geJWTToken}`);\r\n return result;\r\n }\r\n\r\n authFileUploadHeaders()\r\n {\r\n return new HttpHeaders()\r\n .set('Authorization', `Bearer ${this.geJWTToken}`);\r\n }\r\n\r\n // for requesting unsecured data using json\r\n jsonHeaders() {\r\n return new HttpHeaders()\r\n .set('Content-Type', 'application/json')\r\n .set('Accept', 'application/json');\r\n }\r\n\r\n // for requesting unsecured data using form post\r\n contentHeadersV2() {\r\n return new HttpHeaders()\r\n .set('Content-Type', 'application/x-www-form-urlencoded')\r\n .set('Accept', 'application/json');\r\n }\r\n\r\n get geJWTToken(): string {\r\n let result: string = this.localStorage.getDataObject<string>(AppKeys.ACCESS_TOKEN);\r\n \r\n if ( Utilities.IsNil(result))\r\n return '';\r\n \r\n return result;\r\n }\r\n}\r\n","\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\nimport { Message, Notification } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { Utilities } from '@dflat-core/web/core';\r\n\r\n@Injectable()\r\nexport class BusMessageService {\r\n private message$: Subject<Message>;\r\n\r\n constructor() {\r\n this.message$ = new Subject<Message>();\r\n }\r\n\r\n public publish<T>(message: T): void {\r\n const channel = (<any>message.constructor).name;\r\n this.message$.next({ Channel: channel, Data: message });\r\n }\r\n\r\n public of<T>(messageType: new(...args: any[]) => T): Observable<T> {\r\n const channel = (<any>messageType).name;\r\n return this.message$.pipe(filter(m => m.Channel === channel), map(m => m.Data));\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class NotificationMqService {\r\n private message$: Subject<Message>;\r\n\r\n constructor() {\r\n this.message$ = new Subject<Message>();\r\n }\r\n\r\n public publish<T extends Notification>(message: T): void {\r\n const defaultchannel = message.entityType\r\n this.message$.next({ Channel: defaultchannel, Data: message });\r\n\r\n if (!Utilities.IsUndefined(message.entityId)) {\r\n const detailchannel = `${message.entityType}-${message.entityId}`;\r\n this.message$.next({ Channel: detailchannel, Data: message });\r\n }\r\n }\r\n\r\n public of<T extends Notification>(channelKey: string): Observable<T> {\r\n const channel = channelKey;\r\n return this.message$.pipe(filter(m => m.Channel === channel), map(m => m.Data));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { AppKeys } from './app-keys';\r\n\r\n@Injectable()\r\nexport class PermissionService {\r\n\r\n constructor( private localStorage: LocalStoreManager) {}\r\n\r\n hasPermission(permission: string): boolean {\r\n return this.permissions != null && this.permissions.some(p => p === permission) || this.isAdmin;\r\n }\r\n\r\n get permissions(): Array<any> {\r\n let permissions = this.localStorage.getDataObject<string>(AppKeys.PERMISSIONS);\r\n let parsed_permissions = <Array<any>>JSON.parse(permissions);\r\n return parsed_permissions\r\n }\r\n\r\n get isAdmin(): boolean {\r\n let parsed = JSON.parse(this.currentUser);\r\n return parsed && parsed.IsAdmin || false;\r\n }\r\n\r\n get currentUser(): string {\r\n return this.localStorage.getDataObject<string>(AppKeys.CURRENT_USER);\r\n }\r\n}\r\n","import { ReplaySubject } from 'rxjs';\r\n\r\nimport { Utilities } from '@dflat-core/web/core';\r\nimport { DictionnaryWrapper } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { MenuItem } from '../model/model';\r\nimport { PermissionService } from './permission.service';\r\n\r\n@Injectable()\r\nexport abstract class MenuService {\r\n private current: ReplaySubject<MenuItem[]> = new ReplaySubject<MenuItem[]>(1);\r\n private _permissionRouteMap: DictionnaryWrapper<string>;\r\n\r\n public constructor(private permissionService: PermissionService) {\r\n }\r\n\r\n abstract getAllMenuItems(isAdmin:boolean): MenuItem[];\r\n abstract getAccessGrantedMenuItems(): MenuItem[];\r\n\r\n public setCurrent(menu: MenuItem[]) {\r\n this.current.next(menu);\r\n }\r\n\r\n public getCurrent() {\r\n return this.current;\r\n }\r\n\r\n get permissionRouteMap() {\r\n if (Utilities.IsNil(this._permissionRouteMap)) {\r\n this._permissionRouteMap = new DictionnaryWrapper<string>();\r\n this.getAllMenuItems(true).forEach(item => {\r\n if (! Utilities.IsNil(item.sublinks)) {\r\n item.sublinks.forEach( subItem=> {\r\n if (subItem.permissionKey) {\r\n this._permissionRouteMap.dictionary[subItem.link] = subItem.permissionKey;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n return this._permissionRouteMap;\r\n }\r\n\r\n\r\n resetPermissionMap(){\r\n this._permissionRouteMap = undefined;\r\n }\r\n\r\n hasAccessToThisRoute(url: string):boolean {\r\n let menuItems = this.getAccessGrantedMenuItems();\r\n if ( ! Utilities.IsNil( menuItems) && menuItems.findIndex(f => f.link === url) >= 0)\r\n return true;\r\n\r\n if(this.permissionRouteMap.containsKeyOrPartKey(url)){\r\n return this.hasPermission(this.permissionRouteMap.getPartKey(url));\r\n }\r\n // Le menu n'a pas de permissions associé, on renvoie true\r\n return true;\r\n }\r\n\r\n\r\n\r\n pushItem(items: Array<MenuItem>, menuItem: MenuItem, isAdmin:boolean) {\r\n if (Utilities.IsNil(menuItem.permissionKey) ||\r\n isAdmin || this.hasPermission(menuItem.permissionKey)\r\n ) {\r\n items.push(menuItem);\r\n }\r\n }\r\n\r\n hasPermission = (permKey: string) => {\r\n if ( permKey === undefined )\r\n return true;\r\n return this.permissionService.hasPermission(permKey);\r\n }\r\n\r\n hasAnyPermission = (permKeys: (string | undefined)[]) => {\r\n let result = false;\r\n permKeys.forEach(p => result = result || this.hasPermission(p));\r\n return result;\r\n }\r\n\r\n getMenuItems(isAdmin: boolean): MenuItem[] {\r\n\r\n let results = this.getAllMenuItems(isAdmin);\r\n\r\n for(let i = 0; i < results.length; i++)\r\n results[i].id = i;\r\n\r\n return this.sortLinks(results);\r\n }\r\n\r\n private sortLinks(links: MenuItem[]) {\r\n return links.map(t => { return { ...t, sublinks: this.sortLinksSubLevel(t.sublinks) } });\r\n }\r\n\r\n private sortLinksSubLevel(links: MenuItem[]) {\r\n if (!links) return null;\r\n return links.sort((a, b) => a.title.localeCompare(b.title));\r\n }\r\n\r\n// private fillmap(map: Map<string,MenuItem>,menuItems: MenuItem[], parent: string = null )\r\n// {\r\n// if ( ! Utilities.IsNil(menuItems)) {\r\n// menuItems.forEach(x =>{\r\n// if ( ! Utilities.IsNil(parent))\r\n// parent = parent.concat(\"/\" + x.title);\r\n// else\r\n// parent = x.title;\r\n// map.set(parent,x);\r\n// this.fillmap(map,x.sublinks,parent);\r\n// });\r\n// }\r\n// return map;\r\n// }\r\n// public mergeall(Menus:MenuItem[][]): MenuItem[]\r\n// {\r\n// let menuItem = Array<MenuItem>();\r\n// let map = new Map<string,MenuItem>();\r\n// Menus.forEach(menuItem => {\r\n// this.fillmap(map,menuItem,null);\r\n\r\n// });\r\n// let sortedmap = new Map([...map].sort());\r\n// sortedmap.forEach(element => {\r\n// menuItem.push()\r\n\r\n// });\r\n// return menuItem;\r\n// }\r\n public merge(Menus:MenuItem[]): MenuItem[]\r\n {\r\n // let titles : string[];\r\n\r\n // if (!(item.title in titles)){\r\n // titles.push(item.title);\r\n // menu.push(item);\r\n // }\r\n // else{\r\n let menu : MenuItem[] = [];\r\n Menus.forEach(item => {\r\n \r\n let index = menu.findIndex(x=>x.title == item.title);\r\n if(index >= 0)\r\n menu[index].sublinks = [...menu[index].sublinks,...item.sublinks];\r\n else\r\n menu.push(item);\r\n })\r\n return menu;\r\n}\r\n}\r\n","\r\nimport jwt_decode from 'jwt-decode';\r\nimport { Observable, Subscription, throwError, timer } from 'rxjs';\r\nimport { catchError, finalize, map } from 'rxjs/operators';\r\n\r\nimport { Utilities, EnvironmentBase } from '@dflat-core/web/core';\r\nimport { IExternalLoginProvider, IUserCredential, UserUpdatedMessage } from '@dflat-core/web/core-model';\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { NavigationExtras, Router } from '@angular/router';\r\n\r\nimport { AppKeys } from './app-keys';\r\nimport { BusMessageService } from './busmessage.service';\r\nimport { HeadersService } from './headers.service';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { ServerUrl } from './server-url';\r\nimport { MenuService } from './menu.service';\r\n\r\nexport enum AuthTokenType {\r\n AccessToken,\r\n RefreshToken\r\n}\r\n\r\n@Injectable()\r\nexport class AuthService {\r\n baseUrl = this.env.apiUrl;\r\n public loginRedirectUrl: string;\r\n private refreshTokenSubscription: Subscription;\r\n \r\n constructor(\r\n private headersService: HeadersService,\r\n private busMsg: BusMessageService,\r\n private httpClient: HttpClient,\r\n private router: Router,\r\n private localStorage: LocalStoreManager,\r\n private menuService : MenuService,\r\n private env: EnvironmentBase\r\n ) { \r\n this.scheduleRefreshToken(this.isLoggedIn,false);\r\n }\r\n\r\n // After a successful login, save token data into session storage\r\n // note: use \"localStorage\" for persistent, browser-wide logins; \"sessionStorage\" for per-session storage.\r\n login(username: string, password: string, rememberMe: boolean): Observable<IUserCredential> {\r\n // console.log(`login base url : ${this.baseUrl} (environment is production : ${this.env.production})`);\r\n let body = JSON.stringify({ \"username\": username, \"password\": password });\r\n let _url = this.baseUrl + ServerUrl.connectPath;\r\n return this.httpClient.post(_url, body, { headers: this.headersService.authJsonHeaders() }).pipe(\r\n map((resp: Response) => {\r\n // login successful if there's a jwt token in the response\r\n // let user = (resp as any) as IUserCredential;\r\n let user: IUserCredential = (resp as any) as IUserCredential;\r\n if (user && user.AccessToken) {\r\n // store user details and jwt token in local storage to keep user logged in between page refreshes\r\n this.saveUserInfos(user, JSON.stringify(user), rememberMe);\r\n // publish token\r\n this.busMsg.publish(new UserUpdatedMessage(user.AccessToken));\r\n // schedule refresh token\r\n this.scheduleRefreshToken(true, true);\r\n \r\n return user;\r\n }\r\n }));\r\n }\r\n\r\n /**\r\n * Fournisseurs d'identité externes (Google, Microsoft, Apple) activés et configurés côté\r\n * serveur (section ExternalLogin de la configuration).\r\n */\r\n getLoginProviders(): Observable<IExternalLoginProvider[]> {\r\n return this.httpClient.get<IExternalLoginProvider[]>(this.baseUrl + ServerUrl.loginProvidersPath, { headers: this.headersService.jsonHeaders() });\r\n }\r\n\r\n /**\r\n * Connexion par le jeton d'identité remis par un fournisseur externe. Le serveur vérifie le\r\n * jeton, retrouve ou crée le compte, puis répond comme la connexion par mot de passe.\r\n */\r\n loginExternal(provider: string, idToken: string, rememberMe: boolean, firstName?: string, lastName?: string): Observable<IUserCredential> {\r\n let body = JSON.stringify({ \"Provider\": provider, \"IdToken\": idToken, \"FirstName\": firstName, \"LastName\": lastName });\r\n let _url = this.baseUrl + ServerUrl.connectExternalPath;\r\n return this.httpClient.post(_url, body, { headers: this.headersService.authJsonHeaders() }).pipe(\r\n map((resp: Response) => {\r\n let user: IUserCredential = (resp as any) as IUserCredential;\r\n if (user && user.AccessToken) {\r\n this.saveUserInfos(user, JSON.stringify(user), rememberMe);\r\n this.busMsg.publish(new UserUpdatedMessage(user.AccessToken));\r\n this.scheduleRefreshToken(true, true);\r\n\r\n return user;\r\n }\r\n }));\r\n }\r\n\r\n // After a successful login, save token data into session storage\r\n // note: use \"localStorage\" for persistent, browser-wide logins; \"sessionStorage\" for per-session storage.\r\n register(captchaToken: string, firstName: string, lastName: string, email: string, password: string, rememberMe: boolean) : Observable<IUserCredential> {\r\n // console.log(`login base url : ${this.baseUrl} (environment is production : ${this.env.production})`);\r\n let body = JSON.stringify({ \"CaptchaToken\": captchaToken, \"FirstName\": firstName, \"LastName\": lastName, \"Email\": email, \"Password\": password });\r\n let _url = this.baseUrl + ServerUrl.registerPath;\r\n return this.httpClient.post(_url, body, { headers: this.headersService.authJsonHeaders() }).pipe(\r\n map((resp: Response) => {\r\n // login successful if there's a jwt token in the response\r\n let user: IUserCredential = (resp as any) as IUserCredential;\r\n if (user && user.AccessToken) {\r\n // store user details and jwt token in local storage to keep user logged in between page refreshes\r\n this.saveUserInfos(user, JSON.stringify(user), rememberMe);\r\n // publish token\r\n this.busMsg.publish(new UserUpdatedMessage(user.AccessToken));\r\n // schedule refresh token\r\n this.scheduleRefreshToken(true, true);\r\n \r\n return user;\r\n }\r\n }));\r\n }\r\n\r\n // Activation d'un utilisateur\r\n activate(code: string) {\r\n // console.log(`login base url : ${this.baseUrl} (environment is production : ${this.env.production})`);\r\n let body = JSON.stringify({ \"ActivationCode\": code });\r\n let _url = this.baseUrl + ServerUrl.activatePath;\r\n return this.httpClient.post(_url, body, { headers: this.headersService.authJsonHeaders() }).pipe(\r\n map((resp: Response) => {\r\n return resp;\r\n }));\r\n }\r\n\r\n\r\n\r\n saveUserInfos(user: any, userDetails: string, rememberMe?: boolean) {\r\n\r\n // check permissions \r\n let permissions = user.Permissions || new Array<any>();\r\n // this.getPermissions(user.AccessToken) || new Array<any>();\r\n\r\n if (rememberMe) {\r\n this.localStorage.savePermanentData(user.AccessToken, AppKeys.ACCESS_TOKEN);\r\n this.localStorage.savePermanentData(user.RefreshToken, AppKeys.REFRESH_TOKEN);\r\n this.localStorage.savePermanentData(userDetails, AppKeys.CURRENT_USER);\r\n this.localStorage.savePermanentData(JSON.stringify(permissions), AppKeys.PERMISSIONS);\r\n }\r\n else {\r\n this.localStorage.saveSyncedSessionData(user.AccessToken, AppKeys.ACCESS_TOKEN);\r\n this.localStorage.saveSyncedSessionData(user.RefreshToken, AppKeys.REFRESH_TOKEN);\r\n this.localStorage.saveSyncedSessionData(userDetails, AppKeys.CURRENT_USER);\r\n this.localStorage.saveSyncedSessionData(JSON.stringify(permissions), AppKeys.PERMISSIONS);\r\n }\r\n\r\n if (rememberMe) {\r\n this.localStorage.savePermanentData(rememberMe, AppKeys.REMEMBER_ME);\r\n }\r\n }\r\n\r\n getPermissions(token: any) {\r\n let decodedToken = jwt_decode(token);\r\n let permissions = new Array<any>();\r\n if (decodedToken.permissions) {\r\n permissions = Array.isArray(decodedToken.permissions) ? decodedToken.permissions : [decodedToken.permissions];\r\n }\r\n return permissions;\r\n }\r\n\r\n removeUserInfos() {\r\n this.localStorage.deleteData(AppKeys.ACCESS_TOKEN);\r\n this.localStorage.deleteData(AppKeys.REFRESH_TOKEN);\r\n this.localStorage.deleteData(AppKeys.CURRENT_USER);\r\n this.loginRedirectUrl = '/';\r\n }\r\n\r\n // called when logging out user; clears tokens from browser\r\n logout(pseudo: string) {\r\n this.disconnect(pseudo);\r\n }\r\n\r\n disconnect(pseudo: string) {\r\n const headers = new HttpHeaders({ \"Content-Type\": \"application/json\" });\r\n const model = { refreshToken: this.refreshToken };\r\n\r\n return this.httpClient\r\n .post(`${this.baseUrl}${ServerUrl.disconnectPath}`, model, { headers: headers })\r\n .pipe(\r\n map(response => response || {}),\r\n finalize(() => {\r\n this.ensureLogout();\r\n // navigate to home page\r\n this.router.navigate(['/']);\r\n }\r\n )).subscribe(result => {\r\n console.log(\"logout\", result);\r\n });\r\n \r\n }\r\n\r\n ensureLogout() {\r\n this.menuService.resetPermissionMap();\r\n this.busMsg.publish(new UserUpdatedMessage(null));\r\n this.removeUserInfos();\r\n this.unscheduleRefreshToken(true);\r\n }\r\n\r\n redirectLoginUser() {\r\n let redirect = this.loginRedirectUrl && this.loginRedirectUrl !== '/' ? this.loginRedirectUrl : '/';\r\n this.loginRedirectUrl = null;\r\n\r\n let urlParamsAndFragment = Utilities.splitInTwo(redirect, '#');\r\n let urlAndParams = Utilities.splitInTwo(urlParamsAndFragment.firstPart, '?');\r\n\r\n let navigationExtras: NavigationExtras = {\r\n fragment: urlParamsAndFragment.secondPart,\r\n queryParams: Utilities.getQueryParamsFromString(urlAndParams.secondPart),\r\n queryParamsHandling: \"merge\"\r\n };\r\n\r\n this.router.navigate([urlAndParams.firstPart], navigationExtras);\r\n }\r\n\r\n invalidateCurrentTabId() {\r\n if (!this.rememberMe) {\r\n return;\r\n }\r\n const currentTabId = this.getCurrentTabId();\r\n if (this.timerStat && this.timerStat.tabId === currentTabId) {\r\n this.setRefreshTokenTimerStopped();\r\n }\r\n }\r\n\r\n scheduleRefreshToken(isAuthUserLoggedIn: boolean, calledFromLogin: boolean) {\r\n this.unscheduleRefreshToken(false);\r\n\r\n if (!this.isLoggedIn) {\r\n return;\r\n }\r\n\r\n const expDateUtc = this.getAccessTokenExpirationDateUtc();\r\n if (!expDateUtc) {\r\n throw new Error(\"This access token has not the `exp` property.\");\r\n }\r\n const expiresAtUtc = expDateUtc.valueOf();\r\n const nowUtc = new Date().valueOf();\r\n // 3s pour empêcher les timers des autres onglets de tourner moins de 3s\r\n const initialDelay = Math.max(1, expiresAtUtc - nowUtc - 3000);\r\n const timerSource$ = timer(initialDelay);\r\n this.refreshTokenSubscription = timerSource$.subscribe(() => {\r\n if (calledFromLogin || !this.isRefreshTokenTimerStartedInAnotherTab()) {\r\n this.updateToken();\r\n } else {\r\n this.scheduleRefreshToken(isAuthUserLoggedIn, false);\r\n }\r\n });\r\n\r\n if (calledFromLogin || !this.isRefreshTokenTimerStartedInAnotherTab()) {\r\n this.setRefreshTokenTimerStarted();\r\n }\r\n }\r\n\r\n private refreshTokenTimerCheckId = \"is_refreshToken_timer_started\";\r\n private setRefreshTokenTimerStopped(): void {\r\n this.localStorage.savePermanentData(JSON.stringify({\r\n isStarted: false,\r\n tabId: -1\r\n }), this.refreshTokenTimerCheckId);\r\n }\r\n\r\n private setRefreshTokenTimerStarted(): void {\r\n this.localStorage.savePermanentData(JSON.stringify(\r\n {\r\n isStarted: true,\r\n tabId: this.getCurrentTabId()\r\n }), this.refreshTokenTimerCheckId);\r\n }\r\n\r\n private deleteRefreshTokenTimerCheckId() {\r\n this.localStorage.deleteData(this.refreshTokenTimerCheckId);\r\n }\r\n\r\n private isRefreshTokenTimerStartedInAnotherTab(): boolean {\r\n if (!this.rememberMe) {\r\n return false; // Chaque onglet gère son token (infos stockés dans le local storage)\r\n }\r\n\r\n const currentTabId = this.getCurrentTabId();\r\n // console.log(\"RefreshTokenTimer Check\", {\r\n // refreshTokenTimerCheckId: this.timerStat,\r\n // currentTabId: currentTabId\r\n // });\r\n const isStarted = this.timerStat && this.timerStat.isStarted === true && this.timerStat.tabId !== currentTabId;\r\n // if (isStarted) {\r\n // console.log(`RefreshToken timer has already been started in another tab with tabId=${this.timerStat.tabId}.\r\n // currentTabId=${currentTabId}.`);\r\n // }\r\n return isStarted;\r\n }\r\n\r\n getCurrentTabId(): number {\r\n const tabIdToken = \"currentTabId\";\r\n let tabId = this.localStorage.getData(tabIdToken);\r\n if (tabId) {\r\n return tabId;\r\n }\r\n tabId = Math.random();\r\n this.localStorage.saveSyncedSessionData(tabId, tabIdToken);\r\n return tabId;\r\n }\r\n\r\n getAccessTokenExpirationDateUtc(): Date | null {\r\n const decoded = this.getDecodedAccessToken();\r\n if (decoded.exp === undefined) {\r\n return null;\r\n }\r\n const date = new Date(0);\r\n date.setUTCSeconds(decoded.exp);\r\n // console.log(`Token Expires at ${date}`);\r\n return date;\r\n }\r\n\r\n isAccessTokenTokenExpired(): boolean {\r\n const expirationDateUtc = this.getAccessTokenExpirationDateUtc();\r\n if (!expirationDateUtc) {\r\n return true;\r\n }\r\n return !(expirationDateUtc.valueOf() > new Date().valueOf());\r\n }\r\n\r\n getDecodedAccessToken(): any {\r\n return jwt_decode(this.token);\r\n }\r\n\r\n isEmptyString(value: string): boolean {\r\n return !value || 0 === value.length;\r\n }\r\n\r\n unscheduleRefreshToken(cancelTimerCheckToken: boolean) {\r\n if (this.refreshTokenSubscription) {\r\n this.refreshTokenSubscription.unsubscribe();\r\n }\r\n\r\n if (cancelTimerCheckToken) {\r\n this.deleteRefreshTokenTimerCheckId();\r\n }\r\n }\r\n\r\n updateToken() {\r\n console.log(`Entering updateToken()`);\r\n const headers = new HttpHeaders({ \"Content-Type\": \"application/json\" });\r\n // L'API attend le jeton seul dans le corps (chaîne JSON), pas un objet.\r\n const model = JSON.stringify(this.refreshToken);\r\n return this.httpClient\r\n .post(`${this.baseUrl}${ServerUrl.refreshPath}`, model, { headers: headers })\r\n .pipe(\r\n map(response => response || {}),\r\n catchError((error: HttpErrorResponse) =>throwError(() => new Error(error.error)))\r\n )\r\n .subscribe(resp => {\r\n // login successful if there's a jwt token in the response\r\n let user = (resp as any) as { AccessToken: string, RefreshToken: string, Username?: string, FirstName?: string, LastName?: string, IsAdmin?: boolean, Id?: number };\r\n if (user && user.AccessToken) {\r\n // store user details and jwt token in local storage to keep user logged in between page refreshes\r\n this.saveUserInfos(user, JSON.stringify(user),this.rememberMe);\r\n // publish token\r\n this.busMsg.publish(new UserUpdatedMessage(user.AccessToken));\r\n this.scheduleRefreshToken(this.isLoggedIn, false);\r\n return user;\r\n }\r\n });\r\n }\r\n\r\n hasPermission(permission: string): boolean {\r\n return this.permissions != null && this.permissions.some(p => p === permission) || this.isAdmin;\r\n }\r\n\r\n //#region Fields\r\n\r\n get timerStat() : any {\r\n const timerStat_key = this.localStorage.getDataObject<string>(this.refreshTokenTimerCheckId);\r\n const timerStat = JSON.parse(timerStat_key);\r\n return timerStat;\r\n }\r\n\r\n get isLoggedIn(): boolean {\r\n const accessToken = this.token;\r\n const refreshToken = this.refreshToken;\r\n const hasTokens = !this.isEmptyString(accessToken) && !this.isEmptyString(refreshToken);\r\n return hasTokens && !this.isAccessTokenTokenExpired();\r\n }\r\n\r\n get isAdmin(): boolean {\r\n let parsed = JSON.parse(this.currentUser);\r\n if ( Utilities.IsNil(parsed))\r\n return false;\r\n return parsed.IsAdmin || false;\r\n }\r\n\r\n get pseudo(): string {\r\n let parsed = JSON.parse(this.currentUser);\r\n return parsed.Username || '';\r\n }\r\n\r\n get userId(): number {\r\n let parsed = JSON.parse(this.currentUser);\r\n return parsed.Id || 0;\r\n }\r\n\r\n get currentUser(): string {\r\n return this.localStorage.getDataObject<string>(AppKeys.CURRENT_USER);\r\n }\r\n\r\n get rememberMe(): boolean {\r\n return this.localStorage.getDataObject<boolean>(AppKeys.REMEMBER_ME) === true;\r\n }\r\n\r\n get token(): string {\r\n return this.localStorage.getDataObject<string>(AppKeys.ACCESS_TOKEN);\r\n }\r\n\r\n get refreshToken(): string {\r\n return this.localStorage.getDataObject<string>(AppKeys.REFRESH_TOKEN);\r\n }\r\n\r\n get permissions(): Array<any> {\r\n let permissions = this.localStorage.getDataObject<string>(AppKeys.PERMISSIONS);\r\n let parsed_permissions = <Array<any>>JSON.parse(permissions);\r\n return parsed_permissions\r\n }\r\n\r\n get companyId() : number {\r\n const decoded = this.getDecodedAccessToken();\r\n if (Utilities.IsNil(decoded[AppKeys.USER_COMPANY_ID])) {\r\n return null;\r\n }\r\n return <number>decoded[AppKeys.USER_COMPANY_ID];\r\n }\r\n\r\n get referenceSupplierId() : number {\r\n const decoded = this.getDecodedAccessToken();\r\n if (Utilities.IsNil(decoded[AppKeys.REFERENCE_SUPPLIER_ID])) {\r\n return null;\r\n }\r\n return <number>decoded[AppKeys.REFERENCE_SUPPLIER_ID];\r\n }\r\n\r\n //#endregion \r\n\r\n navigateToHome(){\r\n this.router.navigate(['/']);\r\n }\r\n}\r\n","import { Utilities } from '@dflat-core/web/core';\r\nimport { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Route, Router, RouterStateSnapshot } from '@angular/router';\r\n\r\nimport { AuthService } from './auth.service';\r\nimport { MenuService } from './menu.service';\r\n\r\n@Injectable()\r\nexport class AuthGuard {\r\n constructor(\r\n private authService: AuthService,\r\n private menuService: MenuService,\r\n private router: Router\r\n ) {}\r\n\r\n canActivate(\r\n route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): boolean {\r\n let url: string = state.url;\r\n return this.checkLogin(url);\r\n }\r\n\r\n canActivateChild(\r\n route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): boolean {\r\n return this.canActivate(route, state);\r\n }\r\n\r\n canLoad(route: Route): boolean {\r\n let url = `/${route.path}`;\r\n return this.checkLogin(url);\r\n }\r\n\r\n checkLogin(url: string): boolean {\r\n if (this.authService.isLoggedIn) {\r\n if (url === '/accessDenied' || this.authService.isAdmin) {\r\n return true;\r\n }\r\n\r\n return this.hasAuthUserAccessToThisRoute(url);\r\n }\r\n\r\n this.menuService.resetPermissionMap();\r\n this.authService.loginRedirectUrl = url;\r\n this.router.navigate(['/login']);\r\n\r\n return false;\r\n }\r\n\r\n private hasAuthUserAccessToThisRoute(returnUrl: string): boolean {\r\n if ( ! this.menuService.hasAccessToThisRoute(Utilities.splitInTwo(returnUrl, '?').firstPart ) ) {\r\n this.showAccessDenied(returnUrl);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private showAccessDenied(returnUrl: string) {\r\n this.router.navigate(['/accessDenied']);\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { IExternalLoginProvider } from '@dflat-core/web/core-model';\r\n\r\ndeclare const google: any;\r\ndeclare const AppleID: any;\r\n\r\n/** Jeton d'identité remis par un fournisseur externe, à transmettre à AuthService.loginExternal. */\r\nexport interface IExternalLoginResult {\r\n /** Google, Microsoft ou Apple. */\r\n provider: string;\r\n /** Jeton d'identité (JWT) signé par le fournisseur. */\r\n idToken: string;\r\n /** Prénom transmis hors du jeton (Apple, à la première connexion). */\r\n firstName?: string;\r\n /** Nom transmis hors du jeton (Apple, à la première connexion). */\r\n lastName?: string;\r\n}\r\n\r\n/**\r\n * Lance, dans le navigateur, la connexion chez un fournisseur d'identité externe et en récupère\r\n * le jeton d'identité. Aucune dépendance npm : les scripts officiels de Google et d'Apple sont\r\n * chargés à la demande, Microsoft passe par une fenêtre OpenID Connect.\r\n *\r\n * Adresse de retour à déclarer chez Microsoft et Apple : l'origine de l'application\r\n * (`window.location.origin`, ex. https://mon-application.fr). Chez Google, cette origine est à\r\n * déclarer comme « origine JavaScript autorisée ».\r\n */\r\n@Injectable()\r\nexport class ExternalLoginService {\r\n static readonly google = 'Google';\r\n static readonly microsoft = 'Microsoft';\r\n static readonly apple = 'Apple';\r\n\r\n private static readonly googleScript = 'https://accounts.google.com/gsi/client';\r\n private static readonly appleScript = 'https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/fr_FR/appleid.auth.js';\r\n\r\n private scripts: { [src: string]: Promise<void> } = {};\r\n\r\n constructor(private zone: NgZone) { }\r\n\r\n /**\r\n * Affiche le bouton officiel « Continuer avec Google » dans un élément de la page. Google\r\n * n'accepte la connexion que depuis son propre bouton : il ne peut pas être remplacé.\r\n * @param container Élément qui reçoit le bouton.\r\n * @param provider Réglages de Google (identifiant client).\r\n * @param onToken Appelé avec le jeton d'identité quand l'utilisateur s'est connecté.\r\n */\r\n renderGoogleButton(container: HTMLElement, provider: IExternalLoginProvider, onToken: (result: IExternalLoginResult) => void): Promise<void> {\r\n return this.loadScript(ExternalLoginService.googleScript).then(() => {\r\n google.accounts.id.initialize({\r\n client_id: provider.ClientId,\r\n callback: (response: any) => this.zone.run(() => onToken({ provider: ExternalLoginService.google, idToken: response.credential }))\r\n });\r\n google.accounts.id.renderButton(container, {\r\n type: 'standard', theme: 'outline', size: 'large', text: 'continue_with', shape: 'rectangular',\r\n logo_alignment: 'center', locale: 'fr', width: Math.min(400, Math.max(200, container.offsetWidth || 300))\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Connexion par un compte Microsoft, dans une fenêtre : flux OpenID Connect qui renvoie le\r\n * jeton d'identité à l'origine de l'application (« jetons d'ID » à cocher dans l'inscription\r\n * de l'application chez Microsoft).\r\n */\r\n signInWithMicrosoft(provider: IExternalLoginProvider): Promise<IExternalLoginResult> {\r\n const nonce = this.random();\r\n const state = this.random();\r\n const tenant = encodeURIComponent(provider.TenantId || 'common');\r\n const url = `https://login.microsoftonline.com/${tenant}/oauth2/v2.0/authorize`\r\n + `?client_id=${encodeURIComponent(provider.ClientId)}`\r\n + `&response_type=id_token&response_mode=fragment&scope=${encodeURIComponent('openid profile email')}`\r\n + `&redirect_uri=${encodeURIComponent(this.redirectUri)}`\r\n + `&nonce=${nonce}&state=${state}&prompt=select_account`;\r\n\r\n return this.openPopup(url).then(params => {\r\n if (params.get('error'))\r\n throw new Error(params.get('error_description') || params.get('error'));\r\n\r\n const idToken = params.get('id_token');\r\n if (!idToken || params.get('state') !== state || this.readPayload(idToken).nonce !== nonce)\r\n throw new Error('Réponse de Microsoft inattendue.');\r\n\r\n return { provider: ExternalLoginService.microsoft, idToken: idToken };\r\n });\r\n }\r\n\r\n /** Connexion par un identifiant Apple, dans la fenêtre du script officiel « Sign in with Apple ». */\r\n signInWithApple(provider: IExternalLoginProvider): Promise<IExternalLoginResult> {\r\n return this.loadScript(ExternalLoginService.appleScript).then(() => {\r\n AppleID.auth.init({\r\n clientId: provider.ClientId,\r\n scope: 'name email',\r\n redirectURI: this.redirectUri,\r\n state: this.random(),\r\n usePopup: true\r\n });\r\n return AppleID.auth.signIn();\r\n }).then((response: any) => {\r\n const idToken = response && response.authorization && response.authorization.id_token;\r\n if (!idToken)\r\n throw new Error('Réponse d\\'Apple inattendue.');\r\n\r\n // Le nom n'est transmis qu'à la première connexion, hors du jeton.\r\n const name = (response.user && response.user.name) || {};\r\n return { provider: ExternalLoginService.apple, idToken: idToken, firstName: name.firstName, lastName: name.lastName };\r\n });\r\n }\r\n\r\n /** Vrai si l'erreur vient de l'utilisateur qui a fermé la fenêtre de connexion. */\r\n isCancellation(error: any): boolean {\r\n const code = error && (error.error || error.message);\r\n return code === 'popup_closed' || code === 'popup_closed_by_user' || code === 'user_cancelled_authorize';\r\n }\r\n\r\n /** Adresse de retour déclarée chez les fournisseurs : l'origine de l'application. */\r\n private get redirectUri(): string {\r\n return window.location.origin;\r\n }\r\n\r\n /**\r\n * Ouvre la fenêtre de connexion et attend son retour sur l'origine de l'application : la\r\n * réponse du fournisseur est lue dans le fragment de son adresse.\r\n */\r\n private openPopup(url: string): Promise<URLSearchParams> {\r\n const width = 500, height = 650;\r\n const left = window.screenX + Math.max(0, (window.outerWidth - width) / 2);\r\n const top = window.screenY + Math.max(0, (window.outerHeight - height) / 2);\r\n const popup = window.open(url, 'dflat-external-login', `width=${width},height=${height},left=${left},top=${top}`);\r\n\r\n return new Promise<URLSearchParams>((resolve, reject) => {\r\n if (!popup) {\r\n reject(new Error('La fenêtre de connexion a été bloquée par le navigateur.'));\r\n return;\r\n }\r\n\r\n // Hors de la zone Angular : la surveillance ne déclenche pas de détection de changements.\r\n this.zone.runOutsideAngular(() => {\r\n const timer = window.setInterval(() => {\r\n if (popup.closed) {\r\n window.clearInterval(timer);\r\n this.zone.run(() => reject(new Error('popup_closed')));\r\n return;\r\n }\r\n\r\n let hash: string = null;\r\n try {\r\n // Inaccessible tant que la fenêtre est chez le fournisseur (autre origine).\r\n if (popup.location.origin === window.location.origin)\r\n hash = popup.location.hash;\r\n } catch { }\r\n\r\n if (hash && (hash.indexOf('id_token=') >= 0 || hash.indexOf('error=') >= 0)) {\r\n window.clearInterval(timer);\r\n popup.close();\r\n this.zone.run(() => resolve(new URLSearchParams(hash.replace(/^#\\/?/, ''))));\r\n }\r\n }, 200);\r\n });\r\n });\r\n }\r\n\r\n /** Charge une fois le script d'un fournisseur. */\r\n private loadScript(src: string): Promise<void> {\r\n if (!this.scripts[src]) {\r\n this.scripts[src] = new Promise<void>((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = src;\r\n script.async = true;\r\n script.onload = () => resolve();\r\n script.onerror = () => {\r\n delete this.scripts[src];\r\n reject(new Error('Le service de connexion est injoignable.'));\r\n };\r\n document.head.appendChild(script);\r\n });\r\n }\r\n return this.scripts[src];\r\n }\r\n\r\n /** Valeur aléatoire (nonce, état) liant la réponse du fournisseur à la demande. */\r\n private random(): string {\r\n const bytes = new Uint8Array(16);\r\n window.crypto.getRandomValues(bytes);\r\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n /** Contenu d'un jeton JWT, sans vérification : la signature est contrôlée par le serveur. */\r\n private readPayload(token: string): any {\r\n try {\r\n const part = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\r\n return JSON.parse(decodeURIComponent(atob(part).split('').map(c => '%' + c.charCodeAt(0).toString(16).padStart(2, '0')).join('')));\r\n } catch {\r\n return {};\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ReplaySubject } from 'rxjs';\r\nimport { Title } from '@angular/platform-browser';\r\n\r\n@Injectable()\r\nexport class BreadcrumbService {\r\n public current: ReplaySubject<any>;\r\n private initialData: any = {\r\n description: '',\r\n display: false,\r\n header : '',\r\n\r\n levels: [\r\n {\r\n icon: 'clock-o',\r\n link: ['/'],\r\n title: 'Default'\r\n }\r\n ]\r\n };\r\n\r\n constructor(protected title: Title ) {\r\n this.current = new ReplaySubject(1);\r\n this.clear();\r\n }\r\n\r\n public setCurrent(data: any) {\r\n if ( data.description !== undefined && data.description !== '') {\r\n\r\n this.title.setTitle('DFlat - ' + data.levels[data.levels.length - 1].title);\r\n }\r\n else\r\n this.title.setTitle('DFlat');\r\n\r\n this.current.next(data);\r\n }\r\n\r\n public getCurrent() {\r\n return this.current;\r\n }\r\n\r\n public clear() {\r\n this.setCurrent(this.initialData);\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class FilterService {\r\n \r\n private displayFilterChangedSubject = new BehaviorSubject<boolean>(false);\r\n public filterChanged$ = this.displayFilterChangedSubject.asObservable();\r\n \r\n displayFilter: boolean = true;\r\n get DisplayFilter() { return this.displayFilter; } \r\n\r\n \r\n keywords: string ='';\r\n get Keywords() { return this.keywords; } \r\n set Keywords(value: string) { this.keywords = value; } \r\n\r\n public constructor() {\r\n\r\n }\r\n setFilterDisplay(value: boolean) {\r\n if ( this.displayFilter != value ) {\r\n this.displayFilter = value;\r\n \r\n // Déclenchement de l'évènement de changement d'affichage du filtre\r\n this.displayFilterChangedSubject.next(this.displayFilter);\r\n }\r\n }\r\n\r\n toggleFilterDisplay() {\r\n this.displayFilter = !this.displayFilter;\r\n \r\n // Déclenchement de l'évènement de changement d'affichage du filtre\r\n this.displayFilterChangedSubject.next(this.displayFilter);\r\n }\r\n}","import { Utilities } from \"@dflat-core/web/core\";\r\nimport { EventEmitter, Injectable } from \"@angular/core\";\r\nimport { NamedPosition } from \"../model/model\";\r\nimport { AppKeys } from \"./app-keys\";\r\nimport { LocalStoreManager } from \"./local-store-manager.service\";\r\n\r\n\r\n@Injectable()\r\nexport class GeolocationService {\r\n\r\n positionsHistory: Array<NamedPosition> = new Array<NamedPosition>(0);\r\n positionChanged: EventEmitter<NamedPosition> = new EventEmitter();\r\n \r\n constructor(protected localStore: LocalStoreManager) {\r\n try {\r\n let saveLocations = localStore.getDataObject<Array<NamedPosition>>(AppKeys.LAST_GEOLOCATIONS, false);\r\n if ( ! Utilities.IsNil(saveLocations))\r\n this.positionsHistory = saveLocations; \r\n }\r\n catch {}\r\n }\r\n\r\n getCurrentPosition(): NamedPosition {\r\n // Retourne la dernière valeur de l'historique\r\n if (! Utilities.IsNil(this.positionsHistory) && this.positionsHistory.length > 0)\r\n return this.positionsHistory[0];\r\n }\r\n\r\n setCurrentPosition(formattedName: string, placeId:string , latitude: number, longitude: number) {\r\n\r\n // Création d'un objet de type NamedPosition\r\n let currentPosition : NamedPosition = { \r\n placeId: placeId,\r\n formattedName: formattedName,\r\n latitude:latitude,\r\n longitude: longitude\r\n };\r\n\r\n // Insertion de la dernière position dans l'historique (on ne garde que les 5 dernières positions)\r\n this.positionsHistory.unshift(currentPosition);\r\n if ( this.positionsHistory.length > 5 )\r\n this.positionsHistory.pop();\r\n\r\n // Sauvegarde dans le localStorage\r\n this.localStore.savePermanentData(this.positionsHistory, AppKeys.LAST_GEOLOCATIONS);\r\n\r\n // Déclenchement de l'évènement de changemetn de position courante.\r\n this.positionChanged.emit(currentPosition);\r\n }\r\n\r\n /**\r\n * Calcule la distance en mètres entre la position courante et le point dont les coordonnées GPS sont spécifiées en paramètre.\r\n * @param latitude Latitude du point\r\n * @param longitude Longitude du point\r\n * @returns La distance en mètres entre la position courante et le point dont les coordonnées GPS sont spécifiées en paramètre.\r\n */\r\n getDistanceToCurrent(latitude : number, longitude: number) : number {\r\n \r\n // Distance entre les coordonnées spécifiées et la position courante.\r\n let position : NamedPosition = this.getCurrentPosition();\r\n if ( Utilities.IsNil(position) )\r\n return undefined;\r\n\r\n return this.getDistance(position.latitude, position.longitude, latitude, longitude);\r\n }\r\n\r\n /** Calcule la distance en mètres entre 2 points en coordonnées GPS.\r\n * @param latitude1 Latitude du point 1\r\n * @param longitude1 Longitude du point 1\r\n * @param latitude2 Latitude du point 2\r\n * @param longitude2 Longitude du point 2\r\n * @returns Une estimation la distance en mètres entre les point GPS 1 et 2 dont les coordonnées sont spécifiées.\r\n */\r\n getDistance(latitude1: number, longitude1 : number, latitude2: number, longitude2 : number) {\r\n \r\n // Connaissant la position de deux points A et B sur une sphère, calculer la distance entre eux\r\n // revient à calculer l'abscisse curviligne S (AB) sur le grand cercle passant par A et B.\r\n // Si l’on considère deux points A et B sur la sphère, de latitudes ϕA et ϕB et de longitudes λA et λB, \r\n // alors la distance angulaire en radians SA-B entre A et B est donnée par la relation fondamentale de trigonométrie\r\n // sphérique, utilisant dλ = λB – λA :\r\n // SA-B = arc cos (sin ϕA sin ϕB + cos ϕA cos ϕB cos dλ)\r\n // La distance S en mètres, s’obtient en multipliant SA-B par un rayon de la Terre conventionnel (6 378 137 mètres par exemple).\r\n\r\n // Conversion en radian\r\n let a: number = latitude1 * Math.PI / 180;\r\n let b: number = longitude1 * Math.PI / 180;\r\n let c: number = latitude2 * Math.PI / 180;\r\n let d: number = longitude2 * Math.PI / 180;\r\n\r\n // Calcul de la distance en m\r\n let e = Math.sin(a) * Math.sin(c) + Math.cos(a) * Math.cos(c) * Math.cos(d - b);\r\n let result = 6378137 * Math.acos(e);\r\n\r\n return result;\r\n }\r\n\r\n \r\n\r\n}","\r\nimport { map } from 'rxjs/operators';\r\nimport { ReplaySubject, Subject } from 'rxjs';\r\n\r\n// based on https://github.com/ng-book/angular2-rxjs-chat/blob/master/app/ts/services/NotificationsService.ts\r\nimport { Notification } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\ntype INotificationsOperation = (notifications: Notification[]) => Notification[];\r\n\r\n@Injectable()\r\nexport class NotificationsService {\r\n private notificationsList: Notification[] = [];\r\n \r\n // a stream that publishes new notifications only once\r\n public newNotifications: Subject<Notification> = new Subject<Notification>();\r\n\r\n // `notifications` is a stream that emits an array of the most up to date notifications\r\n public notifications: ReplaySubject<Notification[]> = new ReplaySubject<Notification[]>(1);\r\n\r\n // `updates` receives _operations_ to be applied to our `notifications`\r\n // it's a way we can perform changes on *all* notifications (that are currently\r\n // stored in `notifications`)\r\n public updates: Subject<any> = new Subject<any>();\r\n\r\n // action streams\r\n public create: Subject<Notification> = new Subject<Notification>();\r\n // public markThreadAsRead: Subject<any> = new Subject<any>();\r\n\r\n constructor() {\r\n // recois des operation, et les fais sur la liste interne, puis diffuse le resultat sur notifications\r\n this.updates.subscribe((ope) => {\r\n this.notificationsList = ope(this.notificationsList);\r\n this.notifications.next(this.notificationsList);\r\n });\r\n\r\n this.newNotifications.pipe(\r\n map(function(notification: Notification): INotificationsOperation {\r\n return (notifications: Notification[]) => {\r\n return notifications.concat(notification);\r\n };\r\n }))\r\n .subscribe(this.updates);\r\n\r\n }\r\n\r\n // an imperative function call to this action stream\r\n public addNotification(notification: Notification): void {\r\n this.newNotifications.next(notification);\r\n }\r\n\r\n}\r\n","import { Notification, UserUpdatedMessage } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\nimport * as signalR from '@microsoft/signalr';\r\n\r\nimport { AppKeys } from './app-keys';\r\nimport { AuthService } from './auth.service';\r\nimport { BusMessageService, NotificationMqService } from './busmessage.service';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { NotificationsService } from './notifications.service';\r\nimport { EnvironmentBase } from '@dflat-core/web/core';\r\n\r\nenum RequestState {\r\n Pending = 0,\r\n InProgress = 1,\r\n Success = 2,\r\n Error = 3,\r\n Warning = 4,\r\n}\r\n/*\r\n signalR Hub Service.\r\n Currently chimera class, both registering to a the dflatHub and registering handlers.\r\n TODO Extract handlers elsewhere.\r\n*/\r\n@Injectable()\r\nexport class HubService {\r\n\r\n protected hubUrl = this.env.hubUrl;\r\n private timer$: any;\r\n\r\n protected hubConnection: signalR.HubConnection = null;\r\n isConnected: boolean = false;\r\n isReconnect: boolean = false;\r\n isInit: boolean;\r\n isConnecting: boolean;\r\n\r\n get hubOptions(): signalR.IHttpConnectionOptions {\r\n let _self = this;\r\n var options = {\r\n skipNegotiation: true,\r\n transport: signalR.HttpTransportType.WebSockets,\r\n accessTokenFactory: () => {\r\n const token = _self.localStorage.getDataObject<string>(AppKeys.ACCESS_TOKEN);\r\n return token;\r\n }\r\n };\r\n return options;\r\n }\r\n\r\n constructor(\r\n protected localStorage: LocalStoreManager,\r\n protected notificationService: NotificationsService,\r\n protected busMsg: BusMessageService,\r\n protected mqMsg: NotificationMqService,\r\n protected authService: AuthService,\r\n protected env: EnvironmentBase\r\n ) {\r\n this.busMsg.of(UserUpdatedMessage).subscribe(msg =>\r\n {\r\n // log out\r\n if(msg.userKey === null){\r\n this.disposeConnection();\r\n }\r\n else {\r\n this.startHub();\r\n }\r\n });\r\n }\r\n\r\n //TODO REFACTO\r\n\r\n init() {\r\n\r\n if ( ! this.isInit ) {\r\n this.startHub();\r\n this.isInit = true;\r\n }\r\n }\r\n\r\n disposeConnection() {\r\n if (this.hubConnection) {\r\n this.hubConnection.stop();\r\n }\r\n }\r\n\r\n startHub() {\r\n\r\n // Si la connnexion est déjà active ou qu'un utilisateur n'est pas connecté on ne fait rien.\r\n if(this.isConnected || ! this.authService.isLoggedIn || this.isConnecting)\r\n return;\r\n\r\n\r\n this.isConnecting = true;\r\n\r\n var options = this.hubOptions;;\r\n this.hubConnection = new signalR.HubConnectionBuilder()\r\n .withUrl(this.hubUrl, options)\r\n .configureLogging(signalR.LogLevel.Trace)\r\n .build();\r\n this.hubConnection.serverTimeoutInMilliseconds = 30000;\r\n\r\n this.configure();\r\n\r\n this.hubConnection\r\n .start()\r\n .then(() => {\r\n console.log('*****Connection started!');\r\n this.isConnected = true;\r\n this.isConnecting = false;\r\n clearInterval(this.timer$);\r\n })\r\n .catch(err => {\r\n console.log('Error while establishing connection :(', err);\r\n this.isConnected = false;\r\n this.isConnecting = false;\r\n clearInterval(this.timer$);\r\n this.scheduleStartingHub();\r\n })\r\n }\r\n configure() {\r\n // subscribe to operation log from server\r\n this.hubConnection.on('OperationLog', (uid: string, message: string) => {\r\n this.publishEvents(new Notification({ id: undefined, content: message, class: undefined, entityType: uid, entityId: undefined }));\r\n });\r\n\r\n // subscribe to broadcasted messagse from server\r\n this.hubConnection.on('BroadcastMessage', (name: string, message: string) => {\r\n // console.log(`BroadcastMessage received : ${message}, ${name}`);\r\n });\r\n\r\n //Subscriptions have to be prior the connection start so the server hub knows which 'events' this client is eligible for.\r\n this.hubConnection.on(\"ReportProgress\", (name: string, message: string, state: RequestState, entityType: string, entityId: number) => {\r\n // console.log(`ReportProgress: name: ${name} | message: ${message} | state: ${state} | entityType: ${entityType} | entityId: ${entityId} `);\r\n //let end = state === RequestState.Success || state === RequestState.Error || state === RequestState.Warning ;\r\n let classNotif = \"info\";\r\n\r\n //if (end) {\r\n\r\n const notif = new Notification({ id: name, content: message, class: classNotif, entityType: entityType, entityId: entityId });\r\n this.publishEvents(notif);\r\n //}\r\n });\r\n\r\n //Registers a handler that will be invoked when the connection is closed.\r\n this.hubConnection.onclose(e => {\r\n console.log(`Hub connection closed !`);\r\n this.isConnected = false;\r\n this.scheduleStartingHub();\r\n\r\n });\r\n }\r\n\r\n\r\n scheduleStartingHub(){\r\n\r\n // chaque 30s\r\n this.timer$ = setInterval(() => {\r\n console.log(\"retry start hub\");\r\n this.startHub();\r\n }, 30000);\r\n\r\n }\r\n\r\n publishEvents(notif: Notification) {\r\n this.mqMsg.publish(notif);\r\n }\r\n}\r\n\r\n","import jwt_decode from 'jwt-decode';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, map, shareReplay } from 'rxjs/operators';\r\n\r\nimport { Utilities } from '@dflat-core/web/core';\r\nimport { UserUpdatedMessage } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { AppKeys } from './app-keys';\r\nimport { BusMessageService } from './busmessage.service';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\n\r\n/**\r\n * Cache des données d'initialisation des écrans (colonnes, descripteurs de filtre, filtre vide,\r\n * actions, formulaire) : tout ce qui est chargé avant la recherche et ne change pas d'une\r\n * ouverture à l'autre.\r\n *\r\n * Le cache est vidé quand le jeton d'accès reçu (connexion, rafraîchissement, déconnexion)\r\n * porte un autre horodatage serveur (claim \"cachestamp\", régénéré à chaque redémarrage de l'API\r\n * ou par Config/ResetClientCache) ou un autre utilisateur.\r\n */\r\n@Injectable()\r\nexport class InitCacheService {\r\n public static readonly CACHE_STAMP = \"cachestamp\";\r\n public static readonly USER_ACCOUNT_ID = \"id\";\r\n\r\n private entries = new Map<string, Observable<any>>();\r\n private stamp: string;\r\n\r\n constructor(busMsg: BusMessageService, localStorage: LocalStoreManager) {\r\n this.stamp = this.readStamp(localStorage.getDataObject<string>(AppKeys.ACCESS_TOKEN));\r\n busMsg.of(UserUpdatedMessage).subscribe(message => this.onTokenChanged(message.userKey));\r\n }\r\n\r\n /**\r\n * Retourne la valeur en cache pour la clé, ou la charge par la fabrique (une seule requête,\r\n * partagée par les appels simultanés). Chaque abonné reçoit sa propre copie : il peut la\r\n * modifier sans toucher au cache.\r\n */\r\n get<T>(key: string, factory: () => Observable<T>): Observable<T> {\r\n let entry = this.entries.get(key);\r\n if (!entry) {\r\n entry = factory().pipe(\r\n catchError(error => {\r\n // Un échec n'est pas gardé : l'appel suivant recharge.\r\n if (this.entries.get(key) === entry) {\r\n this.entries.delete(key);\r\n }\r\n return throwError(() => error);\r\n }),\r\n shareReplay(1));\r\n this.entries.set(key, entry);\r\n }\r\n return entry.pipe(map(value => Utilities.deepCopy(value)));\r\n }\r\n\r\n /** Vide le cache, ou seulement les entrées dont la clé commence par le préfixe. */\r\n clear(prefix?: string): void {\r\n if (Utilities.IsNil(prefix)) {\r\n this.entries.clear();\r\n return;\r\n }\r\n Array.from(this.entries.keys())\r\n .filter(key => key.startsWith(prefix))\r\n .forEach(key => this.entries.delete(key));\r\n }\r\n\r\n private onTokenChanged(token: string): void {\r\n const stamp = this.readStamp(token);\r\n if (stamp !== this.stamp) {\r\n this.stamp = stamp;\r\n this.clear();\r\n }\r\n }\r\n\r\n /** Identité du cache : horodatage serveur et utilisateur du jeton (null sans jeton). */\r\n private readStamp(token: string): string {\r\n if (!token) {\r\n return null;\r\n }\r\n try {\r\n const decoded = jwt_decode(token);\r\n return `${decoded[InitCacheService.CACHE_STAMP]}|${decoded[InitCacheService.USER_ACCOUNT_ID]}`;\r\n }\r\n catch {\r\n return null;\r\n }\r\n }\r\n}\r\n","\r\nimport { map } from 'rxjs/operators';\r\nimport { ReplaySubject, Subject } from 'rxjs';\r\n\r\n// based on https://github.com/ng-book/angular2-rxjs-chat/blob/master/app/ts/services/MessagesService.ts\r\nimport { Message } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\ntype IMessagesOperation = (messages: Message[]) => Message[];\r\n\r\n@Injectable()\r\nexport class MessagesService {\r\n private messagesList: Message[] = [];\r\n // a stream that publishes new messages only once\r\n public newMessages: Subject<Message> = new Subject<Message>();\r\n\r\n // `messages` is a stream that emits an array of the most up to date messages\r\n public messages: ReplaySubject<Message[]> = new ReplaySubject<Message[]>(1);\r\n\r\n // `updates` receives _operations_ to be applied to our `messages`\r\n // it's a way we can perform changes on *all* messages (that are currently\r\n // stored in `messages`)\r\n public updates: Subject<any> = new Subject<any>();\r\n\r\n // action streams\r\n public create: Subject<Message> = new Subject<Message>();\r\n // public markThreadAsRead: Subject<any> = new Subject<any>();\r\n\r\n constructor() {\r\n // recois des operation, et les fais sur la liste interne, puis diffuse le resultat sur messages\r\n this.updates.subscribe((ope) => {\r\n this.messagesList = ope(this.messagesList);\r\n this.messages.next(this.messagesList);\r\n });\r\n\r\n this.newMessages.pipe(\r\n map(function(message: Message): IMessagesOperation {\r\n return (messages: Message[]) => {\r\n return messages.concat(message);\r\n };\r\n }))\r\n .subscribe(this.updates);\r\n\r\n }\r\n\r\n // an imperative function call to this action stream\r\n public addMessage(message: Message): void {\r\n this.newMessages.next(message);\r\n }\r\n\r\n}\r\n","import { Utilities } from '@dflat-core/web/core';\r\nimport { EventEmitter, Injectable } from '@angular/core';\r\nimport { ScreenConfiguration } from '../model/model';\r\n\r\n\r\n@Injectable()\r\nexport class ScreenService {\r\n screenChanged: EventEmitter<ScreenConfiguration> = new EventEmitter();\r\n scrollChanged: EventEmitter<Element> = new EventEmitter();\r\n \r\n config: ScreenConfiguration;\r\n \r\n public constructor() {\r\n\r\n }\r\n\r\n getScreenConfiguration(): ScreenConfiguration {\r\n return this.config;\r\n }\r\n\r\n setScreenConfiguration(value: ScreenConfiguration) {\r\n // Si la valeur passée est vide, on ne fait rien.\r\n if ( Utilities.IsNil(value))\r\n return;\r\n\r\n // Sinon, on vérifie qu'une des valeurs de configuration a changé\r\n if (Utilities.IsNil(this.config) \r\n || this.config.isExtraSmallScreen != value.isExtraSmallScreen\r\n || this.config.isSmallScreen != value.isSmallScreen\r\n || this.config.isLargeScreen != value.isLargeScreen\r\n ) {\r\n this.config = value;\r\n\r\n // Déclenchement de l'évènement de changemetn de position courante.\r\n this.screenChanged.emit(this.config);\r\n }\r\n }\r\n\r\n scroll(elt: Element){\r\n \r\n // Déclenchement de l'évènement de scrolling\r\n this.scrollChanged.emit(elt);\r\n }\r\n\r\n\r\n}","\r\nimport { ReplaySubject } from 'rxjs';\r\n\r\nimport { IUserCredential, User } from '@dflat-core/web/core-model';\r\nimport { EventEmitter, Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { AuthService } from './auth.service';\r\nimport { Utilities } from '@dflat-core/web/core';\r\n\r\n\r\n@Injectable()\r\nexport class UserService {\r\n\r\n public userChanged: EventEmitter<User> = new EventEmitter<User>();\r\n private current: ReplaySubject<User> = new ReplaySubject<User>(1);\r\n private editUser: ReplaySubject<any> = new ReplaySubject<any>( 1 );\r\n constructor(\r\n private router: Router,\r\n private authService: AuthService\r\n ) { }\r\n\r\n public setCurrent(user: User) {\r\n this.current.next(user);\r\n this.userChanged.emit(user);\r\n }\r\n \r\n public getCurrent() {\r\n return this.current;\r\n }\r\n\r\n public openEditUser(){\r\n this.editUser.next(1);\r\n }\r\n\r\n public getEditUser(){\r\n return this.editUser;\r\n }\r\n\r\n get AuthenticatedUser(): User {\r\n let user = this.authService.currentUser;\r\n let parsed = JSON.parse(user);\r\n let login : IUserCredential = parsed as IUserCredential;\r\n if ( Utilities.IsNil(login))\r\n return undefined;\r\n return new User(login);\r\n }\r\n\r\n public logout() {\r\n const user = new User({} as IUserCredential);\r\n user.IsConnected = false;\r\n this.setCurrent(user); \r\n this.authService.logout(this.authService.pseudo);\r\n \r\n }\r\n}\r\n","// IMPORTANT : DANS LE BUT DE FACILITER LES MERGE ET LA LECTURE DU CODE.\r\n\r\n// 1. TOUJOURS CONSERVER LE TRI SUR LES IMPORTS\r\n// UTILISER L'EXTENSION \"TypeScript Import Sorter\" DANS VSCODE.\r\n// CONFIGURER L'EXTENSION POUR ACTIVER LA MISE EN FORME AUTOMATIQUE A LA SAUVEGARDE \r\n\r\n// 2. UTILISER CTRL-SHIFT O POUR SUPPRIMER AUTOMATIQUEMENT LES IMPORTS INUTILES\r\n\r\n// 3. TRIER LES COMPOSANTS OU DEPENDANCES DANS LES DECLARATIONS (IMPORTS, EXPORTS)\r\n// SELECTION DU TEXTE PUIS CTRL-SHIFT P, \"Sort Lines Ascending\"\r\n// ON PEUT PARAMETRER DES RACCOURCIS CLAVIER DANS VSCODE\r\nimport { EnsureModuleLoadedOnceGuard } from '@dflat-core/web/core';\r\nimport { CoreModelModule } from '@dflat-core/web/core-model';\r\n// PAR EXEMPLE : CTRL-T UP (TRI CROISSANT) ou CTRL-T DOWN (TRI DECDROISSANT)\r\nimport { CommonModule } from '@angular/common';\r\nimport { provideHttpClient, withInterceptorsFromDi, withXhr } from '@angular/common/http';\r\nimport { NgModule, Optional, SkipSelf } from '@angular/core';\r\nimport { AppConfiguration } from './services/appConfig.service';\r\nimport { AuthGuard } from './services/auth-guard.service';\r\nimport { AuthService } from './services/auth.service';\r\nimport { ExternalLoginService } from './services/external-login.service';\r\nimport { BreadcrumbService } from './services/breadcrumb.service';\r\nimport { BusMessageService, NotificationMqService } from './services/busmessage.service';\r\nimport { FilterService } from './services/filter.service';\r\nimport { GeolocationService } from './services/geolocation.service';\r\nimport { HeadersService } from './services/headers.service';\r\nimport { HubService } from './services/hub.service';\r\nimport { InitCacheService } from './services/init-cache.service';\r\nimport { LocalStoreManager } from './services/local-store-manager.service';\r\nimport { MessagesService } from './services/message.service';\r\nimport { NotificationsService } from './services/notifications.service';\r\nimport { PermissionService } from './services/permission.service';\r\nimport { ScreenService } from './services/screen.service';\r\nimport { UserService } from './services/user.service';\r\n\r\n\r\n@NgModule({ exports: [],\r\n declarations: [], imports: [CommonModule, CoreModelModule], providers: [\r\n LocalStoreManager,\r\n GeolocationService,\r\n MessagesService,\r\n NotificationsService,\r\n PermissionService,\r\n UserService,\r\n AuthGuard,\r\n AuthService,\r\n ExternalLoginService,\r\n HeadersService,\r\n BusMessageService,\r\n BreadcrumbService,\r\n ScreenService,\r\n AppConfiguration,\r\n HubService,\r\n InitCacheService,\r\n NotificationMqService,\r\n FilterService,\r\n provideHttpClient(withXhr(), withInterceptorsFromDi())\r\n ] })\r\n// Ensure that CoreServicesModule is only loaded into AppModule\r\nexport class CoreServicesModule extends EnsureModuleLoadedOnceGuard {\r\n\r\n // Looks for the module in the parent injector to see if it's already been loaded (only want it loaded once)\r\n constructor( @Optional() @SkipSelf() parentModule: CoreServicesModule) {\r\n super(parentModule);\r\n }\r\n}\r\n\r\n","\r\nimport { Observable, empty as observableEmpty, throwError as observableThrowError } from 'rxjs';\r\n\r\nimport { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from \"@angular/common/http\";\r\nimport { Injectable, Injector } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\nimport { catchError } from 'rxjs/operators';\r\n\r\nimport { AuthService } from \"./auth.service\";\r\nimport { HeadersService } from \"./headers.service\";\r\n\r\nimport { ApiError, ApiErrorTypes } from '@dflat-core/web/core-model';\r\n\r\n@Injectable()\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n\r\n constructor(\r\n protected router: Router,\r\n protected injector: Injector,\r\n \r\n ) {\r\n\r\n }\r\n\r\n intercept(\r\n req: HttpRequest<any>,\r\n next: HttpHandler\r\n ): Observable<HttpEvent<any>> {\r\n const headersService = this.injector.get(HeadersService);\r\n const authService = this.injector.get(AuthService);\r\n switch (req.method) {\r\n case \"GET\":\r\n req = req.clone({ headers: headersService.authFormHeaders(), withCredentials: true });\r\n break;\r\n case \"POST\":\r\n // let isFileUpload = req.url.match(/Upload|File/)\r\n // let headers;\r\n // if (isFileUpload) {\r\n // headers = headersService.authFileUploadHeaders();\r\n // }\r\n // else {\r\n // headers = headersService.authJsonHeaders();\r\n //}\r\n\r\n if ( req.headers['lazyUpdate'] == null) {\r\n req = req.clone({ headers: headersService.authJsonHeaders(), withCredentials: true });\r\n }\r\n break;\r\n default:\r\n req = req;\r\n break;\r\n }\r\n\r\n const r = req;\r\n\r\n return next.handle(req).pipe(catchError(err => {\r\n console.log(err);\r\n if (err instanceof HttpErrorResponse) {\r\n\r\n // Ignore signalr failure\r\n if (r.url.includes(\"/hub/\")) {\r\n return observableEmpty();\r\n }\r\n if (err.status === 401 || err.status === 403) {\r\n // Ignore login failed\r\n if (!(r.url.endsWith(\"/api/Account/Connect\"))) {\r\n authService.ensureLogout();\r\n this.router.navigate(['/login']);\r\n return observableEmpty();\r\n }\r\n }\r\n else if (err.status === 400) {\r\n let apiError: ApiError = {};\r\n apiError.ApiErrorType = ApiErrorTypes.UserError;\r\n apiError.Message = err.error;\r\n\r\n this.onError(err, apiError);\r\n\r\n }\r\n else {\r\n\r\n\r\n try {\r\n\r\n if ( err.error instanceof Blob) {\r\n err.error.text().then((str=>{\r\n let apiError: ApiError = JSON.parse(str) as ApiError;\r\n this.onError(err, apiError);\r\n }));\r\n }\r\n else {\r\n let apiError: ApiError = err.error as ApiError;\r\n this.onError(err, apiError);\r\n }\r\n\r\n // if (typeof err.error === \"string\") {\r\n\r\n\r\n // }\r\n // else {\r\n\r\n // let reader = new FileReader();\r\n // reader.addEventListener(\"loadend\",\r\n // () => {\r\n // let result = reader.result as string;\r\n // result = trimChar(result, \"\\\"\");\r\n // this.onError(err, result);\r\n\r\n // });\r\n // reader.readAsText(err.error);\r\n // }\r\n }\r\n catch (error) {\r\n let apiError: ApiError = {};\r\n apiError.ApiErrorType = ApiErrorTypes.UserError;\r\n apiError.Message = \"Une erreur a été détectée. Merci de contacter le service technique !\";\r\n\r\n this.onError(err, apiError);\r\n\r\n }\r\n }\r\n }\r\n return observableThrowError(err);\r\n }));\r\n }\r\n\r\n\r\n onError(errResponse : HttpErrorResponse, error: ApiError) {\r\n console.log(error.Message);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { UserService } from './user.service';\r\n\r\n@Injectable()\r\nexport class CanActivateGuard {\r\n private connected = false;\r\n\r\n constructor(\r\n private router: Router,\r\n private userService: UserService\r\n ) {\r\n this.userService.getCurrent().subscribe((user) => {\r\n this.connected = user.IsConnected;\r\n });\r\n }\r\n\r\n public canActivate() {\r\n if ( !this.connected ) {\r\n this.router.navigate( [ 'login' ] );\r\n }\r\n return this.connected;\r\n }\r\n}\r\n","export function trimChar(str:string,c:string)\r\n{\r\n // Escape special char when needed\r\n c = c === \"]\"\r\n ? \"\\\\]\"\r\n : c === \"\\\\\"\r\n ? \"\\\\\\\\\"\r\n : c;\r\n return str.replace(new RegExp(`^[${c}]+|[${c}]+$`,\"g\"),\"\");\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { MenuService } from './menu.service';\r\n\r\n/**\r\n * Menus des modules de l'application : chaque module racine ([module]-root) y déclare le sien,\r\n * `{ provide: MODULE_MENU_SERVICES, useExisting: <Module>MenuService, multi: true }`.\r\n * ApplicationMenuService les réunit en un seul menu.\r\n */\r\nexport const MODULE_MENU_SERVICES = new InjectionToken<MenuService[]>('MODULE_MENU_SERVICES');\r\n","export interface IErrorHandler {\r\n handleError(error: any);\r\n}\r\n\r\nexport class MenuItem {\r\n public id?: number;\r\n public title?: string;\r\n public link?: string;\r\n public icon?: string;\r\n public sublinks?: MenuItem[];\r\n public permissionKey?: string;\r\n public external?: boolean = false;\r\n public target?: string = '';\r\n \r\n public constructor(title?: string,\r\n link?: string,\r\n icon?: string,\r\n sublinks?: MenuItem[],\r\n permissionKey?: string)\r\n {\r\n this.title = title;\r\n this.link = link;\r\n this.icon = icon;\r\n this.sublinks = sublinks;\r\n this.permissionKey = permissionKey;\r\n }\r\n}\r\n\r\nexport interface NamedPosition {\r\n formattedName: string;\r\n placeId: string;\r\n latitude: number;\r\n longitude:number;\r\n\r\n}\r\n\r\nexport interface ScreenConfiguration {\r\n isSmallScreen: boolean;\r\n isExtraSmallScreen: boolean;\r\n isLargeScreen: boolean;\r\n}","import { Inject, Injectable, Optional } from '@angular/core';\r\n\r\nimport { MenuItem } from '../model/model';\r\nimport { MenuService } from './menu.service';\r\nimport { MODULE_MENU_SERVICES } from './module-menu-services.token';\r\nimport { PermissionService } from './permission.service';\r\n\r\n/**\r\n * Menu de l'application : réunion des menus de tous ses modules (déclarés sous\r\n * MODULE_MENU_SERVICES), dans l'ordre de déclaration. Les thèmes de même libellé sont fusionnés\r\n * et leurs éléments réunis sans doublon (même lien). Chaque module filtre ses éléments selon les\r\n * permissions de l'utilisateur connecté.\r\n *\r\n * Fourni sous MenuService par DflatAppModule.\r\n */\r\n@Injectable()\r\nexport class ApplicationMenuService extends MenuService {\r\n\r\n public constructor(\r\n permissionService: PermissionService,\r\n @Optional() @Inject(MODULE_MENU_SERVICES) private moduleMenus: MenuService[] | null\r\n ) {\r\n super(permissionService);\r\n }\r\n\r\n public getAllMenuItems(isAdmin: boolean): MenuItem[] {\r\n // Copies : merge complète les éléments de son premier thème de chaque libellé.\r\n const themes = (this.moduleMenus ?? [])\r\n .reduce((all, menu) => all.concat(menu.getAllMenuItems(isAdmin)), new Array<MenuItem>())\r\n .map(theme => new MenuItem(theme.title, theme.link, theme.icon, [...(theme.sublinks ?? [])], theme.permissionKey));\r\n\r\n return this.merge(themes)\r\n .map(theme => new MenuItem(theme.title, theme.link, theme.icon, this.distinctItems(theme.sublinks), theme.permissionKey));\r\n }\r\n\r\n public getAccessGrantedMenuItems(): MenuItem[] {\r\n return (this.moduleMenus ?? [])\r\n .reduce((all, menu) => all.concat(menu.getAccessGrantedMenuItems() ?? []), new Array<MenuItem>());\r\n }\r\n\r\n /** Éléments sans doublon : le premier élément de chaque lien est gardé. */\r\n private distinctItems(items: MenuItem[] | undefined): MenuItem[] {\r\n const links = new Set<string | undefined>();\r\n return (items ?? []).filter(item => {\r\n if (item.link !== undefined && links.has(item.link))\r\n return false;\r\n links.add(item.link);\r\n return true;\r\n });\r\n }\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"dflat-core-web-core-services.mjs","names":["i1.LocalStoreManager","i1.LocalStoreManager","i1.PermissionService","i1.HeadersService","i2.BusMessageService","i5.LocalStoreManager","i6.MenuService","i1.AuthService","i2.MenuService","i3","i1.LocalStoreManager","i1.LocalStoreManager","i2.NotificationsService","i3.BusMessageService","i3.NotificationMqService","i4.AuthService","i5","i1.BusMessageService","i2.LocalStoreManager","i1","i2.AuthService","observableEmpty","observableThrowError","i1","i1","i2.UserService","i1.PermissionService"],"sources":["../../core-services/src/lib/services/appConfig.service.ts","../../core-services/src/lib/services/app-keys.ts","../../core-services/src/lib/services/server-url.ts","../../core-services/src/lib/services/local-store-manager.service.ts","../../core-services/src/lib/services/headers.service.ts","../../core-services/src/lib/services/busmessage.service.ts","../../core-services/src/lib/services/permission.service.ts","../../core-services/src/lib/services/menu.service.ts","../../core-services/src/lib/services/auth.service.ts","../../core-services/src/lib/services/auth-guard.service.ts","../../core-services/src/lib/services/external-login.service.ts","../../core-services/src/lib/services/breadcrumb.service.ts","../../core-services/src/lib/services/filter.service.ts","../../core-services/src/lib/services/geolocation.service.ts","../../core-services/src/lib/services/notifications.service.ts","../../core-services/src/lib/services/hub.service.ts","../../core-services/src/lib/services/init-cache.service.ts","../../core-services/src/lib/services/message.service.ts","../../core-services/src/lib/services/screen.service.ts","../../core-services/src/lib/services/user.service.ts","../../core-services/src/lib/core-services.module.ts","../../core-services/src/lib/services/auth.interceptor.ts","../../core-services/src/lib/services/can-activate-guard.service.ts","../../core-services/src/lib/services/string.function.ts","../../core-services/src/lib/services/module-menu-services.token.ts","../../core-services/src/lib/model/model.ts","../../core-services/src/lib/services/application-menu.service.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class AppConfiguration {\r\n searchText = \"\";\r\n isSearchAllowed = false;\r\n\r\n constructor( ) {\r\n }\r\n\r\n}\r\n","\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class AppKeys {\r\n public static readonly CURRENT_USER = \"current_user\";\r\n public static readonly ACCESS_TOKEN = \"access_token\";\r\n public static readonly REFRESH_TOKEN = \"refresh_token\";\r\n public static readonly TOKEN_EXPIRES_IN = \"expires_in\";\r\n public static readonly REMEMBER_ME = \"remember_me\";\r\n public static readonly PERMISSIONS = \"permissions\";\r\n public static readonly LAST_GEOLOCATIONS = \"geolocations\";\r\n \r\n public static readonly REFERENCE_SUPPLIER_ID = \"refsuppid\";\r\n public static readonly USER_COMPANY_ID = \"companyid\";\r\n public static readonly SELECTED_COMPANY = \"selectedcompany\";\r\n}","export class ServerUrl {\r\n static isProduction: boolean = false;\r\n\r\n // POUR TESTER L'ENVIRONNEMENT DE PROD EN LOCAL DECOMMENTER LES LIGNES\r\n // static baseUrl = (ServerUrl.isProduction ? 'http://localhost:56407' : 'http://localhost:56407');\r\n static baseUrl = (ServerUrl.isProduction ? '' : 'http://localhost:56407');\r\n static apiUrl = ServerUrl.baseUrl + '/api';\r\n static hubUrl = ServerUrl.baseUrl + '/hub';\r\n\r\n static loginPath = '/Account/Login';\r\n static connectPath = '/Account/Connect';\r\n static connectExternalPath = '/Account/ConnectExternal';\r\n static loginProvidersPath = '/Account/GetLoginProviders';\r\n static registerPath = '/Account/Register';\r\n static activatePath = '/Account/Activate';\r\n static refreshPath = '/Account/RefreshToken';\r\n static disconnectPath = '/Account/Disconnect';\r\n}\r\n","import { Observable, Subject } from 'rxjs';\r\n\r\nimport { Utilities } from '@dflat-core/web/core';\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable()\r\nexport class LocalStoreManager {\r\n\r\n private static syncListenerInitialised = false;\r\n private syncKeys: string[] = [];\r\n private initEvent = new Subject();\r\n\r\n private reservedKeys: string[] = ['sync_keys', 'addToSyncKeys', 'removeFromSyncKeys',\r\n 'getSessionStorage', 'setSessionStorage', 'addToSessionStorage', 'removeFromSessionStorage', 'clearAllSessionsStorage'];\r\n\r\n public static readonly DBKEY_USER_DATA = \"user_data\";\r\n private static readonly DBKEY_SYNC_KEYS = \"sync_keys\";\r\n\r\n\r\n //Todo: Implement EventListeners for the various event operations and a SessionStorageEvent for specific data keys\r\n\r\n public initialiseStorageSyncListener() {\r\n if (LocalStoreManager.syncListenerInitialised == true)\r\n return;\r\n\r\n LocalStoreManager.syncListenerInitialised = true;\r\n window.addEventListener(\"storage\", this.sessionStorageTransferHandler, false);\r\n this.syncSessionStorage();\r\n }\r\n\r\n\r\n\r\n public deinitialiseStorageSyncListener() {\r\n window.removeEventListener(\"storage\", this.sessionStorageTransferHandler, false);\r\n LocalStoreManager.syncListenerInitialised = false;\r\n }\r\n\r\n\r\n private sessionStorageTransferHandler = (event: StorageEvent) => {\r\n if (!event.newValue)\r\n return;\r\n\r\n if (event.key == 'getSessionStorage') {\r\n\r\n if (sessionStorage.length) {\r\n this.localStorageSetItem('setSessionStorage', sessionStorage);\r\n localStorage.removeItem('setSessionStorage');\r\n }\r\n }\r\n else if (event.key == 'setSessionStorage') {\r\n\r\n if (!this.syncKeys.length)\r\n this.loadSyncKeys();\r\n\r\n let data = JSON.parse(event.newValue);\r\n //console.info(\"Set => Key: Transfer setSessionStorage\" + \", data: \" + JSON.stringify(data));\r\n\r\n for (let key in data) {\r\n\r\n if (this.syncKeysContains(key))\r\n this.sessionStorageSetItem(key, JSON.parse(data[key]));\r\n }\r\n\r\n this.onInit();\r\n }\r\n else if (event.key === 'addToSessionStorage') {\r\n\r\n let data = JSON.parse(event.newValue);\r\n\r\n //console.warn(\"Set => Key: Transfer addToSessionStorage\" + \", data: \" + JSON.stringify(data));\r\n\r\n this.addToSessionStorageHelper(data[\"data\"], data[\"key\"]);\r\n }\r\n else if (event.key === 'removeFromSessionStorage') {\r\n\r\n this.removeFromSessionStorageHelper(event.newValue);\r\n }\r\n else if (event.key === 'clearAllSessionsStorage' && sessionStorage.length) {\r\n\r\n this.clearInstanceSessionStorage();\r\n }\r\n else if (event.key === 'addToSyncKeys') {\r\n\r\n this.addToSyncKeysHelper(event.newValue);\r\n }\r\n else if (event.key === 'removeFromSyncKeys') {\r\n\r\n this.removeFromSyncKeysHelper(event.newValue);\r\n }\r\n }\r\n\r\n private syncSessionStorage() {\r\n\r\n localStorage.setItem('getSessionStorage', '_dummy');\r\n localStorage.removeItem('getSessionStorage');\r\n }\r\n\r\n\r\n public clearAllStorage() {\r\n this.clearAllSessionsStorage();\r\n this.clearLocalStorage();\r\n }\r\n\r\n\r\n public clearAllSessionsStorage() {\r\n this.clearInstanceSessionStorage();\r\n localStorage.removeItem(LocalStoreManager.DBKEY_SYNC_KEYS);\r\n localStorage.setItem('clearAllSessionsStorage', '_dummy');\r\n localStorage.removeItem('clearAllSessionsStorage');\r\n }\r\n\r\n\r\n public clearInstanceSessionStorage() {\r\n\r\n sessionStorage.clear();\r\n this.syncKeys = [];\r\n }\r\n\r\n\r\n public clearLocalStorage() {\r\n localStorage.clear();\r\n }\r\n\r\n\r\n private addToSessionStorage(data: any, key: string) {\r\n this.addToSessionStorageHelper(data, key);\r\n this.addToSyncKeysBackup(key);\r\n\r\n this.localStorageSetItem('addToSessionStorage', { key: key, data: data });\r\n localStorage.removeItem('addToSessionStorage');\r\n }\r\n\r\n private addToSessionStorageHelper(data: any, key: string) {\r\n\r\n this.addToSyncKeysHelper(key);\r\n this.sessionStorageSetItem(key, data);\r\n }\r\n\r\n\r\n private removeFromSessionStorage(keyToRemove: string) {\r\n this.removeFromSessionStorageHelper(keyToRemove);\r\n this.removeFromSyncKeysBackup(keyToRemove);\r\n\r\n localStorage.setItem('removeFromSessionStorage', keyToRemove);\r\n localStorage.removeItem('removeFromSessionStorage');\r\n }\r\n\r\n private removeFromSessionStorageHelper(keyToRemove: string) {\r\n sessionStorage.removeItem(keyToRemove);\r\n this.removeFromSyncKeysHelper(keyToRemove);\r\n }\r\n\r\n\r\n private testForInvalidKeys(key: string) {\r\n if (!key)\r\n throw new Error(\"key cannot be empty\")\r\n\r\n if (this.reservedKeys.some(x => x === key))\r\n throw new Error(`The storage key \"${key}\" is reserved and cannot be used. Please use a different key`);\r\n }\r\n\r\n private syncKeysContains(key: string) {\r\n return this.syncKeys.some(x => x === key);\r\n }\r\n\r\n\r\n private loadSyncKeys() {\r\n if (this.syncKeys.length)\r\n return;\r\n\r\n this.syncKeys = this.getSyncKeysFromStorage();\r\n }\r\n\r\n\r\n private getSyncKeysFromStorage(defaultValue: string[] = []): string[] {\r\n let data = this.localStorageGetItem(LocalStoreManager.DBKEY_SYNC_KEYS);\r\n\r\n if (data == null)\r\n return defaultValue;\r\n else\r\n return <string[]>data;\r\n }\r\n\r\n\r\n private addToSyncKeys(key: string) {\r\n this.addToSyncKeysHelper(key);\r\n this.addToSyncKeysBackup(key);\r\n\r\n localStorage.setItem('addToSyncKeys', key);\r\n localStorage.removeItem('addToSyncKeys');\r\n }\r\n\r\n\r\n private addToSyncKeysBackup(key: string) {\r\n let storedSyncKeys = this.getSyncKeysFromStorage();\r\n\r\n if (!storedSyncKeys.some(x => x === key)) {\r\n storedSyncKeys.push(key);\r\n this.localStorageSetItem(LocalStoreManager.DBKEY_SYNC_KEYS, storedSyncKeys);\r\n }\r\n }\r\n\r\n private removeFromSyncKeysBackup(key: string) {\r\n\r\n let storedSyncKeys = this.getSyncKeysFromStorage();\r\n let index = storedSyncKeys.indexOf(key);\r\n\r\n if (index > -1) {\r\n storedSyncKeys.splice(index, 1);\r\n this.localStorageSetItem(LocalStoreManager.DBKEY_SYNC_KEYS, storedSyncKeys);\r\n }\r\n }\r\n\r\n\r\n private addToSyncKeysHelper(key: string) {\r\n if (!this.syncKeysContains(key))\r\n this.syncKeys.push(key);\r\n }\r\n\r\n\r\n private removeFromSyncKeys(key: string) {\r\n this.removeFromSyncKeysHelper(key);\r\n this.removeFromSyncKeysBackup(key);\r\n\r\n localStorage.setItem('removeFromSyncKeys', key);\r\n localStorage.removeItem('removeFromSyncKeys');\r\n }\r\n\r\n\r\n private removeFromSyncKeysHelper(key: string) {\r\n let index = this.syncKeys.indexOf(key);\r\n\r\n if (index > -1) {\r\n this.syncKeys.splice(index, 1);\r\n }\r\n }\r\n\r\n\r\n public saveSessionData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSyncKeys(key);\r\n localStorage.removeItem(key);\r\n this.sessionStorageSetItem(key, data);\r\n }\r\n\r\n\r\n public saveSyncedSessionData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n localStorage.removeItem(key);\r\n this.addToSessionStorage(data, key);\r\n }\r\n\r\n\r\n public savePermanentData(data: any, key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSessionStorage(key);\r\n this.localStorageSetItem(key, data);\r\n }\r\n\r\n\r\n\r\n public moveDataToSessionStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.getData(key);\r\n\r\n if (data == null)\r\n return;\r\n\r\n this.saveSessionData(data, key);\r\n }\r\n\r\n\r\n public moveDataToSyncedSessionStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.getData(key);\r\n\r\n if (data == null)\r\n return;\r\n\r\n this.saveSyncedSessionData(data, key);\r\n }\r\n\r\n\r\n public moveDataToPermanentStorage(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.getData(key);\r\n\r\n if (data == null)\r\n return;\r\n\r\n this.savePermanentData(data, key);\r\n }\r\n\r\n\r\n public exists(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n let data = sessionStorage.getItem(key);\r\n\r\n if (data == null)\r\n data = localStorage.getItem(key);\r\n\r\n return data != null;\r\n }\r\n\r\n\r\n public getData(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n let data = this.sessionStorageGetItem(key);\r\n\r\n if (data == null)\r\n data = this.localStorageGetItem(key);\r\n\r\n return data;\r\n }\r\n\r\n\r\n public getDataObject<T>(key = LocalStoreManager.DBKEY_USER_DATA, isDateType = false): T {\r\n let data = this.getData(key);\r\n\r\n if (data != null) {\r\n if (isDateType)\r\n data = new Date(data);\r\n\r\n return <T>data;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n\r\n public deleteData(key = LocalStoreManager.DBKEY_USER_DATA) {\r\n this.testForInvalidKeys(key);\r\n\r\n this.removeFromSessionStorage(key);\r\n localStorage.removeItem(key);\r\n }\r\n\r\n private localStorageSetItem(key: string, data: any) {\r\n localStorage.setItem(key, JSON.stringify(data));\r\n }\r\n\r\n private sessionStorageSetItem(key: string, data: any) {\r\n sessionStorage.setItem(key, JSON.stringify(data));\r\n }\r\n\r\n private localStorageGetItem(key: string) {\r\n return Utilities.JSonTryParse(localStorage.getItem(key));\r\n }\r\n\r\n private sessionStorageGetItem(key: string) {\r\n return Utilities.JSonTryParse(sessionStorage.getItem(key));\r\n }\r\n\r\n private onInit() {\r\n setTimeout(() => {\r\n this.initEvent.next({});\r\n this.initEvent.complete();\r\n });\r\n }\r\n\r\n public getInitEvent(): Observable<{}> {\r\n return this.initEvent.asObservable();\r\n }\r\n}\r\n","\r\nimport { Injectable } from '@angular/core';\r\nimport { HttpHeaders } from '@angular/common/http';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { AppKeys } from './app-keys';\r\nimport { Utilities } from '@dflat-core/web/core';\r\n@Injectable()\r\nexport class HeadersService {\r\n\r\n\r\n constructor(private localStorage: LocalStoreManager) { }\r\n\r\n // for requesting secure data using json\r\n authJsonHeaders() {\r\n let result: HttpHeaders = new HttpHeaders()\r\n .set('Content-Type', 'application/json')\r\n .set('Accept', 'application/json')\r\n .set('Authorization', `Bearer ${this.geJWTToken}`);\r\n return result;\r\n }\r\n\r\n // for requesting secure data from a form post\r\n authFormHeaders() {\r\n let result: HttpHeaders = new HttpHeaders()\r\n .set('Content-Type', 'application/x-www-form-urlencoded')\r\n .set('Accept', 'application/json')\r\n .set('Authorization', `Bearer ${this.geJWTToken}`);\r\n return result;\r\n }\r\n\r\n authFileUploadHeaders()\r\n {\r\n return new HttpHeaders()\r\n .set('Authorization', `Bearer ${this.geJWTToken}`);\r\n }\r\n\r\n // for requesting unsecured data using json\r\n jsonHeaders() {\r\n return new HttpHeaders()\r\n .set('Content-Type', 'application/json')\r\n .set('Accept', 'application/json');\r\n }\r\n\r\n // for requesting unsecured data using form post\r\n contentHeadersV2() {\r\n return new HttpHeaders()\r\n .set('Content-Type', 'application/x-www-form-urlencoded')\r\n .set('Accept', 'application/json');\r\n }\r\n\r\n get geJWTToken(): string {\r\n let result: string = this.localStorage.getDataObject<string>(AppKeys.ACCESS_TOKEN);\r\n \r\n if ( Utilities.IsNil(result))\r\n return '';\r\n \r\n return result;\r\n }\r\n}\r\n","\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { filter, map } from 'rxjs/operators';\r\n\r\nimport { Message, Notification } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { Utilities } from '@dflat-core/web/core';\r\n\r\n@Injectable()\r\nexport class BusMessageService {\r\n private message$: Subject<Message>;\r\n\r\n constructor() {\r\n this.message$ = new Subject<Message>();\r\n }\r\n\r\n public publish<T>(message: T): void {\r\n const channel = (<any>message.constructor).name;\r\n this.message$.next({ Channel: channel, Data: message });\r\n }\r\n\r\n public of<T>(messageType: new(...args: any[]) => T): Observable<T> {\r\n const channel = (<any>messageType).name;\r\n return this.message$.pipe(filter(m => m.Channel === channel), map(m => m.Data));\r\n }\r\n}\r\n\r\n@Injectable()\r\nexport class NotificationMqService {\r\n private message$: Subject<Message>;\r\n\r\n constructor() {\r\n this.message$ = new Subject<Message>();\r\n }\r\n\r\n public publish<T extends Notification>(message: T): void {\r\n const defaultchannel = message.entityType\r\n this.message$.next({ Channel: defaultchannel, Data: message });\r\n\r\n if (!Utilities.IsUndefined(message.entityId)) {\r\n const detailchannel = `${message.entityType}-${message.entityId}`;\r\n this.message$.next({ Channel: detailchannel, Data: message });\r\n }\r\n }\r\n\r\n public of<T extends Notification>(channelKey: string): Observable<T> {\r\n const channel = channelKey;\r\n return this.message$.pipe(filter(m => m.Channel === channel), map(m => m.Data));\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { AppKeys } from './app-keys';\r\n\r\n@Injectable()\r\nexport class PermissionService {\r\n\r\n constructor( private localStorage: LocalStoreManager) {}\r\n\r\n hasPermission(permission: string): boolean {\r\n return this.permissions != null && this.permissions.some(p => p === permission) || this.isAdmin;\r\n }\r\n\r\n get permissions(): Array<any> {\r\n let permissions = this.localStorage.getDataObject<string>(AppKeys.PERMISSIONS);\r\n let parsed_permissions = <Array<any>>JSON.parse(permissions);\r\n return parsed_permissions\r\n }\r\n\r\n get isAdmin(): boolean {\r\n let parsed = JSON.parse(this.currentUser);\r\n return parsed && parsed.IsAdmin || false;\r\n }\r\n\r\n get currentUser(): string {\r\n return this.localStorage.getDataObject<string>(AppKeys.CURRENT_USER);\r\n }\r\n}\r\n","import { ReplaySubject } from 'rxjs';\r\n\r\nimport { Utilities } from '@dflat-core/web/core';\r\nimport { DictionnaryWrapper } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { MenuItem } from '../model/model';\r\nimport { PermissionService } from './permission.service';\r\n\r\n@Injectable()\r\nexport abstract class MenuService {\r\n private current: ReplaySubject<MenuItem[]> = new ReplaySubject<MenuItem[]>(1);\r\n private _permissionRouteMap: DictionnaryWrapper<string>;\r\n\r\n public constructor(private permissionService: PermissionService) {\r\n }\r\n\r\n abstract getAllMenuItems(isAdmin:boolean): MenuItem[];\r\n abstract getAccessGrantedMenuItems(): MenuItem[];\r\n\r\n public setCurrent(menu: MenuItem[]) {\r\n this.current.next(menu);\r\n }\r\n\r\n public getCurrent() {\r\n return this.current;\r\n }\r\n\r\n get permissionRouteMap() {\r\n if (Utilities.IsNil(this._permissionRouteMap)) {\r\n this._permissionRouteMap = new DictionnaryWrapper<string>();\r\n this.getAllMenuItems(true).forEach(item => {\r\n if (! Utilities.IsNil(item.sublinks)) {\r\n item.sublinks.forEach( subItem=> {\r\n if (subItem.permissionKey) {\r\n this._permissionRouteMap.dictionary[subItem.link] = subItem.permissionKey;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n return this._permissionRouteMap;\r\n }\r\n\r\n\r\n resetPermissionMap(){\r\n this._permissionRouteMap = undefined;\r\n }\r\n\r\n hasAccessToThisRoute(url: string):boolean {\r\n let menuItems = this.getAccessGrantedMenuItems();\r\n if ( ! Utilities.IsNil( menuItems) && menuItems.findIndex(f => f.link === url) >= 0)\r\n return true;\r\n\r\n if(this.permissionRouteMap.containsKeyOrPartKey(url)){\r\n return this.hasPermission(this.permissionRouteMap.getPartKey(url));\r\n }\r\n // Le menu n'a pas de permissions associé, on renvoie true\r\n return true;\r\n }\r\n\r\n\r\n\r\n pushItem(items: Array<MenuItem>, menuItem: MenuItem, isAdmin:boolean) {\r\n if (Utilities.IsNil(menuItem.permissionKey) ||\r\n isAdmin || this.hasPermission(menuItem.permissionKey)\r\n ) {\r\n items.push(menuItem);\r\n }\r\n }\r\n\r\n hasPermission = (permKey: string) => {\r\n if ( permKey === undefined )\r\n return true;\r\n return this.permissionService.hasPermission(permKey);\r\n }\r\n\r\n hasAnyPermission = (permKeys: (string | undefined)[]) => {\r\n let result = false;\r\n permKeys.forEach(p => result = result || this.hasPermission(p));\r\n return result;\r\n }\r\n\r\n getMenuItems(isAdmin: boolean): MenuItem[] {\r\n\r\n let results = this.getAllMenuItems(isAdmin);\r\n\r\n for(let i = 0; i < results.length; i++)\r\n results[i].id = i;\r\n\r\n return this.sortLinks(results);\r\n }\r\n\r\n private sortLinks(links: MenuItem[]) {\r\n return links.map(t => { return { ...t, sublinks: this.sortLinksSubLevel(t.sublinks) } });\r\n }\r\n\r\n private sortLinksSubLevel(links: MenuItem[]) {\r\n if (!links) return null;\r\n return links.sort((a, b) => a.title.localeCompare(b.title));\r\n }\r\n\r\n// private fillmap(map: Map<string,MenuItem>,menuItems: MenuItem[], parent: string = null )\r\n// {\r\n// if ( ! Utilities.IsNil(menuItems)) {\r\n// menuItems.forEach(x =>{\r\n// if ( ! Utilities.IsNil(parent))\r\n// parent = parent.concat(\"/\" + x.title);\r\n// else\r\n// parent = x.title;\r\n// map.set(parent,x);\r\n// this.fillmap(map,x.sublinks,parent);\r\n// });\r\n// }\r\n// return map;\r\n// }\r\n// public mergeall(Menus:MenuItem[][]): MenuItem[]\r\n// {\r\n// let menuItem = Array<MenuItem>();\r\n// let map = new Map<string,MenuItem>();\r\n// Menus.forEach(menuItem => {\r\n// this.fillmap(map,menuItem,null);\r\n\r\n// });\r\n// let sortedmap = new Map([...map].sort());\r\n// sortedmap.forEach(element => {\r\n// menuItem.push()\r\n\r\n// });\r\n// return menuItem;\r\n// }\r\n public merge(Menus:MenuItem[]): MenuItem[]\r\n {\r\n // let titles : string[];\r\n\r\n // if (!(item.title in titles)){\r\n // titles.push(item.title);\r\n // menu.push(item);\r\n // }\r\n // else{\r\n let menu : MenuItem[] = [];\r\n Menus.forEach(item => {\r\n \r\n let index = menu.findIndex(x=>x.title == item.title);\r\n if(index >= 0)\r\n menu[index].sublinks = [...menu[index].sublinks,...item.sublinks];\r\n else\r\n menu.push(item);\r\n })\r\n return menu;\r\n}\r\n}\r\n","\r\nimport jwt_decode from 'jwt-decode';\r\nimport { Observable, Subscription, throwError, timer } from 'rxjs';\r\nimport { catchError, finalize, map } from 'rxjs/operators';\r\n\r\nimport { Utilities, EnvironmentBase } from '@dflat-core/web/core';\r\nimport { IExternalLoginProvider, IUserCredential, UserUpdatedMessage } from '@dflat-core/web/core-model';\r\nimport { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { NavigationExtras, Router } from '@angular/router';\r\n\r\nimport { AppKeys } from './app-keys';\r\nimport { BusMessageService } from './busmessage.service';\r\nimport { HeadersService } from './headers.service';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { ServerUrl } from './server-url';\r\nimport { MenuService } from './menu.service';\r\n\r\nexport enum AuthTokenType {\r\n AccessToken,\r\n RefreshToken\r\n}\r\n\r\n@Injectable()\r\nexport class AuthService {\r\n baseUrl = this.env.apiUrl;\r\n public loginRedirectUrl: string;\r\n private refreshTokenSubscription: Subscription;\r\n \r\n constructor(\r\n private headersService: HeadersService,\r\n private busMsg: BusMessageService,\r\n private httpClient: HttpClient,\r\n private router: Router,\r\n private localStorage: LocalStoreManager,\r\n private menuService : MenuService,\r\n private env: EnvironmentBase\r\n ) { \r\n this.scheduleRefreshToken(this.isLoggedIn,false);\r\n }\r\n\r\n // After a successful login, save token data into session storage\r\n // note: use \"localStorage\" for persistent, browser-wide logins; \"sessionStorage\" for per-session storage.\r\n login(username: string, password: string, rememberMe: boolean): Observable<IUserCredential> {\r\n // console.log(`login base url : ${this.baseUrl} (environment is production : ${this.env.production})`);\r\n let body = JSON.stringify({ \"username\": username, \"password\": password });\r\n let _url = this.baseUrl + ServerUrl.connectPath;\r\n return this.httpClient.post(_url, body, { headers: this.headersService.authJsonHeaders() }).pipe(\r\n map((resp: Response) => {\r\n // login successful if there's a jwt token in the response\r\n // let user = (resp as any) as IUserCredential;\r\n let user: IUserCredential = (resp as any) as IUserCredential;\r\n if (user && user.AccessToken) {\r\n // store user details and jwt token in local storage to keep user logged in between page refreshes\r\n this.saveUserInfos(user, JSON.stringify(user), rememberMe);\r\n // publish token\r\n this.busMsg.publish(new UserUpdatedMessage(user.AccessToken));\r\n // schedule refresh token\r\n this.scheduleRefreshToken(true, true);\r\n \r\n return user;\r\n }\r\n }));\r\n }\r\n\r\n /**\r\n * Fournisseurs d'identité externes (Google, Microsoft, Apple) activés et configurés côté\r\n * serveur (section ExternalLogin de la configuration).\r\n */\r\n getLoginProviders(): Observable<IExternalLoginProvider[]> {\r\n return this.httpClient.get<IExternalLoginProvider[]>(this.baseUrl + ServerUrl.loginProvidersPath, { headers: this.headersService.jsonHeaders() });\r\n }\r\n\r\n /**\r\n * Connexion par le jeton d'identité remis par un fournisseur externe. Le serveur vérifie le\r\n * jeton, retrouve ou crée le compte, puis répond comme la connexion par mot de passe.\r\n */\r\n loginExternal(provider: string, idToken: string, rememberMe: boolean, firstName?: string, lastName?: string): Observable<IUserCredential> {\r\n let body = JSON.stringify({ \"Provider\": provider, \"IdToken\": idToken, \"FirstName\": firstName, \"LastName\": lastName });\r\n let _url = this.baseUrl + ServerUrl.connectExternalPath;\r\n return this.httpClient.post(_url, body, { headers: this.headersService.authJsonHeaders() }).pipe(\r\n map((resp: Response) => {\r\n let user: IUserCredential = (resp as any) as IUserCredential;\r\n if (user && user.AccessToken) {\r\n this.saveUserInfos(user, JSON.stringify(user), rememberMe);\r\n this.busMsg.publish(new UserUpdatedMessage(user.AccessToken));\r\n this.scheduleRefreshToken(true, true);\r\n\r\n return user;\r\n }\r\n }));\r\n }\r\n\r\n // After a successful login, save token data into session storage\r\n // note: use \"localStorage\" for persistent, browser-wide logins; \"sessionStorage\" for per-session storage.\r\n register(captchaToken: string, firstName: string, lastName: string, email: string, password: string, rememberMe: boolean) : Observable<IUserCredential> {\r\n // console.log(`login base url : ${this.baseUrl} (environment is production : ${this.env.production})`);\r\n let body = JSON.stringify({ \"CaptchaToken\": captchaToken, \"FirstName\": firstName, \"LastName\": lastName, \"Email\": email, \"Password\": password });\r\n let _url = this.baseUrl + ServerUrl.registerPath;\r\n return this.httpClient.post(_url, body, { headers: this.headersService.authJsonHeaders() }).pipe(\r\n map((resp: Response) => {\r\n // login successful if there's a jwt token in the response\r\n let user: IUserCredential = (resp as any) as IUserCredential;\r\n if (user && user.AccessToken) {\r\n // store user details and jwt token in local storage to keep user logged in between page refreshes\r\n this.saveUserInfos(user, JSON.stringify(user), rememberMe);\r\n // publish token\r\n this.busMsg.publish(new UserUpdatedMessage(user.AccessToken));\r\n // schedule refresh token\r\n this.scheduleRefreshToken(true, true);\r\n \r\n return user;\r\n }\r\n }));\r\n }\r\n\r\n // Activation d'un utilisateur\r\n activate(code: string) {\r\n // console.log(`login base url : ${this.baseUrl} (environment is production : ${this.env.production})`);\r\n let body = JSON.stringify({ \"ActivationCode\": code });\r\n let _url = this.baseUrl + ServerUrl.activatePath;\r\n return this.httpClient.post(_url, body, { headers: this.headersService.authJsonHeaders() }).pipe(\r\n map((resp: Response) => {\r\n return resp;\r\n }));\r\n }\r\n\r\n\r\n\r\n saveUserInfos(user: any, userDetails: string, rememberMe?: boolean) {\r\n\r\n // check permissions \r\n let permissions = user.Permissions || new Array<any>();\r\n // this.getPermissions(user.AccessToken) || new Array<any>();\r\n\r\n if (rememberMe) {\r\n this.localStorage.savePermanentData(user.AccessToken, AppKeys.ACCESS_TOKEN);\r\n this.localStorage.savePermanentData(user.RefreshToken, AppKeys.REFRESH_TOKEN);\r\n this.localStorage.savePermanentData(userDetails, AppKeys.CURRENT_USER);\r\n this.localStorage.savePermanentData(JSON.stringify(permissions), AppKeys.PERMISSIONS);\r\n }\r\n else {\r\n this.localStorage.saveSyncedSessionData(user.AccessToken, AppKeys.ACCESS_TOKEN);\r\n this.localStorage.saveSyncedSessionData(user.RefreshToken, AppKeys.REFRESH_TOKEN);\r\n this.localStorage.saveSyncedSessionData(userDetails, AppKeys.CURRENT_USER);\r\n this.localStorage.saveSyncedSessionData(JSON.stringify(permissions), AppKeys.PERMISSIONS);\r\n }\r\n\r\n if (rememberMe) {\r\n this.localStorage.savePermanentData(rememberMe, AppKeys.REMEMBER_ME);\r\n }\r\n }\r\n\r\n getPermissions(token: any) {\r\n let decodedToken = jwt_decode(token);\r\n let permissions = new Array<any>();\r\n if (decodedToken.permissions) {\r\n permissions = Array.isArray(decodedToken.permissions) ? decodedToken.permissions : [decodedToken.permissions];\r\n }\r\n return permissions;\r\n }\r\n\r\n removeUserInfos() {\r\n this.localStorage.deleteData(AppKeys.ACCESS_TOKEN);\r\n this.localStorage.deleteData(AppKeys.REFRESH_TOKEN);\r\n this.localStorage.deleteData(AppKeys.CURRENT_USER);\r\n this.loginRedirectUrl = '/';\r\n }\r\n\r\n // called when logging out user; clears tokens from browser\r\n logout(pseudo: string) {\r\n this.disconnect(pseudo);\r\n }\r\n\r\n disconnect(pseudo: string) {\r\n const headers = new HttpHeaders({ \"Content-Type\": \"application/json\" });\r\n const model = { refreshToken: this.refreshToken };\r\n\r\n return this.httpClient\r\n .post(`${this.baseUrl}${ServerUrl.disconnectPath}`, model, { headers: headers })\r\n .pipe(\r\n map(response => response || {}),\r\n finalize(() => {\r\n this.ensureLogout();\r\n // navigate to home page\r\n this.router.navigate(['/']);\r\n }\r\n )).subscribe(result => {\r\n console.log(\"logout\", result);\r\n });\r\n \r\n }\r\n\r\n ensureLogout() {\r\n this.menuService.resetPermissionMap();\r\n this.busMsg.publish(new UserUpdatedMessage(null));\r\n this.removeUserInfos();\r\n this.unscheduleRefreshToken(true);\r\n }\r\n\r\n redirectLoginUser() {\r\n let redirect = this.loginRedirectUrl && this.loginRedirectUrl !== '/' ? this.loginRedirectUrl : '/';\r\n this.loginRedirectUrl = null;\r\n\r\n let urlParamsAndFragment = Utilities.splitInTwo(redirect, '#');\r\n let urlAndParams = Utilities.splitInTwo(urlParamsAndFragment.firstPart, '?');\r\n\r\n let navigationExtras: NavigationExtras = {\r\n fragment: urlParamsAndFragment.secondPart,\r\n queryParams: Utilities.getQueryParamsFromString(urlAndParams.secondPart),\r\n queryParamsHandling: \"merge\"\r\n };\r\n\r\n this.router.navigate([urlAndParams.firstPart], navigationExtras);\r\n }\r\n\r\n invalidateCurrentTabId() {\r\n if (!this.rememberMe) {\r\n return;\r\n }\r\n const currentTabId = this.getCurrentTabId();\r\n if (this.timerStat && this.timerStat.tabId === currentTabId) {\r\n this.setRefreshTokenTimerStopped();\r\n }\r\n }\r\n\r\n scheduleRefreshToken(isAuthUserLoggedIn: boolean, calledFromLogin: boolean) {\r\n this.unscheduleRefreshToken(false);\r\n\r\n if (!this.isLoggedIn) {\r\n return;\r\n }\r\n\r\n const expDateUtc = this.getAccessTokenExpirationDateUtc();\r\n if (!expDateUtc) {\r\n throw new Error(\"This access token has not the `exp` property.\");\r\n }\r\n const expiresAtUtc = expDateUtc.valueOf();\r\n const nowUtc = new Date().valueOf();\r\n // 3s pour empêcher les timers des autres onglets de tourner moins de 3s\r\n const initialDelay = Math.max(1, expiresAtUtc - nowUtc - 3000);\r\n const timerSource$ = timer(initialDelay);\r\n this.refreshTokenSubscription = timerSource$.subscribe(() => {\r\n if (calledFromLogin || !this.isRefreshTokenTimerStartedInAnotherTab()) {\r\n this.updateToken();\r\n } else {\r\n this.scheduleRefreshToken(isAuthUserLoggedIn, false);\r\n }\r\n });\r\n\r\n if (calledFromLogin || !this.isRefreshTokenTimerStartedInAnotherTab()) {\r\n this.setRefreshTokenTimerStarted();\r\n }\r\n }\r\n\r\n private refreshTokenTimerCheckId = \"is_refreshToken_timer_started\";\r\n private setRefreshTokenTimerStopped(): void {\r\n this.localStorage.savePermanentData(JSON.stringify({\r\n isStarted: false,\r\n tabId: -1\r\n }), this.refreshTokenTimerCheckId);\r\n }\r\n\r\n private setRefreshTokenTimerStarted(): void {\r\n this.localStorage.savePermanentData(JSON.stringify(\r\n {\r\n isStarted: true,\r\n tabId: this.getCurrentTabId()\r\n }), this.refreshTokenTimerCheckId);\r\n }\r\n\r\n private deleteRefreshTokenTimerCheckId() {\r\n this.localStorage.deleteData(this.refreshTokenTimerCheckId);\r\n }\r\n\r\n private isRefreshTokenTimerStartedInAnotherTab(): boolean {\r\n if (!this.rememberMe) {\r\n return false; // Chaque onglet gère son token (infos stockés dans le local storage)\r\n }\r\n\r\n const currentTabId = this.getCurrentTabId();\r\n // console.log(\"RefreshTokenTimer Check\", {\r\n // refreshTokenTimerCheckId: this.timerStat,\r\n // currentTabId: currentTabId\r\n // });\r\n const isStarted = this.timerStat && this.timerStat.isStarted === true && this.timerStat.tabId !== currentTabId;\r\n // if (isStarted) {\r\n // console.log(`RefreshToken timer has already been started in another tab with tabId=${this.timerStat.tabId}.\r\n // currentTabId=${currentTabId}.`);\r\n // }\r\n return isStarted;\r\n }\r\n\r\n getCurrentTabId(): number {\r\n const tabIdToken = \"currentTabId\";\r\n let tabId = this.localStorage.getData(tabIdToken);\r\n if (tabId) {\r\n return tabId;\r\n }\r\n tabId = Math.random();\r\n this.localStorage.saveSyncedSessionData(tabId, tabIdToken);\r\n return tabId;\r\n }\r\n\r\n getAccessTokenExpirationDateUtc(): Date | null {\r\n const decoded = this.getDecodedAccessToken();\r\n if (decoded.exp === undefined) {\r\n return null;\r\n }\r\n const date = new Date(0);\r\n date.setUTCSeconds(decoded.exp);\r\n // console.log(`Token Expires at ${date}`);\r\n return date;\r\n }\r\n\r\n isAccessTokenTokenExpired(): boolean {\r\n const expirationDateUtc = this.getAccessTokenExpirationDateUtc();\r\n if (!expirationDateUtc) {\r\n return true;\r\n }\r\n return !(expirationDateUtc.valueOf() > new Date().valueOf());\r\n }\r\n\r\n getDecodedAccessToken(): any {\r\n return jwt_decode(this.token);\r\n }\r\n\r\n isEmptyString(value: string): boolean {\r\n return !value || 0 === value.length;\r\n }\r\n\r\n unscheduleRefreshToken(cancelTimerCheckToken: boolean) {\r\n if (this.refreshTokenSubscription) {\r\n this.refreshTokenSubscription.unsubscribe();\r\n }\r\n\r\n if (cancelTimerCheckToken) {\r\n this.deleteRefreshTokenTimerCheckId();\r\n }\r\n }\r\n\r\n updateToken() {\r\n console.log(`Entering updateToken()`);\r\n const headers = new HttpHeaders({ \"Content-Type\": \"application/json\" });\r\n // L'API attend le jeton seul dans le corps (chaîne JSON), pas un objet.\r\n const model = JSON.stringify(this.refreshToken);\r\n return this.httpClient\r\n .post(`${this.baseUrl}${ServerUrl.refreshPath}`, model, { headers: headers })\r\n .pipe(\r\n map(response => response || {}),\r\n catchError((error: HttpErrorResponse) =>throwError(() => new Error(error.error)))\r\n )\r\n .subscribe(resp => {\r\n // login successful if there's a jwt token in the response\r\n let user = (resp as any) as { AccessToken: string, RefreshToken: string, Username?: string, FirstName?: string, LastName?: string, IsAdmin?: boolean, Id?: number };\r\n if (user && user.AccessToken) {\r\n // store user details and jwt token in local storage to keep user logged in between page refreshes\r\n this.saveUserInfos(user, JSON.stringify(user),this.rememberMe);\r\n // publish token\r\n this.busMsg.publish(new UserUpdatedMessage(user.AccessToken));\r\n this.scheduleRefreshToken(this.isLoggedIn, false);\r\n return user;\r\n }\r\n });\r\n }\r\n\r\n hasPermission(permission: string): boolean {\r\n return this.permissions != null && this.permissions.some(p => p === permission) || this.isAdmin;\r\n }\r\n\r\n //#region Fields\r\n\r\n get timerStat() : any {\r\n const timerStat_key = this.localStorage.getDataObject<string>(this.refreshTokenTimerCheckId);\r\n const timerStat = JSON.parse(timerStat_key);\r\n return timerStat;\r\n }\r\n\r\n get isLoggedIn(): boolean {\r\n const accessToken = this.token;\r\n const refreshToken = this.refreshToken;\r\n const hasTokens = !this.isEmptyString(accessToken) && !this.isEmptyString(refreshToken);\r\n return hasTokens && !this.isAccessTokenTokenExpired();\r\n }\r\n\r\n get isAdmin(): boolean {\r\n let parsed = JSON.parse(this.currentUser);\r\n if ( Utilities.IsNil(parsed))\r\n return false;\r\n return parsed.IsAdmin || false;\r\n }\r\n\r\n get pseudo(): string {\r\n let parsed = JSON.parse(this.currentUser);\r\n return parsed.Username || '';\r\n }\r\n\r\n get userId(): number {\r\n let parsed = JSON.parse(this.currentUser);\r\n return parsed.Id || 0;\r\n }\r\n\r\n get currentUser(): string {\r\n return this.localStorage.getDataObject<string>(AppKeys.CURRENT_USER);\r\n }\r\n\r\n get rememberMe(): boolean {\r\n return this.localStorage.getDataObject<boolean>(AppKeys.REMEMBER_ME) === true;\r\n }\r\n\r\n get token(): string {\r\n return this.localStorage.getDataObject<string>(AppKeys.ACCESS_TOKEN);\r\n }\r\n\r\n get refreshToken(): string {\r\n return this.localStorage.getDataObject<string>(AppKeys.REFRESH_TOKEN);\r\n }\r\n\r\n get permissions(): Array<any> {\r\n let permissions = this.localStorage.getDataObject<string>(AppKeys.PERMISSIONS);\r\n let parsed_permissions = <Array<any>>JSON.parse(permissions);\r\n return parsed_permissions\r\n }\r\n\r\n get companyId() : number {\r\n const decoded = this.getDecodedAccessToken();\r\n if (Utilities.IsNil(decoded[AppKeys.USER_COMPANY_ID])) {\r\n return null;\r\n }\r\n return <number>decoded[AppKeys.USER_COMPANY_ID];\r\n }\r\n\r\n get referenceSupplierId() : number {\r\n const decoded = this.getDecodedAccessToken();\r\n if (Utilities.IsNil(decoded[AppKeys.REFERENCE_SUPPLIER_ID])) {\r\n return null;\r\n }\r\n return <number>decoded[AppKeys.REFERENCE_SUPPLIER_ID];\r\n }\r\n\r\n //#endregion \r\n\r\n navigateToHome(){\r\n this.router.navigate(['/']);\r\n }\r\n}\r\n","import { Utilities } from '@dflat-core/web/core';\r\nimport { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Route, Router, RouterStateSnapshot } from '@angular/router';\r\n\r\nimport { AuthService } from './auth.service';\r\nimport { MenuService } from './menu.service';\r\n\r\n@Injectable()\r\nexport class AuthGuard {\r\n constructor(\r\n private authService: AuthService,\r\n private menuService: MenuService,\r\n private router: Router\r\n ) {}\r\n\r\n canActivate(\r\n route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): boolean {\r\n let url: string = state.url;\r\n return this.checkLogin(url);\r\n }\r\n\r\n canActivateChild(\r\n route: ActivatedRouteSnapshot,\r\n state: RouterStateSnapshot\r\n ): boolean {\r\n return this.canActivate(route, state);\r\n }\r\n\r\n canLoad(route: Route): boolean {\r\n let url = `/${route.path}`;\r\n return this.checkLogin(url);\r\n }\r\n\r\n checkLogin(url: string): boolean {\r\n if (this.authService.isLoggedIn) {\r\n if (url === '/accessDenied' || this.authService.isAdmin) {\r\n return true;\r\n }\r\n\r\n return this.hasAuthUserAccessToThisRoute(url);\r\n }\r\n\r\n this.menuService.resetPermissionMap();\r\n this.authService.loginRedirectUrl = url;\r\n this.router.navigate(['/login']);\r\n\r\n return false;\r\n }\r\n\r\n private hasAuthUserAccessToThisRoute(returnUrl: string): boolean {\r\n if ( ! this.menuService.hasAccessToThisRoute(Utilities.splitInTwo(returnUrl, '?').firstPart ) ) {\r\n this.showAccessDenied(returnUrl);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private showAccessDenied(returnUrl: string) {\r\n this.router.navigate(['/accessDenied']);\r\n }\r\n}\r\n","import { Injectable, NgZone } from '@angular/core';\r\nimport { IExternalLoginProvider } from '@dflat-core/web/core-model';\r\n\r\ndeclare const google: any;\r\ndeclare const AppleID: any;\r\n\r\n/** Jeton d'identité remis par un fournisseur externe, à transmettre à AuthService.loginExternal. */\r\nexport interface IExternalLoginResult {\r\n /** Google, Microsoft ou Apple. */\r\n provider: string;\r\n /** Jeton d'identité (JWT) signé par le fournisseur. */\r\n idToken: string;\r\n /** Prénom transmis hors du jeton (Apple, à la première connexion). */\r\n firstName?: string;\r\n /** Nom transmis hors du jeton (Apple, à la première connexion). */\r\n lastName?: string;\r\n}\r\n\r\n/**\r\n * Lance, dans le navigateur, la connexion chez un fournisseur d'identité externe et en récupère\r\n * le jeton d'identité. Aucune dépendance npm : les scripts officiels de Google et d'Apple sont\r\n * chargés à la demande, Microsoft passe par une fenêtre OpenID Connect.\r\n *\r\n * Adresse de retour à déclarer chez Microsoft et Apple : l'origine de l'application\r\n * (`window.location.origin`, ex. https://mon-application.fr). Chez Google, cette origine est à\r\n * déclarer comme « origine JavaScript autorisée ».\r\n */\r\n@Injectable()\r\nexport class ExternalLoginService {\r\n static readonly google = 'Google';\r\n static readonly microsoft = 'Microsoft';\r\n static readonly apple = 'Apple';\r\n\r\n private static readonly googleScript = 'https://accounts.google.com/gsi/client';\r\n private static readonly appleScript = 'https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/fr_FR/appleid.auth.js';\r\n\r\n private scripts: { [src: string]: Promise<void> } = {};\r\n\r\n constructor(private zone: NgZone) { }\r\n\r\n /**\r\n * Affiche le bouton officiel « Continuer avec Google » dans un élément de la page. Google\r\n * n'accepte la connexion que depuis son propre bouton : il ne peut pas être remplacé.\r\n * @param container Élément qui reçoit le bouton.\r\n * @param provider Réglages de Google (identifiant client).\r\n * @param onToken Appelé avec le jeton d'identité quand l'utilisateur s'est connecté.\r\n */\r\n renderGoogleButton(container: HTMLElement, provider: IExternalLoginProvider, onToken: (result: IExternalLoginResult) => void): Promise<void> {\r\n return this.loadScript(ExternalLoginService.googleScript).then(() => {\r\n google.accounts.id.initialize({\r\n client_id: provider.ClientId,\r\n callback: (response: any) => this.zone.run(() => onToken({ provider: ExternalLoginService.google, idToken: response.credential }))\r\n });\r\n google.accounts.id.renderButton(container, {\r\n type: 'standard', theme: 'outline', size: 'large', text: 'continue_with', shape: 'rectangular',\r\n logo_alignment: 'center', locale: 'fr', width: Math.min(400, Math.max(200, container.offsetWidth || 300))\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Connexion par un compte Microsoft, dans une fenêtre : flux OpenID Connect qui renvoie le\r\n * jeton d'identité à l'origine de l'application (« jetons d'ID » à cocher dans l'inscription\r\n * de l'application chez Microsoft).\r\n */\r\n signInWithMicrosoft(provider: IExternalLoginProvider): Promise<IExternalLoginResult> {\r\n const nonce = this.random();\r\n const state = this.random();\r\n const tenant = encodeURIComponent(provider.TenantId || 'common');\r\n const url = `https://login.microsoftonline.com/${tenant}/oauth2/v2.0/authorize`\r\n + `?client_id=${encodeURIComponent(provider.ClientId)}`\r\n + `&response_type=id_token&response_mode=fragment&scope=${encodeURIComponent('openid profile email')}`\r\n + `&redirect_uri=${encodeURIComponent(this.redirectUri)}`\r\n + `&nonce=${nonce}&state=${state}&prompt=select_account`;\r\n\r\n return this.openPopup(url).then(params => {\r\n if (params.get('error'))\r\n throw new Error(params.get('error_description') || params.get('error'));\r\n\r\n const idToken = params.get('id_token');\r\n if (!idToken || params.get('state') !== state || this.readPayload(idToken).nonce !== nonce)\r\n throw new Error('Réponse de Microsoft inattendue.');\r\n\r\n return { provider: ExternalLoginService.microsoft, idToken: idToken };\r\n });\r\n }\r\n\r\n /** Connexion par un identifiant Apple, dans la fenêtre du script officiel « Sign in with Apple ». */\r\n signInWithApple(provider: IExternalLoginProvider): Promise<IExternalLoginResult> {\r\n return this.loadScript(ExternalLoginService.appleScript).then(() => {\r\n AppleID.auth.init({\r\n clientId: provider.ClientId,\r\n scope: 'name email',\r\n redirectURI: this.redirectUri,\r\n state: this.random(),\r\n usePopup: true\r\n });\r\n return AppleID.auth.signIn();\r\n }).then((response: any) => {\r\n const idToken = response && response.authorization && response.authorization.id_token;\r\n if (!idToken)\r\n throw new Error('Réponse d\\'Apple inattendue.');\r\n\r\n // Le nom n'est transmis qu'à la première connexion, hors du jeton.\r\n const name = (response.user && response.user.name) || {};\r\n return { provider: ExternalLoginService.apple, idToken: idToken, firstName: name.firstName, lastName: name.lastName };\r\n });\r\n }\r\n\r\n /** Vrai si l'erreur vient de l'utilisateur qui a fermé la fenêtre de connexion. */\r\n isCancellation(error: any): boolean {\r\n const code = error && (error.error || error.message);\r\n return code === 'popup_closed' || code === 'popup_closed_by_user' || code === 'user_cancelled_authorize';\r\n }\r\n\r\n /** Adresse de retour déclarée chez les fournisseurs : l'origine de l'application. */\r\n private get redirectUri(): string {\r\n return window.location.origin;\r\n }\r\n\r\n /**\r\n * Ouvre la fenêtre de connexion et attend son retour sur l'origine de l'application : la\r\n * réponse du fournisseur est lue dans le fragment de son adresse.\r\n */\r\n private openPopup(url: string): Promise<URLSearchParams> {\r\n const width = 500, height = 650;\r\n const left = window.screenX + Math.max(0, (window.outerWidth - width) / 2);\r\n const top = window.screenY + Math.max(0, (window.outerHeight - height) / 2);\r\n const popup = window.open(url, 'dflat-external-login', `width=${width},height=${height},left=${left},top=${top}`);\r\n\r\n return new Promise<URLSearchParams>((resolve, reject) => {\r\n if (!popup) {\r\n reject(new Error('La fenêtre de connexion a été bloquée par le navigateur.'));\r\n return;\r\n }\r\n\r\n // Hors de la zone Angular : la surveillance ne déclenche pas de détection de changements.\r\n this.zone.runOutsideAngular(() => {\r\n const timer = window.setInterval(() => {\r\n if (popup.closed) {\r\n window.clearInterval(timer);\r\n this.zone.run(() => reject(new Error('popup_closed')));\r\n return;\r\n }\r\n\r\n let hash: string = null;\r\n try {\r\n // Inaccessible tant que la fenêtre est chez le fournisseur (autre origine).\r\n if (popup.location.origin === window.location.origin)\r\n hash = popup.location.hash;\r\n } catch { }\r\n\r\n if (hash && (hash.indexOf('id_token=') >= 0 || hash.indexOf('error=') >= 0)) {\r\n window.clearInterval(timer);\r\n popup.close();\r\n this.zone.run(() => resolve(new URLSearchParams(hash.replace(/^#\\/?/, ''))));\r\n }\r\n }, 200);\r\n });\r\n });\r\n }\r\n\r\n /** Charge une fois le script d'un fournisseur. */\r\n private loadScript(src: string): Promise<void> {\r\n if (!this.scripts[src]) {\r\n this.scripts[src] = new Promise<void>((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = src;\r\n script.async = true;\r\n script.onload = () => resolve();\r\n script.onerror = () => {\r\n delete this.scripts[src];\r\n reject(new Error('Le service de connexion est injoignable.'));\r\n };\r\n document.head.appendChild(script);\r\n });\r\n }\r\n return this.scripts[src];\r\n }\r\n\r\n /** Valeur aléatoire (nonce, état) liant la réponse du fournisseur à la demande. */\r\n private random(): string {\r\n const bytes = new Uint8Array(16);\r\n window.crypto.getRandomValues(bytes);\r\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\r\n }\r\n\r\n /** Contenu d'un jeton JWT, sans vérification : la signature est contrôlée par le serveur. */\r\n private readPayload(token: string): any {\r\n try {\r\n const part = token.split('.')[1].replace(/-/g, '+').replace(/_/g, '/');\r\n return JSON.parse(decodeURIComponent(atob(part).split('').map(c => '%' + c.charCodeAt(0).toString(16).padStart(2, '0')).join('')));\r\n } catch {\r\n return {};\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ReplaySubject } from 'rxjs';\r\nimport { Title } from '@angular/platform-browser';\r\n\r\n@Injectable()\r\nexport class BreadcrumbService {\r\n public current: ReplaySubject<any>;\r\n private initialData: any = {\r\n description: '',\r\n display: false,\r\n header : '',\r\n\r\n levels: [\r\n {\r\n icon: 'clock-o',\r\n link: ['/'],\r\n title: 'Default'\r\n }\r\n ]\r\n };\r\n\r\n constructor(protected title: Title ) {\r\n this.current = new ReplaySubject(1);\r\n this.clear();\r\n }\r\n\r\n public setCurrent(data: any) {\r\n if ( data.description !== undefined && data.description !== '') {\r\n\r\n this.title.setTitle('DFlat - ' + data.levels[data.levels.length - 1].title);\r\n }\r\n else\r\n this.title.setTitle('DFlat');\r\n\r\n this.current.next(data);\r\n }\r\n\r\n public getCurrent() {\r\n return this.current;\r\n }\r\n\r\n public clear() {\r\n this.setCurrent(this.initialData);\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class FilterService {\r\n \r\n private displayFilterChangedSubject = new BehaviorSubject<boolean>(false);\r\n public filterChanged$ = this.displayFilterChangedSubject.asObservable();\r\n \r\n displayFilter: boolean = true;\r\n get DisplayFilter() { return this.displayFilter; } \r\n\r\n \r\n keywords: string ='';\r\n get Keywords() { return this.keywords; } \r\n set Keywords(value: string) { this.keywords = value; } \r\n\r\n public constructor() {\r\n\r\n }\r\n setFilterDisplay(value: boolean) {\r\n if ( this.displayFilter != value ) {\r\n this.displayFilter = value;\r\n \r\n // Déclenchement de l'évènement de changement d'affichage du filtre\r\n this.displayFilterChangedSubject.next(this.displayFilter);\r\n }\r\n }\r\n\r\n toggleFilterDisplay() {\r\n this.displayFilter = !this.displayFilter;\r\n \r\n // Déclenchement de l'évènement de changement d'affichage du filtre\r\n this.displayFilterChangedSubject.next(this.displayFilter);\r\n }\r\n}","import { Utilities } from \"@dflat-core/web/core\";\r\nimport { EventEmitter, Injectable } from \"@angular/core\";\r\nimport { NamedPosition } from \"../model/model\";\r\nimport { AppKeys } from \"./app-keys\";\r\nimport { LocalStoreManager } from \"./local-store-manager.service\";\r\n\r\n\r\n@Injectable()\r\nexport class GeolocationService {\r\n\r\n positionsHistory: Array<NamedPosition> = new Array<NamedPosition>(0);\r\n positionChanged: EventEmitter<NamedPosition> = new EventEmitter();\r\n \r\n constructor(protected localStore: LocalStoreManager) {\r\n try {\r\n let saveLocations = localStore.getDataObject<Array<NamedPosition>>(AppKeys.LAST_GEOLOCATIONS, false);\r\n if ( ! Utilities.IsNil(saveLocations))\r\n this.positionsHistory = saveLocations; \r\n }\r\n catch {}\r\n }\r\n\r\n getCurrentPosition(): NamedPosition {\r\n // Retourne la dernière valeur de l'historique\r\n if (! Utilities.IsNil(this.positionsHistory) && this.positionsHistory.length > 0)\r\n return this.positionsHistory[0];\r\n }\r\n\r\n setCurrentPosition(formattedName: string, placeId:string , latitude: number, longitude: number) {\r\n\r\n // Création d'un objet de type NamedPosition\r\n let currentPosition : NamedPosition = { \r\n placeId: placeId,\r\n formattedName: formattedName,\r\n latitude:latitude,\r\n longitude: longitude\r\n };\r\n\r\n // Insertion de la dernière position dans l'historique (on ne garde que les 5 dernières positions)\r\n this.positionsHistory.unshift(currentPosition);\r\n if ( this.positionsHistory.length > 5 )\r\n this.positionsHistory.pop();\r\n\r\n // Sauvegarde dans le localStorage\r\n this.localStore.savePermanentData(this.positionsHistory, AppKeys.LAST_GEOLOCATIONS);\r\n\r\n // Déclenchement de l'évènement de changemetn de position courante.\r\n this.positionChanged.emit(currentPosition);\r\n }\r\n\r\n /**\r\n * Calcule la distance en mètres entre la position courante et le point dont les coordonnées GPS sont spécifiées en paramètre.\r\n * @param latitude Latitude du point\r\n * @param longitude Longitude du point\r\n * @returns La distance en mètres entre la position courante et le point dont les coordonnées GPS sont spécifiées en paramètre.\r\n */\r\n getDistanceToCurrent(latitude : number, longitude: number) : number {\r\n \r\n // Distance entre les coordonnées spécifiées et la position courante.\r\n let position : NamedPosition = this.getCurrentPosition();\r\n if ( Utilities.IsNil(position) )\r\n return undefined;\r\n\r\n return this.getDistance(position.latitude, position.longitude, latitude, longitude);\r\n }\r\n\r\n /** Calcule la distance en mètres entre 2 points en coordonnées GPS.\r\n * @param latitude1 Latitude du point 1\r\n * @param longitude1 Longitude du point 1\r\n * @param latitude2 Latitude du point 2\r\n * @param longitude2 Longitude du point 2\r\n * @returns Une estimation la distance en mètres entre les point GPS 1 et 2 dont les coordonnées sont spécifiées.\r\n */\r\n getDistance(latitude1: number, longitude1 : number, latitude2: number, longitude2 : number) {\r\n \r\n // Connaissant la position de deux points A et B sur une sphère, calculer la distance entre eux\r\n // revient à calculer l'abscisse curviligne S (AB) sur le grand cercle passant par A et B.\r\n // Si l’on considère deux points A et B sur la sphère, de latitudes ϕA et ϕB et de longitudes λA et λB, \r\n // alors la distance angulaire en radians SA-B entre A et B est donnée par la relation fondamentale de trigonométrie\r\n // sphérique, utilisant dλ = λB – λA :\r\n // SA-B = arc cos (sin ϕA sin ϕB + cos ϕA cos ϕB cos dλ)\r\n // La distance S en mètres, s’obtient en multipliant SA-B par un rayon de la Terre conventionnel (6 378 137 mètres par exemple).\r\n\r\n // Conversion en radian\r\n let a: number = latitude1 * Math.PI / 180;\r\n let b: number = longitude1 * Math.PI / 180;\r\n let c: number = latitude2 * Math.PI / 180;\r\n let d: number = longitude2 * Math.PI / 180;\r\n\r\n // Calcul de la distance en m\r\n let e = Math.sin(a) * Math.sin(c) + Math.cos(a) * Math.cos(c) * Math.cos(d - b);\r\n let result = 6378137 * Math.acos(e);\r\n\r\n return result;\r\n }\r\n\r\n \r\n\r\n}","\r\nimport { map } from 'rxjs/operators';\r\nimport { ReplaySubject, Subject } from 'rxjs';\r\n\r\n// based on https://github.com/ng-book/angular2-rxjs-chat/blob/master/app/ts/services/NotificationsService.ts\r\nimport { Notification } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\ntype INotificationsOperation = (notifications: Notification[]) => Notification[];\r\n\r\n@Injectable()\r\nexport class NotificationsService {\r\n private notificationsList: Notification[] = [];\r\n \r\n // a stream that publishes new notifications only once\r\n public newNotifications: Subject<Notification> = new Subject<Notification>();\r\n\r\n // `notifications` is a stream that emits an array of the most up to date notifications\r\n public notifications: ReplaySubject<Notification[]> = new ReplaySubject<Notification[]>(1);\r\n\r\n // `updates` receives _operations_ to be applied to our `notifications`\r\n // it's a way we can perform changes on *all* notifications (that are currently\r\n // stored in `notifications`)\r\n public updates: Subject<any> = new Subject<any>();\r\n\r\n // action streams\r\n public create: Subject<Notification> = new Subject<Notification>();\r\n // public markThreadAsRead: Subject<any> = new Subject<any>();\r\n\r\n constructor() {\r\n // recois des operation, et les fais sur la liste interne, puis diffuse le resultat sur notifications\r\n this.updates.subscribe((ope) => {\r\n this.notificationsList = ope(this.notificationsList);\r\n this.notifications.next(this.notificationsList);\r\n });\r\n\r\n this.newNotifications.pipe(\r\n map(function(notification: Notification): INotificationsOperation {\r\n return (notifications: Notification[]) => {\r\n return notifications.concat(notification);\r\n };\r\n }))\r\n .subscribe(this.updates);\r\n\r\n }\r\n\r\n // an imperative function call to this action stream\r\n public addNotification(notification: Notification): void {\r\n this.newNotifications.next(notification);\r\n }\r\n\r\n}\r\n","import { FormChangedMessage, Notification, PresentationChangedMessage, UserUpdatedMessage } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\nimport * as signalR from '@microsoft/signalr';\r\n\r\nimport { AppKeys } from './app-keys';\r\nimport { AuthService } from './auth.service';\r\nimport { BusMessageService, NotificationMqService } from './busmessage.service';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\nimport { NotificationsService } from './notifications.service';\r\nimport { EnvironmentBase } from '@dflat-core/web/core';\r\n\r\nenum RequestState {\r\n Pending = 0,\r\n InProgress = 1,\r\n Success = 2,\r\n Error = 3,\r\n Warning = 4,\r\n}\r\n/*\r\n signalR Hub Service.\r\n Currently chimera class, both registering to a the dflatHub and registering handlers.\r\n TODO Extract handlers elsewhere.\r\n*/\r\n@Injectable()\r\nexport class HubService {\r\n\r\n protected hubUrl = this.env.hubUrl;\r\n private timer$: any;\r\n\r\n protected hubConnection: signalR.HubConnection = null;\r\n isConnected: boolean = false;\r\n isReconnect: boolean = false;\r\n isInit: boolean;\r\n isConnecting: boolean;\r\n\r\n get hubOptions(): signalR.IHttpConnectionOptions {\r\n let _self = this;\r\n var options = {\r\n skipNegotiation: true,\r\n transport: signalR.HttpTransportType.WebSockets,\r\n accessTokenFactory: () => {\r\n const token = _self.localStorage.getDataObject<string>(AppKeys.ACCESS_TOKEN);\r\n return token;\r\n }\r\n };\r\n return options;\r\n }\r\n\r\n constructor(\r\n protected localStorage: LocalStoreManager,\r\n protected notificationService: NotificationsService,\r\n protected busMsg: BusMessageService,\r\n protected mqMsg: NotificationMqService,\r\n protected authService: AuthService,\r\n protected env: EnvironmentBase\r\n ) {\r\n this.busMsg.of(UserUpdatedMessage).subscribe(msg =>\r\n {\r\n // log out\r\n if(msg.userKey === null){\r\n this.disposeConnection();\r\n }\r\n else {\r\n this.startHub();\r\n }\r\n });\r\n }\r\n\r\n //TODO REFACTO\r\n\r\n init() {\r\n\r\n if ( ! this.isInit ) {\r\n this.startHub();\r\n this.isInit = true;\r\n }\r\n }\r\n\r\n disposeConnection() {\r\n if (this.hubConnection) {\r\n this.hubConnection.stop();\r\n }\r\n }\r\n\r\n startHub() {\r\n\r\n // Si la connnexion est déjà active ou qu'un utilisateur n'est pas connecté on ne fait rien.\r\n if(this.isConnected || ! this.authService.isLoggedIn || this.isConnecting)\r\n return;\r\n\r\n\r\n this.isConnecting = true;\r\n\r\n var options = this.hubOptions;;\r\n this.hubConnection = new signalR.HubConnectionBuilder()\r\n .withUrl(this.hubUrl, options)\r\n .configureLogging(signalR.LogLevel.Trace)\r\n .build();\r\n this.hubConnection.serverTimeoutInMilliseconds = 30000;\r\n\r\n this.configure();\r\n\r\n this.hubConnection\r\n .start()\r\n .then(() => {\r\n console.log('*****Connection started!');\r\n this.isConnected = true;\r\n this.isConnecting = false;\r\n clearInterval(this.timer$);\r\n })\r\n .catch(err => {\r\n console.log('Error while establishing connection :(', err);\r\n this.isConnected = false;\r\n this.isConnecting = false;\r\n clearInterval(this.timer$);\r\n this.scheduleStartingHub();\r\n })\r\n }\r\n configure() {\r\n // subscribe to operation log from server\r\n this.hubConnection.on('OperationLog', (uid: string, message: string) => {\r\n this.publishEvents(new Notification({ id: undefined, content: message, class: undefined, entityType: uid, entityId: undefined }));\r\n });\r\n\r\n // subscribe to broadcasted messagse from server\r\n this.hubConnection.on('BroadcastMessage', (name: string, message: string) => {\r\n // console.log(`BroadcastMessage received : ${message}, ${name}`);\r\n });\r\n\r\n //Subscriptions have to be prior the connection start so the server hub knows which 'events' this client is eligible for.\r\n this.hubConnection.on(\"ReportProgress\", (name: string, message: string, state: RequestState, entityType: string, entityId: number) => {\r\n // console.log(`ReportProgress: name: ${name} | message: ${message} | state: ${state} | entityType: ${entityType} | entityId: ${entityId} `);\r\n //let end = state === RequestState.Success || state === RequestState.Error || state === RequestState.Warning ;\r\n let classNotif = \"info\";\r\n\r\n //if (end) {\r\n\r\n const notif = new Notification({ id: name, content: message, class: classNotif, entityType: entityType, entityId: entityId });\r\n this.publishEvents(notif);\r\n //}\r\n });\r\n\r\n // Formulaire modifié en base (éditeur de formulaire, écrans des formulaires) : relayé sur le bus,\r\n // le cache d'initialisation est vidé (InitCacheService) et les écrans ouverts rechargent leur formulaire.\r\n this.hubConnection.on('FormChanged', (entityName: string | null, stamp: number) => {\r\n this.busMsg.publish(new FormChangedMessage(entityName, stamp));\r\n });\r\n\r\n // Profil de présentation partagé modifié en base (écran des profils de présentation) : relayé sur le bus,\r\n // le cache d'initialisation est vidé (InitCacheService) et les grilles ouvertes rechargent leurs colonnes.\r\n this.hubConnection.on('PresentationChanged', (entityName: string | null, stamp: number) => {\r\n this.busMsg.publish(new PresentationChangedMessage(entityName, stamp));\r\n });\r\n\r\n //Registers a handler that will be invoked when the connection is closed.\r\n this.hubConnection.onclose(e => {\r\n console.log(`Hub connection closed !`);\r\n this.isConnected = false;\r\n this.scheduleStartingHub();\r\n\r\n });\r\n }\r\n\r\n\r\n scheduleStartingHub(){\r\n\r\n // chaque 30s\r\n this.timer$ = setInterval(() => {\r\n console.log(\"retry start hub\");\r\n this.startHub();\r\n }, 30000);\r\n\r\n }\r\n\r\n publishEvents(notif: Notification) {\r\n this.mqMsg.publish(notif);\r\n }\r\n}\r\n\r\n","import jwt_decode from 'jwt-decode';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError, map, shareReplay } from 'rxjs/operators';\r\n\r\nimport { Utilities } from '@dflat-core/web/core';\r\nimport { FormChangedMessage, PresentationChangedMessage, UserUpdatedMessage } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\nimport { AppKeys } from './app-keys';\r\nimport { BusMessageService } from './busmessage.service';\r\nimport { LocalStoreManager } from './local-store-manager.service';\r\n\r\n/**\r\n * Cache des données d'initialisation des écrans (colonnes, descripteurs de filtre, filtre vide,\r\n * actions, formulaire) : tout ce qui est chargé avant la recherche et ne change pas d'une\r\n * ouverture à l'autre.\r\n *\r\n * Le cache est vidé quand le jeton d'accès reçu (connexion, rafraîchissement, déconnexion)\r\n * porte un autre horodatage serveur (claim \"cachestamp\", régénéré à chaque redémarrage de l'API\r\n * ou par Config/ResetClientCache, ou après la modification d'un formulaire) ou un autre\r\n * utilisateur. Les entrées d'une entité sont aussi vidées dès que le hub signale que son\r\n * formulaire a été modifié (FormChangedMessage).\r\n */\r\n@Injectable()\r\nexport class InitCacheService {\r\n public static readonly CACHE_STAMP = \"cachestamp\";\r\n public static readonly USER_ACCOUNT_ID = \"id\";\r\n\r\n private entries = new Map<string, Observable<any>>();\r\n private stamp: string;\r\n\r\n constructor(busMsg: BusMessageService, localStorage: LocalStoreManager) {\r\n this.stamp = this.readStamp(localStorage.getDataObject<string>(AppKeys.ACCESS_TOKEN));\r\n busMsg.of(UserUpdatedMessage).subscribe(message => this.onTokenChanged(message.userKey));\r\n busMsg.of(PresentationChangedMessage).subscribe(message => this.onPresentationChanged(message));\r\n busMsg.of(FormChangedMessage).subscribe(message => this.onFormChanged(message));\r\n }\r\n\r\n /**\r\n * Retourne la valeur en cache pour la clé, ou la charge par la fabrique (une seule requête,\r\n * partagée par les appels simultanés). Chaque abonné reçoit sa propre copie : il peut la\r\n * modifier sans toucher au cache.\r\n */\r\n get<T>(key: string, factory: () => Observable<T>): Observable<T> {\r\n let entry = this.entries.get(key);\r\n if (!entry) {\r\n entry = factory().pipe(\r\n catchError(error => {\r\n // Un échec n'est pas gardé : l'appel suivant recharge.\r\n if (this.entries.get(key) === entry) {\r\n this.entries.delete(key);\r\n }\r\n return throwError(() => error);\r\n }),\r\n shareReplay(1));\r\n this.entries.set(key, entry);\r\n }\r\n return entry.pipe(map(value => Utilities.deepCopy(value)));\r\n }\r\n\r\n /** Vide le cache, ou seulement les entrées dont la clé commence par le préfixe. */\r\n clear(prefix?: string): void {\r\n if (Utilities.IsNil(prefix)) {\r\n this.entries.clear();\r\n return;\r\n }\r\n Array.from(this.entries.keys())\r\n .filter(key => key.startsWith(prefix))\r\n .forEach(key => this.entries.delete(key));\r\n }\r\n\r\n /** Formulaire modifié : vide les entrées de l'entité (clé « entité/... »), ou tout le cache. */\r\n private onFormChanged(message: FormChangedMessage): void {\r\n Array.from(this.entries.keys())\r\n .filter(key => message.concerns(key.split('/')[0]))\r\n .forEach(key => this.entries.delete(key));\r\n }\r\n\r\n /** Profil de présentation modifié : vide les entrées de l'entité (clé « entité/... »), ou tout le cache. */\r\n private onPresentationChanged(message: PresentationChangedMessage): void {\r\n Array.from(this.entries.keys())\r\n .filter(key => message.concerns(key.split('/')[0]))\r\n .forEach(key => this.entries.delete(key));\r\n }\r\n\r\n private onTokenChanged(token: string): void {\r\n const stamp = this.readStamp(token);\r\n if (stamp !== this.stamp) {\r\n this.stamp = stamp;\r\n this.clear();\r\n }\r\n }\r\n\r\n /** Identité du cache : horodatage serveur et utilisateur du jeton (null sans jeton). */\r\n private readStamp(token: string): string {\r\n if (!token) {\r\n return null;\r\n }\r\n try {\r\n const decoded = jwt_decode(token);\r\n return `${decoded[InitCacheService.CACHE_STAMP]}|${decoded[InitCacheService.USER_ACCOUNT_ID]}`;\r\n }\r\n catch {\r\n return null;\r\n }\r\n }\r\n}\r\n","\r\nimport { map } from 'rxjs/operators';\r\nimport { ReplaySubject, Subject } from 'rxjs';\r\n\r\n// based on https://github.com/ng-book/angular2-rxjs-chat/blob/master/app/ts/services/MessagesService.ts\r\nimport { Message } from '@dflat-core/web/core-model';\r\nimport { Injectable } from '@angular/core';\r\n\r\ntype IMessagesOperation = (messages: Message[]) => Message[];\r\n\r\n@Injectable()\r\nexport class MessagesService {\r\n private messagesList: Message[] = [];\r\n // a stream that publishes new messages only once\r\n public newMessages: Subject<Message> = new Subject<Message>();\r\n\r\n // `messages` is a stream that emits an array of the most up to date messages\r\n public messages: ReplaySubject<Message[]> = new ReplaySubject<Message[]>(1);\r\n\r\n // `updates` receives _operations_ to be applied to our `messages`\r\n // it's a way we can perform changes on *all* messages (that are currently\r\n // stored in `messages`)\r\n public updates: Subject<any> = new Subject<any>();\r\n\r\n // action streams\r\n public create: Subject<Message> = new Subject<Message>();\r\n // public markThreadAsRead: Subject<any> = new Subject<any>();\r\n\r\n constructor() {\r\n // recois des operation, et les fais sur la liste interne, puis diffuse le resultat sur messages\r\n this.updates.subscribe((ope) => {\r\n this.messagesList = ope(this.messagesList);\r\n this.messages.next(this.messagesList);\r\n });\r\n\r\n this.newMessages.pipe(\r\n map(function(message: Message): IMessagesOperation {\r\n return (messages: Message[]) => {\r\n return messages.concat(message);\r\n };\r\n }))\r\n .subscribe(this.updates);\r\n\r\n }\r\n\r\n // an imperative function call to this action stream\r\n public addMessage(message: Message): void {\r\n this.newMessages.next(message);\r\n }\r\n\r\n}\r\n","import { Utilities } from '@dflat-core/web/core';\r\nimport { EventEmitter, Injectable } from '@angular/core';\r\nimport { ScreenConfiguration } from '../model/model';\r\n\r\n\r\n@Injectable()\r\nexport class ScreenService {\r\n screenChanged: EventEmitter<ScreenConfiguration> = new EventEmitter();\r\n scrollChanged: EventEmitter<Element> = new EventEmitter();\r\n \r\n config: ScreenConfiguration;\r\n \r\n public constructor() {\r\n\r\n }\r\n\r\n getScreenConfiguration(): ScreenConfiguration {\r\n return this.config;\r\n }\r\n\r\n setScreenConfiguration(value: ScreenConfiguration) {\r\n // Si la valeur passée est vide, on ne fait rien.\r\n if ( Utilities.IsNil(value))\r\n return;\r\n\r\n // Sinon, on vérifie qu'une des valeurs de configuration a changé\r\n if (Utilities.IsNil(this.config) \r\n || this.config.isExtraSmallScreen != value.isExtraSmallScreen\r\n || this.config.isSmallScreen != value.isSmallScreen\r\n || this.config.isLargeScreen != value.isLargeScreen\r\n ) {\r\n this.config = value;\r\n\r\n // Déclenchement de l'évènement de changemetn de position courante.\r\n this.screenChanged.emit(this.config);\r\n }\r\n }\r\n\r\n scroll(elt: Element){\r\n \r\n // Déclenchement de l'évènement de scrolling\r\n this.scrollChanged.emit(elt);\r\n }\r\n\r\n\r\n}","\r\nimport { ReplaySubject } from 'rxjs';\r\n\r\nimport { IUserCredential, User } from '@dflat-core/web/core-model';\r\nimport { EventEmitter, Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\nimport { AuthService } from './auth.service';\r\nimport { Utilities } from '@dflat-core/web/core';\r\n\r\n\r\n@Injectable()\r\nexport class UserService {\r\n\r\n public userChanged: EventEmitter<User> = new EventEmitter<User>();\r\n private current: ReplaySubject<User> = new ReplaySubject<User>(1);\r\n private editUser: ReplaySubject<any> = new ReplaySubject<any>( 1 );\r\n constructor(\r\n private router: Router,\r\n private authService: AuthService\r\n ) { }\r\n\r\n public setCurrent(user: User) {\r\n this.current.next(user);\r\n this.userChanged.emit(user);\r\n }\r\n \r\n public getCurrent() {\r\n return this.current;\r\n }\r\n\r\n public openEditUser(){\r\n this.editUser.next(1);\r\n }\r\n\r\n public getEditUser(){\r\n return this.editUser;\r\n }\r\n\r\n get AuthenticatedUser(): User {\r\n let user = this.authService.currentUser;\r\n let parsed = JSON.parse(user);\r\n let login : IUserCredential = parsed as IUserCredential;\r\n if ( Utilities.IsNil(login))\r\n return undefined;\r\n return new User(login);\r\n }\r\n\r\n public logout() {\r\n const user = new User({} as IUserCredential);\r\n user.IsConnected = false;\r\n this.setCurrent(user); \r\n this.authService.logout(this.authService.pseudo);\r\n \r\n }\r\n}\r\n","// IMPORTANT : DANS LE BUT DE FACILITER LES MERGE ET LA LECTURE DU CODE.\r\n\r\n// 1. TOUJOURS CONSERVER LE TRI SUR LES IMPORTS\r\n// UTILISER L'EXTENSION \"TypeScript Import Sorter\" DANS VSCODE.\r\n// CONFIGURER L'EXTENSION POUR ACTIVER LA MISE EN FORME AUTOMATIQUE A LA SAUVEGARDE \r\n\r\n// 2. UTILISER CTRL-SHIFT O POUR SUPPRIMER AUTOMATIQUEMENT LES IMPORTS INUTILES\r\n\r\n// 3. TRIER LES COMPOSANTS OU DEPENDANCES DANS LES DECLARATIONS (IMPORTS, EXPORTS)\r\n// SELECTION DU TEXTE PUIS CTRL-SHIFT P, \"Sort Lines Ascending\"\r\n// ON PEUT PARAMETRER DES RACCOURCIS CLAVIER DANS VSCODE\r\nimport { EnsureModuleLoadedOnceGuard } from '@dflat-core/web/core';\r\nimport { CoreModelModule } from '@dflat-core/web/core-model';\r\n// PAR EXEMPLE : CTRL-T UP (TRI CROISSANT) ou CTRL-T DOWN (TRI DECDROISSANT)\r\nimport { CommonModule } from '@angular/common';\r\nimport { provideHttpClient, withInterceptorsFromDi, withXhr } from '@angular/common/http';\r\nimport { NgModule, Optional, SkipSelf } from '@angular/core';\r\nimport { AppConfiguration } from './services/appConfig.service';\r\nimport { AuthGuard } from './services/auth-guard.service';\r\nimport { AuthService } from './services/auth.service';\r\nimport { ExternalLoginService } from './services/external-login.service';\r\nimport { BreadcrumbService } from './services/breadcrumb.service';\r\nimport { BusMessageService, NotificationMqService } from './services/busmessage.service';\r\nimport { FilterService } from './services/filter.service';\r\nimport { GeolocationService } from './services/geolocation.service';\r\nimport { HeadersService } from './services/headers.service';\r\nimport { HubService } from './services/hub.service';\r\nimport { InitCacheService } from './services/init-cache.service';\r\nimport { LocalStoreManager } from './services/local-store-manager.service';\r\nimport { MessagesService } from './services/message.service';\r\nimport { NotificationsService } from './services/notifications.service';\r\nimport { PermissionService } from './services/permission.service';\r\nimport { ScreenService } from './services/screen.service';\r\nimport { UserService } from './services/user.service';\r\n\r\n\r\n@NgModule({ exports: [],\r\n declarations: [], imports: [CommonModule, CoreModelModule], providers: [\r\n LocalStoreManager,\r\n GeolocationService,\r\n MessagesService,\r\n NotificationsService,\r\n PermissionService,\r\n UserService,\r\n AuthGuard,\r\n AuthService,\r\n ExternalLoginService,\r\n HeadersService,\r\n BusMessageService,\r\n BreadcrumbService,\r\n ScreenService,\r\n AppConfiguration,\r\n HubService,\r\n InitCacheService,\r\n NotificationMqService,\r\n FilterService,\r\n provideHttpClient(withXhr(), withInterceptorsFromDi())\r\n ] })\r\n// Ensure that CoreServicesModule is only loaded into AppModule\r\nexport class CoreServicesModule extends EnsureModuleLoadedOnceGuard {\r\n\r\n // Looks for the module in the parent injector to see if it's already been loaded (only want it loaded once)\r\n constructor( @Optional() @SkipSelf() parentModule: CoreServicesModule) {\r\n super(parentModule);\r\n }\r\n}\r\n\r\n","\r\nimport { Observable, empty as observableEmpty, throwError as observableThrowError } from 'rxjs';\r\n\r\nimport { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from \"@angular/common/http\";\r\nimport { Injectable, Injector } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\nimport { catchError } from 'rxjs/operators';\r\n\r\nimport { AuthService } from \"./auth.service\";\r\nimport { HeadersService } from \"./headers.service\";\r\n\r\nimport { ApiError, ApiErrorTypes } from '@dflat-core/web/core-model';\r\n\r\n@Injectable()\r\nexport class AuthInterceptor implements HttpInterceptor {\r\n\r\n constructor(\r\n protected router: Router,\r\n protected injector: Injector,\r\n \r\n ) {\r\n\r\n }\r\n\r\n intercept(\r\n req: HttpRequest<any>,\r\n next: HttpHandler\r\n ): Observable<HttpEvent<any>> {\r\n const headersService = this.injector.get(HeadersService);\r\n const authService = this.injector.get(AuthService);\r\n switch (req.method) {\r\n case \"GET\":\r\n req = req.clone({ headers: headersService.authFormHeaders(), withCredentials: true });\r\n break;\r\n case \"POST\":\r\n // let isFileUpload = req.url.match(/Upload|File/)\r\n // let headers;\r\n // if (isFileUpload) {\r\n // headers = headersService.authFileUploadHeaders();\r\n // }\r\n // else {\r\n // headers = headersService.authJsonHeaders();\r\n //}\r\n\r\n if ( req.headers['lazyUpdate'] == null) {\r\n req = req.clone({ headers: headersService.authJsonHeaders(), withCredentials: true });\r\n }\r\n break;\r\n default:\r\n req = req;\r\n break;\r\n }\r\n\r\n const r = req;\r\n\r\n return next.handle(req).pipe(catchError(err => {\r\n console.log(err);\r\n if (err instanceof HttpErrorResponse) {\r\n\r\n // Ignore signalr failure\r\n if (r.url.includes(\"/hub/\")) {\r\n return observableEmpty();\r\n }\r\n if (err.status === 401 || err.status === 403) {\r\n // Ignore login failed\r\n if (!(r.url.endsWith(\"/api/Account/Connect\"))) {\r\n authService.ensureLogout();\r\n this.router.navigate(['/login']);\r\n return observableEmpty();\r\n }\r\n }\r\n else if (err.status === 400) {\r\n let apiError: ApiError = {};\r\n apiError.ApiErrorType = ApiErrorTypes.UserError;\r\n apiError.Message = err.error;\r\n\r\n this.onError(err, apiError);\r\n\r\n }\r\n else {\r\n\r\n\r\n try {\r\n\r\n if ( err.error instanceof Blob) {\r\n err.error.text().then((str=>{\r\n let apiError: ApiError = JSON.parse(str) as ApiError;\r\n this.onError(err, apiError);\r\n }));\r\n }\r\n else {\r\n let apiError: ApiError = err.error as ApiError;\r\n this.onError(err, apiError);\r\n }\r\n\r\n // if (typeof err.error === \"string\") {\r\n\r\n\r\n // }\r\n // else {\r\n\r\n // let reader = new FileReader();\r\n // reader.addEventListener(\"loadend\",\r\n // () => {\r\n // let result = reader.result as string;\r\n // result = trimChar(result, \"\\\"\");\r\n // this.onError(err, result);\r\n\r\n // });\r\n // reader.readAsText(err.error);\r\n // }\r\n }\r\n catch (error) {\r\n let apiError: ApiError = {};\r\n apiError.ApiErrorType = ApiErrorTypes.UserError;\r\n apiError.Message = \"Une erreur a été détectée. Merci de contacter le service technique !\";\r\n\r\n this.onError(err, apiError);\r\n\r\n }\r\n }\r\n }\r\n return observableThrowError(err);\r\n }));\r\n }\r\n\r\n\r\n onError(errResponse : HttpErrorResponse, error: ApiError) {\r\n console.log(error.Message);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { UserService } from './user.service';\r\n\r\n@Injectable()\r\nexport class CanActivateGuard {\r\n private connected = false;\r\n\r\n constructor(\r\n private router: Router,\r\n private userService: UserService\r\n ) {\r\n this.userService.getCurrent().subscribe((user) => {\r\n this.connected = user.IsConnected;\r\n });\r\n }\r\n\r\n public canActivate() {\r\n if ( !this.connected ) {\r\n this.router.navigate( [ 'login' ] );\r\n }\r\n return this.connected;\r\n }\r\n}\r\n","export function trimChar(str:string,c:string)\r\n{\r\n // Escape special char when needed\r\n c = c === \"]\"\r\n ? \"\\\\]\"\r\n : c === \"\\\\\"\r\n ? \"\\\\\\\\\"\r\n : c;\r\n return str.replace(new RegExp(`^[${c}]+|[${c}]+$`,\"g\"),\"\");\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { MenuService } from './menu.service';\r\n\r\n/**\r\n * Menus des modules de l'application : chaque module racine ([module]-root) y déclare le sien,\r\n * `{ provide: MODULE_MENU_SERVICES, useExisting: <Module>MenuService, multi: true }`.\r\n * ApplicationMenuService les réunit en un seul menu.\r\n */\r\nexport const MODULE_MENU_SERVICES = new InjectionToken<MenuService[]>('MODULE_MENU_SERVICES');\r\n","export interface IErrorHandler {\r\n handleError(error: any);\r\n}\r\n\r\nexport class MenuItem {\r\n public id?: number;\r\n public title?: string;\r\n public link?: string;\r\n public icon?: string;\r\n public sublinks?: MenuItem[];\r\n public permissionKey?: string;\r\n public external?: boolean = false;\r\n public target?: string = '';\r\n \r\n public constructor(title?: string,\r\n link?: string,\r\n icon?: string,\r\n sublinks?: MenuItem[],\r\n permissionKey?: string)\r\n {\r\n this.title = title;\r\n this.link = link;\r\n this.icon = icon;\r\n this.sublinks = sublinks;\r\n this.permissionKey = permissionKey;\r\n }\r\n}\r\n\r\nexport interface NamedPosition {\r\n formattedName: string;\r\n placeId: string;\r\n latitude: number;\r\n longitude:number;\r\n\r\n}\r\n\r\nexport interface ScreenConfiguration {\r\n isSmallScreen: boolean;\r\n isExtraSmallScreen: boolean;\r\n isLargeScreen: boolean;\r\n}","import { Inject, Injectable, Optional } from '@angular/core';\r\n\r\nimport { MenuItem } from '../model/model';\r\nimport { MenuService } from './menu.service';\r\nimport { MODULE_MENU_SERVICES } from './module-menu-services.token';\r\nimport { PermissionService } from './permission.service';\r\n\r\n/**\r\n * Menu de l'application : réunion des menus de tous ses modules (déclarés sous\r\n * MODULE_MENU_SERVICES), dans l'ordre de déclaration. Les thèmes de même libellé sont fusionnés\r\n * et leurs éléments réunis sans doublon (même lien). Chaque module filtre ses éléments selon les\r\n * permissions de l'utilisateur connecté.\r\n *\r\n * Fourni sous MenuService par DflatAppModule.\r\n */\r\n@Injectable()\r\nexport class ApplicationMenuService extends MenuService {\r\n\r\n public constructor(\r\n permissionService: PermissionService,\r\n @Optional() @Inject(MODULE_MENU_SERVICES) private moduleMenus: MenuService[] | null\r\n ) {\r\n super(permissionService);\r\n }\r\n\r\n public getAllMenuItems(isAdmin: boolean): MenuItem[] {\r\n // Copies : merge complète les éléments de son premier thème de chaque libellé.\r\n const themes = (this.moduleMenus ?? [])\r\n .reduce((all, menu) => all.concat(menu.getAllMenuItems(isAdmin)), new Array<MenuItem>())\r\n .map(theme => new MenuItem(theme.title, theme.link, theme.icon, [...(theme.sublinks ?? [])], theme.permissionKey));\r\n\r\n return this.merge(themes)\r\n .map(theme => new MenuItem(theme.title, theme.link, theme.icon, this.distinctItems(theme.sublinks), theme.permissionKey));\r\n }\r\n\r\n public getAccessGrantedMenuItems(): MenuItem[] {\r\n return (this.moduleMenus ?? [])\r\n .reduce((all, menu) => all.concat(menu.getAccessGrantedMenuItems() ?? []), new Array<MenuItem>());\r\n }\r\n\r\n /** Éléments sans doublon : le premier élément de chaque lien est gardé. */\r\n private distinctItems(items: MenuItem[] | undefined): MenuItem[] {\r\n const links = new Set<string | undefined>();\r\n return (items ?? []).filter(item => {\r\n if (item.link !== undefined && links.has(item.link))\r\n return false;\r\n links.add(item.link);\r\n return true;\r\n });\r\n }\r\n}\r\n"],"mappings":"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"}