diff --git a/alfa-client/apps/info/project.json b/alfa-client/apps/info/project.json index 6a94515647a2d9bac320d3c677a7a2393a790924..38c9788b9fbcaf060d509ed7ade48dcad8503c99 100644 --- a/alfa-client/apps/info/project.json +++ b/alfa-client/apps/info/project.json @@ -8,25 +8,16 @@ "targets": { "build": { "executor": "@angular-devkit/build-angular:browser-esbuild", - "outputs": [ - "{options.outputPath}" - ], + "outputs": ["{options.outputPath}"], "options": { "outputPath": "dist/apps/info", "index": "apps/info/src/index.html", "main": "apps/info/src/main.ts", - "polyfills": [ - "zone.js" - ], + "polyfills": ["zone.js"], "tsConfig": "apps/info/tsconfig.app.json", "inlineStyleLanguage": "scss", - "assets": [ - "apps/info/src/favicon.svg", - "apps/info/src/assets" - ], - "styles": [ - "apps/info/src/styles.scss" - ], + "assets": ["apps/info/src/favicon.svg", "apps/info/src/assets"], + "styles": ["apps/info/src/styles.scss"], "scripts": [], "stylePreprocessorOptions": { "includePaths": [ @@ -40,6 +31,10 @@ "configurations": { "production-by": { "fileReplacements": [ + { + "replace": "apps/info/src/environments/environment.ts", + "with": "apps/info/src/environments/environment.prod.by.ts" + }, { "replace": "apps/info/src/pages/accessibility/accessibility-page.component.ts", "with": "apps/info/src/pages/accessibility/accessibility-page-by.component.ts" @@ -61,9 +56,17 @@ }, "production-sh": { "fileReplacements": [ + { + "replace": "apps/info/src/environments/environment.ts", + "with": "apps/info/src/environments/environment.prod.sh.ts" + }, { "replace": "apps/info/src/pages/accessibility/accessibility-page.component.ts", "with": "apps/info/src/pages/accessibility/accessibility-page-sh.component.ts" + }, + { + "replace": "apps/info/src/pages/impressum/impressum-page.component.ts", + "with": "apps/info/src/pages/impressum/impressum-page-sh.component.ts" } ], "budgets": [ @@ -85,6 +88,10 @@ { "replace": "apps/info/src/pages/accessibility/accessibility-page.component.ts", "with": "apps/info/src/pages/accessibility/accessibility-page-sh.component.ts" + }, + { + "replace": "apps/info/src/pages/impressum/impressum-page.component.ts", + "with": "apps/info/src/pages/impressum/impressum-page-sh.component.ts" } ], "buildOptimizer": false, @@ -100,8 +107,11 @@ "serve": { "executor": "@angular-devkit/build-angular:dev-server", "configurations": { - "production": { - "buildTarget": "info:build:production" + "production-by": { + "buildTarget": "info:build:production-by" + }, + "production-sh": { + "buildTarget": "info:build:production-sh" }, "development": { "buildTarget": "info:build:development" @@ -120,9 +130,7 @@ }, "test": { "executor": "@nx/jest:jest", - "outputs": [ - "{workspaceRoot}/coverage/{projectRoot}" - ], + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { "jestConfig": "apps/info/jest.config.ts" } @@ -137,22 +145,16 @@ }, "container": { "executor": "@nx-tools/nx-container:build", - "dependsOn": [ - "build" - ], + "dependsOn": ["build"], "options": { "engine": "docker", "push": true, "metadata": { - "images": [ - "docker.ozg-sh.de/info" - ], + "images": ["docker.ozg-sh.de/info"], "load": true, - "tags": [ - "snapshot-latest" - ] + "tags": ["snapshot-latest"] } } } } -} \ No newline at end of file +} diff --git a/alfa-client/apps/info/src/app/app.component.html b/alfa-client/apps/info/src/app/app.component.html index 13d01813a0e5b8b42f74d308d648b60e2377dffc..b30e793d253d6e07873b825df8c247f8b69e11c6 100644 --- a/alfa-client/apps/info/src/app/app.component.html +++ b/alfa-client/apps/info/src/app/app.component.html @@ -11,4 +11,18 @@ <main class="flex-auto bg-background-50"> <router-outlet></router-outlet> </main> + @if (!isBayern) { + <footer class="ozg-prose flex justify-center gap-4" data-test-id="navigation-footer"> + <nav> + <ul class="flex flex-wrap justify-center gap-9"> + <li> + <a routerLink="/barrierefreiheit">Barrierefreiheit</a> + </li> + <li> + <a routerLink="/impressum">Impressum</a> + </li> + </ul> + </nav> + </footer> + } </div> diff --git a/alfa-client/apps/info/src/app/app.component.spec.ts b/alfa-client/apps/info/src/app/app.component.spec.ts index 5928900f952dcd5521fdafae4f2b042fb6be8b95..a9aef32a46554df9f598a3cbf086e713049d76d7 100644 --- a/alfa-client/apps/info/src/app/app.component.spec.ts +++ b/alfa-client/apps/info/src/app/app.component.spec.ts @@ -1,11 +1,15 @@ +import { existsAsHtmlElement, notExistsAsHtmlElement } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { provideRouter } from '@angular/router'; +import { getDataTestIdOf } from 'libs/tech-shared/test/data-test'; import { AppComponent } from './app.component'; describe('AppComponent', () => { let component: AppComponent; let fixture: ComponentFixture<AppComponent>; + const navigationLocator: string = getDataTestIdOf('navigation-footer'); + beforeEach(async () => { await TestBed.configureTestingModule({ imports: [AppComponent], @@ -20,4 +24,34 @@ describe('AppComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + describe('component', () => { + describe('ngOnInit', () => { + it('should set isBayern', () => { + component.ngOnInit(); + + expect(component.isBayern).toBe(false); + }); + }); + }); + + describe('template', () => { + describe('bundesland bayern', () => { + it('should NOT show navigation footer', () => { + component.isBayern = true; + + fixture.detectChanges(); + + notExistsAsHtmlElement(fixture, navigationLocator); + }); + + it('should show navigation footer', () => { + component.isBayern = false; + + fixture.detectChanges(); + + existsAsHtmlElement(fixture, navigationLocator); + }); + }); + }); }); diff --git a/alfa-client/apps/info/src/app/app.component.ts b/alfa-client/apps/info/src/app/app.component.ts index e81b19bbe0ad9e0ec1594bf7aa6f8c77b3801117..65ebf90d0dde07e83be8a3fe3981eb46e0c69987 100644 --- a/alfa-client/apps/info/src/app/app.component.ts +++ b/alfa-client/apps/info/src/app/app.component.ts @@ -1,6 +1,7 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { RouterModule } from '@angular/router'; import { OzgLogoIconComponent } from '@ods/system'; +import { environment } from '../environments/environment'; @Component({ standalone: true, @@ -8,4 +9,10 @@ import { OzgLogoIconComponent } from '@ods/system'; selector: 'app-root', templateUrl: './app.component.html', }) -export class AppComponent {} +export class AppComponent implements OnInit { + public isBayern: boolean; + + ngOnInit() { + this.isBayern = environment.bundesland === 'by'; + } +} diff --git a/alfa-client/apps/info/src/app/app.routes.ts b/alfa-client/apps/info/src/app/app.routes.ts index 2260ea6873811a57c40ea24dada72e8ef52a357c..d6ae093054d1fc56814c24e4b16c24b0e1705734 100644 --- a/alfa-client/apps/info/src/app/app.routes.ts +++ b/alfa-client/apps/info/src/app/app.routes.ts @@ -1,5 +1,6 @@ import { Route } from '@angular/router'; import { AccessibilityPageComponent } from '../pages/accessibility/accessibility-page.component'; +import { ImpressumPageComponent } from '../pages/impressum/impressum-page.component'; export const appRoutes: Route[] = [ { @@ -12,4 +13,10 @@ export const appRoutes: Route[] = [ component: AccessibilityPageComponent, title: 'Barrierefreiheit', }, + { + path: 'impressum', + component: ImpressumPageComponent, + title: 'Impressum', + }, + { path: '**', redirectTo: 'barrierefreiheit' }, ]; diff --git a/alfa-client/apps/info/src/environments/environment.prod.by.ts b/alfa-client/apps/info/src/environments/environment.prod.by.ts new file mode 100644 index 0000000000000000000000000000000000000000..5197eb27edcaa967af00f66b3b071dce2e042ca8 --- /dev/null +++ b/alfa-client/apps/info/src/environments/environment.prod.by.ts @@ -0,0 +1,4 @@ +export const environment = { + production: true, + bundesland: 'by', +}; diff --git a/alfa-client/apps/info/src/environments/environment.prod.sh.ts b/alfa-client/apps/info/src/environments/environment.prod.sh.ts new file mode 100644 index 0000000000000000000000000000000000000000..211c1eabf6a11fa3bfa93e5cc2c5d5fbaaf56ea1 --- /dev/null +++ b/alfa-client/apps/info/src/environments/environment.prod.sh.ts @@ -0,0 +1,4 @@ +export const environment = { + production: true, + bundesland: 'sh', +}; diff --git a/alfa-client/apps/info/src/environments/environment.ts b/alfa-client/apps/info/src/environments/environment.ts new file mode 100644 index 0000000000000000000000000000000000000000..879a4bf8ab755c728fb22c3d6655cdaa828180b2 --- /dev/null +++ b/alfa-client/apps/info/src/environments/environment.ts @@ -0,0 +1,4 @@ +export const environment = { + production: false, + bundesland: 'sh', +}; diff --git a/alfa-client/apps/info/src/pages/impressum/impressum-page-sh.component.spec.ts b/alfa-client/apps/info/src/pages/impressum/impressum-page-sh.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..04481d7d8817dd7bf46eca7979be1d782e802891 --- /dev/null +++ b/alfa-client/apps/info/src/pages/impressum/impressum-page-sh.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ImpressumPageComponent } from './impressum-page-sh.component'; + +describe('ImpressumPageComponent', () => { + let component: ImpressumPageComponent; + let fixture: ComponentFixture<ImpressumPageComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ImpressumPageComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ImpressumPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/alfa-client/apps/info/src/pages/impressum/impressum-page-sh.component.ts b/alfa-client/apps/info/src/pages/impressum/impressum-page-sh.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..443387d3a3af5dba195f4eb173d3a965f8803605 --- /dev/null +++ b/alfa-client/apps/info/src/pages/impressum/impressum-page-sh.component.ts @@ -0,0 +1,32 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-impressum-page', + standalone: true, + imports: [CommonModule], + template: `<div class="ozg-prose prose prose-h1:text-4xl prose-h2:text-2xl"> + <h1>Impressum</h1> + <p> + Der Ministerpräsident - Staatskanzlei <br /> + StK 3 – Digitalisierung und Zentrales IT-Management <br /> + Düsternbrooker Weg 104 <br /> + 24105 Kiel + </p> + <p> + E-Mail: <br /> + <a href="mailto:digitalisierung@stk.landsh.de">digitalisierung@stk.landsh.de</a> + </p> + <p> + Verantwortlich <br /> + Dr. Moritz Karg <br /> + StK 30 – Grundsatzangelegenheiten der Digitalisierung und des EGovernments + </p> + + <p> + E-Mail: <br /> + <a href="mailto:digitalisierung@stk.landsh.de">digitalisierung@stk.landsh.de</a> + </p> + </div>`, +}) +export class ImpressumPageComponent {} diff --git a/alfa-client/apps/info/src/pages/impressum/impressum-page.component.spec.ts b/alfa-client/apps/info/src/pages/impressum/impressum-page.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..da6855d06a29e6365e2e83e39aff6beffef02a3c --- /dev/null +++ b/alfa-client/apps/info/src/pages/impressum/impressum-page.component.spec.ts @@ -0,0 +1,21 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ImpressumPageComponent } from './impressum-page.component'; + +describe('ImpressumPageComponent', () => { + let component: ImpressumPageComponent; + let fixture: ComponentFixture<ImpressumPageComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ImpressumPageComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ImpressumPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/alfa-client/apps/info/src/pages/impressum/impressum-page.component.ts b/alfa-client/apps/info/src/pages/impressum/impressum-page.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..8cc9ac2f4c4c6ae084090b7b60fdcf84aee60d77 --- /dev/null +++ b/alfa-client/apps/info/src/pages/impressum/impressum-page.component.ts @@ -0,0 +1,11 @@ +import { CommonModule } from '@angular/common'; +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-impressum-page', + standalone: true, + imports: [CommonModule], + // template will be set during build time - see fileReplacements in apps/info/project.json + template: ``, +}) +export class ImpressumPageComponent {}