From 7be58893b2ab412085c184b7445ae7fc25e59e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schultz=20Madsen?= Date: Sun, 18 Oct 2026 08:00:14 +0200 Subject: [PATCH 1/4] ci: test angular19 against the matching frontend branch PR CI checks out the frontend (and sibling plugins) at the branch the PR targets instead of always stable. Corepack is enabled before every yarn install, since the frontend's angular19 branch pins yarn@4; the Docker build uses yarn for the frontend build as well. Dead WDIO config copies are dropped (the frontend no longer has WDIO). Co-Authored-By: Claude Opus 5.5 --- .github/workflows/dotnet-core-master.yml | 8 ++++---- .github/workflows/dotnet-core-pr.yml | 14 +++++++------- Dockerfile | 3 ++- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.github/workflows/dotnet-core-master.yml b/.github/workflows/dotnet-core-master.yml index 825c6c7f..be17a910 100644 --- a/.github/workflows/dotnet-core-master.yml +++ b/.github/workflows/dotnet-core-master.yml @@ -34,8 +34,6 @@ jobs: cp -av eform-angular-workflow-plugin/eform-client/e2e/Tests/workflow-settings eform-angular-frontend/eform-client/e2e/Tests/workflow-settings cp -av eform-angular-workflow-plugin/eform-client/e2e/Tests/workflow-general eform-angular-frontend/eform-client/e2e/Tests/workflow-general cp -av eform-angular-workflow-plugin/eform-client/e2e/Page\ objects/Workflow eform-angular-frontend/eform-client/e2e/Page\ objects/Workflow - cp -av eform-angular-workflow-plugin/eform-client/wdio-headless-plugin-step2.conf.ts eform-angular-frontend/eform-client/wdio-headless-plugin-step2.conf.ts - cp -av eform-angular-workflow-plugin/eform-client/wdio-plugin-step2.conf.ts eform-angular-frontend/eform-client/wdio-plugin-step2.conf.ts mkdir -p eform-angular-frontend/eFormAPI/eFormAPI.Web/Plugins cd eform-angular-frontend/eform-client && ../../eform-angular-workflow-plugin/testinginstallpn.sh - name: Button conventions @@ -107,8 +105,6 @@ jobs: cp -av eform-angular-workflow-plugin/eform-client/e2e/Tests/workflow-settings eform-angular-frontend/eform-client/e2e/Tests/workflow-settings cp -av eform-angular-workflow-plugin/eform-client/e2e/Tests/workflow-general eform-angular-frontend/eform-client/e2e/Tests/workflow-general cp -av eform-angular-workflow-plugin/eform-client/e2e/Page\ objects/Workflow eform-angular-frontend/eform-client/e2e/Page\ objects/Workflow - cp -av eform-angular-workflow-plugin/eform-client/wdio-headless-plugin-step2.conf.ts eform-angular-frontend/eform-client/wdio-headless-plugin-step2.conf.ts - cp -av eform-angular-workflow-plugin/eform-client/wdio-plugin-step2.conf.ts eform-angular-frontend/eform-client/wdio-plugin-step2.conf.ts mkdir -p eform-angular-frontend/eFormAPI/eFormAPI.Web/Plugins cd eform-angular-frontend/eform-client && ../../eform-angular-workflow-plugin/testinginstallpn.sh - name: Start the newly build Docker container @@ -120,6 +116,8 @@ jobs: run: cat docker_run_log - name: Pretest changes to work with Docker container run: sed -i 's/localhost/mariadbtest/g' eform-angular-frontend/eform-client/e2e/Constants/DatabaseConfigurationConstants.ts + - name: Enable Corepack + run: corepack enable - name: yarn install run: cd eform-angular-frontend/eform-client && yarn install - name: DB Configuration @@ -238,6 +236,8 @@ jobs: run: cat docker_run_log - name: Pretest changes to work with Docker container run: sed -i 's/localhost/mariadbtest/g' eform-angular-frontend/eform-client/e2e/Constants/DatabaseConfigurationConstants.ts + - name: Enable Corepack + run: corepack enable - name: yarn install run: cd eform-angular-frontend/eform-client && yarn install - name: Install Playwright browsers diff --git a/.github/workflows/dotnet-core-pr.yml b/.github/workflows/dotnet-core-pr.yml index 5ffc4860..25fd093e 100644 --- a/.github/workflows/dotnet-core-pr.yml +++ b/.github/workflows/dotnet-core-pr.yml @@ -19,7 +19,7 @@ jobs: with: fetch-depth: 0 repository: microting/eform-angular-frontend - ref: stable + ref: ${{ github.base_ref }} path: eform-angular-frontend - name: Copy dependencies run: | @@ -31,8 +31,6 @@ jobs: cp -av eform-angular-workflow-plugin/eform-client/e2e/Tests/workflow-settings eform-angular-frontend/eform-client/e2e/Tests/workflow-settings cp -av eform-angular-workflow-plugin/eform-client/e2e/Tests/workflow-general eform-angular-frontend/eform-client/e2e/Tests/workflow-general cp -av eform-angular-workflow-plugin/eform-client/e2e/Page\ objects/Workflow eform-angular-frontend/eform-client/e2e/Page\ objects/Workflow - cp -av eform-angular-workflow-plugin/eform-client/wdio-headless-plugin-step2.conf.ts eform-angular-frontend/eform-client/wdio-headless-plugin-step2.conf.ts - cp -av eform-angular-workflow-plugin/eform-client/wdio-plugin-step2.conf.ts eform-angular-frontend/eform-client/wdio-plugin-step2.conf.ts mkdir -p eform-angular-frontend/eFormAPI/eFormAPI.Web/Plugins cd eform-angular-frontend/eform-client && ../../eform-angular-workflow-plugin/testinginstallpn.sh - name: Button conventions @@ -83,7 +81,7 @@ jobs: uses: actions/checkout@v3 with: repository: microting/eform-angular-frontend - ref: stable + ref: ${{ github.base_ref }} path: eform-angular-frontend - name: Sleep 15 seconds run: sleep 15 @@ -101,8 +99,6 @@ jobs: cp -av eform-angular-workflow-plugin/eform-client/e2e/Tests/workflow-settings eform-angular-frontend/eform-client/e2e/Tests/workflow-settings cp -av eform-angular-workflow-plugin/eform-client/e2e/Tests/workflow-general eform-angular-frontend/eform-client/e2e/Tests/workflow-general cp -av eform-angular-workflow-plugin/eform-client/e2e/Page\ objects/Workflow eform-angular-frontend/eform-client/e2e/Page\ objects/Workflow - cp -av eform-angular-workflow-plugin/eform-client/wdio-headless-plugin-step2.conf.ts eform-angular-frontend/eform-client/wdio-headless-plugin-step2.conf.ts - cp -av eform-angular-workflow-plugin/eform-client/wdio-plugin-step2.conf.ts eform-angular-frontend/eform-client/wdio-plugin-step2.conf.ts mkdir -p eform-angular-frontend/eFormAPI/eFormAPI.Web/Plugins cd eform-angular-frontend/eform-client && ../../eform-angular-workflow-plugin/testinginstallpn.sh - name: Start the newly build Docker container @@ -114,6 +110,8 @@ jobs: run: cat docker_run_log - name: Pretest changes to work with Docker container run: sed -i 's/localhost/mariadbtest/g' eform-angular-frontend/eform-client/e2e/Constants/DatabaseConfigurationConstants.ts + - name: Enable Corepack + run: corepack enable - name: yarn install run: cd eform-angular-frontend/eform-client && yarn install - name: DB Configuration @@ -202,7 +200,7 @@ jobs: uses: actions/checkout@v3 with: repository: microting/eform-angular-frontend - ref: stable + ref: ${{ github.base_ref }} path: eform-angular-frontend - name: Sleep 15 seconds run: sleep 15 @@ -229,6 +227,8 @@ jobs: run: cat docker_run_log - name: Pretest changes to work with Docker container run: sed -i 's/localhost/mariadbtest/g' eform-angular-frontend/eform-client/e2e/Constants/DatabaseConfigurationConstants.ts + - name: Enable Corepack + run: corepack enable - name: yarn install run: cd eform-angular-frontend/eform-client && yarn install - name: Install Playwright browsers diff --git a/Dockerfile b/Dockerfile index 8b4f59b2..8771ef8a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,8 +2,9 @@ FROM node:22-bookworm-slim as node-env WORKDIR /app ENV PATH /app/node_modules/.bin:$PATH COPY eform-angular-frontend/eform-client ./ +RUN corepack enable RUN yarn install -RUN npm run build +RUN yarn build FROM mcr.microsoft.com/dotnet/sdk:10.0-noble AS build-env WORKDIR /app From 129a9bbc24e37d7e0e4c6d879879210b34186b7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schultz=20Madsen?= Date: Sun, 18 Oct 2026 08:13:48 +0200 Subject: [PATCH 2/4] refactor: convert workflow-pn to standalone components for Angular 21 Co-Authored-By: Claude Opus 5.5 --- .../settings-add-site-modal.component.ts | 7 ++- .../settings-remove-site-modal.component.ts | 4 +- .../workflow-folders-modal.component.ts | 6 +- .../workflow-settings.component.ts | 11 +++- .../workflow-case-delete.component.ts | 5 +- .../workflow-case-edit.component.ts | 13 +++- .../workflow-cases-page.component.ts | 15 ++++- .../layouts/workflow-pn-layout.component.ts | 3 +- .../modules/workflow-pn/workflow-pn.module.ts | 59 +------------------ 9 files changed, 55 insertions(+), 68 deletions(-) diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-add-site-modal/settings-add-site-modal.component.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-add-site-modal/settings-add-site-modal.component.ts index 59d83a61..6e54f82e 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-add-site-modal/settings-add-site-modal.component.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-add-site-modal/settings-add-site-modal.component.ts @@ -5,13 +5,18 @@ import {Subscription} from 'rxjs'; import {WorkflowPnSettingsService} from '../../../services'; import {eqBy, prop, symmetricDifferenceWith} from 'ramda'; import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; +import {MatDialogTitle, MatDialogContent, MatDialogActions} from '@angular/material/dialog'; +import {MatFormField, MatLabel} from '@angular/material/form-field'; +import {MtxSelect} from '@ng-matero/extensions/select'; +import {FormsModule} from '@angular/forms'; +import {TranslatePipe} from '@ngx-translate/core'; @AutoUnsubscribe() @Component({ selector: 'app-settings-add-site-modal', templateUrl: './settings-add-site-modal.component.html', styleUrls: ['./settings-add-site-modal.component.scss'], - standalone: false + imports: [MatDialogTitle, MatDialogContent, MatDialogActions, MatFormField, MatLabel, MtxSelect, FormsModule, TranslatePipe], }) export class SettingsAddSiteModalComponent implements OnInit, OnDestroy { private settingsService = inject(WorkflowPnSettingsService); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.ts index 6ea409c4..e4aabc6c 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.ts @@ -12,12 +12,12 @@ import {WorkflowPnSettingsService} from '../../../services'; import { AutoUnsubscribe } from 'ngx-auto-unsubscribe'; import { Subscription } from 'rxjs'; + @AutoUnsubscribe() @Component({ selector: 'app-settings-remove-site-modal', templateUrl: './settings-remove-site-modal.component.html', - styleUrls: ['./settings-remove-site-modal.component.scss'], - standalone: false + styleUrls: ['./settings-remove-site-modal.component.scss'] }) export class SettingsRemoveSiteModalComponent implements OnInit, OnDestroy { private settingsService = inject(WorkflowPnSettingsService); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/workflow-folders-modal/workflow-folders-modal.component.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/workflow-folders-modal/workflow-folders-modal.component.ts index 777bfef8..821701f8 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/workflow-folders-modal/workflow-folders-modal.component.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/workflow-folders-modal/workflow-folders-modal.component.ts @@ -9,13 +9,17 @@ import { AuthService, FoldersService} from 'src/app/common/services'; import { AutoUnsubscribe } from 'ngx-auto-unsubscribe'; import { FolderDto } from 'src/app/common/models'; import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; +import {MatDialogTitle, MatDialogContent} from '@angular/material/dialog'; +import {MatCard, MatCardContent} from '@angular/material/card'; +import {EformTreeViewPickerComponent} from 'src/app/common/modules/eform-shared/components'; +import {TranslatePipe} from '@ngx-translate/core'; @AutoUnsubscribe() @Component({ selector: 'app-workflow-folders-modal', templateUrl: './workflow-folders-modal.component.html', styleUrls: ['./workflow-folders-modal.component.scss'], - standalone: false + imports: [MatDialogTitle, MatDialogContent, MatCard, MatCardContent, EformTreeViewPickerComponent, TranslatePipe], }) export class WorkflowFoldersModalComponent implements OnInit, OnDestroy { private folderService = inject(FoldersService); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/workflow-settings/workflow-settings.component.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/workflow-settings/workflow-settings.component.ts index 246b6ca8..39356c49 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/workflow-settings/workflow-settings.component.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/workflow-settings/workflow-settings.component.ts @@ -22,13 +22,22 @@ import {Overlay} from '@angular/cdk/overlay'; import {MtxGridColumn} from '@ng-matero/extensions/grid'; import {TranslateService} from '@ngx-translate/core'; import {DeleteModalComponent} from 'src/app/common/modules/eform-shared/components'; +import {EformNewSubheaderComponent} from 'src/app/common/modules/eform-shared/components'; +import {MatButton} from '@angular/material/button'; +import {MatTooltip} from '@angular/material/tooltip'; +import {MatIcon} from '@angular/material/icon'; +import {TranslatePipe} from '@ngx-translate/core'; +import {MatFormField, MatLabel} from '@angular/material/form-field'; +import {MatInput} from '@angular/material/input'; +import {FormsModule} from '@angular/forms'; +import {MtxGrid} from '@ng-matero/extensions/grid'; @AutoUnsubscribe() @Component({ selector: 'app-workflow-settings', templateUrl: './workflow-settings.component.html', styleUrls: ['./workflow-settings.component.scss'], - standalone: false + imports: [EformNewSubheaderComponent, MatButton, MatTooltip, MatIcon, TranslatePipe, MatFormField, MatLabel, MatInput, FormsModule, MtxGrid], }) export class WorkflowSettingsComponent implements OnInit, OnDestroy { private workflowPnSettingsService = inject(WorkflowPnSettingsService); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-case-delete/workflow-case-delete.component.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-case-delete/workflow-case-delete.component.ts index 4bcd0147..a074a2b3 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-case-delete/workflow-case-delete.component.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-case-delete/workflow-case-delete.component.ts @@ -10,13 +10,16 @@ import {Subscription} from 'rxjs'; import {WorkflowCaseModel} from '../../../models'; import {WorkflowPnCasesService} from '../../../services'; import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; +import {MatDialogTitle, MatDialogContent, MatDialogActions} from '@angular/material/dialog'; +import {DatePipe} from '@angular/common'; +import {TranslatePipe} from '@ngx-translate/core'; @AutoUnsubscribe() @Component({ selector: 'app-workflow-case-delete', templateUrl: './workflow-case-delete.component.html', styleUrls: ['./workflow-case-delete.component.scss'], - standalone: false + imports: [MatDialogTitle, MatDialogContent, MatDialogActions, TranslatePipe, DatePipe], }) export class WorkflowCaseDeleteComponent implements OnInit, OnDestroy { private workflowCaseService = inject(WorkflowPnCasesService); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-case-edit/workflow-case-edit.component.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-case-edit/workflow-case-edit.component.ts index 7fb6fa9c..3051e970 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-case-edit/workflow-case-edit.component.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-case-edit/workflow-case-edit.component.ts @@ -17,13 +17,24 @@ import {FormBuilder, FormGroup, Validators} from '@angular/forms'; import {format} from 'date-fns'; import {Store} from '@ngrx/store'; import {MatDatepickerInputEvent} from '@angular/material/datepicker'; +import {EformNewSubheaderComponent} from 'src/app/common/modules/eform-shared/components'; +import {MatCard, MatCardHeader, MatCardContent, MatCardFooter} from '@angular/material/card'; +import {MatFormField, MatLabel, MatSuffix} from '@angular/material/form-field'; +import {MatInput} from '@angular/material/input'; +import {MatDatepickerToggle, MatDatepickerInput, MatDatepicker} from '@angular/material/datepicker'; +import {MtxSelect} from '@ng-matero/extensions/select'; +import {FormsModule} from '@angular/forms'; +import {NgIf, DatePipe} from '@angular/common'; +import {ElementPictureComponent} from 'src/app/common/modules/eform-cases/components'; +import {MatButton} from '@angular/material/button'; +import {TranslatePipe} from '@ngx-translate/core'; @AutoUnsubscribe() @Component({ selector: 'app-workflow-case-edit', templateUrl: './workflow-case-edit.component.html', styleUrls: ['./workflow-case-edit.component.scss'], - standalone: false + imports: [EformNewSubheaderComponent, MatCard, MatCardHeader, MatCardContent, MatCardFooter, MatFormField, MatLabel, MatSuffix, MatInput, MatDatepickerToggle, MatDatepickerInput, MatDatepicker, MtxSelect, FormsModule, NgIf, DatePipe, ElementPictureComponent, MatButton, TranslatePipe], }) export class WorkflowCaseEditComponent implements OnInit, OnDestroy { private activateRoute = inject(ActivatedRoute); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-cases-page/workflow-cases-page.component.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-cases-page/workflow-cases-page.component.ts index f71a4d29..779b13c6 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-cases-page/workflow-cases-page.component.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/components/workflow-cases/workflow-cases-page/workflow-cases-page.component.ts @@ -15,7 +15,7 @@ import {Overlay} from '@angular/cdk/overlay'; import {dialogConfigHelper} from 'src/app/common/helpers'; import {DeleteModalComponent} from 'src/app/common/modules/eform-shared/components'; import {PdfIcon, WordIcon} from 'src/app/common/const'; -import {MatIconRegistry} from '@angular/material/icon'; +import {MatIcon, MatIconRegistry} from '@angular/material/icon'; import {DomSanitizer} from '@angular/platform-browser'; import {Store} from '@ngrx/store'; import { @@ -24,13 +24,24 @@ import { selectWorkflowCasesPaginationIsSortDsc, selectWorkflowCasesPaginationSort } from '../../../state'; +import {EformNewSubheaderComponent, EformPaginationComponent} from 'src/app/common/modules/eform-shared/components'; +import {MatIconButton} from '@angular/material/button'; +import {MatTooltip} from '@angular/material/tooltip'; +import {MatFormField, MatLabel} from '@angular/material/form-field'; +import {MatInput} from '@angular/material/input'; +import {FormsModule} from '@angular/forms'; +import {MtxGrid} from '@ng-matero/extensions/grid'; +import {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu'; +import {RouterLink} from '@angular/router'; +import {AsyncPipe} from '@angular/common'; +import {TranslatePipe} from '@ngx-translate/core'; @AutoUnsubscribe() @Component({ selector: 'app-workflow-cases-page', templateUrl: './workflow-cases-page.component.html', styleUrls: ['./workflow-cases-page.component.scss'], - standalone: false + imports: [EformNewSubheaderComponent, EformPaginationComponent, MatIconButton, MatTooltip, MatIcon, MatFormField, MatLabel, MatInput, FormsModule, MtxGrid, MatMenu, MatMenuItem, MatMenuTrigger, RouterLink, AsyncPipe, TranslatePipe], }) export class WorkflowCasesPageComponent implements OnInit, OnDestroy { private store = inject(Store); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/layouts/workflow-pn-layout.component.ts b/eform-client/src/app/plugins/modules/workflow-pn/layouts/workflow-pn-layout.component.ts index e8b15429..baf3735c 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/layouts/workflow-pn-layout.component.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/layouts/workflow-pn-layout.component.ts @@ -4,12 +4,13 @@ import {translates} from './../i18n/translates'; import {Store} from '@ngrx/store'; import {take} from 'rxjs'; import {addPluginToVisited, selectPluginsVisitedPlugins} from 'src/app/state'; +import {RouterOutlet} from '@angular/router'; @Component({ selector: 'app-workflow-pn-layout', template: ` `, - standalone: false + imports: [RouterOutlet], }) export class WorkflowPnLayoutComponent implements AfterContentInit, OnInit { private translateService = inject(TranslateService); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/workflow-pn.module.ts b/eform-client/src/app/plugins/modules/workflow-pn/workflow-pn.module.ts index a6d405ed..8b1b8bf8 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/workflow-pn.module.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/workflow-pn.module.ts @@ -1,72 +1,15 @@ -import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { TranslateModule } from '@ngx-translate/core'; -import { EformSharedModule } from 'src/app/common/modules/eform-shared/eform-shared.module'; -import { - SettingsAddSiteModalComponent, - /*SettingsRemoveSiteModalComponent,*/ - WorkflowCaseDeleteComponent, - WorkflowCaseEditComponent, - WorkflowCasesPageComponent, - WorkflowSettingsComponent, WorkflowFoldersModalComponent, -} from './components'; -import { WorkflowPnLayoutComponent } from './layouts'; +import { StoreModule } from '@ngrx/store'; import { WorkflowPnCasesService, WorkflowPnSettingsService } from './services'; import { WorkflowPnRouting } from './workflow-pn.routing'; -import {EformImportedModule} from 'src/app/common/modules/eform-imported/eform-imported.module'; -import {EformCasesModule} from 'src/app/common/modules/eform-cases/eform-cases.module'; -import {MtxGridModule} from '@ng-matero/extensions/grid'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatInputModule} from '@angular/material/input'; -import {MatButtonModule} from '@angular/material/button'; -import {MatIconModule} from '@angular/material/icon'; -import {MatTooltipModule} from '@angular/material/tooltip'; -import {MatDialogModule} from '@angular/material/dialog'; -import {MatCardModule} from '@angular/material/card'; -import {MtxSelectModule} from '@ng-matero/extensions/select'; -import {StoreModule} from '@ngrx/store'; import * as workflowCasesReducer from './state/workflow-cases/workflow-cases.reducer'; -import {MatDatepickerModule} from '@angular/material/datepicker'; -import {MatMenu, MatMenuItem, MatMenuTrigger} from "@angular/material/menu"; @NgModule({ imports: [ - CommonModule, - TranslateModule, - FormsModule, - EformSharedModule, - RouterModule, WorkflowPnRouting, - EformImportedModule, - EformCasesModule, - MtxGridModule, - MatFormFieldModule, - MatInputModule, - MatButtonModule, - MatIconModule, - MatTooltipModule, - MatDialogModule, - MatCardModule, - MtxSelectModule, StoreModule.forFeature('workflowPn', { workflowCasesState: workflowCasesReducer.reducer, }), - MatDatepickerModule, - MatMenuTrigger, - MatMenu, - MatMenuItem, - ], - declarations: [ - WorkflowPnLayoutComponent, - WorkflowSettingsComponent, - WorkflowCasesPageComponent, - WorkflowCaseDeleteComponent, - WorkflowCaseEditComponent, - SettingsAddSiteModalComponent, - // SettingsRemoveSiteModalComponent, - WorkflowFoldersModalComponent, ], providers: [ WorkflowPnSettingsService, From 18042b214633e958ae8930282a0d94ae95e96af1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schultz=20Madsen?= Date: Sun, 18 Oct 2026 08:15:15 +0200 Subject: [PATCH 3/4] test: migrate workflow-pn specs from Jest to Vitest Also removes the dead SettingsRemoveSiteModalComponent (legacy mdbModal, not declared or referenced anywhere), which cannot compile standalone. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/dotnet-core-master.yml | 26 +++++++ .github/workflows/dotnet-core-pr.yml | 26 +++++++ .../modules/workflow-pn/components/index.ts | 1 - .../settings-add-site-modal.component.spec.ts | 67 ++++++++++++------- .../settings-remove-site-modal.component.html | 37 ---------- .../settings-remove-site-modal.component.scss | 0 ...ttings-remove-site-modal.component.spec.ts | 25 ------- .../settings-remove-site-modal.component.ts | 48 ------------- 8 files changed, 94 insertions(+), 136 deletions(-) delete mode 100644 eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.html delete mode 100644 eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.scss delete mode 100644 eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.spec.ts delete mode 100644 eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.ts diff --git a/.github/workflows/dotnet-core-master.yml b/.github/workflows/dotnet-core-master.yml index be17a910..182aeeb6 100644 --- a/.github/workflows/dotnet-core-master.yml +++ b/.github/workflows/dotnet-core-master.yml @@ -8,6 +8,32 @@ on: - '.github/**' jobs: + angular-unit-test: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + with: + path: eform-angular-workflow-plugin + - name: Preparing Frontend checkout + uses: actions/checkout@v4 + with: + repository: microting/eform-angular-frontend + ref: ${{ github.ref_name }} + path: eform-angular-frontend + - name: Copy dependencies + run: | + cp -av eform-angular-workflow-plugin/eform-client/src/app/plugins/modules/workflow-pn eform-angular-frontend/eform-client/src/app/plugins/modules/workflow-pn + cd eform-angular-frontend/eform-client && ../../eform-angular-workflow-plugin/testinginstallpn.sh + - uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Enable Corepack + run: corepack enable + - name: yarn install + run: cd eform-angular-frontend/eform-client && yarn install + - name: Unit tests + run: cd eform-angular-frontend/eform-client && npx ng test --watch=false --include='src/app/plugins/modules/workflow-pn/**/*.spec.ts' workflow-build: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/dotnet-core-pr.yml b/.github/workflows/dotnet-core-pr.yml index 25fd093e..6d970660 100644 --- a/.github/workflows/dotnet-core-pr.yml +++ b/.github/workflows/dotnet-core-pr.yml @@ -8,6 +8,32 @@ on: - '.github/**' jobs: + angular-unit-test: + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + with: + path: eform-angular-workflow-plugin + - name: Preparing Frontend checkout + uses: actions/checkout@v4 + with: + repository: microting/eform-angular-frontend + ref: ${{ github.base_ref }} + path: eform-angular-frontend + - name: Copy dependencies + run: | + cp -av eform-angular-workflow-plugin/eform-client/src/app/plugins/modules/workflow-pn eform-angular-frontend/eform-client/src/app/plugins/modules/workflow-pn + cd eform-angular-frontend/eform-client && ../../eform-angular-workflow-plugin/testinginstallpn.sh + - uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Enable Corepack + run: corepack enable + - name: yarn install + run: cd eform-angular-frontend/eform-client && yarn install + - name: Unit tests + run: cd eform-angular-frontend/eform-client && npx ng test --watch=false --include='src/app/plugins/modules/workflow-pn/**/*.spec.ts' workflow-build: runs-on: ubuntu-latest steps: diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/index.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/index.ts index 85e0d0af..21cc08ac 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/index.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/components/index.ts @@ -2,4 +2,3 @@ export * from './workflow-cases'; export * from './settings/workflow-settings/workflow-settings.component'; export * from './settings/workflow-folders-modal/workflow-folders-modal.component'; export * from './settings/settings-add-site-modal/settings-add-site-modal.component'; -// export * from './settings/settings-remove-site-modal/settings-remove-site-modal.component'; diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-add-site-modal/settings-add-site-modal.component.spec.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-add-site-modal/settings-add-site-modal.component.spec.ts index 013fcbe5..b6f7c0f8 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-add-site-modal/settings-add-site-modal.component.spec.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-add-site-modal/settings-add-site-modal.component.spec.ts @@ -1,25 +1,42 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { SettingsAddSiteModalComponent } from './settings-add-site-modal.component'; - -describe('SettingsAddSiteModalComponent', () => { - let component: SettingsAddSiteModalComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SettingsAddSiteModalComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SettingsAddSiteModalComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { provideNoopAnimations } from '@angular/platform-browser/animations'; +import { TranslateModule } from '@ngx-translate/core'; +import { describe, it, expect, beforeEach, vi } from 'vitest'; +import { WorkflowPnSettingsService } from '../../../services'; +import { SettingsAddSiteModalComponent } from './settings-add-site-modal.component'; + +describe('SettingsAddSiteModalComponent', () => { + let component: SettingsAddSiteModalComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SettingsAddSiteModalComponent, TranslateModule.forRoot()], + providers: [ + provideNoopAnimations(), + { provide: WorkflowPnSettingsService, useValue: { addSiteToSettings: vi.fn() } }, + { provide: MatDialogRef, useValue: { close: vi.fn() } }, + { + provide: MAT_DIALOG_DATA, + useValue: { + sites: [{ siteUId: 1, siteName: 'A' }, { siteUId: 2, siteName: 'B' }], + assignedSites: [{ siteUId: 1, siteName: 'A' }], + }, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(SettingsAddSiteModalComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should only offer sites that are not assigned yet', () => { + expect(component.availableSites.map((s) => s.siteUId)).toEqual([2]); + }); +}); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.html b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.html deleted file mode 100644 index 62276664..00000000 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.html +++ /dev/null @@ -1,37 +0,0 @@ - diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.scss b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.spec.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.spec.ts deleted file mode 100644 index a2b7a168..00000000 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { SettingsRemoveSiteModalComponent } from './settings-remove-site-modal.component'; - -describe('SettingsRemoveSiteModalComponent', () => { - let component: SettingsRemoveSiteModalComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ SettingsRemoveSiteModalComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SettingsRemoveSiteModalComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.ts b/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.ts deleted file mode 100644 index e4aabc6c..00000000 --- a/eform-client/src/app/plugins/modules/workflow-pn/components/settings/settings-remove-site-modal/settings-remove-site-modal.component.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - Component, - EventEmitter, - OnDestroy, - OnInit, - Output, - ViewChild, - inject -} from '@angular/core'; -import { SiteNameDto } from 'src/app/common/models'; -import {WorkflowPnSettingsService} from '../../../services'; -import { AutoUnsubscribe } from 'ngx-auto-unsubscribe'; -import { Subscription } from 'rxjs'; - - -@AutoUnsubscribe() -@Component({ - selector: 'app-settings-remove-site-modal', - templateUrl: './settings-remove-site-modal.component.html', - styleUrls: ['./settings-remove-site-modal.component.scss'] -}) -export class SettingsRemoveSiteModalComponent implements OnInit, OnDestroy { - private settingsService = inject(WorkflowPnSettingsService); - - @ViewChild('frame', { static: false }) frame; - @Output() siteRemoved: EventEmitter = new EventEmitter(); - selectedSite: SiteNameDto = new SiteNameDto(); - removeSub$: Subscription; - - ngOnInit(): void {} - - show(site: SiteNameDto) { - this.selectedSite = site; - this.frame.show(); - } - - removeSite() { - this.removeSub$ = this.settingsService - .removeSiteFromSettings(this.selectedSite.siteUId) - .subscribe((data) => { - this.siteRemoved.emit(); - this.frame.hide(); - this.selectedSite = new SiteNameDto(); - }); - } - - ngOnDestroy() {} -} From 15d2ad3c44257e29f4e3d57c86b37a58894bc18b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Schultz=20Madsen?= Date: Sun, 18 Oct 2026 08:27:09 +0200 Subject: [PATCH 4/4] fix: keep MatDialogModule so plugin dialogs resolve module-provided services Co-Authored-By: Claude Opus 5.5 --- .../src/app/plugins/modules/workflow-pn/workflow-pn.module.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/eform-client/src/app/plugins/modules/workflow-pn/workflow-pn.module.ts b/eform-client/src/app/plugins/modules/workflow-pn/workflow-pn.module.ts index 8b1b8bf8..8e328f7b 100644 --- a/eform-client/src/app/plugins/modules/workflow-pn/workflow-pn.module.ts +++ b/eform-client/src/app/plugins/modules/workflow-pn/workflow-pn.module.ts @@ -1,4 +1,5 @@ import { NgModule } from '@angular/core'; +import {MatDialogModule} from '@angular/material/dialog'; import { StoreModule } from '@ngrx/store'; import { WorkflowPnCasesService, WorkflowPnSettingsService } from './services'; import { WorkflowPnRouting } from './workflow-pn.routing'; @@ -6,6 +7,7 @@ import * as workflowCasesReducer from './state/workflow-cases/workflow-cases.red @NgModule({ imports: [ + MatDialogModule, WorkflowPnRouting, StoreModule.forFeature('workflowPn', { workflowCasesState: workflowCasesReducer.reducer,