diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts index 0281bb3a..c7c52faf 100644 --- a/src/app/admin/admin.module.ts +++ b/src/app/admin/admin.module.ts @@ -27,6 +27,7 @@ import { UserTableComponent } from './users/user-list/user-table/user-table.comp import { UsersComponent } from './users/users.component'; import { MatSelectModule } from '@angular/material/select'; import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSelectSearchModule } from '@shared/components/mat-select-search/mat-select-search.module'; @NgModule({ declarations: [ @@ -60,6 +61,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; SharedModule, MatSelectModule, MatFormFieldModule, + MatSelectSearchModule, ], exports: [ UserDetailComponent, @@ -79,4 +81,4 @@ import { MatFormFieldModule } from '@angular/material/form-field'; OrganisationListComponent, ], }) -export class AdminModule { } +export class AdminModule {} diff --git a/src/app/admin/organisation/organisation-detail/organisation-detail.component.ts b/src/app/admin/organisation/organisation-detail/organisation-detail.component.ts index 74b8b36f..a2a2f0ee 100644 --- a/src/app/admin/organisation/organisation-detail/organisation-detail.component.ts +++ b/src/app/admin/organisation/organisation-detail/organisation-detail.component.ts @@ -14,6 +14,7 @@ import { DeleteDialogService } from '@shared/components/delete-dialog/delete-dia import { DropdownButton } from '@shared/models/dropdown-button.model'; import { ApplicationService } from '@applications/application.service'; import { environment } from '@environments/environment'; +import { Title } from '@angular/platform-browser'; @Component({ selector: 'app-organisation-detail', @@ -47,7 +48,8 @@ export class OrganisationDetailComponent implements OnInit, OnChanges, OnDestroy private organisationService: OrganisationService, private permissionsService: PermissionService, private deleteDialogService: DeleteDialogService, - private location: Location + private location: Location, + private titleService: Title ) { } ngOnChanges(changes: SimpleChanges): void { @@ -64,10 +66,11 @@ export class OrganisationDetailComponent implements OnInit, OnChanges, OnDestroy editRouterLink: 'edit-organisation', isErasable: true, } - this.translate.get(['NAV.ORGANISATIONS', 'ORGANISATION.DROPDOWN']) + this.translate.get(['NAV.ORGANISATIONS', 'ORGANISATION.DROPDOWN', 'TITLE.ORGANIZATION']) .subscribe(translations => { this.backButton.label = translations['NAV.ORGANISATIONS']; this.dropdownButton.label = translations['ORGANISATION.DROPDOWN']; + this.titleService.setTitle(translations['TITLE.ORGANIZATION']) }); } diff --git a/src/app/admin/organisation/organisation-list/organisation-list.component.ts b/src/app/admin/organisation/organisation-list/organisation-list.component.ts index f4f383b2..3ce2a103 100644 --- a/src/app/admin/organisation/organisation-list/organisation-list.component.ts +++ b/src/app/admin/organisation/organisation-list/organisation-list.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { Title } from '@angular/platform-browser'; import { TranslateService } from '@ngx-translate/core'; import { Sort } from '@shared/models/sort.model'; @@ -9,9 +10,14 @@ import { Sort } from '@shared/models/sort.model'; }) export class OrganisationListComponent implements OnInit { - constructor(public translate: TranslateService) { + constructor(public translate: TranslateService, private titleService: Title) { translate.use('da'); } - ngOnInit(): void { } + ngOnInit(): void { + this.translate.get(['TITLE.ORGANIZATION']) + .subscribe(translations => { + this.titleService.setTitle(translations['TITLE.ORGANIZATION']); + }); + } } diff --git a/src/app/admin/organisation/organisation-list/organisation-tabel/organisation-tabel.component.html b/src/app/admin/organisation/organisation-list/organisation-tabel/organisation-tabel.component.html index a482c50f..47af0f9b 100644 --- a/src/app/admin/organisation/organisation-list/organisation-tabel/organisation-tabel.component.html +++ b/src/app/admin/organisation/organisation-list/organisation-tabel/organisation-tabel.component.html @@ -1,4 +1,7 @@
+
+ +
diff --git a/src/app/admin/permission/permission-detail/permission-detail.component.ts b/src/app/admin/permission/permission-detail/permission-detail.component.ts index 3824c77d..28a0ab3e 100644 --- a/src/app/admin/permission/permission-detail/permission-detail.component.ts +++ b/src/app/admin/permission/permission-detail/permission-detail.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core'; +import { Component, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { PermissionService } from '@app/admin/permission/permission.service'; @@ -6,15 +6,11 @@ import { Subscription } from 'rxjs'; import { PermissionResponse } from '../permission.model'; import { BackButton } from '@shared/models/back-button.model'; import { QuickActionButton } from '@shared/models/quick-action-button.model'; -import { Application } from '@applications/application.model'; -import { ApplicationService } from '@applications/application.service'; -import { SharedVariableService } from '@shared/shared-variable/shared-variable.service'; -import { OrganisationResponse } from '@app/admin/organisation/organisation.model'; -import { OrganisationService } from '@app/admin/organisation/organisation.service'; import { UserResponse } from '@app/admin/users/user.model'; import { DropdownButton } from '@shared/models/dropdown-button.model'; import { DeleteDialogService } from '@shared/components/delete-dialog/delete-dialog.service'; import { environment } from '@environments/environment'; +import { Title } from '@angular/platform-browser'; @Component({ @@ -53,6 +49,7 @@ export class PermissionDetailComponent implements OnInit, OnChanges { private route: ActivatedRoute, private permissionService: PermissionService, private router: Router, + private titleService: Title, private deleteDialogService: DeleteDialogService ) { } @@ -67,10 +64,11 @@ export class PermissionDetailComponent implements OnInit, OnChanges { isErasable: true, } } - this.translate.get(['NAV.PERMISSIONS', 'PERMISSION.DETAIL.DROPDOWN']) + this.translate.get(['NAV.PERMISSIONS', 'PERMISSION.DETAIL.DROPDOWN', 'TITLE.PERMISSION']) .subscribe(translations => { this.backButton.label = translations['NAV.PERMISSIONS']; this.dropdownButton.label = translations['PERMISSION.DETAIL.DROPDOWN']; + this.titleService.setTitle(translations['TITLE.PERMISSION']); }); } diff --git a/src/app/admin/permission/permission-edit/permission-edit.component.html b/src/app/admin/permission/permission-edit/permission-edit.component.html index 7271c86f..f110c567 100644 --- a/src/app/admin/permission/permission-edit/permission-edit.component.html +++ b/src/app/admin/permission/permission-edit/permission-edit.component.html @@ -31,19 +31,16 @@
- - - - {{user.name}} ({{user.email}}) - + + + + + {{getTextForUser(user)}} + - +
@@ -61,26 +58,28 @@
-
-
+
+
- + + + + {{app.name}} + +
-
+
- + {{'PERMISSION.EDIT.ADD-APPLICATION-ON-CREATE' | translate}}
diff --git a/src/app/admin/permission/permission-edit/permission-edit.component.ts b/src/app/admin/permission/permission-edit/permission-edit.component.ts index 55a94048..327d8572 100644 --- a/src/app/admin/permission/permission-edit/permission-edit.component.ts +++ b/src/app/admin/permission/permission-edit/permission-edit.component.ts @@ -1,9 +1,9 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { HttpErrorResponse } from '@angular/common/http'; -import { FormGroup } from '@angular/forms'; +import { FormControl, FormGroup } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; -import { Subscription } from 'rxjs'; +import { ReplaySubject, Subject, Subscription } from 'rxjs'; import { Location } from '@angular/common'; import { PermissionService } from '../permission.service'; import { PermissionRequest, PermissionType } from '../permission.model'; @@ -15,13 +15,14 @@ import { ApplicationService } from '@applications/application.service'; import { Application } from '@applications/application.model'; import { BackButton } from '@shared/models/back-button.model'; import { ErrorMessageService } from '@shared/error-message.service'; +import { takeUntil } from 'rxjs/operators'; @Component({ selector: 'app-permission-edit', templateUrl: './permission-edit.component.html', styleUrls: ['./permission-edit.component.scss'], }) -export class PermissionEditComponent implements OnInit { +export class PermissionEditComponent implements OnInit, OnDestroy { permission = new PermissionRequest(); public organisations: OrganisationResponse[]; public users: UserResponse[]; @@ -31,7 +32,10 @@ export class PermissionEditComponent implements OnInit { public errorFields: string[]; public formFailedSubmit = false; public form: FormGroup; - public backButton: BackButton = { label: '', routerLink: ['admin','permissions'] }; + public backButton: BackButton = { + label: '', + routerLink: ['admin', 'permissions'], + }; public title = ''; public submitButton = ''; public isEditMode = false; @@ -41,6 +45,18 @@ export class PermissionEditComponent implements OnInit { userSubscription: Subscription; applicationSubscription: Subscription; + public userMultiCtrl: FormControl = new FormControl(); + public userMultiFilterCtrl: FormControl = new FormControl(); + public filteredUsersMulti: ReplaySubject = new ReplaySubject< + UserResponse[] + >(1); + + public applicationMultiCtrl: FormControl = new FormControl(); + public applicationMultiFilterCtrl: FormControl = new FormControl(); + public filteredApplicationsMulti: ReplaySubject< + Application[] + > = new ReplaySubject(1); + constructor( private translate: TranslateService, private route: ActivatedRoute, @@ -69,6 +85,64 @@ export class PermissionEditComponent implements OnInit { this.isEditMode = true; this.setBackButton(); } + + this.userMultiFilterCtrl.valueChanges + .pipe(takeUntil(this._onDestroy)) + .subscribe(() => { + this.filterUsersMulti(); + }); + + this.applicationMultiFilterCtrl.valueChanges + .pipe(takeUntil(this._onDestroy)) + .subscribe(() => { + this.filterApplicationsMulti(); + }); + } + + private filterApplicationsMulti() { + if (!this.applications) { + return; + } + // get the search keyword + let search = this.applicationMultiFilterCtrl.value; + if (!search) { + this.filteredApplicationsMulti.next(this.applications.slice()); + return; + } else { + search = search.toLowerCase(); + } + // filter the banks + this.filteredApplicationsMulti.next( + this.applications.filter( + (app) => app.name.toLowerCase().indexOf(search) > -1 + ) + ); + } + + private filterUsersMulti() { + if (!this.users) { + return; + } + // get the search keyword + let search = this.userMultiFilterCtrl?.value?.trim(); + if (!search) { + this.filteredUsersMulti.next(this.users.slice()); + return; + } else { + search = search.toLowerCase(); + } + const filtered = this.users.filter((user) => { + return ( + user.name.toLocaleLowerCase().indexOf(search) > -1 || + user?.email?.toLocaleLowerCase()?.indexOf(search) > -1 + ); + }); + // filter the banks + this.filteredUsersMulti.next(filtered); + } + + getTextForUser(user: UserResponse): string { + return `${user.name}` + (user.email ? ` (${user.email})` : ``); } private setBackButton() { @@ -92,6 +166,7 @@ export class PermissionEditComponent implements OnInit { this.userSubscription = this.userService.getMultiple().subscribe( (users) => { this.users = users.data; + this.filteredUsersMulti.next(this.users.slice()); }, (error: HttpErrorResponse) => { this.showError(error); @@ -113,6 +188,7 @@ export class PermissionEditComponent implements OnInit { .subscribe( (res) => { this.applications = res.data; + this.filteredApplicationsMulti.next(this.applications.slice()); }, (error: HttpErrorResponse) => { this.showError(error); @@ -127,7 +203,9 @@ export class PermissionEditComponent implements OnInit { this.permission.name = response.name; this.permission.level = response.type; this.permission.userIds = response.users.map((x) => x.id); - this.permission.automaticallyAddNewApplications = response.automaticallyAddNewApplications; + this.userMultiCtrl.setValue(this.permission.userIds); + this.permission.automaticallyAddNewApplications = + response.automaticallyAddNewApplications; if (response.type !== PermissionType.GlobalAdmin) { this.permission.organizationId = response?.organization?.id; @@ -141,6 +219,7 @@ export class PermissionEditComponent implements OnInit { this.permission.applicationIds = response.applications.map( (x) => x.id ); + this.applicationMultiCtrl.setValue(this.permission.applicationIds); } }, (error: HttpErrorResponse) => { @@ -199,17 +278,19 @@ export class PermissionEditComponent implements OnInit { } } - isOrganizationAdministrationPermission() { + isOrganizationApplicationPermission() { return ( this.permission.level == PermissionType.OrganizationApplicationPermissions || - this.permission.level == PermissionType.Write || - this.permission.level == PermissionType.Read + this.isReadOrWrite() ); } isReadOrWrite(): boolean { - return this.permission.level === PermissionType.Read || this.permission.level === PermissionType.Write + return ( + this.permission.level === PermissionType.Read || + this.permission.level === PermissionType.Write + ); } onSubmit(): void { @@ -229,4 +310,12 @@ export class PermissionEditComponent implements OnInit { routeBack(): void { this.location.back(); } + + /** Subject that emits when the component has been destroyed. */ + private _onDestroy = new Subject(); + + ngOnDestroy() { + this._onDestroy.next(); + this._onDestroy.complete(); + } } diff --git a/src/app/admin/permission/permission-list/permission-list.component.html b/src/app/admin/permission/permission-list/permission-list.component.html index 22b72525..e41723ac 100644 --- a/src/app/admin/permission/permission-list/permission-list.component.html +++ b/src/app/admin/permission/permission-list/permission-list.component.html @@ -1,4 +1,4 @@ -
diff --git a/src/app/admin/permission/permission-list/permission-list.component.ts b/src/app/admin/permission/permission-list/permission-list.component.ts index 03cb7393..cec1432d 100644 --- a/src/app/admin/permission/permission-list/permission-list.component.ts +++ b/src/app/admin/permission/permission-list/permission-list.component.ts @@ -5,6 +5,7 @@ import { Subscription } from 'rxjs'; import { PermissionService } from '../permission.service'; import { Sort } from '@shared/models/sort.model'; import { environment } from '@environments/environment'; +import { Title } from '@angular/platform-browser'; @Component({ selector: 'app-permission-list', @@ -14,57 +15,14 @@ import { environment } from '@environments/environment'; export class PermissionListComponent implements OnInit, OnChanges { isLoadingResults = true; public pageLimit = environment.tablePageSize; - public sort: Sort[] = [ - { - id: 1, - dir: 'ASC', - col: 'updatedAt', - label: 'SORT.UPDATED-ASCENDING', - }, - { - id: 2, - dir: 'DESC', - col: 'updatedAt', - label: 'SORT.UPDATED-DESCENDING', - }, - { - id: 3, - dir: 'ASC', - col: 'createdAt', - label: 'SORT.CREATED-ASCENDING', - }, - { - id: 4, - dir: 'DESC', - col: 'createdAt', - label: 'SORT.CREATED-DESCENDING', - }, - { - id: 5, - dir: 'ASC', - col: 'name', - label: 'SORT.NAME-ASCENDING', - }, - { - id: 6, - dir: 'DESC', - col: 'name', - label: 'SORT.NAME-DESCENDING', - }, - ]; public selectedSortId = 1; - public selectedSortObject: Sort = { - id: 6, - dir: 'DESC', - col: 'name', - label: 'SORT.NAME-DESCENDING', - }; public permissions: PermissionResponse[]; permissionSubscription: Subscription; constructor( public translate: TranslateService, + private titleService: Title, private permissionService: PermissionService ) { translate.use('da'); @@ -75,6 +33,10 @@ export class PermissionListComponent implements OnInit, OnChanges { ngOnInit(): void { this.getPermissions(); + this.translate.get(['TITLE.PERMISSION']) + .subscribe(translations => { + this.titleService.setTitle(translations['TITLE.PERMISSION']); + }); } getPermissions() { diff --git a/src/app/admin/permission/permission-list/permission-tabel/permission-tabel.component.html b/src/app/admin/permission/permission-list/permission-tabel/permission-tabel.component.html index 1b43efc3..1157d8df 100644 --- a/src/app/admin/permission/permission-list/permission-tabel/permission-tabel.component.html +++ b/src/app/admin/permission/permission-list/permission-tabel/permission-tabel.component.html @@ -1,4 +1,7 @@
+
+ +
diff --git a/src/app/admin/users/user-edit/user-edit.component.html b/src/app/admin/users/user-edit/user-edit.component.html index 9f9f13ef..0d1b2e5d 100644 --- a/src/app/admin/users/user-edit/user-edit.component.html +++ b/src/app/admin/users/user-edit/user-edit.component.html @@ -25,7 +25,7 @@ * diff --git a/src/app/admin/users/user-list/user-list.component.ts b/src/app/admin/users/user-list/user-list.component.ts index 1df85569..9563dffc 100644 --- a/src/app/admin/users/user-list/user-list.component.ts +++ b/src/app/admin/users/user-list/user-list.component.ts @@ -1,4 +1,6 @@ import { Component } from '@angular/core'; +import { Title } from '@angular/platform-browser'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'app-user-list', @@ -6,9 +8,14 @@ import { Component } from '@angular/core'; styleUrls: ['./user-list.component.scss'], }) export class UserListComponent { - constructor() {} + constructor(private titleService: Title, private translate: TranslateService) {} - ngOnInit(): void {} + ngOnInit(): void { + this.translate.get(['TITLE.USER']) + .subscribe(translations => { + this.titleService.setTitle(translations['TITLE.USER']); + }); + } ngOnChanges(): void {} } diff --git a/src/app/admin/users/user-list/user-table/user-table.component.html b/src/app/admin/users/user-list/user-table/user-table.component.html index 68563897..a8a44c63 100644 --- a/src/app/admin/users/user-list/user-table/user-table.component.html +++ b/src/app/admin/users/user-list/user-table/user-table.component.html @@ -1,7 +1,7 @@ -
+
+ +
diff --git a/src/app/app.module.ts b/src/app/app.module.ts index a9c73fdf..aab4ebc9 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,4 +1,4 @@ -import { BrowserModule } from '@angular/platform-browser'; +import { BrowserModule, Title } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { TranslateModule, TranslateLoader } from '@ngx-translate/core'; import { TranslateHttpLoader } from '@ngx-translate/http-loader'; @@ -20,6 +20,9 @@ import { ErrorPageComponent } from './error-page/error-page.component'; import { SearchModule } from './search/search.module'; import { JwtModule } from '@auth0/angular-jwt'; import { MonacoEditorModule } from 'ngx-monaco-editor'; +import { MatInputModule } from '@angular/material/input'; +import { MatPaginatorIntl } from '@angular/material/paginator'; +import { MatPaginatorIntlDa } from '@shared/helpers/mat-paginator-intl-da'; export function HttpLoaderFactory(http: HttpClient) { return new TranslateHttpLoader(http, './assets/i18n/', '.json'); @@ -58,6 +61,7 @@ export function tokenGetter() { GatewayModule, SearchModule, HttpClientModule, + MatInputModule, JwtModule.forRoot({ config: { tokenGetter @@ -71,8 +75,10 @@ export function tokenGetter() { // use these two providers only in dev environment //{ provide: ErrorHandler, useClass: GlobalErrorHandler }, //{ provide: HTTP_INTERCEPTORS, useClass: ServerErrorInterceptor, multi: true }, + Title, { provide: HTTP_INTERCEPTORS, useClass: AuthJwtInterceptor, multi: true }, { provide: SAVER, useFactory: getSaver }, + { provide: MatPaginatorIntl, useClass: MatPaginatorIntlDa }, ], }) export class AppModule { } diff --git a/src/app/applications/application-detail/application-detail.component.html b/src/app/applications/application-detail/application-detail.component.html index 1ff41ca5..1eac588d 100644 --- a/src/app/applications/application-detail/application-detail.component.html +++ b/src/app/applications/application-detail/application-detail.component.html @@ -21,10 +21,16 @@

Detaljer

- - +
+ + +
+ + + +
diff --git a/src/app/applications/application-detail/application-detail.component.ts b/src/app/applications/application-detail/application-detail.component.ts index b8dfaec1..f006843b 100644 --- a/src/app/applications/application-detail/application-detail.component.ts +++ b/src/app/applications/application-detail/application-detail.component.ts @@ -1,4 +1,5 @@ import { Component, EventEmitter, OnDestroy, OnInit, Output } from '@angular/core'; +import { Title } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; import { Application } from '@applications/application.model'; import { ApplicationService } from '@applications/application.service'; @@ -6,6 +7,7 @@ import { TranslateService } from '@ngx-translate/core'; import { DeleteDialogService } from '@shared/components/delete-dialog/delete-dialog.service'; import { BackButton } from '@shared/models/back-button.model'; import { DropdownButton } from '@shared/models/dropdown-button.model'; +import { MeService } from '@shared/services/me.service'; import { Subscription } from 'rxjs'; @Component({ @@ -22,12 +24,15 @@ export class ApplicationDetailComponent implements OnInit, OnDestroy { public id: number; public dropdownButton: DropdownButton; public errorMessage: string; + public canEdit = false; constructor( private applicationService: ApplicationService, private route: ActivatedRoute, public translate: TranslateService, public router: Router, + private meService: MeService, + private titleService: Title, private deleteDialogService: DeleteDialogService ) { } @@ -43,11 +48,13 @@ export class ApplicationDetailComponent implements OnInit, OnDestroy { console.log(this.id); } - this.translate.get(['NAV.APPLICATIONS', 'APPLICATION-TABLE-ROW.SHOW-OPTIONS']) + this.translate.get(['NAV.APPLICATIONS', 'APPLICATION-TABLE-ROW.SHOW-OPTIONS', 'TITLE.APPLICATION']) .subscribe(translations => { this.backButton.label = translations['NAV.APPLICATIONS']; this.dropdownButton.label = translations['APPLICATION-TABLE-ROW.SHOW-OPTIONS']; + this.titleService.setTitle(translations['TITLE.APPLICATION']); }); + this.canEdit = this.meService.canWriteInTargetOrganization(); } onDeleteApplication() { diff --git a/src/app/applications/applications-list/applications-list.component.ts b/src/app/applications/applications-list/applications-list.component.ts index 4b7690c4..1e9bab84 100644 --- a/src/app/applications/applications-list/applications-list.component.ts +++ b/src/app/applications/applications-list/applications-list.component.ts @@ -3,6 +3,7 @@ import { OnInit, Input, } from '@angular/core'; +import { Title } from '@angular/platform-browser'; import { NavbarComponent } from '@app/navbar/navbar.component'; import { Application } from '@applications/application.model'; import { environment } from '@environments/environment'; @@ -26,12 +27,17 @@ export class ApplicationsListComponent implements OnInit { constructor( public translate: TranslateService, + private titleService: Title, private globalService: SharedVariableService ) { translate.use('da'); } ngOnInit(): void { + this.translate.get(['TITLE.APPLICATION']) + .subscribe(translations => { + this.titleService.setTitle(translations['TITLE.APPLICATION']); + }); this.organizationId = this.globalService.getSelectedOrganisationId(); } diff --git a/src/app/applications/applications-list/applications-table/applications-table.component.html b/src/app/applications/applications-list/applications-table/applications-table.component.html index 3705d059..fb80f29e 100644 --- a/src/app/applications/applications-list/applications-table/applications-table.component.html +++ b/src/app/applications/applications-list/applications-table/applications-table.component.html @@ -1,8 +1,7 @@ -
- -
- +
+ +
{{errorMessage | translate}} diff --git a/src/app/applications/bulk-import/bulk-import.component.ts b/src/app/applications/bulk-import/bulk-import.component.ts index 4dbd6123..e28d2506 100644 --- a/src/app/applications/bulk-import/bulk-import.component.ts +++ b/src/app/applications/bulk-import/bulk-import.component.ts @@ -1,5 +1,6 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; +import { Title } from '@angular/platform-browser'; import { ActivatedRoute } from '@angular/router'; import { IoTDeviceService } from '@applications/iot-devices/iot-device.service'; import { faDownload, faTrash } from '@fortawesome/free-solid-svg-icons'; @@ -27,9 +28,9 @@ export class BulkImportComponent implements OnInit { faTrash = faTrash; faDownload = faDownload; samples = [ - { name: 'Generic-Http-sample.csv', url: '../../../assets/docs/iotdevice_generichttp.csv' }, - { name: 'Lorawan-sample.csv', url: '../../../assets/docs/iotdevice_lorawan.csv' }, - { name: 'Sigfox-sample.csv', url: '../../../assets/docs/iotdevice_sigfox.csv' }, + { name: 'generic-http-sample.csv', url: '../../../assets/docs/iotdevice_generichttp.csv' }, + { name: 'lorawan-otaa-sample.csv', url: '../../../assets/docs/iotdevice_lorawan_otaa.csv' }, + { name: 'lorawan-abp-sample.csv', url: '../../../assets/docs/iotdevice_lorawan_abp.csv' }, ] download$: Observable; private bulkMapper = new BulkMapping(); @@ -40,13 +41,19 @@ export class BulkImportComponent implements OnInit { private papa: Papa, private iotDeviceService: IoTDeviceService, private route: ActivatedRoute, + private titleService: Title, private translate: TranslateService, private downloads: DownloadService, private errorMessageService: ErrorMessageService - ) { } + ) { + this.translate.use('da'); + } ngOnInit(): void { - this.translate.use('da'); + this.translate.get(['TITLE.BULKIMPORT']) + .subscribe(translations => { + this.titleService.setTitle(translations['TITLE.BULKIMPORT']); + }); this.applicationId = +this.route.snapshot.paramMap.get('id'); } diff --git a/src/app/applications/bulk-import/bulkMapping.ts b/src/app/applications/bulk-import/bulkMapping.ts index d941c95e..d85823e8 100644 --- a/src/app/applications/bulk-import/bulkMapping.ts +++ b/src/app/applications/bulk-import/bulkMapping.ts @@ -28,8 +28,8 @@ export class BulkMapping { applicationSessionKey: data.applicationSessionKey ? data.applicationSessionKey : undefined, serviceProfileID: data.serviceProfileID ? data.serviceProfileID : undefined, deviceProfileID: data.deviceProfileID ? data.deviceProfileID : undefined, - fCntUp: data.fCntUp ? data.fCntUp : undefined, - nFCntDown: data.nFCntDown ? data.nFCntDown : undefined, + fCntUp: data.fCntUp ? +data.fCntUp : undefined, + nFCntDown: data.nFCntDown ? +data.nFCntDown : undefined, deviceStatusBattery: undefined, deviceStatusMargin: undefined }; @@ -69,7 +69,8 @@ export class BulkMapping { createdBy: undefined, updatedBy: undefined, updatedByName: undefined, - createdByName: undefined + createdByName: undefined, + deviceModelId: data.deviceModelId != "" ? +data.deviceModelId : undefined, }; } } diff --git a/src/app/applications/datatarget/datatarget-detail/datatarget-detail.component.html b/src/app/applications/datatarget/datatarget-detail/datatarget-detail.component.html index 869f168e..cc9829db 100644 --- a/src/app/applications/datatarget/datatarget-detail/datatarget-detail.component.html +++ b/src/app/applications/datatarget/datatarget-detail/datatarget-detail.component.html @@ -47,11 +47,9 @@

{{ 'DATATARGET.RELATIONS' | translate }}

{{'DATATARGET.PAYLOADEDECODER' | translate}} - {{relation.payloadDecoder.name}} + {{relation.payloadDecoder.name}} - - {{ 'DATATARGET.NO-PAYLOADDECODER' | translate}} - + {{ 'DATATARGET.NO-PAYLOADDECODER' | translate}}

@@ -59,7 +57,9 @@

{{ 'DATATARGET.RELATIONS' | translate }}

{{'DATATARGET.IOTDEVICE' | translate}} - {{getJoinedDeviceNames(relation.iotDevices)}} + + , {{device.name}} +

diff --git a/src/app/applications/datatarget/datatarget-detail/datatarget-detail.component.ts b/src/app/applications/datatarget/datatarget-detail/datatarget-detail.component.ts index 8749d0f6..7af25889 100644 --- a/src/app/applications/datatarget/datatarget-detail/datatarget-detail.component.ts +++ b/src/app/applications/datatarget/datatarget-detail/datatarget-detail.component.ts @@ -82,10 +82,6 @@ export class DatatargetDetailComponent implements OnInit, OnDestroy { ); } - getJoinedDeviceNames(element: IotDevice[]): string { - return element.map(device => device.name).join(', '); - } - getDatatargetRelations(id: number) { this.datatargetRelationServicer.getByDataTarget(id) .subscribe((response) => { diff --git a/src/app/applications/datatarget/datatarget-edit/datatarget-edit.component.ts b/src/app/applications/datatarget/datatarget-edit/datatarget-edit.component.ts index e7964347..968df9e2 100644 --- a/src/app/applications/datatarget/datatarget-edit/datatarget-edit.component.ts +++ b/src/app/applications/datatarget/datatarget-edit/datatarget-edit.component.ts @@ -103,7 +103,6 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { this.getDevices(); } this.getPayloadDecoders(); - console.log(this.devices, this.payloadDecoders); this.setDataSetExcists(); } @@ -138,7 +137,6 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { dialog.afterClosed().subscribe((result) => { if (result === true) { this.deleteRow(index); - console.log(`Dialog result: ${result}`); } }); } @@ -158,11 +156,15 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { } updateDatatarget() { - this.counter = 1 + this.payloadDeviceDatatarget?.length ? this.payloadDeviceDatatarget?.length : 0; + this.resetErrors(); + this.counter = 1 + (this.payloadDeviceDatatarget?.length ? this.payloadDeviceDatatarget?.length : 0); this.datatargetService.update(this.datatarget) .subscribe( (response: Datatarget) => { - this.datatarget = response; + this.datatarget = response; + if (this.datatarget.openDataDkDataset != null) { + this.datatarget.openDataDkDataset.acceptTerms = true; + } this.shouldShowMailDialog().subscribe( (response) => { this.countToRedirect(); @@ -189,7 +191,6 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { if (relation.id) { this.payloadDeviceDataTargetService.put(relation).subscribe( (response) => { - console.log(response); this.countToRedirect(); }, (error) => { @@ -199,7 +200,6 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { } else { this.payloadDeviceDataTargetService.post(relation).subscribe( (res: any) => { - console.log(res); this.countToRedirect(); }, (error) => { @@ -212,7 +212,7 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { countToRedirect() { this.counter -= 1; - if (this.counter <= 0) { + if (this.counter <= 0 && !this.formFailedSubmit) { this.showSavedSnack(); this.routeToDatatargets(); } @@ -227,11 +227,15 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { } createDatatarget() { + this.resetErrors(); this.datatarget.applicationId = this.applicationId; this.datatargetService.create(this.datatarget) .subscribe((response: Datatarget) => { this.datatargetid = response.id; - this.datatarget = response + this.datatarget = response; + if (this.datatarget.openDataDkDataset != null) { + this.datatarget.openDataDkDataset.acceptTerms = true; + } this.showSavedSnack(); }, (error: HttpErrorResponse) => { @@ -242,6 +246,12 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { } + private resetErrors() { + this.errorFields = []; + this.errorMessages = undefined; + this.formFailedSubmit = false; + } + checkDataTargetModelOpendatadkdatasaet() { if (!this.datatarget.openDataDkDataset) { this.datatarget.openDataDkDataset = new OpenDataDkDataset(); @@ -256,12 +266,10 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { } public selectAllDevices(index: number) { - console.log(this.payloadDeviceDatatarget[0].iotDeviceIds); this.payloadDeviceDatatarget[index].iotDeviceIds = this.devices.map(device => device.id); } public deSelectAllDevices(index: number) { - console.log(this.payloadDeviceDatatarget[0].iotDeviceIds); this.payloadDeviceDatatarget[index].iotDeviceIds = []; } @@ -284,8 +292,6 @@ export class DatatargetEditComponent implements OnInit, OnDestroy { } onCoordinateKey(event: any) { - console.log(event.target.value); - console.log(event.target.maxLength); if (event.target.value.length > event.target.maxLength) { event.target.value = event.target.value.slice( 0, diff --git a/src/app/applications/datatarget/datatarget-list/datatarget-list.component.ts b/src/app/applications/datatarget/datatarget-list/datatarget-list.component.ts index 3d796f19..2f5236cd 100644 --- a/src/app/applications/datatarget/datatarget-list/datatarget-list.component.ts +++ b/src/app/applications/datatarget/datatarget-list/datatarget-list.component.ts @@ -4,6 +4,7 @@ import { ActivatedRoute } from '@angular/router'; import { Datatarget } from '../datatarget.model'; import { BackButton } from '@shared/models/back-button.model'; import { environment } from '@environments/environment'; +import { Title } from '@angular/platform-browser'; @Component({ @@ -21,17 +22,19 @@ export class DatatargetListComponent implements OnInit { constructor( public translate: TranslateService, - private route: ActivatedRoute,) { + private titleService: Title, + private route: ActivatedRoute) { translate.use('da'); } ngOnInit(): void { const applikationName: string = this.route.snapshot.paramMap.get('name'); this.applikationId = this.route.snapshot.paramMap.get('id'); - this.translate.get(["NAV.DATATARGET", "NAV.APPLICATIONS"]) + this.translate.get(["NAV.DATATARGET", "NAV.APPLICATIONS", "TITLE.DATATARGET"]) .subscribe((translate) => { this.title = translate['NAV.DATATARGET'] + ' - ' + applikationName; this.backButton.label = translate['NAV.APPLICATIONS']; + this.titleService.setTitle(translate['TITLE.DATATARGET']); }); this.setBackButton() } diff --git a/src/app/applications/datatarget/datatarget-table/datatarget-table.component.html b/src/app/applications/datatarget/datatarget-table/datatarget-table.component.html index 3abc5a63..43de08b9 100644 --- a/src/app/applications/datatarget/datatarget-table/datatarget-table.component.html +++ b/src/app/applications/datatarget/datatarget-table/datatarget-table.component.html @@ -1,54 +1,53 @@ - - - -
-
+
+
+ +
+
- - - - - + + + + + - - - - + - + {{element.type | translate}} + - - - - - + + + + + - - -
- {{ 'DATATARGET-TABLE.NAME' | translate }} - - {{element.name}} - + {{ 'DATATARGET-TABLE.NAME' | translate }} + + {{element.name}} + - {{ 'DATATARGET-TABLE.TYPE' | translate }} + + + + {{ 'DATATARGET-TABLE.TYPE' | translate }} - {{element.type | translate}} - - + +
- - -
- \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/src/app/applications/datatarget/datatarget-table/datatarget-table.component.ts b/src/app/applications/datatarget/datatarget-table/datatarget-table.component.ts index 62aa17ae..c3bbc0df 100644 --- a/src/app/applications/datatarget/datatarget-table/datatarget-table.component.ts +++ b/src/app/applications/datatarget/datatarget-table/datatarget-table.component.ts @@ -25,7 +25,7 @@ export class DatatargetTableComponent implements OnInit, AfterViewInit, OnDestro datatargets: Datatarget[]; resultsLength = 0; public canEdit = false; - @Input() isLoadingResults: boolean; + @Input() isLoadingResults: boolean = true; public pageSize = environment.tablePageSize; @Input() pageLimit: number; diff --git a/src/app/applications/datatarget/opendatadk/opendatadk-dataset.model.ts b/src/app/applications/datatarget/opendatadk/opendatadk-dataset.model.ts index 8328c5c7..36fe3b5c 100644 --- a/src/app/applications/datatarget/opendatadk/opendatadk-dataset.model.ts +++ b/src/app/applications/datatarget/opendatadk/opendatadk-dataset.model.ts @@ -1,4 +1,5 @@ export class OpenDataDkDataset { + id?: number; name: string; //reqired - max 120 resourceTitle: string; description: string; diff --git a/src/app/applications/datatarget/opendatadk/opendatadk-edit/opendatadk-edit.component.ts b/src/app/applications/datatarget/opendatadk/opendatadk-edit/opendatadk-edit.component.ts index b45e689f..8ec2e7a2 100644 --- a/src/app/applications/datatarget/opendatadk/opendatadk-edit/opendatadk-edit.component.ts +++ b/src/app/applications/datatarget/opendatadk/opendatadk-edit/opendatadk-edit.component.ts @@ -4,18 +4,18 @@ import { OpenDataDkDataset } from '../opendatadk-dataset.model'; @Component({ selector: 'app-opendatadk-edit', templateUrl: './opendatadk-edit.component.html', - styleUrls: ['./opendatadk-edit.component.scss'] + styleUrls: ['./opendatadk-edit.component.scss'], }) export class OpendatadkEditComponent implements OnInit { - public errorMessages: any; @Input() errorFields: string[]; @Input() formFailedSubmit = false; @Input() openDataDk: OpenDataDkDataset; - constructor() { } + constructor() {} ngOnInit(): void { + // Set box to checked, if this already exists. + this.openDataDk.acceptTerms = this.openDataDk.id != null; } - } diff --git a/src/app/applications/iot-devices/iot-device-detail/downlink/downlink-dialog/downlink-dialog.component.ts b/src/app/applications/iot-devices/iot-device-detail/downlink/downlink-dialog/downlink-dialog.component.ts index ca05c76c..37c6355b 100644 --- a/src/app/applications/iot-devices/iot-device-detail/downlink/downlink-dialog/downlink-dialog.component.ts +++ b/src/app/applications/iot-devices/iot-device-detail/downlink/downlink-dialog/downlink-dialog.component.ts @@ -1,19 +1,18 @@ -import { Component, OnInit, Output } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { MatDialogRef } from '@angular/material/dialog'; import { TranslateService } from '@ngx-translate/core'; -import { EventEmitter } from 'protractor'; import { DownlinkComponent } from '../downlink.component'; @Component({ selector: 'app-downlink-dialog', templateUrl: './downlink-dialog.component.html', - styleUrls: ['./downlink-dialog.component.scss'] + styleUrls: ['./downlink-dialog.component.scss'], }) export class DownlinkDialogComponent implements OnInit { - constructor( private translate: TranslateService, - public dialog: MatDialogRef) {} + public dialog: MatDialogRef + ) {} ngOnInit(): void { this.translate.use('da'); @@ -22,5 +21,4 @@ export class DownlinkDialogComponent implements OnInit { cancel() { this.dialog.close(); } - } diff --git a/src/app/applications/iot-devices/iot-device-detail/iot-device-detail.component.html b/src/app/applications/iot-devices/iot-device-detail/iot-device-detail.component.html index 9b0c3b2c..6e5b25b2 100644 --- a/src/app/applications/iot-devices/iot-device-detail/iot-device-detail.component.html +++ b/src/app/applications/iot-devices/iot-device-detail/iot-device-detail.component.html @@ -15,7 +15,7 @@ - + { this.backButton.label = translations['NAV.APPLICATIONS']; this.dropdownButton.label = translations['IOTDEVICE-TABLE-ROW.SHOW-OPTIONS']; + this.titleService.setTitle(translations['TITLE.IOTDEVICE']); }); } diff --git a/src/app/applications/iot-devices/iot-device-edit/iot-device-edit.component.ts b/src/app/applications/iot-devices/iot-device-edit/iot-device-edit.component.ts index dbe01d72..831d3c6a 100644 --- a/src/app/applications/iot-devices/iot-device-edit/iot-device-edit.component.ts +++ b/src/app/applications/iot-devices/iot-device-edit/iot-device-edit.component.ts @@ -1,6 +1,7 @@ import { Location } from '@angular/common'; import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Title } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; import { Application } from '@app/applications/application.model'; import { ApplicationService } from '@app/applications/application.service'; @@ -62,6 +63,7 @@ export class IotDeviceEditComponent implements OnInit, OnDestroy { private deviceModelService: DeviceModelService, private errorMessageService: ErrorMessageService, private scrollToTopService: ScrollToTopService, + private titleService: Title ) { } ngOnInit(): void { @@ -75,6 +77,11 @@ export class IotDeviceEditComponent implements OnInit, OnDestroy { this.disableChoseApplication = false; } + this.translate.get(['TITLE.IOTDEVICE']) + .subscribe(translations => { + this.titleService.setTitle(translations['TITLE.IOTDEVICE']); + }); + this.getApplication(); this.getServiceProfiles(); this.getDeviceProfiles(); diff --git a/src/app/applications/iot-devices/iot-devices-table/iot-devices-table.component.html b/src/app/applications/iot-devices/iot-devices-table/iot-devices-table.component.html index b65779d2..49f04edf 100644 --- a/src/app/applications/iot-devices/iot-devices-table/iot-devices-table.component.html +++ b/src/app/applications/iot-devices/iot-devices-table/iot-devices-table.component.html @@ -1,6 +1,7 @@ - -
+
+ +
diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html index dbf3ea85..8425e3a9 100644 --- a/src/app/dashboard/dashboard.component.html +++ b/src/app/dashboard/dashboard.component.html @@ -1,25 +1,25 @@ - +
+ +
- -
+
-
+

-
+
- - {{'DASHBOARD.WELCOME' | translate}} - +

{{'DASHBOARD.WELCOME' | translate}}

+

{{'DASHBOARD.WELCOME-SUB' | translate}}

-
- - + +
-
- {{'DASHBOARD.LIST.HEADLINE' | translate}} +
+

{{'DASHBOARD.LIST.HEADLINE' | translate}} +

  • {{'DASHBOARD.LIST.P1' | translate}}
  • {{'DASHBOARD.LIST.P2' | translate}}
  • @@ -30,39 +30,44 @@

  • {{'DASHBOARD.LIST.P7' | translate}}
-
{{'DASHBOARD.WELCOME-MESSAGE' | translate}}
+
+

{{'DASHBOARD.SUB-HEADER-1' | translate}}

+

{{'DASHBOARD.WELCOME-MESSAGE' | translate}}{{'DASHBOARD.LINK-1' | + translate}}{{'DASHBOARD.WELCOME-MESSAGE-3' | translate}} +

+

{{'DASHBOARD.SUB-HEADER-2' | translate}}

+

{{'DASHBOARD.WELCOME-MESSAGE-2' | translate}}{{'DASHBOARD.LINK-2' | + translate}} +

+

-
+
Start med at oprette en organisation + class="btn btn-primary btn--animated">{{'DASHBOARD.BUTTON' | translate}}
-
- -
-
- +
-

- - {{'DASHBOARD.WELCOME' | translate}} - - - {{'DASHBOARD.NO-ACCESS' | translate}} +
+ +
+

{{'DASHBOARD.WELCOME' | translate}}

+

{{'DASHBOARD.NO-ACCESS' | translate}}

+
-

+
-
- -
\ No newline at end of file diff --git a/src/app/dashboard/dashboard.component.scss b/src/app/dashboard/dashboard.component.scss index 0aa62efd..c39c88a0 100644 --- a/src/app/dashboard/dashboard.component.scss +++ b/src/app/dashboard/dashboard.component.scss @@ -5,17 +5,22 @@ .heading-primary { padding: 1rem; color: $color-white-001; - text-transform: uppercase; backface-visibility: hidden; - margin-bottom: 6rem; &--main { font-weight: 400; animation-name: slideInLeft; animation-duration: 1s; animation-timing-function: ease-out; - margin-bottom: 2rem; - + text-align: center; + h1 { + font-size: 3rem; + color: $color-white-001; + margin-bottom: 0 !important; + } + h2 { + color: $color-white-001; + } } &--sub { @@ -25,44 +30,64 @@ animation: slideInRight 1s ease-out; white-space: pre-wrap; line-height: 1.7rem; + p { + strong { + color: $color-white-001; + text-transform: uppercase; + } + color: $color-white-001; + margin-bottom: 0 !important; + margin-top: 0 !important; + &:nth-child(odd) { + margin-top: 1.5rem !important; + //margin-bottom: 0 !important; + } + a { + color: $color-white-001; + border-bottom: 1px $color-white-001 solid; + &:hover, + :visited { + color: darken($color-primary, 10%); + border-bottom: 1px darken($color-primary, 10%) solid; + } + } + } - ul{ + ul { display: block; list-style-type: disc; - margin-block-start: 1em; + margin-block-start: 0; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; padding-inline-start: 40px; - li{ + li { display: list-item; list-style: disc; + font-weight: normal; } } } } - height: 85vh; - background-image: linear-gradient( - to right bottom, - rgba($color-primary, 0.8), - rgba($color-orange-004, 0.8) - ), - url(../../assets/images/hero.jpg); + background-color: $color-green-001; background-size: cover; background-position: top; position: relative; @supports (clip-path: polygon(0 0)) or (-webkit-clip-path: polygon(0 0)) { - -webkit-clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%); - clip-path: polygon(0 0, 100% 0, 100% 75vh, 0 100%); - height: 90vh; + -webkit-clip-path: polygon(0 0, 100% 0, 100% 80%, 0 100%); + clip-path: polygon(0 0, 100% 0, 100% 80%, 0 100%); + height: 120%; } &__logo-box { position: absolute; - bottom: 5vh; - right: 5rem; + bottom: 1vh; + right: 4rem; + @include media-breakpoint-up(md) { + bottom: 5vh; + } } &__logo { diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts index 6c7d2301..1c6916ae 100644 --- a/src/app/dashboard/dashboard.component.ts +++ b/src/app/dashboard/dashboard.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { Title } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; import { UserMinimalService } from '@app/admin/users/user-minimal.service'; import { AuthService } from '@auth/auth.service'; @@ -16,6 +17,7 @@ export class DashboardComponent implements OnInit { noAccess: string; isLoadingResults = true; hasSomePermission: boolean; + isGlobalAdmin = false; constructor( private route: ActivatedRoute, @@ -23,15 +25,20 @@ export class DashboardComponent implements OnInit { private router: Router, private sharedVariableService: SharedVariableService, private translate: TranslateService, + private titleService: Title, private userMinimalService: UserMinimalService, ) { this.route.queryParams.subscribe(async (params) => { this.translate.use('da'); - await this.translate.get(['DASHBOARD.NO-JOB-ACCESS', 'DASHBOARD.KOMBIT-LOGIN-ERROR','DASHBOARD.USER-INACTIVE']).toPromise().then(translations => { - this.unauthorizedMessage = translations['DASHBOARD.NO-JOB-ACCESS']; - this.kombitError = translations['DASHBOARD.KOMBIT-LOGIN-ERROR']; - this.noAccess = translations['DASHBOARD.USER-INACTIVE']; - }); + await this.translate.get(['DASHBOARD.NO-JOB-ACCESS','TITLE.FRONTPAGE', 'DASHBOARD.KOMBIT-LOGIN-ERROR','DASHBOARD.USER-INACTIVE']) + .toPromise() + .then(translations => { + this.unauthorizedMessage = translations['DASHBOARD.NO-JOB-ACCESS']; + this.kombitError = translations['DASHBOARD.KOMBIT-LOGIN-ERROR']; + this.noAccess = translations['DASHBOARD.USER-INACTIVE']; + this.titleService.setTitle(translations['TITLE.FRONTPAGE']); + } + ); // this is used when a user is returned from Kombit login const jwt = params['jwt']; if (jwt) { @@ -54,6 +61,7 @@ export class DashboardComponent implements OnInit { await this.sharedVariableService.setOrganizationInfo(); this.userMinimalService.setUserMinimalList() this.hasSomePermission = this.sharedVariableService.getHasAnyPermission(); + this.isGlobalAdmin = this.sharedVariableService.isGlobalAdmin(); this.isLoadingResults = false; }); } diff --git a/src/app/dashboard/dashboard.module.ts b/src/app/dashboard/dashboard.module.ts index 3e9706f2..035d83f8 100644 --- a/src/app/dashboard/dashboard.module.ts +++ b/src/app/dashboard/dashboard.module.ts @@ -6,7 +6,13 @@ import { RouterModule } from '@angular/router'; @NgModule({ - declarations: [DashboardComponent], - imports: [CommonModule, SharedModule, RouterModule], + declarations: [ + DashboardComponent + ], + imports: [ + CommonModule, + SharedModule, + RouterModule + ], }) export class DashboardModule { } diff --git a/src/app/device-model/device-model-list/device-model-list.component.ts b/src/app/device-model/device-model-list/device-model-list.component.ts index 5b8569b3..2d2676a9 100644 --- a/src/app/device-model/device-model-list/device-model-list.component.ts +++ b/src/app/device-model/device-model-list/device-model-list.component.ts @@ -1,4 +1,5 @@ import { Component, OnInit } from '@angular/core'; +import { Title } from '@angular/platform-browser'; import { TranslateService } from '@ngx-translate/core'; import { SharedVariableService } from '@shared/shared-variable/shared-variable.service'; @@ -10,10 +11,17 @@ import { SharedVariableService } from '@shared/shared-variable/shared-variable.s export class DeviceModelListComponent implements OnInit { constructor( - private translate: TranslateService - ) { } + private translate: TranslateService, + private titleService: Title + ) { + translate.use('da'); + } ngOnInit(): void { + this.translate.get(['TITLE.DEVICEMODEL']) + .subscribe(translations => { + this.titleService.setTitle(translations['TITLE.DEVICEMODEL']); + }); } } diff --git a/src/app/device-model/device-model-table/device-model-table.component.html b/src/app/device-model/device-model-table/device-model-table.component.html index f295e764..cfdf1a7e 100644 --- a/src/app/device-model/device-model-table/device-model-table.component.html +++ b/src/app/device-model/device-model-table/device-model-table.component.html @@ -1,8 +1,8 @@ - -
- +
+ +
diff --git a/src/app/gateway/gateway-detail/gateway-detail.component.html b/src/app/gateway/gateway-detail/gateway-detail.component.html index c369ca7b..f6981726 100644 --- a/src/app/gateway/gateway-detail/gateway-detail.component.html +++ b/src/app/gateway/gateway-detail/gateway-detail.component.html @@ -48,6 +48,9 @@

{{ 'GATEWAY.LOCATION' | translate }}

{{ 'GATEWAY.STATS' | translate }}

+
+ +
diff --git a/src/app/gateway/gateway-detail/gateway-detail.component.ts b/src/app/gateway/gateway-detail/gateway-detail.component.ts index 829090a5..b9e75007 100644 --- a/src/app/gateway/gateway-detail/gateway-detail.component.ts +++ b/src/app/gateway/gateway-detail/gateway-detail.component.ts @@ -33,6 +33,7 @@ export class GatewayDetailComponent implements OnInit, OnDestroy, AfterViewInit deleteGateway = new EventEmitter(); private deleteDialogSubscription: Subscription; public dropdownButton: DropdownButton; + isLoadingResults = true; constructor( private gatewayService: ChirpstackGatewayService, @@ -81,6 +82,7 @@ export class GatewayDetailComponent implements OnInit, OnDestroy, AfterViewInit this.resultLength = this.gatewayStats.length; this.dataSource.paginator = this.paginator; this.setDropdownButton(); + this.isLoadingResults = false; }); } diff --git a/src/app/gateway/gateway-list/gateway-list.component.ts b/src/app/gateway/gateway-list/gateway-list.component.ts index 17e80a2f..d022dd4f 100644 --- a/src/app/gateway/gateway-list/gateway-list.component.ts +++ b/src/app/gateway/gateway-list/gateway-list.component.ts @@ -10,6 +10,7 @@ import { DeleteDialogService } from '@shared/components/delete-dialog/delete-dia import { MeService } from '@shared/services/me.service'; import { SharedVariableService } from '@shared/shared-variable/shared-variable.service'; import { environment } from '@environments/environment'; +import { Title } from '@angular/platform-browser'; @Component({ @@ -47,6 +48,7 @@ export class GatewayListComponent implements OnInit, OnChanges, OnDestroy { private chirpstackGatewayService: ChirpstackGatewayService, private deleteDialogService: DeleteDialogService, private meService: MeService, + private titleService: Title, private sharedVariableService: SharedVariableService) { translate.use('da'); moment.locale('da'); @@ -55,6 +57,10 @@ export class GatewayListComponent implements OnInit, OnChanges, OnDestroy { ngOnInit(): void { this.getGateways(); this.organisations = this.sharedVariableService.getOrganizationInfo(); + this.translate.get(['TITLE.LORAWAN-GATEWAY']) + .subscribe(translations => { + this.titleService.setTitle(translations['TITLE.LORAWAN-GATEWAY']); + }); } ngOnChanges() { diff --git a/src/app/gateway/gateway-table/gateway-table.component.html b/src/app/gateway/gateway-table/gateway-table.component.html index cfdb14d7..4f6086d0 100644 --- a/src/app/gateway/gateway-table/gateway-table.component.html +++ b/src/app/gateway/gateway-table/gateway-table.component.html @@ -1,9 +1,12 @@
- +
+ +
+
- + @@ -23,7 +26,8 @@ - + @@ -33,14 +37,14 @@ -
+ {{ 'LORA-GATEWAY-TABLE.NAME' | translate }} @@ -15,7 +18,7 @@ - {{ 'LORA-GATEWAY-TABLE.GATEWAYID' | translate }}{{ 'LORA-GATEWAY-TABLE.GATEWAYID' | translate }} {{ element.id }} {{ 'LORA-GATEWAY-TABLE.ORGANIZATION' | translate }}{{ 'LORA-GATEWAY-TABLE.ORGANIZATION' | translate }} + {{ element.internalOrganizationName }} {{ 'LORA-GATEWAY-TABLE.LOCATION' | translate }} - {{ element.location.longitude | number:'2.1-6' }}, - {{ element.location.latitude | number:'2.1-6' }} + {{ element.location.latitude | number:'2.1-6' }}, + {{ element.location.longitude | number:'2.1-6' }} + {{ 'LORA-GATEWAY-TABLE.LAST-SEEN-AT' | translate }} @@ -50,7 +54,7 @@ - + {{ 'LORA-GATEWAY-TABLE.STATUS' | translate }} @@ -75,8 +79,8 @@