Skip to content
Snippets Groups Projects
Commit f892b9ea authored by Martin's avatar Martin
Browse files

OZG-7510 extract mapping form; cleanup; adjust settings type model; move provider

parent f8cb26e9
No related branches found
No related tags found
1 merge request!63Ozg 7510 statistic edit delete fields
Showing
with 62 additions and 90 deletions
......@@ -21,16 +21,10 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
import { ConfigurationService } from '@admin-client/configuration-shared';
import {
AggregationMappingListResourceService,
AggregationMappingService,
createAggregationMappingResourceService,
} from '@admin-client/reporting-shared';
import { AggregationMappingProvider } from '@admin-client/reporting-shared';
import { ApiRootModule } from '@alfa-client/api-root-shared';
import { EnvironmentModule, loadEnvironment } from '@alfa-client/environment-shared';
import { NavigationSharedModule } from '@alfa-client/navigation-shared';
import { ResourceRepository } from '@alfa-client/tech-shared';
import { registerLocaleData } from '@angular/common';
import { HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
import localeDe from '@angular/common/locales/de';
......@@ -103,12 +97,7 @@ loadEnvironment(environment.environmentUrl).then((env) => {
PostfachProviders,
SettingsProviders,
UserProviders,
{
provide: AggregationMappingListResourceService,
useFactory: createAggregationMappingResourceService,
deps: [ResourceRepository, ConfigurationService],
},
AggregationMappingService,
AggregationMappingProvider,
importProvidersFrom(
NavigationSharedModule,
BrowserModule,
......
import { AdminStatistikFieldsFormComponent } from '@admin-client/statistik';
import { existsAsHtmlElement } from '@alfa-client/test-utils';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MockComponent } from 'ng-mocks';
import { AdminStatistikFieldsFormComponent } from '../../../../../../libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component';
import { getDataTestIdOf } from '../../../../../../libs/tech-shared/test/data-test';
import { StatistikFieldsFormPageComponent } from './statistik-fields-form-page.component';
......
import { AdminStatistikFieldsFormComponent } from '@admin-client/statistik';
import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { AdminStatistikFieldsFormComponent } from '../../../../../../libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component';
@Component({
selector: 'statistik-fields-form-page',
......
......@@ -21,8 +21,7 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
import { Resource } from '@ngxp/rest';
import { SettingName } from 'libs/admin/settings-shared/src/lib/settings.model';
import { SettingItemResource } from 'libs/admin/settings-shared/src/lib/settings.model';
export interface Absender {
name: string;
......@@ -37,9 +36,4 @@ export interface Postfach {
signatur: string;
}
export declare type PostfachSettingsItem = {
name: SettingName.POSTFACH;
settingBody: Postfach;
};
export declare type PostfachResource = Resource & PostfachSettingsItem;
export declare type PostfachResource = SettingItemResource<Postfach>;
......@@ -21,13 +21,13 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
import { SettingName } from '@admin-client/settings-shared';
import { SettingItem, SettingName } from '@admin-client/settings-shared';
import { createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
import { SnackBarService } from '@alfa-client/ui';
import { inject, Injectable } from '@angular/core';
import { Observable, startWith, tap } from 'rxjs';
import { PostfachResourceService } from './postfach-resource.service';
import { Postfach, PostfachResource, PostfachSettingsItem } from './postfach.model';
import { Postfach, PostfachResource } from './postfach.model';
@Injectable()
export class PostfachService {
......@@ -51,7 +51,7 @@ export class PostfachService {
}
}
private buildPostfachSettingItem(postfach: Postfach): PostfachSettingsItem {
private buildPostfachSettingItem(postfach: Postfach): SettingItem<Postfach> {
return {
name: SettingName.POSTFACH,
settingBody: postfach,
......
......@@ -22,9 +22,9 @@
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
import { faker } from '@faker-js/faker';
import { SettingName } from 'libs/admin/settings-shared/src/lib/settings.model';
import { SettingItem, SettingName } from 'libs/admin/settings-shared/src/lib/settings.model';
import { toResource } from 'libs/tech-shared/test/resource';
import { Postfach, PostfachResource, PostfachSettingsItem } from '../lib/postfach.model';
import { Postfach, PostfachResource } from '../lib/postfach.model';
export function createPostfach(): Postfach {
return {
......@@ -39,7 +39,7 @@ export function createPostfach(): Postfach {
};
}
export function createPostfachSettingItem(): PostfachSettingsItem {
export function createPostfachSettingItem(): SettingItem<Postfach> {
return {
name: SettingName.POSTFACH,
settingBody: createPostfach(),
......
export * from './lib/aggregation-mapping-resource.service';
export * from './lib/aggregation-mapping.model';
export * from './lib/aggregation-mapping.provider';
export * from './lib/aggregation-mapping.service';
import { ResourceRepository } from '@alfa-client/tech-shared';
import { Provider } from '@angular/core';
import { ConfigurationService } from 'libs/admin/configuration-shared/src/lib/configuration.service';
import {
AggregationMappingListResourceService,
createAggregationMappingResourceService,
} from './aggregation-mapping-resource.service';
import { AggregationMappingService } from './aggregation-mapping.service';
export const AggregationMappingProvider: Provider[] = [
{
provide: AggregationMappingListResourceService,
useFactory: createAggregationMappingResourceService,
deps: [ResourceRepository, ConfigurationService],
},
AggregationMappingService,
];
......@@ -38,6 +38,7 @@ describe('AggregationMappingService', () => {
beforeEach(() => {
listResourceService.getList = jest.fn().mockReturnValue(singleCold(aggregationMappingListStateResource));
});
it('should call listResourceService', () => {
service.getList();
......
......@@ -25,11 +25,11 @@ export function createAggregationMappingResource(linkRelations: LinkRelationName
}
export function createAggregationMappingResources(linkRelations: LinkRelationName[] = []): AggregationMappingResource[] {
return times(10, () => toResource(createAggregationMappingResource(), [...linkRelations]));
return times(10, () => createAggregationMappingResource(linkRelations));
}
export function createAggregationMappingListResource(linkRelations: LinkRelationName[] = []): AggregationMappingListResource {
return toResource({}, [...linkRelations], {
return toResource({}, linkRelations, {
[AggregationMappingListLinkRel.LIST]: createAggregationMappingResources(),
});
}
......@@ -4,7 +4,11 @@ import { Resource } from '@ngxp/rest';
import { SettingListLinkRel } from './settings.linkrel';
import { SettingItemResource, SettingListResource } from './settings.model';
export class SettingListResourceService extends ResourceListService<Resource, SettingListResource, SettingItemResource> {}
export class SettingListResourceService extends ResourceListService<
Resource,
SettingListResource,
SettingItemResource<unknown>
> {}
export function createSettingListResourceService(repository: ResourceRepository, configurationService: ConfigurationService) {
return new ResourceListService(buildConfig(configurationService), repository);
......
......@@ -25,16 +25,16 @@ import { ListResource } from '@alfa-client/tech-shared';
import { Resource } from '@ngxp/rest';
export interface SettingListResource extends ListResource {
_embedded: { settings: SettingItemResource[] };
_embedded: { settings: SettingItemResource<unknown>[] };
}
export enum SettingName {
POSTFACH = 'Postfach',
}
export interface SettingItem {
export interface SettingItem<T> {
name: SettingName;
settingBody: unknown;
settingBody: T;
}
export declare type SettingItemResource = Resource & SettingItem;
export interface SettingItemResource<T> extends SettingItem<T>, Resource {}
......@@ -2,16 +2,16 @@ import { StateResource } from '@alfa-client/tech-shared';
import { inject, Injectable } from '@angular/core';
import { map, Observable } from 'rxjs';
import { SettingListResourceService } from './settings-resource.service';
import { SettingListResource, SettingName } from './settings.model';
import { getSettingItem } from './settings.util';
import { SettingItemResource, SettingListResource, SettingName } from './settings.model';
import { getSettingItemResource } from './settings.util';
@Injectable()
export class SettingsService {
private settingListResourceService = inject(SettingListResourceService);
public get<T>(name: SettingName): Observable<StateResource<T>> {
public get<T>(name: SettingName): Observable<StateResource<SettingItemResource<T>>> {
return this.settingListResourceService
.getList()
.pipe(map((list: StateResource<SettingListResource>) => getSettingItem<T>(list, name)));
.pipe(map((list: StateResource<SettingListResource>) => getSettingItemResource<T>(list, name)));
}
}
......@@ -31,7 +31,6 @@ describe('get setting resource', () => {
const settingName: SettingName = <SettingName>'DUMMY';
it('should return matching setting resource as state resource if exists', () => {
createSettingItemResource();
const settingItemResource: SettingItemResource = { ...createSettingItemResource(), name: settingName };
const settingsListResource: StateResource<SettingListResource> = createStateResource(
createFilledSettingsListResource([settingItemResource]),
......
......@@ -31,11 +31,11 @@ import {
import { SettingListLinkRel } from './settings.linkrel';
import { SettingItemResource, SettingListResource, SettingName } from './settings.model';
export function getSettingItem<T>(
export function getSettingItemResource<T>(
settingsListResource: StateResource<SettingListResource>,
itemName: SettingName,
): StateResource<T> {
const entries: SettingItemResource[] = getEmbeddedResources(settingsListResource, SettingListLinkRel.LIST);
const entry: SettingItemResource = entries.find((item: SettingItemResource) => item.name === itemName);
return isNotNil(entry) ? createStateResource(entry as T) : createEmptyStateResource<T>();
): StateResource<SettingItemResource<T>> {
const entries: SettingItemResource<T>[] = getEmbeddedResources(settingsListResource, SettingListLinkRel.LIST);
const entry: SettingItemResource<T> = entries.find((item: SettingItemResource<T>) => item.name === itemName);
return isNotNil(entry) ? createStateResource(entry) : createEmptyStateResource<SettingItemResource<T>>();
}
import { ROUTES } from '@admin-client/shared';
import { CommonModule } from '@angular/common';
import { Component, Input } from '@angular/core';
import { RoutingButtonComponent } from '@ods/component';
......@@ -12,6 +11,4 @@ import { CloseIconComponent } from '@ods/system';
})
export class AdminCancelButtonComponent {
@Input() linkPath: string;
public readonly Routes = ROUTES;
}
......@@ -27,18 +27,13 @@ describe('AdminSaveButtonComponent', () => {
await TestBed.configureTestingModule({
imports: [AdminSaveButtonComponent],
declarations: [MockComponent(ButtonWithSpinnerComponent)],
})
.overrideComponent(AdminSaveButtonComponent, {
set: {
providers: [
{
provide: ADMIN_FORMSERVICE,
useValue: formService,
},
],
},
})
.compileComponents();
}).compileComponents();
fixture = TestBed.createComponent(AdminSaveButtonComponent);
component = fixture.componentInstance;
......
import { ADMIN_FORMSERVICE } from '@admin-client/shared';
import { AbstractFormService, createEmptyStateResource } from '@alfa-client/tech-shared';
import { AbstractFormService, createEmptyStateResource, StateResource } from '@alfa-client/tech-shared';
import { CommonModule } from '@angular/common';
import { Component, inject } from '@angular/core';
import { Resource } from '@ngxp/rest';
import { ButtonWithSpinnerComponent } from '@ods/component';
import { of } from 'rxjs';
import { Observable, of } from 'rxjs';
@Component({
selector: 'admin-save-button',
......@@ -15,7 +15,7 @@ import { of } from 'rxjs';
export class AdminSaveButtonComponent {
private formService: AbstractFormService<Resource> = inject(ADMIN_FORMSERVICE);
public stateResource$ = of(createEmptyStateResource<Resource>());
public stateResource$: Observable<StateResource<Resource>> = of(createEmptyStateResource<Resource>());
public submit(): void {
this.stateResource$ = this.formService.submit();
......
export * from './lib/statistik-container/statistik-container.component';
export * from './lib/statistik-fields-form/admin-statistik-fields-form.component';
......@@ -16,34 +16,8 @@
data-test-id="form-id-input"
></ods-text-editor>
</div>
<div [formArrayName]="StatistikFieldsFormService.FIELD_MAPPINGS">
<div
*ngFor="let mappingControl of formService.mappings.controls; let i = index"
[formGroupName]="i"
class="flex w-full gap-2"
>
<ods-text-editor
class="flex-1"
formControlName="sourcePath"
label="Pfad des Datenfeldes"
placeholder="Tragen Sie hier den gesamten Pfad des Datenfeldes ein, das Sie auswerten möchten."
[attr.data-test-id]="'mapping-field-' + i"
></ods-text-editor>
<ods-button
class="self-end"
variant="ghost"
size="fit"
destructive="true"
(clickEmitter)="formService.removeMapping(i)"
[dataTestId]="'remove-mapping-button-' + i"
>
<ods-delete-icon icon />
</ods-button>
</div>
</div>
<statistik-fields-form-mapping />
</form>
<ods-button text="Datenfeld hinzufügen" dataTestId="add-mapping-button" (clickEmitter)="formService.addMapping()">
<ods-plus-icon icon class="fill-whitetext" />
</ods-button>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment