Skip to content
Snippets Groups Projects
Commit 3b8b62a8 authored by Alexander Reifschneider's avatar Alexander Reifschneider
Browse files

OZG-7774 add statistic menu

Sub-Task: OZG-8104
parent 3d4f9091
No related branches found
No related tags found
1 merge request!128OZG-7774 add new menu items
Showing
with 176 additions and 30 deletions
...@@ -61,6 +61,9 @@ ...@@ -61,6 +61,9 @@
@if (apiRoot | hasLink: apiRootLinkRel.CONFIGURATION) { @if (apiRoot | hasLink: apiRootLinkRel.CONFIGURATION) {
<admin-menu-container data-test-id="menu-container"></admin-menu-container> <admin-menu-container data-test-id="menu-container"></admin-menu-container>
} }
@if (apiRoot | hasLink: apiRootLinkRel.CONFIGURATION) {
<admin-statistik-menu-container data-test-id="menu-container" />
}
</ods-navbar> </ods-navbar>
<main class="flex-1 overflow-y-auto bg-white px-6 py-4"> <main class="flex-1 overflow-y-auto bg-white px-6 py-4">
<router-outlet <router-outlet
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
import { MenuContainerComponent } from '@admin-client/configuration'; import { MenuContainerComponent, StatistikMenuContainerComponent } from '@admin-client/configuration';
import { ConfigurationLinkRel, ConfigurationResource, ConfigurationService } from '@admin-client/configuration-shared'; import { ConfigurationLinkRel, ConfigurationResource, ConfigurationService } from '@admin-client/configuration-shared';
import { ROUTES } from '@admin-client/shared'; import { ROUTES } from '@admin-client/shared';
import { KeycloakTokenService } from '@admin/keycloak-shared'; import { KeycloakTokenService } from '@admin/keycloak-shared';
...@@ -53,6 +53,7 @@ import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/ ...@@ -53,6 +53,7 @@ import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/
UnavailablePageComponent, UnavailablePageComponent,
BuildInfoComponent, BuildInfoComponent,
MenuContainerComponent, MenuContainerComponent,
StatistikMenuContainerComponent,
RouterLink, RouterLink,
HasLinkPipe, HasLinkPipe,
], ],
......
export * from './lib/menu-container/menu-container.component'; export * from './lib/menu-container/menu-container.component';
export * from './lib/statistik-menu-container/statistik-menu-container.component';
...@@ -3,8 +3,3 @@ ...@@ -3,8 +3,3 @@
<ods-icon icon name="mailbox" fill="text" /> <ods-icon icon name="mailbox" fill="text" />
</ods-nav-item> </ods-nav-item>
} }
@if (configurationStateResource.resource | hasLink: configurationLinkRel.AGGREGATION_MAPPINGS) {
<ods-nav-item data-test-id="statistik-navigation" caption="Statistik" [path]="'/' + ROUTES.AGGREGATION_MAPPING">
<ods-icon icon name="statistic" fill="text" />
</ods-nav-item>
}
...@@ -48,24 +48,4 @@ describe('MenuComponent', () => { ...@@ -48,24 +48,4 @@ describe('MenuComponent', () => {
notExistsAsHtmlElement(fixture, postfachNavigation); notExistsAsHtmlElement(fixture, postfachNavigation);
}); });
}); });
describe('statistic navigation', () => {
it('should show if settings link is present', () => {
component.configurationStateResource = createStateResource(
createConfigurationResource([ConfigurationLinkRel.AGGREGATION_MAPPINGS]),
);
fixture.detectChanges();
existsAsHtmlElement(fixture, statistikNavigationSelector);
});
it('should hide if settings link is missing', () => {
component.configurationStateResource = createStateResource(createConfigurationResource());
fixture.detectChanges();
notExistsAsHtmlElement(fixture, statistikNavigationSelector);
});
});
}); });
<admin-statistik-menu [configurationStateResource]="configurationStateResource$ | async" />
import { ConfigurationResource, ConfigurationService } from '@admin-client/configuration-shared';
import { createStateResource, StateResource } from '@alfa-client/tech-shared';
import { getMockComponent, mock, Mock } from '@alfa-client/test-utils';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MockComponent } from 'ng-mocks';
import { of } from 'rxjs';
import { createConfigurationResource } from '../../../../configuration-shared/test/configuration';
import { StatistikMenuContainerComponent } from './statistik-menu-container.component';
import { StatistikMenuComponent } from './statistik-menu/statistik-menu.component';
describe('StatistikMenuContainerComponent', () => {
let component: StatistikMenuContainerComponent;
let fixture: ComponentFixture<StatistikMenuContainerComponent>;
let configurationService: Mock<ConfigurationService>;
const configurationStateResource: StateResource<ConfigurationResource> = createStateResource(createConfigurationResource());
beforeEach(async () => {
configurationService = { ...mock(ConfigurationService), get: jest.fn().mockReturnValue(of(configurationStateResource)) };
await TestBed.configureTestingModule({
imports: [StatistikMenuContainerComponent],
declarations: [MockComponent(StatistikMenuComponent)],
providers: [
{
provide: ConfigurationService,
useValue: configurationService,
},
],
}).compileComponents();
fixture = TestBed.createComponent(StatistikMenuContainerComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
describe('ngOnInit', () => {
it('should call service', () => {
component.ngOnInit();
expect(configurationService.get).toHaveBeenCalled();
});
});
it('should call menu', () => {
const menu: StatistikMenuComponent = getMockComponent(fixture, StatistikMenuComponent);
expect(menu.configurationStateResource).toBe(configurationStateResource);
});
});
import { ConfigurationResource, ConfigurationService } from '@admin-client/configuration-shared';
import { StateResource } from '@alfa-client/tech-shared';
import { CommonModule } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
import { Observable } from 'rxjs';
import { StatistikMenuComponent } from './statistik-menu/statistik-menu.component';
@Component({
selector: 'admin-statistik-menu-container',
standalone: true,
imports: [CommonModule, StatistikMenuComponent],
templateUrl: './statistik-menu-container.component.html',
})
export class StatistikMenuContainerComponent implements OnInit {
private readonly configurationService = inject(ConfigurationService);
public configurationStateResource$: Observable<StateResource<ConfigurationResource>>;
ngOnInit(): void {
this.configurationStateResource$ = this.configurationService.get();
}
}
<ods-nav-headline label="Statistik" />
@if (configurationStateResource.resource | hasLink: configurationLinkRel.AGGREGATION_MAPPINGS) {
<ods-nav-item data-test-id="statistik-navigation" caption="Auswertungen" [path]="'/' + ROUTES.AGGREGATION_MAPPING">
<ods-icon icon name="statistic" fill="text" />
</ods-nav-item>
}
<!-- @if (configurationStateResource.resource | hasLink: configurationLinkRel.**datenanfragen**) {
<ods-nav-item data-test-id="statistik-navigation" caption="Auswertungen" [path]="'/' + **datenanfragen**">
<ods-icon icon name="statistic" fill="text" />
</ods-nav-item>
}
@if (configurationStateResource.resource | hasLink: configurationLinkRel.**datenfreigaben**) {
<ods-nav-item data-test-id="statistik-navigation" caption="Auswertungen" [path]="'/' + **datenfreigaben**">
<ods-icon icon name="statistic" fill="text" />
</ods-nav-item>
} -->
import { ConfigurationLinkRel } from '@admin-client/configuration-shared';
import { createEmptyStateResource, createStateResource, HasLinkPipe } from '@alfa-client/tech-shared';
import { existsAsHtmlElement, notExistsAsHtmlElement } from '@alfa-client/test-utils';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { IconComponent, NavItemComponent } from '@ods/system';
import { createConfigurationResource } from 'libs/admin/configuration-shared/test/configuration';
import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
import { MockComponent } from 'ng-mocks';
import { StatistikMenuComponent } from './statistik-menu.component';
describe('StatistikMenuComponent', () => {
let component: StatistikMenuComponent;
let fixture: ComponentFixture<StatistikMenuComponent>;
const postfachNavigation: string = getDataTestIdOf('postfach-navigation');
const statistikNavigationSelector: string = getDataTestIdOf('statistik-navigation');
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [StatistikMenuComponent, HasLinkPipe],
declarations: [MockComponent(NavItemComponent), MockComponent(IconComponent)],
}).compileComponents();
fixture = TestBed.createComponent(StatistikMenuComponent);
component = fixture.componentInstance;
component.configurationStateResource = createEmptyStateResource();
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
describe('statistic navigation', () => {
it('should show if agregation mapping link is present', () => {
component.configurationStateResource = createStateResource(
createConfigurationResource([ConfigurationLinkRel.AGGREGATION_MAPPINGS]),
);
fixture.detectChanges();
existsAsHtmlElement(fixture, statistikNavigationSelector);
});
it('should hide if agregation mapping link is missing', () => {
component.configurationStateResource = createStateResource(createConfigurationResource());
fixture.detectChanges();
notExistsAsHtmlElement(fixture, statistikNavigationSelector);
});
});
});
import { ConfigurationLinkRel, ConfigurationResource } from '@admin-client/configuration-shared';
import { ROUTES } from '@admin-client/shared';
import { HasLinkPipe, StateResource } from '@alfa-client/tech-shared';
import { CommonModule } from '@angular/common';
import { Component, Input } from '@angular/core';
import { IconComponent, NavHeadlineComponent, NavItemComponent } from '@ods/system';
@Component({
selector: 'admin-statistik-menu',
standalone: true,
imports: [CommonModule, NavItemComponent, IconComponent, HasLinkPipe, NavHeadlineComponent],
templateUrl: './statistik-menu.component.html',
})
export class StatistikMenuComponent {
@Input() configurationStateResource: StateResource<ConfigurationResource>;
public readonly configurationLinkRel = ConfigurationLinkRel;
public readonly ROUTES = ROUTES;
}
...@@ -28,7 +28,7 @@ export enum ROUTES { ...@@ -28,7 +28,7 @@ export enum ROUTES {
BENUTZER_ID = 'benutzer/:userid', BENUTZER_ID = 'benutzer/:userid',
ORGANISATIONSEINHEITEN = 'organisationseinheiten', ORGANISATIONSEINHEITEN = 'organisationseinheiten',
UNAVAILABLE = 'unavailable', UNAVAILABLE = 'unavailable',
AGGREGATION_MAPPING = 'auswertungen', AGGREGATION_MAPPING = 'statistik/auswertungen',
AGGREGATION_MAPPING_NEU = 'auswertungen/neu', AGGREGATION_MAPPING_NEU = 'statistik/auswertungen/neu',
AGGREGATION_MAPPING_ID = 'auswertungen/:aggregationMappingId', AGGREGATION_MAPPING_ID = 'statistik/auswertungen/:aggregationMappingId',
} }
...@@ -5,7 +5,7 @@ import { Component, Input } from '@angular/core'; ...@@ -5,7 +5,7 @@ import { Component, Input } from '@angular/core';
selector: 'ods-nav-headline', selector: 'ods-nav-headline',
standalone: true, standalone: true,
imports: [CommonModule], imports: [CommonModule],
template: `<p class="mx-4 font-medium">{{ label }}</p>`, template: `<p class="mx-4 my-2 font-medium">{{ label }}</p>`,
}) })
export class NavHeadlineComponent { export class NavHeadlineComponent {
@Input({ required: true }) label!: string; @Input({ required: true }) label!: string;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment