diff --git a/alfa-client/apps/admin/src/main.ts b/alfa-client/apps/admin/src/main.ts index fc479885f2dde75810dc76f8429e26a6068e60ca..de7bed8ea66ac6e222311d9d8c185b4cad477b85 100644 --- a/alfa-client/apps/admin/src/main.ts +++ b/alfa-client/apps/admin/src/main.ts @@ -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, diff --git a/alfa-client/apps/admin/src/pages/statistik/statistik-fields-form-page/statistik-fields-form-page.component.spec.ts b/alfa-client/apps/admin/src/pages/statistik/statistik-fields-form-page/statistik-fields-form-page.component.spec.ts index a861afd0728827a45330d8d5d2d78f63e6dfc5d1..938cc1b0061d2194105629ca70c1e5f8619d881c 100644 --- a/alfa-client/apps/admin/src/pages/statistik/statistik-fields-form-page/statistik-fields-form-page.component.spec.ts +++ b/alfa-client/apps/admin/src/pages/statistik/statistik-fields-form-page/statistik-fields-form-page.component.spec.ts @@ -1,7 +1,7 @@ +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'; diff --git a/alfa-client/apps/admin/src/pages/statistik/statistik-fields-form-page/statistik-fields-form-page.component.ts b/alfa-client/apps/admin/src/pages/statistik/statistik-fields-form-page/statistik-fields-form-page.component.ts index e249c034417fc7133d8cc2c5db690ddcb94ea50f..c4122b72d148865b4219d5446a3c2060574b23e7 100644 --- a/alfa-client/apps/admin/src/pages/statistik/statistik-fields-form-page/statistik-fields-form-page.component.ts +++ b/alfa-client/apps/admin/src/pages/statistik/statistik-fields-form-page/statistik-fields-form-page.component.ts @@ -1,6 +1,6 @@ +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', diff --git a/alfa-client/libs/admin/postfach-shared/src/lib/postfach.model.ts b/alfa-client/libs/admin/postfach-shared/src/lib/postfach.model.ts index c592dec3e6621543ca69e9ee23abdeea1ec6f4ec..e3ce2fb8bd6153796bea9bf82422718d2324721e 100644 --- a/alfa-client/libs/admin/postfach-shared/src/lib/postfach.model.ts +++ b/alfa-client/libs/admin/postfach-shared/src/lib/postfach.model.ts @@ -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>; diff --git a/alfa-client/libs/admin/postfach-shared/src/lib/postfach.service.ts b/alfa-client/libs/admin/postfach-shared/src/lib/postfach.service.ts index 19cf4ef6cf561586b44f3afee70e4c716ec54052..3321cfc1690bd504a1e0f94ac6eda627170a29c9 100644 --- a/alfa-client/libs/admin/postfach-shared/src/lib/postfach.service.ts +++ b/alfa-client/libs/admin/postfach-shared/src/lib/postfach.service.ts @@ -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, diff --git a/alfa-client/libs/admin/postfach-shared/src/test/postfach.ts b/alfa-client/libs/admin/postfach-shared/src/test/postfach.ts index 8f8df8c509f888f6027f8746045489d84dd2f77f..88132bc3d88c73d130f50caed0da9aa15ae68d5b 100644 --- a/alfa-client/libs/admin/postfach-shared/src/test/postfach.ts +++ b/alfa-client/libs/admin/postfach-shared/src/test/postfach.ts @@ -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(), diff --git a/alfa-client/libs/admin/reporting-shared/src/index.ts b/alfa-client/libs/admin/reporting-shared/src/index.ts index 9ddf4d3f190eb4ad70ea582988cb058322b7b186..44ab78233d97deaf497e327e28f71c431ae6960e 100644 --- a/alfa-client/libs/admin/reporting-shared/src/index.ts +++ b/alfa-client/libs/admin/reporting-shared/src/index.ts @@ -1,3 +1,4 @@ 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'; diff --git a/alfa-client/libs/admin/reporting-shared/src/lib/aggregation-mapping.provider.ts b/alfa-client/libs/admin/reporting-shared/src/lib/aggregation-mapping.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..888d7154e81dbfe53fb7476e4de8835463de6d25 --- /dev/null +++ b/alfa-client/libs/admin/reporting-shared/src/lib/aggregation-mapping.provider.ts @@ -0,0 +1,17 @@ +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, +]; diff --git a/alfa-client/libs/admin/reporting-shared/src/lib/aggregation-mapping.service.spec.ts b/alfa-client/libs/admin/reporting-shared/src/lib/aggregation-mapping.service.spec.ts index 6bc5f3ca516ecb2bb914a45091682872f09a79f4..ecf4387ceee6a3dbdd6775f8ef4fa3a306144002 100644 --- a/alfa-client/libs/admin/reporting-shared/src/lib/aggregation-mapping.service.spec.ts +++ b/alfa-client/libs/admin/reporting-shared/src/lib/aggregation-mapping.service.spec.ts @@ -38,6 +38,7 @@ describe('AggregationMappingService', () => { beforeEach(() => { listResourceService.getList = jest.fn().mockReturnValue(singleCold(aggregationMappingListStateResource)); }); + it('should call listResourceService', () => { service.getList(); diff --git a/alfa-client/libs/admin/reporting-shared/test/aggregation-mapping.ts b/alfa-client/libs/admin/reporting-shared/test/aggregation-mapping.ts index 6c7c4d6d8c7d37ef208117c9a6a2b750b27f0853..acbcc9fa75722396e4a410ea77e9157a2a8ce8fc 100644 --- a/alfa-client/libs/admin/reporting-shared/test/aggregation-mapping.ts +++ b/alfa-client/libs/admin/reporting-shared/test/aggregation-mapping.ts @@ -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(), }); } diff --git a/alfa-client/libs/admin/settings-shared/src/lib/settings-resource.service.ts b/alfa-client/libs/admin/settings-shared/src/lib/settings-resource.service.ts index a75f91afec901a8c969c00ede9a8631766421f1f..7e9df14e6ec13929f720978ada7ebcb3e74c5ef9 100644 --- a/alfa-client/libs/admin/settings-shared/src/lib/settings-resource.service.ts +++ b/alfa-client/libs/admin/settings-shared/src/lib/settings-resource.service.ts @@ -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); diff --git a/alfa-client/libs/admin/settings-shared/src/lib/settings.model.ts b/alfa-client/libs/admin/settings-shared/src/lib/settings.model.ts index 263fca126d53eb889e1701e931a8b32a38899145..2e97584b7934ea105c828cbb2523c0d16ce431a1 100644 --- a/alfa-client/libs/admin/settings-shared/src/lib/settings.model.ts +++ b/alfa-client/libs/admin/settings-shared/src/lib/settings.model.ts @@ -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 {} diff --git a/alfa-client/libs/admin/settings-shared/src/lib/settings.service.ts b/alfa-client/libs/admin/settings-shared/src/lib/settings.service.ts index aaf9eb77215703026c749a955c84a6373d6e1fa3..770c9d7da6230f67e7d92c553e97e062277b5994 100644 --- a/alfa-client/libs/admin/settings-shared/src/lib/settings.service.ts +++ b/alfa-client/libs/admin/settings-shared/src/lib/settings.service.ts @@ -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))); } } diff --git a/alfa-client/libs/admin/settings-shared/src/lib/settings.util.spec.ts b/alfa-client/libs/admin/settings-shared/src/lib/settings.util.spec.ts index 29d7ed769bc382c9a8384d13679c37ec23c47b56..a84eccc40f6fc9b441ee360b3cb94b56d2f2af1e 100644 --- a/alfa-client/libs/admin/settings-shared/src/lib/settings.util.spec.ts +++ b/alfa-client/libs/admin/settings-shared/src/lib/settings.util.spec.ts @@ -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]), diff --git a/alfa-client/libs/admin/settings-shared/src/lib/settings.util.ts b/alfa-client/libs/admin/settings-shared/src/lib/settings.util.ts index 6b4f9b41754059c6fef0a95f7e1ee1967dd612dd..2a00f86b2a84fef05b45ccfde06c3ff8a6321745 100644 --- a/alfa-client/libs/admin/settings-shared/src/lib/settings.util.ts +++ b/alfa-client/libs/admin/settings-shared/src/lib/settings.util.ts @@ -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>>(); } diff --git a/alfa-client/libs/admin/shared/src/lib/admin-cancel-button/admin-cancel-button.component.ts b/alfa-client/libs/admin/shared/src/lib/admin-cancel-button/admin-cancel-button.component.ts index 73d37ea79298e21bbb800115520a713f47f1ea45..8c284f05c61e3d545025c8447d4d302a0fc3db85 100644 --- a/alfa-client/libs/admin/shared/src/lib/admin-cancel-button/admin-cancel-button.component.ts +++ b/alfa-client/libs/admin/shared/src/lib/admin-cancel-button/admin-cancel-button.component.ts @@ -1,4 +1,3 @@ -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; } diff --git a/alfa-client/libs/admin/shared/src/lib/admin-save-button/admin-save-button.component.spec.ts b/alfa-client/libs/admin/shared/src/lib/admin-save-button/admin-save-button.component.spec.ts index 562779a31a0b71f68d1942cbf7f27b4beb967aab..52a303f378e824677dd6518126ae838ebd416e3a 100644 --- a/alfa-client/libs/admin/shared/src/lib/admin-save-button/admin-save-button.component.spec.ts +++ b/alfa-client/libs/admin/shared/src/lib/admin-save-button/admin-save-button.component.spec.ts @@ -27,18 +27,13 @@ describe('AdminSaveButtonComponent', () => { await TestBed.configureTestingModule({ imports: [AdminSaveButtonComponent], declarations: [MockComponent(ButtonWithSpinnerComponent)], - }) - .overrideComponent(AdminSaveButtonComponent, { - set: { - providers: [ - { - provide: ADMIN_FORMSERVICE, - useValue: formService, - }, - ], + providers: [ + { + provide: ADMIN_FORMSERVICE, + useValue: formService, }, - }) - .compileComponents(); + ], + }).compileComponents(); fixture = TestBed.createComponent(AdminSaveButtonComponent); component = fixture.componentInstance; diff --git a/alfa-client/libs/admin/shared/src/lib/admin-save-button/admin-save-button.component.ts b/alfa-client/libs/admin/shared/src/lib/admin-save-button/admin-save-button.component.ts index 0d4921c089422d210dc8bf28061d90970a86a91e..60abd08c7f311ecabe6d56ecc47fbfcd16412877 100644 --- a/alfa-client/libs/admin/shared/src/lib/admin-save-button/admin-save-button.component.ts +++ b/alfa-client/libs/admin/shared/src/lib/admin-save-button/admin-save-button.component.ts @@ -1,10 +1,10 @@ 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(); diff --git a/alfa-client/libs/admin/statistik/src/index.ts b/alfa-client/libs/admin/statistik/src/index.ts index cdc5d7b64f24d50920b721f3ab01c5b69cb41b99..157271feb3bf8625864f12faec9623307c3b7690 100644 --- a/alfa-client/libs/admin/statistik/src/index.ts +++ b/alfa-client/libs/admin/statistik/src/index.ts @@ -1 +1,2 @@ export * from './lib/statistik-container/statistik-container.component'; +export * from './lib/statistik-fields-form/admin-statistik-fields-form.component'; diff --git a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.html b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.html index 8251c9067a3a2bbf07363cc9a1f8e167fbf6de1a..27805c87fe074bae41311083bc1aed20d5aaeaef 100644 --- a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.html +++ b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.html @@ -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> diff --git a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.spec.ts b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.spec.ts index a34eb6328a63ffd6a46dc22314cec534d98b829b..a0154fd3137315cfbfd12187d70f0ffb43635df5 100644 --- a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.spec.ts +++ b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.spec.ts @@ -1,19 +1,16 @@ import { ADMIN_FORMSERVICE } from '@admin-client/shared'; import { EMPTY_STRING } from '@alfa-client/tech-shared'; -import { dispatchEventFromFixture, existsAsHtmlElement, mock, Mock, MockEvent, mockGetValue } from '@alfa-client/test-utils'; +import { dispatchEventFromFixture, existsAsHtmlElement, mock, Mock, MockEvent } from '@alfa-client/test-utils'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { TextEditorComponent } from '@ods/component'; import { ButtonComponent, PlusIconComponent } from '@ods/system'; import { MockComponent } from 'ng-mocks'; -import { - getDataTestIdAttributeOf, - getDataTestIdOf, - getDynamicDataTestIdAttributOf, -} from '../../../../../tech-shared/test/data-test'; +import { getDataTestIdAttributeOf, getDataTestIdOf } from '../../../../../tech-shared/test/data-test'; import { AdminCancelButtonComponent } from '../../../../shared/src/lib/admin-cancel-button/admin-cancel-button.component'; import { AdminSaveButtonComponent } from '../../../../shared/src/lib/admin-save-button/admin-save-button.component'; import { AdminStatistikFieldsFormComponent } from './admin-statistik-fields-form.component'; +import { AdminStatistikFieldsFormMappingComponent } from './statistik-fields-form-mapping/statistik-fields-form-mapping.component'; import { StatistikFieldsFormService } from './statistik-fields.formservice'; describe('AdminStatistikFieldsFormComponent', () => { @@ -24,9 +21,6 @@ describe('AdminStatistikFieldsFormComponent', () => { const formIdInputTestId: string = getDataTestIdOf('form-id-input'); const addMappingButton: string = getDataTestIdAttributeOf('add-mapping-button'); - const mappingField: string = getDataTestIdOf('mapping-field-0'); - const removeMappingButton: string = getDynamicDataTestIdAttributOf('remove-mapping-button-0'); - const formBuilder: FormBuilder = new FormBuilder(); let formService: Mock<StatistikFieldsFormService>; @@ -37,22 +31,9 @@ describe('AdminStatistikFieldsFormComponent', () => { [StatistikFieldsFormService.FIELD_FORM_ENGINE_NAME]: new FormControl(EMPTY_STRING), [StatistikFieldsFormService.FIELD_FORM_ID]: new FormControl(EMPTY_STRING), }), - [StatistikFieldsFormService.FIELD_MAPPINGS]: formBuilder.array([ - new FormGroup({ sourcePath: new FormControl(EMPTY_STRING) }), - ]), }); - formService = <any>{ - ...mock(StatistikFieldsFormService), - form, - addMapping: jest.fn(), - removeMapping: jest.fn(), - }; - mockGetValue( - formService, - StatistikFieldsFormService.FIELD_MAPPINGS, - form.controls[StatistikFieldsFormService.FIELD_MAPPINGS], - ); + formService = <any>{ ...mock(StatistikFieldsFormService), form }; await TestBed.configureTestingModule({ declarations: [ @@ -62,6 +43,7 @@ describe('AdminStatistikFieldsFormComponent', () => { MockComponent(PlusIconComponent), MockComponent(AdminSaveButtonComponent), MockComponent(AdminCancelButtonComponent), + MockComponent(AdminStatistikFieldsFormMappingComponent), ], imports: [ReactiveFormsModule], }) @@ -126,21 +108,5 @@ describe('AdminStatistikFieldsFormComponent', () => { }); }); }); - - describe('mapping input', () => { - it('should exists', () => { - fixture.detectChanges(); - - existsAsHtmlElement(fixture, mappingField); - }); - }); - - describe('remove mapping button', () => { - it('should call formservice', () => { - dispatchEventFromFixture(fixture, removeMappingButton, MockEvent.CLICK); - - expect(formService.removeMapping).toHaveBeenCalledWith(0); - }); - }); }); }); diff --git a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.ts b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.ts index 91dfb6c42cd7c8880635dd394043e8d005df021c..0298196202e623a3d080468c792f3c1c800a8750 100644 --- a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.ts +++ b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/admin-statistik-fields-form.component.ts @@ -1,9 +1,9 @@ import { ADMIN_FORMSERVICE, AdminCancelButtonComponent, AdminSaveButtonComponent, ROUTES } from '@admin-client/shared'; -import { CommonModule } from '@angular/common'; import { Component, inject } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { TextEditorComponent } from '@ods/component'; import { ButtonComponent, DeleteIconComponent, PlusIconComponent } from '@ods/system'; +import { AdminStatistikFieldsFormMappingComponent } from './statistik-fields-form-mapping/statistik-fields-form-mapping.component'; import { StatistikFieldsFormService } from './statistik-fields.formservice'; @Component({ @@ -11,7 +11,6 @@ import { StatistikFieldsFormService } from './statistik-fields.formservice'; templateUrl: './admin-statistik-fields-form.component.html', standalone: true, imports: [ - CommonModule, ButtonComponent, PlusIconComponent, ReactiveFormsModule, @@ -19,6 +18,7 @@ import { StatistikFieldsFormService } from './statistik-fields.formservice'; DeleteIconComponent, AdminSaveButtonComponent, AdminCancelButtonComponent, + AdminStatistikFieldsFormMappingComponent, ], providers: [{ provide: ADMIN_FORMSERVICE, useClass: StatistikFieldsFormService }], }) diff --git a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields-form-mapping/statistik-fields-form-mapping.component.html b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields-form-mapping/statistik-fields-form-mapping.component.html new file mode 100644 index 0000000000000000000000000000000000000000..2ce86b545b1039b795911cf172f154b9e2b97871 --- /dev/null +++ b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields-form-mapping/statistik-fields-form-mapping.component.html @@ -0,0 +1,27 @@ +<form [formGroup]="formService.form"> + <div class="flex flex-col gap-4" [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> +</form> diff --git a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields-form-mapping/statistik-fields-form-mapping.component.spec.ts b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields-form-mapping/statistik-fields-form-mapping.component.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..61cd006e429951cde3657be7688b30063cc2e6eb --- /dev/null +++ b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields-form-mapping/statistik-fields-form-mapping.component.spec.ts @@ -0,0 +1,90 @@ +import { ADMIN_FORMSERVICE } from '@admin-client/shared'; +import { EMPTY_STRING } from '@alfa-client/tech-shared'; +import { dispatchEventFromFixture, existsAsHtmlElement, mock, Mock, MockEvent, mockGetValue } from '@alfa-client/test-utils'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; +import { TextEditorComponent } from '@ods/component'; +import { ButtonComponent, DeleteIconComponent } from '@ods/system'; +import { getDataTestIdOf, getDynamicDataTestIdAttributOf } from 'libs/tech-shared/test/data-test'; +import { MockComponent } from 'ng-mocks'; +import { StatistikFieldsFormService } from '../statistik-fields.formservice'; +import { AdminStatistikFieldsFormMappingComponent } from './statistik-fields-form-mapping.component'; + +describe('AdminStatistikFieldsFormMappingComponent', () => { + let component: AdminStatistikFieldsFormMappingComponent; + let fixture: ComponentFixture<AdminStatistikFieldsFormMappingComponent>; + + const mappingField: string = getDataTestIdOf('mapping-field-0'); + const removeMappingButton: string = getDynamicDataTestIdAttributOf('remove-mapping-button-0'); + + const formBuilder: FormBuilder = new FormBuilder(); + + let formService: Mock<StatistikFieldsFormService>; + + beforeEach(async () => { + const form: FormGroup = formBuilder.group({ + [StatistikFieldsFormService.FIELD_MAPPINGS]: formBuilder.array([ + new FormGroup({ sourcePath: new FormControl(EMPTY_STRING) }), + ]), + }); + + formService = <any>{ + ...mock(StatistikFieldsFormService), + form, + addMapping: jest.fn(), + removeMapping: jest.fn(), + }; + + mockGetValue( + formService, + StatistikFieldsFormService.FIELD_MAPPINGS, + form.controls[StatistikFieldsFormService.FIELD_MAPPINGS], + ); + + await TestBed.configureTestingModule({ + declarations: [ + AdminStatistikFieldsFormMappingComponent, + MockComponent(TextEditorComponent), + MockComponent(ButtonComponent), + MockComponent(DeleteIconComponent), + ], + imports: [ReactiveFormsModule], + providers: [ + { + provide: StatistikFieldsFormService, + useValue: formService, + }, + { + provide: ADMIN_FORMSERVICE, + useValue: formService, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(AdminStatistikFieldsFormMappingComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + describe('template', () => { + describe('mapping input', () => { + it('should exists', () => { + fixture.detectChanges(); + + existsAsHtmlElement(fixture, mappingField); + }); + }); + + describe('remove mapping button', () => { + it('should call formservice', () => { + dispatchEventFromFixture(fixture, removeMappingButton, MockEvent.CLICK); + + expect(formService.removeMapping).toHaveBeenCalledWith(0); + }); + }); + }); +}); diff --git a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields-form-mapping/statistik-fields-form-mapping.component.ts b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields-form-mapping/statistik-fields-form-mapping.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..48bc3eaddd2a2fe51b983939dd8920b02e7f8dae --- /dev/null +++ b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields-form-mapping/statistik-fields-form-mapping.component.ts @@ -0,0 +1,29 @@ +import { ADMIN_FORMSERVICE, AdminCancelButtonComponent, AdminSaveButtonComponent, ROUTES } from '@admin-client/shared'; +import { CommonModule } from '@angular/common'; +import { Component, inject } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { TextEditorComponent } from '@ods/component'; +import { ButtonComponent, DeleteIconComponent, PlusIconComponent } from '@ods/system'; +import { StatistikFieldsFormService } from '../statistik-fields.formservice'; + +@Component({ + selector: 'statistik-fields-form-mapping', + templateUrl: './statistik-fields-form-mapping.component.html', + standalone: true, + imports: [ + CommonModule, + ButtonComponent, + PlusIconComponent, + ReactiveFormsModule, + TextEditorComponent, + DeleteIconComponent, + AdminSaveButtonComponent, + AdminCancelButtonComponent, + ], +}) +export class AdminStatistikFieldsFormMappingComponent { + public readonly formService = <StatistikFieldsFormService>inject(ADMIN_FORMSERVICE); + + public readonly StatistikFieldsFormService = StatistikFieldsFormService; + public readonly Routes = ROUTES; +} diff --git a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields.formservice.ts b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields.formservice.ts index ebcfad677faae62c09e0a1736208caffc70455ce..1b746e12f42b44cc1261ce6de543380ea61d9ec4 100644 --- a/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields.formservice.ts +++ b/alfa-client/libs/admin/statistik/src/lib/statistik-fields-form/statistik-fields.formservice.ts @@ -25,7 +25,6 @@ export class StatistikFieldsFormService extends AbstractFormService<AggregationM } protected doSubmit(): Observable<StateResource<AggregationMappingResource>> { - console.info('FormValue: ', this.getFormValue()); return this.service.create(this.getFormValue()); }