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

Merge branch 'OZG-6986-admn-statistic-tab' into 'main'

OZG-6986 Add statistic page

See merge request !15
parents 8d0fde91 322687cc
Branches
Tags
1 merge request!15OZG-6986 Add statistic page
Showing
with 482 additions and 8 deletions
import { exist } from '../../support/cypress.util';
export class StatistikE2EComponent {
private readonly headerText: string = 'statistik-header-text';
public isHeaderTextVisible(): void {
exist(cy.getTestElement(this.headerText));
}
}
import { MainPage, waitForSpinnerToDisappear } from 'apps/admin-e2e/src/page-objects/main.po';
import { exist, notExist } from 'apps/admin-e2e/src/support/cypress.util';
import { loginAsAriane } from 'apps/admin-e2e/src/support/user-util';
describe('Navigation', () => {
const mainPage: MainPage = new MainPage();
describe('with user ariane', () => {
before(() => {
loginAsAriane();
waitForSpinnerToDisappear();
});
it('should show benutzer navigation item', () => {
exist(mainPage.getBenutzerTab());
});
it('should show postfach navigation item', () => {
exist(mainPage.getPostfachNavigationItem());
});
it('should hide organisationseinheiten navigation item', () => {
notExist(mainPage.getOrganisationEinheitNavigationItem());
});
it('should hide statistik navigation item', () => {
notExist(mainPage.getStatistikNavigationItem());
});
});
});
import { StatistikE2EComponent } from 'apps/admin-e2e/src/components/statistik/statistik-component';
import { MainPage, waitForSpinnerToDisappear } from 'apps/admin-e2e/src/page-objects/main.po';
import { exist, notExist } from 'apps/admin-e2e/src/support/cypress.util';
import { loginAsDaria } from 'apps/admin-e2e/src/support/user-util';
describe('Navigation', () => {
const mainPage: MainPage = new MainPage();
const statistikPage: StatistikE2EComponent = new StatistikE2EComponent();
describe('with user daria', () => {
before(() => {
loginAsDaria();
waitForSpinnerToDisappear();
});
it('should hide other navigation item', () => {
notExist(mainPage.getBenutzerTab());
});
it('should hide postfach navigation item', () => {
notExist(mainPage.getPostfachNavigationItem());
});
it('should hide organisationseinheiten navigation item', () => {
notExist(mainPage.getOrganisationEinheitNavigationItem());
});
describe('statistik', () => {
it('should be visible', () => {
exist(mainPage.getStatistikNavigationItem());
});
it('should be initial selected', () => {
mainPage.isStatistikNavigationItemSelected();
});
it('should show header text', () => {
statistikPage.isHeaderTextVisible();
});
});
});
});
import { StatistikE2EComponent } from 'apps/admin-e2e/src/components/statistik/statistik-component';
import { MainPage, waitForSpinnerToDisappear } from 'apps/admin-e2e/src/page-objects/main.po';
import { exist } from 'apps/admin-e2e/src/support/cypress.util';
import { loginAsSafira } from 'apps/admin-e2e/src/support/user-util';
describe('Navigation', () => {
const mainPage: MainPage = new MainPage();
const statistikPage: StatistikE2EComponent = new StatistikE2EComponent();
describe('with user safira', () => {
before(() => {
loginAsSafira();
waitForSpinnerToDisappear();
});
it('should show benutzer navigation item', () => {
exist(mainPage.getBenutzerTab());
});
it('should show postfach navigation item', () => {
exist(mainPage.getPostfachNavigationItem());
});
it('should show organisationseinheiten navigation item', () => {
exist(mainPage.getOrganisationEinheitNavigationItem());
});
describe('statistik', () => {
it('should be visible', () => {
exist(mainPage.getStatistikNavigationItem());
});
describe('on selection', () => {
before(() => {
mainPage.openStatistik();
});
it('should show page on selection', () => {
statistikPage.isHeaderTextVisible();
});
it('should mark navigation item as selected', () => {
mainPage.isStatistikNavigationItemSelected();
});
});
});
});
});
{
"name": "daria",
"password": "Y9nk43yrQ_zzIPpfFU-I",
"firstName": "Daria",
"lastName": "Data",
"fullName": "Daria Data",
"email": "daria.data@ozg-sh.de",
"initials": "DD",
"dataTestId": "DARIA_DATENBEAUFTRAGUNG",
"clientRoles": ["DATENBEAUFTRAGUNG"],
"groups": ["E2E Tests"]
}
{
"name": "safira",
"password": "Y9nk43yrQ_zzIPpfFU-I",
"firstName": "Safira",
"lastName": "Super",
"fullName": "Safira Super",
"email": "safira.super@ozg-sh.de",
"initials": "SS",
"dataTestId": "SAFIRA_ADMIN_DATENBEAUFTRAGUNG",
"clientRoles": ["DATENBEAUFTRAGUNG", "ADMIN_ADMIN"],
"groups": ["E2E Tests"]
}
...@@ -22,15 +22,21 @@ ...@@ -22,15 +22,21 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
import { BuildInfoE2EComponent } from '../components/buildinfo/buildinfo.e2e.component'; import { BuildInfoE2EComponent } from '../components/buildinfo/buildinfo.e2e.component';
import { containClass } from '../support/cypress.util';
import { HeaderE2EComponent } from './header.po'; import { HeaderE2EComponent } from './header.po';
export class MainPage { export class MainPage {
private readonly buildInfo: BuildInfoE2EComponent = new BuildInfoE2EComponent(); private readonly buildInfo: BuildInfoE2EComponent = new BuildInfoE2EComponent();
private readonly header: HeaderE2EComponent = new HeaderE2EComponent(); private readonly header: HeaderE2EComponent = new HeaderE2EComponent();
private readonly benutzerTab: string = 'caption-Benutzer__Rollen'; private readonly benutzerTab: string = 'caption-Benutzer__Rollen';
private readonly postfachTab: string = 'caption-Postfach'; private readonly postfachTab: string = 'caption-Postfach';
private readonly organisationsEinheitenTab: string = 'caption-Organisationseinheiten'; private readonly organisationsEinheitenTab: string = 'caption-Organisationseinheiten';
private readonly postfachNavigationItem: string = 'postfach-navigation';
private readonly organisationEinheitNavigation: string = 'organisations-einheiten-navigation';
private readonly statistikNavigationItem: string = 'statistik-navigation';
public getBuildInfo(): BuildInfoE2EComponent { public getBuildInfo(): BuildInfoE2EComponent {
return this.buildInfo; return this.buildInfo;
} }
...@@ -47,6 +53,14 @@ export class MainPage { ...@@ -47,6 +53,14 @@ export class MainPage {
this.getBenutzerTab().click(); this.getBenutzerTab().click();
} }
public getPostfachNavigationItem(): Cypress.Chainable<Element> {
return cy.getTestElement(this.postfachNavigationItem);
}
public getOrganisationEinheitNavigationItem(): Cypress.Chainable<Element> {
return cy.getTestElement(this.organisationEinheitNavigation);
}
public getOrganisationsEinheitenMenu(): Cypress.Chainable<Element> { public getOrganisationsEinheitenMenu(): Cypress.Chainable<Element> {
return cy.getTestElement(this.organisationsEinheitenTab); return cy.getTestElement(this.organisationsEinheitenTab);
} }
...@@ -54,6 +68,18 @@ export class MainPage { ...@@ -54,6 +68,18 @@ export class MainPage {
public openOrganisationsEinheiten(): void { public openOrganisationsEinheiten(): void {
this.getOrganisationsEinheitenMenu().click(); this.getOrganisationsEinheitenMenu().click();
} }
public getStatistikNavigationItem(): Cypress.Chainable<Element> {
return cy.getTestElement(this.statistikNavigationItem);
}
public isStatistikNavigationItemSelected(): void {
containClass(this.getStatistikNavigationItem().get('a'), 'border-selected');
}
public openStatistik(): void {
this.getStatistikNavigationItem().click();
}
} }
export function waitForSpinnerToDisappear(): boolean { export function waitForSpinnerToDisappear(): boolean {
......
...@@ -25,7 +25,7 @@ import { wait } from './cypress-helper'; ...@@ -25,7 +25,7 @@ import { wait } from './cypress-helper';
//TODO Naming der Methoden geradeziehen //TODO Naming der Methoden geradeziehen
export function containClass(element: Cypress.Chainable<Element>, cssClass: string): void { export function containClass(element: Cypress.Chainable<any>, cssClass: string): void {
element.should('have.class', cssClass); element.should('have.class', cssClass);
} }
......
...@@ -26,15 +26,23 @@ import { HeaderE2EComponent } from '../page-objects/header.po'; ...@@ -26,15 +26,23 @@ import { HeaderE2EComponent } from '../page-objects/header.po';
import { MainPage } from '../page-objects/main.po'; import { MainPage } from '../page-objects/main.po';
export function loginAsAriane(): void { export function loginAsAriane(): void {
cy.fixture('user/user_ariane.json').then((user) => { login(UserJsonPath.ARIANE);
loginByUi(user); }
});
export function loginAsDaria(): void {
login(UserJsonPath.DARIA);
} }
export function loginAsSabine(): void { export function loginAsSabine(): void {
cy.fixture('user/user_sabine.json').then((user) => { login(UserJsonPath.SABINE);
loginByUi(user); }
});
export function loginAsSafira(): void {
login(UserJsonPath.SAFIRA);
}
function login(userJson: string): void {
cy.fixture(userJson).then((user) => loginByUi(user));
} }
// Hinweis: cacheAcrossSpecs: true lässt Tests umfallen // Hinweis: cacheAcrossSpecs: true lässt Tests umfallen
...@@ -60,6 +68,13 @@ export function loginByUi(user: UserE2E): void { ...@@ -60,6 +68,13 @@ export function loginByUi(user: UserE2E): void {
); );
} }
enum UserJsonPath {
ARIANE = 'user/user_ariane.json',
DARIA = 'user/user_daria.json',
SABINE = 'user/user_sabine.json',
SAFIRA = 'user/user_safira.json',
}
export function logout(): void { export function logout(): void {
const mainPage: MainPage = new MainPage(); const mainPage: MainPage = new MainPage();
const header: HeaderE2EComponent = mainPage.getHeader(); const header: HeaderE2EComponent = mainPage.getHeader();
......
...@@ -45,8 +45,8 @@ ...@@ -45,8 +45,8 @@
<ods-nav-item data-test-id="users-roles-navigation" caption="Benutzer & Rollen" path="/benutzer_und_rollen"> <ods-nav-item data-test-id="users-roles-navigation" caption="Benutzer & Rollen" path="/benutzer_und_rollen">
<ods-users-icon class="stroke-text" icon /> <ods-users-icon class="stroke-text" icon />
</ods-nav-item> </ods-nav-item>
<hr />
</ng-container> </ng-container>
<hr />
<ng-container *ngIf="environment.features.postfach"> <ng-container *ngIf="environment.features.postfach">
<ods-nav-item data-test-id="postfach-navigation" caption="Postfach" path="/postfach"> <ods-nav-item data-test-id="postfach-navigation" caption="Postfach" path="/postfach">
<ods-mailbox-icon icon /> <ods-mailbox-icon icon />
...@@ -61,6 +61,12 @@ ...@@ -61,6 +61,12 @@
<ods-orga-unit-icon icon /> <ods-orga-unit-icon icon />
</ods-nav-item> </ods-nav-item>
</ng-container> </ng-container>
<hr />
@if (apiRoot | hasLink: apiRootLinkRel.AGGREGATION_MAPPING) {
<ods-nav-item data-test-id="statistik-navigation" caption="Statistik" path="/statistik">
<ods-statistic-icon icon />
</ods-nav-item>
}
</ng-container> </ng-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">
......
...@@ -65,6 +65,7 @@ describe('AppComponent', () => { ...@@ -65,6 +65,7 @@ describe('AppComponent', () => {
const navigationSelector: string = getDataTestIdOf('navigation'); const navigationSelector: string = getDataTestIdOf('navigation');
const usersRolesNavigationSelector: string = getDataTestIdOf('users-roles-navigation'); const usersRolesNavigationSelector: string = getDataTestIdOf('users-roles-navigation');
const postfachNavigationSelector: string = getDataTestIdOf('postfach-navigation'); const postfachNavigationSelector: string = getDataTestIdOf('postfach-navigation');
const statistikNavigationSelector: string = getDataTestIdOf('statistik-navigation');
const organisationsEinheitenNavigationSelector: string = getDataTestIdOf('organisations-einheiten-navigation'); const organisationsEinheitenNavigationSelector: string = getDataTestIdOf('organisations-einheiten-navigation');
const logoLink: string = getDataTestIdOf('logo-link'); const logoLink: string = getDataTestIdOf('logo-link');
const routerOutletSelector: string = getDataTestIdOf('router-outlet'); const routerOutletSelector: string = getDataTestIdOf('router-outlet');
...@@ -281,6 +282,21 @@ describe('AppComponent', () => { ...@@ -281,6 +282,21 @@ describe('AppComponent', () => {
notExistsAsHtmlElement(fixture, organisationsEinheitenNavigationSelector); notExistsAsHtmlElement(fixture, organisationsEinheitenNavigationSelector);
}); });
it('should show statistik if link in apiRoot exists', () => {
component.apiRootStateResource$ = of(
createStateResource(createApiRootResource([ApiRootLinkRel.AGGREGATION_MAPPING, ApiRootLinkRel.CONFIGURATION])),
);
fixture.detectChanges();
existsAsHtmlElement(fixture, statistikNavigationSelector);
});
it('should not show statistik if link in apiRoot does not exists', () => {
fixture.detectChanges();
notExistsAsHtmlElement(fixture, statistikNavigationSelector);
});
}); });
describe('build version', () => { describe('build version', () => {
......
...@@ -34,6 +34,7 @@ import { ...@@ -34,6 +34,7 @@ import {
NavbarComponent, NavbarComponent,
NavItemComponent, NavItemComponent,
OrgaUnitIconComponent, OrgaUnitIconComponent,
StatisticIconComponent,
UsersIconComponent, UsersIconComponent,
} from '@ods/system'; } from '@ods/system';
import { AuthenticationService } from 'libs/authentication/src/lib/authentication.service'; import { AuthenticationService } from 'libs/authentication/src/lib/authentication.service';
...@@ -55,6 +56,7 @@ import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/ ...@@ -55,6 +56,7 @@ import { UnavailablePageComponent } from '../pages/unavailable/unavailable-page/
AdminLogoIconComponent, AdminLogoIconComponent,
MailboxIconComponent, MailboxIconComponent,
OrgaUnitIconComponent, OrgaUnitIconComponent,
StatisticIconComponent,
RouterOutlet, RouterOutlet,
UnavailablePageComponent, UnavailablePageComponent,
BuildInfoComponent, BuildInfoComponent,
......
...@@ -26,6 +26,7 @@ import { Route } from '@angular/router'; ...@@ -26,6 +26,7 @@ import { Route } from '@angular/router';
import { OrganisationsEinheitFormPageComponent } from '../pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component'; import { OrganisationsEinheitFormPageComponent } from '../pages/organisationseinheit/organisationseinheit-form-page/organisationseinheit-form-page.component';
import { OrganisationsEinheitPageComponent } from '../pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component'; import { OrganisationsEinheitPageComponent } from '../pages/organisationseinheit/organisationseinheit-page/organisationseinheit-page.component';
import { PostfachPageComponent } from '../pages/postfach/postfach-page/postfach-page.component'; import { PostfachPageComponent } from '../pages/postfach/postfach-page/postfach-page.component';
import { StatistikPageComponent } from '../pages/statistik/statistik-page/statistik-page.component';
import { UserAddPageComponent } from '../pages/users-roles/user-add-page/user-add-page.component'; import { UserAddPageComponent } from '../pages/users-roles/user-add-page/user-add-page.component';
import { UserRolesPageComponent } from '../pages/users-roles/user-roles-page/user-roles-page.component'; import { UserRolesPageComponent } from '../pages/users-roles/user-roles-page/user-roles-page.component';
...@@ -60,4 +61,9 @@ export const appRoutes: Route[] = [ ...@@ -60,4 +61,9 @@ export const appRoutes: Route[] = [
component: OrganisationsEinheitFormPageComponent, component: OrganisationsEinheitFormPageComponent,
title: 'Admin | Organisationseinheit', title: 'Admin | Organisationseinheit',
}, },
{
path: ROUTES.STATISTIK,
component: StatistikPageComponent,
title: 'Admin | Statistik',
},
]; ];
<!--
Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den
Ministerpräsidenten des Landes Schleswig-Holstein
Staatskanzlei
Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
Lizenziert unter der EUPL, Version 1.2 oder - sobald
diese von der Europäischen Kommission genehmigt wurden -
Folgeversionen der EUPL ("Lizenz");
Sie dürfen dieses Werk ausschließlich gemäß
dieser Lizenz nutzen.
Eine Kopie der Lizenz finden Sie hier:
https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
Sofern nicht durch anwendbare Rechtsvorschriften
gefordert oder in schriftlicher Form vereinbart, wird
die unter der Lizenz verbreitete Software "so wie sie
ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
ausdrücklich oder stillschweigend - verbreitet.
Die sprachspezifischen Genehmigungen und Beschränkungen
unter der Lizenz sind dem Lizenztext zu entnehmen.
-->
<ng-container *ngIf="(apiRootStateResource$ | async)?.resource as apiRoot">
@if (apiRoot | hasLink: apiRootLinkRel.AGGREGATION_MAPPING) {
<admin-statistik-container data-test-id="statistik-container" />
}
</ng-container>
/*
* Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
import { StatistikContainerComponent } from '@admin-client/statistik';
import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
import { createStateResource, StateResource, TechSharedModule } from '@alfa-client/tech-shared';
import { existsAsHtmlElement, mock, Mock, notExistsAsHtmlElement } from '@alfa-client/test-utils';
import { CommonModule } from '@angular/common';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { createApiRootResource } from 'libs/api-root-shared/test/api-root';
import { getDataTestIdOf } from 'libs/tech-shared/test/data-test';
import { singleColdCompleted } from 'libs/tech-shared/test/marbles';
import { MockComponent } from 'ng-mocks';
import { Observable, of } from 'rxjs';
import { StatistikPageComponent } from './statistik-page.component';
describe('StatistikPageComponent', () => {
let component: StatistikPageComponent;
let fixture: ComponentFixture<StatistikPageComponent>;
const statistikContainerSelector: string = getDataTestIdOf('statistik-container');
let apiRootService: Mock<ApiRootService>;
beforeEach(async () => {
apiRootService = mock(ApiRootService);
await TestBed.configureTestingModule({
imports: [CommonModule, TechSharedModule],
declarations: [StatistikPageComponent, MockComponent(StatistikContainerComponent)],
providers: [{ provide: ApiRootService, useValue: apiRootService }],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(StatistikPageComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
describe('component', () => {
describe('ngOnInit', () => {
const apiRootStateResource: StateResource<ApiRootResource> = createStateResource(createApiRootResource());
const apiRootStateResource$: Observable<StateResource<ApiRootResource>> = of(apiRootStateResource);
beforeEach(() => {
apiRootService.getApiRoot.mockReturnValue(apiRootStateResource$);
});
it('should call apiRootService getApiRoot', () => {
component.ngOnInit();
expect(apiRootService.getApiRoot).toHaveBeenCalled();
});
it('should get apiRootStateResource$', () => {
component.ngOnInit();
expect(component.apiRootStateResource$).toBeObservable(singleColdCompleted(apiRootStateResource));
});
});
});
describe('template', () => {
describe('statistik-organisationseinheit-container', () => {
it('should be rendered if apiRootState has link', () => {
component.apiRootStateResource$ = of(createStateResource(createApiRootResource([ApiRootLinkRel.AGGREGATION_MAPPING])));
fixture.detectChanges();
existsAsHtmlElement(fixture, statistikContainerSelector);
});
it('should not be rendered if apiRootState has no link', () => {
component.apiRootStateResource$ = of(createStateResource(createApiRootResource()));
fixture.detectChanges();
notExistsAsHtmlElement(fixture, statistikContainerSelector);
});
});
});
});
/*
* Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
import { StatistikContainerComponent } from '@admin-client/statistik';
import { ApiRootLinkRel, ApiRootResource, ApiRootService } from '@alfa-client/api-root-shared';
import { createEmptyStateResource, StateResource, TechSharedModule } from '@alfa-client/tech-shared';
import { CommonModule } from '@angular/common';
import { Component, inject, OnInit } from '@angular/core';
import { Observable, of } from 'rxjs';
@Component({
selector: 'app-statistik-page',
standalone: true,
imports: [CommonModule, StatistikContainerComponent, TechSharedModule],
templateUrl: './statistik-page.component.html',
})
export class StatistikPageComponent implements OnInit {
private readonly apiRootService = inject(ApiRootService);
public apiRootStateResource$: Observable<StateResource<ApiRootResource>> = of(createEmptyStateResource<ApiRootResource>());
public readonly apiRootLinkRel = ApiRootLinkRel;
ngOnInit(): void {
this.apiRootStateResource$ = this.apiRootService.getApiRoot();
}
}
...@@ -26,4 +26,5 @@ export const ROUTES = { ...@@ -26,4 +26,5 @@ export const ROUTES = {
BENUTZER_UND_ROLLEN: 'benutzer_und_rollen', BENUTZER_UND_ROLLEN: 'benutzer_und_rollen',
BENUTZER_UND_ROLLEN_NEU: 'benutzer_und_rollen/neu', BENUTZER_UND_ROLLEN_NEU: 'benutzer_und_rollen/neu',
ORGANISATIONSEINHEITEN: 'organisationseinheiten', ORGANISATIONSEINHEITEN: 'organisationseinheiten',
STATISTIK: 'statistik',
}; };
{
"extends": ["../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts"],
"extends": ["plugin:@nx/angular", "plugin:@angular-eslint/template/process-inline-templates"],
"rules": {
"@angular-eslint/directive-selector": [
"error",
{
"type": "attribute",
"prefix": "admin",
"style": "camelCase"
}
],
"@angular-eslint/component-selector": [
"error",
{
"type": "element",
"prefix": "admin",
"style": "kebab-case"
}
]
}
},
{
"files": ["*.html"],
"extends": ["plugin:@nx/angular-template"],
"rules": {}
}
]
}
# statistik
This library was generated with [Nx](https://nx.dev).
## Running unit tests
Run `nx test statistik` to execute the unit tests.
export default {
displayName: 'admin-statistik',
preset: '../../../jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
coverageDirectory: '../../../coverage/libs/admin/statistik',
transform: {
'^.+\\.(ts|mjs|js|html)$': [
'jest-preset-angular',
{
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\\.(html|svg)$',
},
],
},
transformIgnorePatterns: ['node_modules/(?!.*\\.mjs$)'],
snapshotSerializers: [
'jest-preset-angular/build/serializers/no-ng-attributes',
'jest-preset-angular/build/serializers/ng-snapshot',
'jest-preset-angular/build/serializers/html-comment',
],
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment