diff --git a/goofy-client/.npmrc b/goofy-client/.npmrc new file mode 100644 index 0000000000000000000000000000000000000000..ba386e0fddf195aac7cabfc697ee09299446f154 --- /dev/null +++ b/goofy-client/.npmrc @@ -0,0 +1,2 @@ +registry=https://nexus.ozg-sh.de/repository/npm-proxy +//nexus.ozg-sh.de/:_auth=amVua2luczprTSFnNVUhMVQzNDZxWQ== diff --git a/goofy-client/apps/goofy-e2e/docker-compose.yml b/goofy-client/apps/goofy-e2e/docker-compose.yml index e4dfa8c3cf7c402dd991febcaad2544c5b09e5ab..34b9df4fbe4a465b5e9b911541832ae7b02a0738 100644 --- a/goofy-client/apps/goofy-e2e/docker-compose.yml +++ b/goofy-client/apps/goofy-e2e/docker-compose.yml @@ -67,6 +67,7 @@ services: - KEYCLOAK_RESOURCE=${KEYCLOAK_CLIENT:-alfa} - KEYCLOAK_AUTH_SERVER_URL=https://sso.dev.by.ozg-cloud.de - OZGCLOUD_USER-ASSISTANCE_DOCUMENTATION_URL=/assets/benutzerleitfaden/Benutzerleitfaden_2.5.pdf + - GOOFY_FEATURES_LOESCHANFORDERUNG=true ports: - 8080:8080 depends_on: @@ -93,11 +94,10 @@ services: soft: 65536 hard: 65536 healthcheck: - test: [ "CMD", "curl", "-f", "http://localhost:9200" ] + test: ["CMD-SHELL", "curl -s 'http://localhost:9200/_cat/health?h=status' | egrep -q '(green|yellow)'"] + interval: 10s timeout: 10s retries: 5 - start_period: 30s - ozg-usermanager: image: docker.ozg-sh.de/user-manager:${USERMANAGER_DOCKER_IMAGE:-snapshot-latest} platform: linux/amd64 diff --git a/goofy-client/apps/goofy-e2e/src/components/user-assistance/help-menu.component.e2e.ts b/goofy-client/apps/goofy-e2e/src/components/user-assistance/help-menu.component.e2e.ts new file mode 100644 index 0000000000000000000000000000000000000000..e37f8795bf1cc923759e34358868e1c1b1f507cc --- /dev/null +++ b/goofy-client/apps/goofy-e2e/src/components/user-assistance/help-menu.component.e2e.ts @@ -0,0 +1,13 @@ +export class HelpMenuE2EComponent { + + private readonly rootLocator: string = 'help-menu'; + private readonly buttonLocator: string = 'help-menu-button'; + + public getRoot() { + return cy.getTestElementWithOid(this.rootLocator); + } + + public getButton() { + return this.getRoot().getTestElementWithOid(this.buttonLocator); + } +} diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts index f59859fd43c2327673eff21241393784e9ee9439..c57ef9e1abbd6a3cdc00b1cc6111395315f25af3 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/accessibility/vorgang-list.spec-e2e.ts @@ -64,6 +64,12 @@ describe('VorgangList Page', () => { isKeyboardFocused(vorgangSearch.getClearButton()); }) + it('should focus help menu icon', () => { + pressTab(); + + isKeyboardFocused(header.getHelpMenu().getButton()); + }) + it('should focus settings icon', () => { pressTab(); diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts index 47287b89f71009c4ff4d7ae3f7fa0ecda618ff65..15cdb9c18106aa3eba2dd61f66fb2f6e87a6892e 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/app/buildinfo.e2e-spec.ts @@ -55,8 +55,5 @@ describe('Buildinfo', () => { exist(buildInfo.getVersion()); }) - it('should show buildTime', () => { - exist(buildInfo.getBuildTime()); - }) }) }) \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts b/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts index 0be3289dea31fd73b85378295f0588f7cf47de44..dd51146fd6fbbdead961952c1d499223d9f49340 100644 --- a/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts +++ b/goofy-client/apps/goofy-e2e/src/integration/main-tests/loesch-anforderung/loeschen-anfordern.e2e-spec.ts @@ -6,9 +6,8 @@ import { PostfachMailE2EComponent } from 'apps/goofy-e2e/src/components/postfach import { UserProfileE2EComponent } from 'apps/goofy-e2e/src/components/user-profile/user-profile.component.e2e'; import { VorgangFormularButtonsE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-formular-buttons.e2e.components'; import { WiedervorlageInVorgangE2EComponent } from 'apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-in-vorgang.e2e.component'; -import { WiedervorlageE2EComponent } from 'apps/goofy-e2e/src/components/wiedervorlage/wiedervorlage-page.e2e.component'; -import { WiedervorlagePage } from 'apps/goofy-e2e/src/page-objects/wiedervorlage.po'; -import { formatDateLocal } from 'apps/goofy-e2e/src/support/tech.util'; +import { initVorgangAttachedItem } from 'apps/goofy-e2e/src/support/vorgang-attached-item-util'; +import { createWiedervorlageAttachedItem, createWiedervorlageUriByVorgangIdAndWiedervorlageId } from 'apps/goofy-e2e/src/support/wiedervorlage-util'; import { SnackBarE2EComponent } from '../../../components/ui/snackbar.e2e.component'; import { VorgangListE2EComponent } from '../../../components/vorgang/vorgang-list.e2e.component'; import { VorgangE2E, VorgangMessagesE2E, VorgangStatusE2E, vorgangStatusLabelE2E } from '../../../model/vorgang'; @@ -31,17 +30,16 @@ describe('Vorgang Löschen anfordern', () => { const vorgangAbgeschlossenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[0], 'DoAbgeschlossenLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN }; const vorgangAbgeschlossenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[1], 'DoAbgeschlossenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.ABGESCHLOSSEN }; + const vorgangVerworfenLoeschenAnfordern: VorgangE2E = { ...buildVorgang(objectIds[2], 'DoVerworfenLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN }; const vorgangVerworfenLoeschenAnfordernRevoke: VorgangE2E = { ...buildVorgang(objectIds[3], 'DoVerworfenRevokeLoeschenAnfordern'), status: VorgangStatusE2E.VERWORFEN }; - const wiedervorlagePage: WiedervorlagePage = new WiedervorlagePage(); - const wiedervorlageContainer: WiedervorlageE2EComponent = wiedervorlagePage.getWiedervorlageContainer(); - const wiedervorlageBetreff: string = 'TestWiedervorlage'; - const wiedervorlageBeschreibung: string = 'Beschreibung einer Wiedervorlage'; - const wiedervorlageFrist: string = formatDateLocal(new Date(), 'dd.MM.yyyy'); + const wiedervorlageAttachedItem = createWiedervorlageAttachedItem(objectIds[4], vorgangAbgeschlossenLoeschenAnfordern._id.$oid); + const wiedervorlageUrl = createWiedervorlageUriByVorgangIdAndWiedervorlageId(objectIds[0], objectIds[4]); before(() => { initVorgaenge([vorgangAbgeschlossenLoeschenAnfordern, vorgangAbgeschlossenLoeschenAnfordernRevoke, vorgangVerworfenLoeschenAnfordern, vorgangVerworfenLoeschenAnfordernRevoke]); + initVorgangAttachedItem([wiedervorlageAttachedItem]); loginAsSabine(); @@ -64,24 +62,6 @@ describe('Vorgang Löschen anfordern', () => { describe('by button', () => { - it('should create Wiedervorlage', () => { - vorgangPage.getWiedervorlagenContainer().getCreateWiedervorlageButton().click(); - waitForSpinnerToDisappear(); - - exist(wiedervorlagePage.getSubnavigation().getRoot()); - - wiedervorlageContainer.getBetreff().clear().type(wiedervorlageBetreff); - wiedervorlageContainer.getBeschreibung().clear().type(wiedervorlageBeschreibung); - wiedervorlageContainer.getFrist().clear().type(wiedervorlageFrist); - - wiedervorlageContainer.getSpeichernButton().click(); - waitForSpinnerToDisappear(); - - const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage(wiedervorlageBetreff); - - exist(wiedervorlageInVorgang.getLink()); - }) - it('should have status Abgeschlossen', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[vorgangAbgeschlossenLoeschenAnfordern.status]); }) @@ -106,6 +86,23 @@ describe('Vorgang Löschen anfordern', () => { haveText(vorgangPage.getVorgangDetailHeader().getStatus(), vorgangStatusLabelE2E[VorgangStatusE2E.ZU_LOESCHEN]); }) + it('should redirect Wiedervorlage link to Vorgang', () => { + cy.visit(wiedervorlageUrl); + + exist(vorgangPage.getVorgangDetailHeader().getRoot()); + }) + + it('should show snackBar message', () => { + exist(snackBar.getCloseButton()); + contains(snackBar.getMessage(), VorgangMessagesE2E.WIEDERVORLAGE_BEARBEITEN_NICHT_MOEGLICH) + }) + + it('should close snackBar', () => { + snackBar.getCloseButton().click(); + + notExist(snackBar.getMessage()); + }) + it('back to vorgang list', () => { vorgangPage.getSubnavigation().clickBackButton(); waitForSpinnerToDisappear(); @@ -154,7 +151,7 @@ describe('Vorgang Löschen anfordern', () => { }) it('should disable open Wiedervorlage-Page link ', () => { - const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage(wiedervorlageBetreff); + const wiedervorlageInVorgang: WiedervorlageInVorgangE2EComponent = vorgangPage.getWiedervorlagenContainer().getWiedervorlage('Wiedervorlage'); notExist(wiedervorlageInVorgang.getLink()); }) diff --git a/goofy-client/apps/goofy-e2e/src/model/vorgang.ts b/goofy-client/apps/goofy-e2e/src/model/vorgang.ts index 53d133e01cb88080b5171099d35f1e41c2aff295..7d3732827591e83153065ee1b29bc3ff64403790 100644 --- a/goofy-client/apps/goofy-e2e/src/model/vorgang.ts +++ b/goofy-client/apps/goofy-e2e/src/model/vorgang.ts @@ -152,7 +152,8 @@ export enum VorgangMessagesE2E { ABGESCHLOSSEN = 'Der Vorgang wurde abgeschlossen.', WIEDEREROEFFNET = 'Der Vorgang wurde wiedereröffnet.', LOESCHEN_ANFORDERN = 'Für den Vorgang wurde eine Löschanforderung gestellt.', - ENDGUELTIG_LOESCHEN = 'Der Vorgang wurde gelöscht.' + ENDGUELTIG_LOESCHEN = 'Der Vorgang wurde gelöscht.', + WIEDERVORLAGE_BEARBEITEN_NICHT_MOEGLICH = 'Im Status "Zu löschen" ist die Bearbeitung von Wiedervorlagen nicht möglich.' } export const NO_AKTENZEICHEN: string = 'kein Aktenzeichen zugewiesen'; \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/page-objects/header.po.ts b/goofy-client/apps/goofy-e2e/src/page-objects/header.po.ts index 308d19a7a0de5409a563751d60f3ba156829adda..09bb350d00e2d9ec8d9e8a1ee6889276a531b4b5 100644 --- a/goofy-client/apps/goofy-e2e/src/page-objects/header.po.ts +++ b/goofy-client/apps/goofy-e2e/src/page-objects/header.po.ts @@ -21,15 +21,17 @@ * Die sprachspezifischen Genehmigungen und Beschränkungen * unter der Lizenz sind dem Lizenztext zu entnehmen. */ -import { CurrentUserProfileE2EComponent } from "../components/user-profile/current-user-profile.component.e2e"; -import { UserSettingsE2EComponent } from "../components/user-settings/user-settings.component.e2e"; -import { VorgangSearchE2EComponent } from "../components/vorgang/vorgang-search.e2e.component"; +import { HelpMenuE2EComponent } from '../components/user-assistance/help-menu.component.e2e'; +import { CurrentUserProfileE2EComponent } from '../components/user-profile/current-user-profile.component.e2e'; +import { UserSettingsE2EComponent } from '../components/user-settings/user-settings.component.e2e'; +import { VorgangSearchE2EComponent } from '../components/vorgang/vorgang-search.e2e.component'; export class HeaderE2EComponent { private readonly locatorLogo: string = 'alfa-logo'; private readonly locatorRoot: string = 'header'; + private readonly helpMenu: HelpMenuE2EComponent = new HelpMenuE2EComponent(); private readonly userSettings: UserSettingsE2EComponent = new UserSettingsE2EComponent(); private readonly currentUserProfile: CurrentUserProfileE2EComponent = new CurrentUserProfileE2EComponent(); private readonly vorgangSearch: VorgangSearchE2EComponent = new VorgangSearchE2EComponent(); @@ -46,6 +48,10 @@ export class HeaderE2EComponent { return this.vorgangSearch; } + public getHelpMenu(): HelpMenuE2EComponent { + return this.helpMenu; + } + public getUserSettings(): UserSettingsE2EComponent { return this.userSettings; } diff --git a/goofy-client/apps/goofy-e2e/src/support/wiedervorlage-util.ts b/goofy-client/apps/goofy-e2e/src/support/wiedervorlage-util.ts index 3651fbeb2cb9d5cdd09acfb4669315f78cbad8ef..d8b7a9bde3a39c9f2324534d8af030ea5fd74983 100644 --- a/goofy-client/apps/goofy-e2e/src/support/wiedervorlage-util.ts +++ b/goofy-client/apps/goofy-e2e/src/support/wiedervorlage-util.ts @@ -27,6 +27,7 @@ import { WiedervorlageE2E } from '../model/wiedervorlage'; import { buildUrl } from './tech.util'; import { getUserSabineInternalId } from './user-util'; import { VORGANG_ATTACHED_ITEM_CLASS } from './vorgang-attached-item-util'; +import { createVorgangUriById } from './vorgang-util'; /** @deprecated */ const wiedervorlageFixture: WiedervorlageE2E = require('../fixtures/wiedervorlage/wiedervorlage.json'); @@ -46,7 +47,11 @@ export function buildWiedervorlage(_id: string, uiIdentifier: string): Wiedervor } export function createWiedervorlageNeuUriByVorgangId(id: string): string { - return `/vorgang/${encodeUrlForEmbedding(buildUrl(id, 'vorgangs'))}/wiedervorlage/neu`; + return `${createVorgangUriById(id)}/wiedervorlage/neu`; +} + +export function createWiedervorlageUriByVorgangIdAndWiedervorlageId(vorgangId: string, wiedervorlageId: string): string { + return `${createVorgangUriById(vorgangId)}/wiedervorlage/${encodeUrlForEmbedding(buildUrl(wiedervorlageId, 'wiedervorlages'))}`; } const wiedervorlageItemFixture: WiedervorlageE2E = require('../fixtures/wiedervorlage/wiedervorlage.json'); diff --git a/goofy-client/apps/goofy-e2e/start-e2e-environment.sh b/goofy-client/apps/goofy-e2e/start-e2e-environment.sh index ddc2666398d902acc3150033347ae0a40656fc0f..1a90b7fb229e8069532eacd82d3b588e386eda5f 100755 --- a/goofy-client/apps/goofy-e2e/start-e2e-environment.sh +++ b/goofy-client/apps/goofy-e2e/start-e2e-environment.sh @@ -35,27 +35,48 @@ fi echo "Using docker-compose -f ${SCRIPT_DIR}/docker-compose.yml ..." echo -if [ "$(expr substr $(uname -s) 1 5)" == "Linux" ]; +if [[ "$OSTYPE" == "linux-gnu"* ]] then export DOCKER_GATEWAY_HOST=172.17.0.1 fi -docker compose -f ${SCRIPT_DIR}/docker-compose.yml up -d ozg-mongodb ozg-usermanager ozg-elastic +docker compose -f ${SCRIPT_DIR}/docker-compose.yml up -d ozg-mongodb ozg-usermanager ozg-elastic --wait + +echo +echo "Starting Pluto to init search index." + +SPRING_PROFILE=dev,e2e,initSearchIndex docker compose -f ${SCRIPT_DIR}/docker-compose.yml up -d ozg-pluto echo -while [[ $(curl -sw '%{http_code}' "http://localhost:9200" | grep -c 200) != 1 ]] + +waitForInitSearchIndex() { + (docker compose -f ${SCRIPT_DIR}/docker-compose.yml logs | fgrep -q 'Successful filled up index - exiting') +} + +echo "Waiting for Pluto to finish search index initialisation." +until waitForInitSearchIndex do - echo "Waiting for search service coming up..." - sleep 3 + echo -n "." + sleep 1 done - echo -echo "Starting Pluto to init search index..." -SPRING_PROFILE=dev,e2e,initSearchIndex docker compose -f ${SCRIPT_DIR}/docker-compose.yml up ozg-pluto echo -echo "Starting Pluto and Goofy for normal operations..." +echo "Starting Pluto and Alfa Server for normal operations." + SPRING_PROFILE=dev,e2e docker compose -f ${SCRIPT_DIR}/docker-compose.yml up -d ozg-pluto ozg-goofy ozg-usermanager +waitForServerStarted() { + (docker compose -f ${SCRIPT_DIR}/docker-compose.yml logs | awk 'BEGIN{RS="\0"} /Started AlfaServerApplication/ && /Started PlutoServerApplication/ { exit 1 }') +} + +echo +echo "Waiting for Pluto and Alfa Server to log successful start." +while waitForServerStarted +do + echo -n "." + sleep 1 +done +echo + echo -echo "Checking Docker Log for \"Started\" lines..." -docker compose -f ${SCRIPT_DIR}/docker-compose.yml logs -f | egrep "(Starting|Started)" +echo "done." \ No newline at end of file diff --git a/goofy-client/libs/navigation/src/lib/header-container/header/header.component.html b/goofy-client/libs/navigation/src/lib/header-container/header/header.component.html index 1eda8a946c057a56210dbaf9461fe625e1140a68..f46100b4e1dba9fa8d793b56ef477c6f8ec66e9a 100644 --- a/goofy-client/libs/navigation/src/lib/header-container/header/header.component.html +++ b/goofy-client/libs/navigation/src/lib/header-container/header/header.component.html @@ -31,7 +31,7 @@ <goofy-client-vorgang-search-container></goofy-client-vorgang-search-container> </div> <div class="right"> - <goofy-client-help-menu [apiRootStateResource]="apiRootStateResource"></goofy-client-help-menu> + <goofy-client-help-menu [apiRootStateResource]="apiRootStateResource" data-test-id="help-menu"></goofy-client-help-menu> <goofy-client-user-settings-container data-test-id="user-settings"></goofy-client-user-settings-container> <goofy-client-user-profile-in-header-container data-test-id="current-user"></goofy-client-user-profile-in-header-container> </div> diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang-list.service.spec.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang-list.service.spec.ts index cb47893a5f0f918a229d7c29bdd6d4b462bed09c..39b4f888072852a1b45d7678e2340062634793e2 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang-list.service.spec.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang-list.service.spec.ts @@ -30,7 +30,7 @@ import { createVorgangListResource } from 'libs/vorgang-shared/test/vorgang'; import { of } from 'rxjs'; import { VorgangFacade } from './+state/vorgang.facade'; import { VorgangListService } from './vorgang-list.service'; -import { VorgangFilter, VorgangListResource, VorgangView } from './vorgang.model'; +import { VorgangFilter, VorgangListResource, VorgangStatistic, VorgangView } from './vorgang.model'; import * as VorgangNavigationUtil from './vorgang-navigation.util'; @@ -197,12 +197,25 @@ describe('VorgangListService', () => { }) describe('getVorgangStatistic', () => { + const vorgangStatisticStateResource: StateResource<VorgangStatistic> = createStateResource(<VorgangStatistic>{}); + + beforeEach(() => { + vorgangFacade.getVorgangStatistic.mockReturnValue(of(vorgangStatisticStateResource)); + service.getVorgangList = jest.fn().mockReturnValue(of(<StateResource<VorgangListResource>>{})); + }) it('should call facade', () => { service.getVorgangStatistic(); expect(vorgangFacade.getVorgangStatistic).toHaveBeenCalled(); }) + + it('should getVorgangList', (done) => { + service.getVorgangStatistic().subscribe(() => { + expect(service.getVorgangList).toHaveBeenCalled(); + done(); + }) + }) }) describe('getSelectedFilterAsRouteParam', () => { diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang-list.service.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang-list.service.ts index d3cd2c46044bf0ac991ac51ae67afd25a248717e..4f9f2c340a89379c9defc4f6e03e943733f1ecbb 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang-list.service.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang-list.service.ts @@ -23,9 +23,9 @@ */ import { Injectable } from '@angular/core'; import { ApiRootFacade, ApiRootResource } from '@goofy-client/api-root-shared'; -import { EMPTY_STRING, StateResource, createEmptyStateResource, doIfLoadingRequired, isNotNull } from '@goofy-client/tech-shared'; +import { EMPTY_STRING, StateResource, createEmptyStateResource, doIfLoadingRequired, isLoaded, isNotNull } from '@goofy-client/tech-shared'; import { Observable, combineLatest } from 'rxjs'; -import { map, startWith, tap, withLatestFrom } from 'rxjs/operators'; +import { filter, map, startWith, tap, withLatestFrom } from 'rxjs/operators'; import { VorgangFacade } from './+state/vorgang.facade'; import { ROUTE_PARAM_BY_VORGANG_FILTER, buildLinkRel, getSearchLinkRel } from './vorgang-navigation.util'; import { VorgangFilter, VorgangListResource, VorgangResource, VorgangStatistic, VorgangView } from './vorgang.model'; @@ -63,8 +63,12 @@ export class VorgangListService { return this.vorgangFacade.getVorgaenge(); } - public getVorgangStatistic(): Observable<StateResource<VorgangStatistic>> { - return this.vorgangFacade.getVorgangStatistic(); + public getVorgangStatistic(): Observable<StateResource<VorgangStatistic>> { + return this.vorgangFacade.getVorgangStatistic().pipe( + withLatestFrom(this.getVorgangList()), + filter(([, vorgangListResource]) => isLoaded(vorgangListResource)), + map(([statistic,]) => statistic), + ); } public getSelectedFilterAsRouteParam(): Observable<string> { diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.spec.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.spec.ts index 378921958f5ba192ee99f34e469566f8a799b346..2960eece8f775297bc5c194cc81d66cc490db695 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.spec.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.spec.ts @@ -58,6 +58,14 @@ describe('Vorgang Navigation Util', () => { expect(result).toBe(searchString); }) + it('should return empty string', () => { + const searchString: string = EMPTY_STRING; + + const result = getSearchString(buildCurrentRouteData(searchString)); + + expect(result).toBe(EMPTY_STRING); + }) + function buildCurrentRouteData(searchString: string): RouteData { const urlSegments: UrlSegment[] = [<any>{ path: ALLE_ROUTE_PARAM}, <any>{ path: SEARCH_ROUTE_PARAM}, <any>{ path: searchString }]; const queryParameter = { [SEARCH_ROUTE_PARAM]: searchString }; diff --git a/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts b/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts index 77313108880463d96ae8691df0d2a15d9189b344..91ca40eafe8942737437e281c5642b6e4395dc87 100644 --- a/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts +++ b/goofy-client/libs/vorgang-shared/src/lib/vorgang-navigation.util.ts @@ -25,7 +25,7 @@ import { ApiRootLinkRel } from '@goofy-client/api-root-shared'; import { getFilterFromLocalStorage, getViewFromLocalStorage } from '@goofy-client/app-shared'; import { RouteData } from '@goofy-client/navigation-shared'; import { EMPTY_STRING, isNotEmpty, isNotNull, isNotUndefined } from '@goofy-client/tech-shared'; -import { isEmpty } from 'lodash-es'; +import { isEmpty, isUndefined } from 'lodash-es'; import { VorgangState } from './+state/vorgang.reducer'; import { VorgangFilter, VorgangView } from './vorgang.model'; @@ -92,10 +92,7 @@ const SEARCH_LINK_BY_VORGANG_FILTER: { [filter: string]: string } = { export function getSearchString(routeData: RouteData): string { const searchString: string = VorgangNavigationUtil.getRouteUrlSegment(routeData, 2); - if (isNotUndefined(searchString)) { - return decodeURIComponent(searchString); - } - return searchString; + return isUndefined(searchString) ? EMPTY_STRING : decodeURIComponent(searchString); } export function getSearchLinkRel(vorgangFilter: VorgangFilter): string { diff --git a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html index 6e00d3e0ec4d8e36eb9d914cbe165215f6356a67..813fdb341e119d3b83cb3b29b651a304304fc81b 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html +++ b/goofy-client/libs/vorgang/src/lib/vorgang-list-page-container/vorgang-list-page/vorgang-views-menu/vorgang-views-menu.component.html @@ -23,7 +23,7 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<ng-container *ngIf="vorgangStatisticStateResource.resource as statistic"> +<ng-container *ngIf="vorgangStatisticStateResource?.resource as statistic"> <div class="views"> <goofy-client-vorgang-view-item-container *ngIf="apiRootResource | hasAnyLink: apiRootLinkRel.ALLE_VORGAENGE_NEU: apiRootLinkRel.MEINE_VORGAENGE_NEU: apiRootLinkRel.UNASSIGNED_NEU" data-test-id="vorgang-neu-view" label="Neu" [view]="vorgangView.NEU" [count]="statistic.byStatus.neu"> diff --git a/goofy-client/libs/vorgang/src/lib/vorgang.module.ts b/goofy-client/libs/vorgang/src/lib/vorgang.module.ts index e37e14294423951d6c37413894256c8f19e4959f..b451a8206d08ab2c411700d960633df7af171d7e 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang.module.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang.module.ts @@ -79,7 +79,8 @@ const routes: Routes = [ }, { path: 'alle/search', - redirectTo: 'alle' + canActivate: [vorgangFilterViewGuard], + component: VorgangListSearchContainerComponent, }, { path: 'alle/:status', @@ -107,7 +108,8 @@ const routes: Routes = [ }, { path: 'meine/search', - redirectTo: 'meine' + canActivate: [vorgangFilterViewGuard], + component: VorgangListSearchContainerComponent, }, { path: 'meine/:status', @@ -135,7 +137,8 @@ const routes: Routes = [ }, { path: 'unassigned/search', - redirectTo: 'unassigned' + canActivate: [vorgangFilterViewGuard], + component: VorgangListSearchContainerComponent, }, { path: 'unassigned/:status',