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

OZG-7774 move statistik menu to menu container

parent 6ff2dfdf
Branches
Tags
1 merge request!128OZG-7774 add new menu items
Showing
with 141 additions and 110 deletions
...@@ -61,9 +61,6 @@ ...@@ -61,9 +61,6 @@
@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
......
...@@ -300,7 +300,7 @@ describe('AppComponent', () => { ...@@ -300,7 +300,7 @@ describe('AppComponent', () => {
it('should navigate to statistik if aggregation mapping link exists', () => { it('should navigate to statistik if aggregation mapping link exists', () => {
component._navigateByConfiguration(createConfigurationResource([ConfigurationLinkRel.AGGREGATION_MAPPINGS])); component._navigateByConfiguration(createConfigurationResource([ConfigurationLinkRel.AGGREGATION_MAPPINGS]));
expect(router.navigate).toHaveBeenCalledWith(['/auswertungen']); expect(router.navigate).toHaveBeenCalledWith(['/statistik/auswertungen']);
}); });
it('should navigate to unavailable page if no link exists', () => { it('should navigate to unavailable page if no link exists', () => {
......
...@@ -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, StatistikMenuContainerComponent } from '@admin-client/configuration'; import { MenuContainerComponent } 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,7 +53,6 @@ import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/ ...@@ -53,7 +53,6 @@ import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/
UnavailablePageComponent, UnavailablePageComponent,
BuildInfoComponent, BuildInfoComponent,
MenuContainerComponent, MenuContainerComponent,
StatistikMenuContainerComponent,
RouterLink, RouterLink,
HasLinkPipe, HasLinkPipe,
], ],
......
...@@ -24,4 +24,6 @@ ...@@ -24,4 +24,6 @@
export enum ConfigurationLinkRel { export enum ConfigurationLinkRel {
SETTING = 'settings', SETTING = 'settings',
AGGREGATION_MAPPINGS = 'aggregationMappings', AGGREGATION_MAPPINGS = 'aggregationMappings',
DATENFREIGABE = 'datenfreigabes',
DATENANFRAGE = 'datenanfrages',
} }
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';
<admin-menu [configurationStateResource]="configurationStateResource$ | async"></admin-menu> <admin-menu [configurationStateResource]="configurationStateResource$ | async" />
\ No newline at end of file <admin-statistik-menu [configurationStateResource]="configurationStateResource$ | async" />
...@@ -7,6 +7,7 @@ import { of } from 'rxjs'; ...@@ -7,6 +7,7 @@ import { of } from 'rxjs';
import { createConfigurationResource } from '../../../../configuration-shared/test/configuration'; import { createConfigurationResource } from '../../../../configuration-shared/test/configuration';
import { MenuContainerComponent } from './menu-container.component'; import { MenuContainerComponent } from './menu-container.component';
import { MenuComponent } from './menu/menu.component'; import { MenuComponent } from './menu/menu.component';
import { StatistikMenuComponent } from './statistik-menu/statistik-menu.component';
describe('MenuContainerComponent', () => { describe('MenuContainerComponent', () => {
let component: MenuContainerComponent; let component: MenuContainerComponent;
...@@ -21,7 +22,7 @@ describe('MenuContainerComponent', () => { ...@@ -21,7 +22,7 @@ describe('MenuContainerComponent', () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
imports: [MenuContainerComponent], imports: [MenuContainerComponent],
declarations: [MockComponent(MenuComponent)], declarations: [MockComponent(MenuComponent), MockComponent(StatistikMenuComponent)],
providers: [ providers: [
{ {
provide: ConfigurationService, provide: ConfigurationService,
...@@ -52,4 +53,10 @@ describe('MenuContainerComponent', () => { ...@@ -52,4 +53,10 @@ describe('MenuContainerComponent', () => {
expect(menu.configurationStateResource).toBe(configurationStateResource); expect(menu.configurationStateResource).toBe(configurationStateResource);
}); });
it('should call statistic menu', () => {
const statisticMenu: StatistikMenuComponent = getMockComponent(fixture, StatistikMenuComponent);
expect(statisticMenu.configurationStateResource).toBe(configurationStateResource);
});
}); });
...@@ -4,11 +4,12 @@ import { CommonModule } from '@angular/common'; ...@@ -4,11 +4,12 @@ import { CommonModule } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core'; import { Component, inject, OnInit } from '@angular/core';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { MenuComponent } from './menu/menu.component'; import { MenuComponent } from './menu/menu.component';
import { StatistikMenuComponent } from './statistik-menu/statistik-menu.component';
@Component({ @Component({
selector: 'admin-menu-container', selector: 'admin-menu-container',
standalone: true, standalone: true,
imports: [CommonModule, MenuComponent], imports: [CommonModule, MenuComponent, StatistikMenuComponent],
templateUrl: './menu-container.component.html', templateUrl: './menu-container.component.html',
}) })
export class MenuContainerComponent implements OnInit { export class MenuContainerComponent implements OnInit {
......
@if (
configurationStateResource.resource
| hasAnyLink
: configurationLinkRel.AGGREGATION_MAPPINGS
: configurationLinkRel.DATENFREIGABE
: configurationLinkRel.DATENANFRAGE
) {
<ods-nav-headline label="Statistik" />
<div class="flex flex-col gap-2">
@if (configurationStateResource.resource | hasLink: configurationLinkRel.AGGREGATION_MAPPINGS) {
<ods-nav-item data-test-id="auswertung-navigation" caption="Auswertungen" [path]="'/' + ROUTES.AGGREGATION_MAPPING">
<ods-icon icon name="statistic" fill="text" />
</ods-nav-item>
}
@if (configurationStateResource.resource | hasLink: configurationLinkRel.DATENFREIGABE) {
<ods-nav-item data-test-id="datenfreigaben-navigation" caption="Datenfreigaben" [path]="'/' + ROUTES.DATENFREIGABEN">
<ods-icon icon name="bar-chart-arrow" fill="text" />
</ods-nav-item>
}
@if (configurationStateResource.resource | hasLink: configurationLinkRel.DATENANFRAGE) {
<ods-nav-item data-test-id="datenanfragen-navigation" caption="Datenanfragen" [path]="'/' + ROUTES.DATENANFRAGEN">
<ods-icon icon name="bubble-question-mark" fill="text" />
</ods-nav-item>
}
</div>
}
...@@ -12,8 +12,9 @@ describe('StatistikMenuComponent', () => { ...@@ -12,8 +12,9 @@ describe('StatistikMenuComponent', () => {
let component: StatistikMenuComponent; let component: StatistikMenuComponent;
let fixture: ComponentFixture<StatistikMenuComponent>; let fixture: ComponentFixture<StatistikMenuComponent>;
const postfachNavigation: string = getDataTestIdOf('postfach-navigation'); const auswertungNavigationSelector: string = getDataTestIdOf('auswertung-navigation');
const statistikNavigationSelector: string = getDataTestIdOf('statistik-navigation'); const datenfreigabenNavigationSelector: string = getDataTestIdOf('datenfreigaben-navigation');
const datenanfragenNavigationSelector: string = getDataTestIdOf('datenanfragen-navigation');
beforeEach(async () => { beforeEach(async () => {
await TestBed.configureTestingModule({ await TestBed.configureTestingModule({
...@@ -32,6 +33,7 @@ describe('StatistikMenuComponent', () => { ...@@ -32,6 +33,7 @@ describe('StatistikMenuComponent', () => {
}); });
describe('statistic navigation', () => { describe('statistic navigation', () => {
describe('auswertung', () => {
it('should show if agregation mapping link is present', () => { it('should show if agregation mapping link is present', () => {
component.configurationStateResource = createStateResource( component.configurationStateResource = createStateResource(
createConfigurationResource([ConfigurationLinkRel.AGGREGATION_MAPPINGS]), createConfigurationResource([ConfigurationLinkRel.AGGREGATION_MAPPINGS]),
...@@ -39,7 +41,7 @@ describe('StatistikMenuComponent', () => { ...@@ -39,7 +41,7 @@ describe('StatistikMenuComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
existsAsHtmlElement(fixture, statistikNavigationSelector); existsAsHtmlElement(fixture, auswertungNavigationSelector);
}); });
it('should hide if agregation mapping link is missing', () => { it('should hide if agregation mapping link is missing', () => {
...@@ -47,7 +49,46 @@ describe('StatistikMenuComponent', () => { ...@@ -47,7 +49,46 @@ describe('StatistikMenuComponent', () => {
fixture.detectChanges(); fixture.detectChanges();
notExistsAsHtmlElement(fixture, statistikNavigationSelector); notExistsAsHtmlElement(fixture, auswertungNavigationSelector);
});
});
describe('datenfreigaben', () => {
it('should show if datenfreigabe link is present', () => {
component.configurationStateResource = createStateResource(
createConfigurationResource([ConfigurationLinkRel.DATENFREIGABE]),
);
fixture.detectChanges();
existsAsHtmlElement(fixture, datenfreigabenNavigationSelector);
});
it('should hide if datenfreigabe link is missing', () => {
component.configurationStateResource = createStateResource(createConfigurationResource());
fixture.detectChanges();
notExistsAsHtmlElement(fixture, datenfreigabenNavigationSelector);
});
});
describe('datenanfragen', () => {
it('should show if datenanfrage link is present', () => {
component.configurationStateResource = createStateResource(
createConfigurationResource([ConfigurationLinkRel.DATENANFRAGE]),
);
fixture.detectChanges();
existsAsHtmlElement(fixture, datenanfragenNavigationSelector);
});
it('should hide if datenanfrage link is missing', () => {
component.configurationStateResource = createStateResource(createConfigurationResource());
fixture.detectChanges();
notExistsAsHtmlElement(fixture, datenanfragenNavigationSelector);
});
}); });
}); });
}); });
import { ConfigurationLinkRel, ConfigurationResource } from '@admin-client/configuration-shared'; import { ConfigurationLinkRel, ConfigurationResource } from '@admin-client/configuration-shared';
import { ROUTES } from '@admin-client/shared'; import { ROUTES } from '@admin-client/shared';
import { HasLinkPipe, StateResource } from '@alfa-client/tech-shared'; import { HasAnyLinkPipe, HasLinkPipe, StateResource } from '@alfa-client/tech-shared';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { IconComponent, NavHeadlineComponent, NavItemComponent } from '@ods/system'; import { IconComponent, NavHeadlineComponent, NavItemComponent } from '@ods/system';
...@@ -8,7 +8,7 @@ import { IconComponent, NavHeadlineComponent, NavItemComponent } from '@ods/syst ...@@ -8,7 +8,7 @@ import { IconComponent, NavHeadlineComponent, NavItemComponent } from '@ods/syst
@Component({ @Component({
selector: 'admin-statistik-menu', selector: 'admin-statistik-menu',
standalone: true, standalone: true,
imports: [CommonModule, NavItemComponent, IconComponent, HasLinkPipe, NavHeadlineComponent], imports: [CommonModule, NavItemComponent, IconComponent, HasLinkPipe, HasAnyLinkPipe, NavHeadlineComponent],
templateUrl: './statistik-menu.component.html', templateUrl: './statistik-menu.component.html',
}) })
export class StatistikMenuComponent { export class StatistikMenuComponent {
......
<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" />
<div class="flex flex-col gap-2">
@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="release-data-navigation" caption="Datenfreigaben" [path]="'/' + ROUTES.RELEASE_DATA">
<ods-icon icon name="bar-chart-arrow" fill="text" />
</ods-nav-item>
<!-- } -->
<!-- @if (configurationStateResource.resource | hasLink: configurationLinkRel.**datenfreigaben**) { -->
<ods-nav-item data-test-id="request-data-navigation" caption="Datenanfragen" [path]="'/' + ROUTES.REQUEST_DATA">
<ods-icon icon name="bubble-question-mark" fill="text" />
</ods-nav-item>
<!-- } -->
</div>
...@@ -31,6 +31,6 @@ export enum ROUTES { ...@@ -31,6 +31,6 @@ export enum ROUTES {
AGGREGATION_MAPPING = 'statistik/auswertungen', AGGREGATION_MAPPING = 'statistik/auswertungen',
AGGREGATION_MAPPING_NEU = 'statistik/auswertungen/neu', AGGREGATION_MAPPING_NEU = 'statistik/auswertungen/neu',
AGGREGATION_MAPPING_ID = 'statistik/auswertungen/:aggregationMappingId', AGGREGATION_MAPPING_ID = 'statistik/auswertungen/:aggregationMappingId',
RELEASE_DATA = 'statistik/datenfreigaben', DATENFREIGABEN = 'statistik/datenfreigaben',
REQUEST_DATA = 'statistik/datenanfragen', DATENANFRAGEN = 'statistik/datenanfragen',
} }
...@@ -43,6 +43,7 @@ export * from './lib/pipe/format-date-with-time.pipe'; ...@@ -43,6 +43,7 @@ export * from './lib/pipe/format-date-with-time.pipe';
export * from './lib/pipe/format-date-without-year-with-time.pipe'; export * from './lib/pipe/format-date-without-year-with-time.pipe';
export * from './lib/pipe/format-to-pretty-date.pipe'; export * from './lib/pipe/format-to-pretty-date.pipe';
export * from './lib/pipe/get-url.pipe'; export * from './lib/pipe/get-url.pipe';
export * from './lib/pipe/has-any-link.pipe';
export * from './lib/pipe/has-link.pipe'; export * from './lib/pipe/has-link.pipe';
export * from './lib/pipe/not-has-link.pipe'; export * from './lib/pipe/not-has-link.pipe';
export * from './lib/pipe/to-embedded-resource.pipe'; export * from './lib/pipe/to-embedded-resource.pipe';
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment