Skip to content
Snippets Groups Projects
Commit 05eacc4e authored by OZGCloud's avatar OZGCloud
Browse files

Merge branch 'master' into OZG-3420-e2e-tests-in-eigene-pipeline

parents ae63a515 608eae7e
No related branches found
No related tags found
No related merge requests found
Showing
with 183 additions and 38 deletions
......@@ -23,8 +23,8 @@
*/
export class NavigationE2EComponent {
private readonly locatorAllVorgaengeItem: string = 'all-vorgaenge-navigation-item';
private readonly locatorMyVorgaengeItem: string = 'my-vorgaenge-navigation-item';
private readonly alleFilterItem: string = 'alle-filter-item';
private readonly meineVorgaengeFilterItem: string = 'meine-vorgaenge-filter-item';
private readonly locatorRoot: string = 'navigation';
......@@ -32,11 +32,11 @@ export class NavigationE2EComponent {
return cy.getTestElement(this.locatorRoot);
}
public getAllVorgaengeItem() {
return cy.getTestElement(this.locatorAllVorgaengeItem);
public getAlleFilterItem() {
return cy.getTestElement(this.alleFilterItem);
}
public getMyVorgaengeItem() {
return cy.getTestElement(this.locatorMyVorgaengeItem);
public getMeineVorgaengeFilterItem() {
return cy.getTestElement(this.meineVorgaengeFilterItem);
}
}
\ No newline at end of file
export class VorgangViewsE2EComponent {
private readonly vorgangList: string = 'vorgang-vorgang-list-view';
private readonly search: string = 'vorgang-search-view';
public getVorgangList() {
return cy.getTestElement(this.vorgangList);
}
public getSearch() {
return cy.getTestElement(this.search);
}
}
\ No newline at end of file
......@@ -4,5 +4,16 @@
"602566a207bb665df9a86e86",
"6287e73f93b7c34e3ce08a4f",
"6287e7497433b51bfc87cfe8",
"6287e7507433b51bfc87cfe9"
"6287e7507433b51bfc87cfe9",
"63f36a253b699e31515bcfac",
"63ef6a343b699e31515bcfa5",
"63ef5dc73b699e31515bcfa2",
"63ef541b0b962e161eac58c0",
"63ef54020b962e161eac58bd",
"63f89809c3da394fab1ca99b",
"63f891a1c3da394fab1ca994",
"63f89142c3da394fab1ca98d",
"63f881fac3da394fab1ca985",
"63f8812ac3da394fab1ca97e",
"63f87a08d51f927a669b3807"
]
......@@ -53,14 +53,14 @@ describe('Navigation', () => {
describe('navigation item myVorgaenge', () => {
it('should not exists', () => {
notExist(navigation.getMyVorgaengeItem());
notExist(navigation.getMeineVorgaengeFilterItem());
})
})
describe('navigation item allVorgaenge', () => {
it('should exists', () => {
exist(navigation.getAllVorgaengeItem());
exist(navigation.getAlleFilterItem());
})
})
})
\ No newline at end of file
......@@ -33,7 +33,7 @@ import { contains, exist, notExist } from '../../../support/cypress.util';
import { loginAsSabine } from '../../../support/user-util';
import { createVorgang, initVorgang } from '../../../support/vorgang-util';
describe('Interceptor unauthorized', () => {
describe.skip('Interceptor unauthorized', () => {
const mainPage: MainPage = new MainPage();
const vorgangList: VorgangListE2EComponent = mainPage.getVorgangList();
......
......@@ -23,11 +23,12 @@
*/
import { NavigationE2EComponent } from 'apps/goofy-e2e/src/components/navigation/navigation.e2e.component';
import { VorgangListE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-list.e2e.component';
import { VorgangViewsE2EComponent } from 'apps/goofy-e2e/src/components/vorgang/vorgang-views.e2e.component';
import { UsermanagerUserE2E } from 'apps/goofy-e2e/src/model/usermanager';
import { VorgangE2E } from 'apps/goofy-e2e/src/model/vorgang';
import { MainPage, waitForSpinnerToDisappear } from 'apps/goofy-e2e/src/page-objects/main.po';
import { dropCollections } from 'apps/goofy-e2e/src/support/cypress-helper';
import { CypressKeyboardActions, exist, notExist } from 'apps/goofy-e2e/src/support/cypress.util';
import { CypressKeyboardActions, exist, haveText, notExist } from 'apps/goofy-e2e/src/support/cypress.util';
import { getUserManagerUserEmil, getUserManagerUserPeter, getUserManagerUserSabine, getUserSabineInternalId, initUsermanagerUsers, loginAsSabine } from 'apps/goofy-e2e/src/support/user-util';
import { buildVorgang, createVorgang, initSearchIndex, initVorgaenge, objectIds } from 'apps/goofy-e2e/src/support/vorgang-util';
......@@ -37,6 +38,8 @@ describe('Navigation', () => {
const navigation: NavigationE2EComponent = mainPage.getNavigation();
const views: VorgangViewsE2EComponent = mainPage.getViews();
const usermanagerUserSabine: UsermanagerUserE2E = getUserManagerUserSabine();
const vorgang: VorgangE2E = createVorgang();
......@@ -55,7 +58,7 @@ describe('Navigation', () => {
waitForSpinnerToDisappear();
exist(vorgangList.getRoot());
navigation.getAllVorgaengeItem().click();
navigation.getAlleFilterItem().click();
waitForSpinnerToDisappear();
exist(vorgangList.getRoot());
})
......@@ -67,21 +70,21 @@ describe('Navigation', () => {
describe('navigation item myVorgaenge', () => {
it('should exists', () => {
exist(navigation.getMyVorgaengeItem());
exist(navigation.getMeineVorgaengeFilterItem());
})
})
describe('navigation item allVorgaenge', () => {
it('should exists', () => {
exist(navigation.getAllVorgaengeItem());
exist(navigation.getAlleFilterItem());
})
})
describe('click on my vorgaenge', () => {
it('should hide not to user assigned vorgaenge', () => {
navigation.getMyVorgaengeItem().click();
navigation.getMeineVorgaengeFilterItem().click();
waitForSpinnerToDisappear();
notExist(vorgangList.getListItem(vorgang.name).getRoot());
......@@ -104,7 +107,9 @@ describe('Navigation', () => {
describe('click on all vorgaenge', () => {
it('should show all vorgaenge', () => {
navigation.getAllVorgaengeItem().click();
navigation.getAlleFilterItem().click();
views.getVorgangList().click();
waitForSpinnerToDisappear();
exist(vorgangList.getListItem(vorgang.name).getRoot());
......@@ -124,6 +129,41 @@ describe('Navigation', () => {
})
})
describe('click on search view', () => {
it('and alle filter should show empty list', () => {
mainPage.getVorgangSearch().getClearButton().click();
waitForSpinnerToDisappear();
views.getSearch().click();
waitForSpinnerToDisappear();
notExist(vorgangList.getListItem(vorgang.name).getRoot());
notExist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot());
notExist(vorgangList.getListItem(vorgangAssigned.name).getRoot());
notExist(vorgangList.getListItem(vorgangAssignedNotBeFiltered.name).getRoot());
//TODO sauber implementieren
haveText(cy.getTestElement('empty-list-text'), 'Es wurden keine Treffer für „“ gefunden');
})
it('and meine filter should show empty list', () => {
navigation.getMeineVorgaengeFilterItem().click();
waitForSpinnerToDisappear();
notExist(vorgangList.getListItem(vorgang.name).getRoot());
notExist(vorgangList.getListItem(vorgangNotBeFiltered.name).getRoot());
notExist(vorgangList.getListItem(vorgangAssigned.name).getRoot());
notExist(vorgangList.getListItem(vorgangAssignedNotBeFiltered.name).getRoot());
//TODO sauber implementieren
haveText(cy.getTestElement('empty-list-text'), 'Es wurden keine Treffer für „“ gefunden');
})
})
function doSearch(searchString: string): void {
mainPage.getVorgangSearch().getInput().clear().type(searchString + CypressKeyboardActions.ENTER);
}
......
......@@ -48,7 +48,7 @@ describe('VorgangList Pages', () => {
const loadPageInterceptor: string = 'loadPage';
beforeEach(() => {
intercept(HttpMethodE2E.GET, '*/vorgangs').as(loadPageInterceptor);
intercept(HttpMethodE2E.GET, '*/vorgangs?page=0&limit=100').as(loadPageInterceptor);
})
it('should be 100 initial ', () => {
......@@ -64,7 +64,7 @@ describe('VorgangList Pages', () => {
const loadNextPageInterceptor: string = 'loadNextPage';
beforeEach(() => {
intercept(HttpMethodE2E.GET, '*/vorgangs?page=1').as(loadNextPageInterceptor);
intercept(HttpMethodE2E.GET, '*/vorgangs?page=1&limit=100').as(loadNextPageInterceptor);
})
it('should reload next vorgaenge page on scrolling down', () => {
......
......@@ -221,6 +221,7 @@ describe('VorgangList Suche', () => {
})
describe('clear preview list if clicking clear button', () => {
it('should hide preview list', () => {
mainPage.getVorgangSearch().getInput().clear().type(vorgangName.substring(0, 3));
......@@ -235,6 +236,7 @@ describe('VorgangList Suche', () => {
})
describe.skip('clear preview list on less than 3 character', () => {
it('should hide preview list', () => {
mainPage.getVorgangSearch().getInput().clear().type(vorgangName.substring(0, 3), { delay: 220 });
......
......@@ -28,12 +28,14 @@ import { InternalServerErrorDialogE2EComponent } from '../components/ui/internal
import { SnackBarE2EComponent } from '../components/ui/snackbar.e2e.component';
import { VorgangListE2EComponent } from '../components/vorgang/vorgang-list.e2e.component';
import { VorgangSearchE2EComponent } from '../components/vorgang/vorgang-search.e2e.component';
import { VorgangViewsE2EComponent } from '../components/vorgang/vorgang-views.e2e.component';
import { HeaderE2EComponent } from './header.po';
export class MainPage {
private readonly buildInfo: BuildInfoE2EComponent = new BuildInfoE2EComponent();
private readonly header: HeaderE2EComponent = new HeaderE2EComponent();
private readonly navigation: NavigationE2EComponent = new NavigationE2EComponent();
private readonly views: VorgangViewsE2EComponent = new VorgangViewsE2EComponent();
private readonly snackBar: SnackBarE2EComponent = new SnackBarE2EComponent();
private readonly vorgangList: VorgangListE2EComponent = new VorgangListE2EComponent();
private readonly vorgangSearch: VorgangSearchE2EComponent = new VorgangSearchE2EComponent();
......@@ -53,6 +55,10 @@ export class MainPage {
return this.navigation;
}
public getViews(): VorgangViewsE2EComponent {
return this.views;
}
public getSnackBar(): SnackBarE2EComponent {
return this.snackBar;
}
......
......@@ -93,9 +93,7 @@ export function initVorgangData(data: VorgangE2E[]): void {
export function initSearchIndexData(vorgaenge: VorgangE2E[]): void {
cy.removeAllDocumentsFromSearchIndex();
vorgaenge.forEach(vorgang => {
cy.addVorgangToSearchIndex(vorgang)
})
vorgaenge.forEach(vorgang => cy.addVorgangToSearchIndex(vorgang))
}
export function initUsermanagerData(data: UsermanagerUserE2E[]): void {
......
......@@ -41,7 +41,6 @@
}
main {
padding-left: 1rem;
position: relative;
flex-grow: 1;
max-width: calc(100vw - 1.25rem);
......
......@@ -24,8 +24,9 @@
import { Component, Inject, OnInit } from '@angular/core';
import { Title } from '@angular/platform-browser';
import { ApiRootFacade, ApiRootResource } from '@goofy-client/api-root-shared';
import { getFilterFromLocalStorage, getViewFromLocalStorage } from '@goofy-client/app-shared';
import { ENVIRONMENT_CONFIG } from '@goofy-client/environment-shared';
import { StateResource } from '@goofy-client/tech-shared';
import { EMPTY_STRING, isNotNil, StateResource } from '@goofy-client/tech-shared';
import { IconService } from '@goofy-client/ui';
import { AuthConfig, OAuthService } from 'angular-oauth2-oidc';
import { JwksValidationHandler } from 'angular-oauth2-oidc-jwks';
......@@ -71,7 +72,7 @@ export class AppComponent implements OnInit {
issuer: this.envConfig.authServer + '/realms/' + this.envConfig.realm,
// URL of the SPA to redirect the user to after login
redirectUri: window.location.origin + window.location.pathname,
redirectUri: window.location.origin + this.buildRedirectUri(),
// URL of the SPA to redirect the user after silent refresh
silentRefreshRedirectUri: window.location.origin + '/silent-refresh.html',
......@@ -87,6 +88,25 @@ export class AppComponent implements OnInit {
};
}
//TODO TDD
private buildRedirectUri(): string {
const filter: string = getFilterFromLocalStorage();
const view: string = getViewFromLocalStorage();
let path: string = '/';
if(filter === 'meine') {
path += 'meine';
} else {
path += 'alle'
}
if(isNotNil(view) && EMPTY_STRING !== view && 'undefined' !== view) {
path += '/' + view;
}
// console.info('REDIRECT_URI: ', path);
return path;
}
//TOCHECK Wird die genutzt?
public setTitle(newTitle: string) {
this.titleService.setTitle(newTitle);
}
......
......@@ -65,7 +65,11 @@ const tooltipDefaults: MatTooltipDefaultOptions = {
BrowserModule,
HttpClientModule,
BrowserAnimationsModule,
RouterModule.forRoot(routes, { onSameUrlNavigation: 'reload' }),
RouterModule.forRoot(routes, {
initialNavigation: 'enabledNonBlocking',
onSameUrlNavigation: 'reload',
}),
UiModule,
EnvironmentModule,
OAuthModule.forRoot({
......
......@@ -34,6 +34,7 @@ $darkBackgroundExpansionPanelLike: #424242;
$shadow-bottom: inset 0 -1px 0 rgba(#000, 0.08);
$header-height: 64px;
$navigation-width: 20px;
$navigation-height: 50px;
$activeButton: #e5eef8;
......@@ -41,6 +42,13 @@ $primaryPalette: mat.define-palette(mat.$blue-palette, 800, 500, 900);
$accentPalette: mat.define-palette(mat.$yellow-palette, 600, 300, 800);
$warnPalette: mat.define-palette(mat.$red-palette, 800, 600, 900);
$statusNeuPalette: mat.define-palette(mat.$blue-palette, 800, 500, 900);
$statusAngenommenPalette: mat.define-palette(mat.$yellow-palette, 600, 300, 800);
$statusInBearbeitungPalette: mat.define-palette(mat.$yellow-palette, 600, 300, 800);
$statusBeschiedenPalette: mat.define-palette(mat.$green-palette, 600, 300, 800);
$statusAbgeschlossenPalette: mat.define-palette(mat.$green-palette, 600, 300, 800);
$statusVerworfenPalette: mat.define-palette(mat.$gray-palette, 600, 300, 800);
$goofyTheme: mat.define-light-theme((
color: (
primary: $primaryPalette,
......
......@@ -21,20 +21,23 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
@import "variables";
.l-scroll-area {
height: calc(100vh - 112px);
height: calc(100vh - $header-height - $navigation-height);
background-color: #fff;
box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, 0.08), inset 1px 0 0 rgba(0, 0, 0, 0.08), inset -1px 0 0 rgba(0, 0, 0, 0.08);
// TODO Wofür ist der box-shadow?
// box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, 0.08), inset 1px 0 0 rgba(0, 0, 0, 0.08), inset -1px 0 0 rgba(0, 0, 0, 0.08);
overflow: auto;
padding-bottom: 40px;
outline: 0;
&--full {
//background-color: #fff;
box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, 0.08), inset 1px 0 0 rgba(0, 0, 0, 0.08), inset -1px 0 0 rgba(0, 0, 0, 0.08);
// TODO Wofür ist der box-shadow?
// box-shadow: inset 0 -1px 0 0 rgba(0, 0, 0, 0.08), inset 1px 0 0 rgba(0, 0, 0, 0.08), inset -1px 0 0 rgba(0, 0, 0, 0.08);
position: relative;
display: block;
min-height: calc(100vh - 112px);
min-height: calc(100vh - $header-height - $navigation-height);
}
}
......
......@@ -45,6 +45,8 @@
@import "libs/vorgang-shared-ui/src/lib/vorgang-nummer/vorgang-nummer.component.theme";
@import "libs/ui/src/lib/icon/postfach-icon/postfach-icon.component.theme";
@import "libs/ui/src/lib/ui/button-toggle/button-toogle.theme";
@import "libs/vorgang/src/lib/vorgang-list-page/vorgang-filter-menu-container/vorgang-filter-menu/_vorgang-filter-item.theme";
@import "libs/vorgang/src/lib/vorgang-list-page/vorgang-views-menu/vorgang-views-menu-item-status-button/_vorgang-views-menu-item-status-button.theme";
// TODO(v15): As of v15 mat.legacy-core no longer includes default typography styles.
// The following line adds:
......
......@@ -21,12 +21,19 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
export enum ApiRootLinkRel {
VORGAENGE = 'vorgaenge',
MY_VORGAENGE = 'myVorgaenge',
SEARCH = 'search',
SEARCH_MY_VORGAENGE = 'searchMyVorgaenge',
export enum ApiRootLinkRel { //TODO Renaming
CURRENT_USER = 'currentUser',
SEARCH_USER_PROFILES = 'search-user-profiles',
DOWNLOAD_TOKEN = 'downloadToken',
CURRENT_USER = 'currentUser'
SEARCH = 'search_all',
SEARCH_MY_VORGAENGE = 'search_my',
VORGAENGE = 'vorgaenge_all',
MY_VORGAENGE = 'vorgaenge_my',
ALLE_VORGAENGE_NEU = 'vorgaenge_neu_all',
MEINE_VORGAENGE_NEU = 'vorgaenge_neu_meine',
ALLE_VORGAENGE_ANGENOMMEN = 'vorgaenge_angenommen_all',
ALLE_VORGAENGE_IN_BEARBEITUNG = 'vorgaenge_in_bearbeitung_all',
ALLE_VORGAENGE_BESCHIEDEN = 'vorgaenge_beschieden_all',
ALLE_VORGAENGE_ABGESCHLOSSEN = 'vorgaenge_abgeschlossen_all',
ALLE_VORGAENGE_VERWORFEN = 'vorgaenge_verworfen_all',
}
\ No newline at end of file
......@@ -23,6 +23,8 @@
*/
import { AppService } from './app.service';
import * as LocalStorage from '../storage/storage';
describe('AppService', () => {
let service: AppService;
......@@ -33,4 +35,16 @@ describe('AppService', () => {
it('should create', () => {
expect(service).toBeTruthy();
})
describe('setDarkMode', () => {
const darkModeStorage = jest.spyOn(LocalStorage, 'setDarkModeIntoStorage');
const darkMode: boolean = true;
it('should set in localStorage', () => {
service.setDarkMode(darkMode);
expect(darkModeStorage).toHaveBeenCalledWith('true');
})
})
})
\ No newline at end of file
......@@ -28,7 +28,7 @@ import { getDarkModeFromLocalStorage, setDarkModeIntoStorage } from '../storage/
@Injectable()
export class AppService {
private readonly darkMode: BehaviorSubject<boolean> = new BehaviorSubject(Boolean(JSON.parse(getDarkModeFromLocalStorage())));
private readonly darkMode: BehaviorSubject<boolean> = new BehaviorSubject(Boolean((JSON.parse(getDarkModeFromLocalStorage()))));
public setDarkMode(darkMode: boolean): void {
setDarkModeIntoStorage(String(darkMode));
......
......@@ -23,6 +23,8 @@
*/
export const localStorageDark: string = 'dark';
export const localStorageFilter: string = 'filter';
export const localStorageView: string = 'view';
export function setDarkModeIntoStorage(value: string): void {
localStorage.setItem(localStorageDark, value);
......@@ -31,3 +33,19 @@ export function setDarkModeIntoStorage(value: string): void {
export function getDarkModeFromLocalStorage(): string {
return localStorage.getItem(localStorageDark);
}
export function setFilterIntoStorage(value: string): void {
localStorage.setItem(localStorageFilter, value);
}
export function getFilterFromLocalStorage(): string {
return localStorage.getItem(localStorageFilter);
}
export function setViewIntoStorage(value: string): void {
localStorage.setItem(localStorageView, value);
}
export function getViewFromLocalStorage(): string {
return localStorage.getItem(localStorageView);
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment