Repository: infonl/dimpact-zaakafhandelcomponent
Pull request #3411: feat(app): Zaak details - Location sidebar form
Author: login: infonl-marcel
Created: 2025-05-21T10:14:34Z | Merged: 2025-05-22T15:31:21Z

FE - Zaak details - Location sidebar form

- Moved form
- Renamed the used folders and files to align

Solves PZ-6833


Diff:
diff --git a/src/main/app/src/app/shared/location/location-util.ts b/src/main/app/src/app/shared/location/location-util.ts
index a8e5f4e4c5..3a163032d8 100644
--- a/src/main/app/src/app/shared/location/location-util.ts
+++ b/src/main/app/src/app/shared/location/location-util.ts
@@ -49,4 +49,27 @@ export class LocationUtil {
     }
     return null;
   }
+
+  public static isSameGeometry(
+    left?: GeneratedType<"RestGeometry"> | null,
+    right?: GeneratedType<"RestGeometry"> | null,
+  ) {
+    if (left?.type !== right?.type) return false;
+
+    switch (left?.type) {
+      case GeometryType.POINT:
+        return (
+          left?.point?.latitude === right?.point?.latitude &&
+          left?.point?.longitude === right?.point?.longitude
+        );
+      case GeometryType.POLYGON:
+        console.log("Polygon comparison not implemented");
+        return false;
+      case GeometryType.GEOMETRY_COLLECTION:
+        console.log("Geometry collection comparison not implemented");
+        return false;
+      default:
+        return false;
+    }
+  }
 }
diff --git a/src/main/app/src/app/zaken/zaak-details-wijzigen/zaak-details-wijzigen.component.html b/src/main/app/src/app/zaken/zaak-details-wijzigen/zaak-details-wijzigen.component.html
index 26f1b9312e..6932f780f0 100644
--- a/src/main/app/src/app/zaken/zaak-details-wijzigen/zaak-details-wijzigen.component.html
+++ b/src/main/app/src/app/zaken/zaak-details-wijzigen/zaak-details-wijzigen.component.html
@@ -12,39 +12,11 @@
 </mat-toolbar>
 <mat-divider></mat-divider>
 
-<div>
-  <mat-tab-group mat-stretch-tabs="false">
-    <mat-tab label="{{ 'gegevens.algemeen' | translate }}">
-      <ng-template mat-tab-label>
-        <mat-icon>topic</mat-icon>
-        {{ "gegevens.algemeen" | translate }}</ng-template
-      >
-      <div class="form">
-        <mfb-form
-          *ngIf="formFields"
-          [formFields]="formFields"
-          [config]="formConfig"
-          (formSubmit)="saveFromFormView($event)"
-          (formPartial)="saveFromFormView($event)"
-        ></mfb-form>
-      </div>
-    </mat-tab>
-    <mat-tab
-      label="{{ 'locatie' | translate }}"
-      [disabled]="!zaak.rechten.wijzigenLocatie"
-    >
-      <ng-template mat-tab-label>
-        <mat-icon>place</mat-icon>
-        {{ "locatie" | translate }}
-      </ng-template>
-      <zac-locatie-zoek
-        [currentLocation]="zaak.zaakgeometrie"
-        [readonly]="!zaak.rechten.wijzigenLocatie"
-        [reasonControl]="reasonField.formControl"
-        (locatie)="saveFromMapView()"
-        (locationChanged)="locationChanged($event)"
-        [sideNav]="sideNav"
-      ></zac-locatie-zoek>
-    </mat-tab>
-  </mat-tab-group>
+<div class="form">
+  <mfb-form
+    *ngIf="formFields"
+    [formFields]="formFields"
+    [config]="formConfig"
+    (formSubmit)="onSubmit($event)"
+  ></mfb-form>
 </div>
diff --git a/src/main/app/src/app/zaken/zaak-details-wijzigen/zaak-details-wijzigen.component.ts b/src/main/app/src/app/zaken/zaak-details-wijzigen/zaak-details-wijzigen.component.ts
index 1ec2ee86cc..8627244570 100644
--- a/src/main/app/src/app/zaken/zaak-details-wijzigen/zaak-details-wijzigen.component.ts
+++ b/src/main/app/src/app/zaken/zaak-details-wijzigen/zaak-details-wijzigen.component.ts
@@ -12,7 +12,7 @@ import {
 } from "@angular/forms";
 import { MatDrawer } from "@angular/material/sidenav";
 import moment from "moment";
-import { Observable, Subject, Subscription, forkJoin, takeUntil } from "rxjs";
+import { Observable, Subject, takeUntil } from "rxjs";
 import { ReferentieTabelService } from "src/app/admin/referentie-tabel.service";
 import { UtilService } from "src/app/core/service/util.service";
 import { Vertrouwelijkheidaanduiding } from "src/app/informatie-objecten/model/vertrouwelijkheidaanduiding.enum";
@@ -321,7 +321,7 @@ export class CaseDetailsEditComponent implements OnDestroy, OnInit {
     return null;
   }
 
-  saveFromFormView(formGroup?: FormGroup): void {
+  onSubmit(formGroup?: FormGroup): void {
     if (!formGroup) {
       void this.sideNav.close();
       return;
@@ -338,26 +338,6 @@ export class CaseDetailsEditComponent implements OnDestroy, OnInit {
     void this.updateZaak(this.createZaakPatch(updates));
   }
 
-  saveFromMapView() {
-    const updates = this.formFields.reduce((acc, fields) => {
-      fields.forEach((field) => {
-        const value = field.formControl.value;
-        acc[field.id] =
-          field.id === "vertrouwelijkheidaanduiding"
-            ? (value as { value: unknown }).value
-            : value;
-      });
-      return acc;
-    }, {});
-
-    void this.updateZaak(this.createZaakPatch(updates));
-  }
-
-  locationChanged(update?: GeneratedType<"RestGeometry">) {
-    this.zaak.zaakgeometrie = update;
-    this.reasonField.formControl.enable();
-  }
-
   private createZaakPatch(update: Record<string, unknown>) {
     // eslint-disable-next-line @typescript-eslint/no-unused-vars
     const { assignment, reason, ...updates } = update;
@@ -372,38 +352,20 @@ export class CaseDetailsEditComponent implements OnDestroy, OnInit {
 
   private async updateZaak(zaak: Partial<GeneratedType<"RestZaak">>) {
     const reason = this.reasonField.formControl.value;
-    const subscriptions: Subscription[] = [];
 
     this.patchBehandelaar(zaak, reason);
 
-    this.patchLocation(reason).subscribe(() => {
-      // To prevent a race condition, we need to first update the `zaakgeometrie` and then the other fields
-      subscriptions.push(
-        this.zakenService
-          .updateZaak(this.zaak.uuid, { zaak, reden: reason })
-          .subscribe(() => {}),
-      );
-
-      forkJoin([subscriptions]).subscribe(() => this.sideNav.close());
-    });
-  }
-
-  private patchLocation(reason?: string) {
-    if (
-      JSON.stringify(this.zaak.zaakgeometrie) ===
-      JSON.stringify(this.initialZaakGeometry)
-    ) {
-      return new Observable((observer) => {
-        observer.next(null);
-        observer.complete();
+    this.zakenService
+      .updateZaak(this.zaak.uuid, { zaak, reden: reason })
+      .pipe(takeUntil(this.ngDestroy))
+      .subscribe({
+        next: () => {
+          void this.sideNav.close();
+        },
+        error: (err) => {
+          console.error("Fout bij bijwerken zaak:", err);
+        },
       });
-    }
-
-    return this.zakenService.updateZaakLocatie(
-      this.zaak.uuid,
-      reason,
-      this.zaak.zaakgeometrie as unknown as GeneratedType<"RestGeometry">,
-    );
   }
 
   private patchBehandelaar(
diff --git a/src/main/app/src/app/zaken/zaak-locatie/tonen/zaak-locatie-tonen.component.html b/src/main/app/src/app/zaken/zaak-locatie-tonen/zaak-locatie-tonen.component.html
similarity index 100%
rename from src/main/app/src/app/zaken/zaak-locatie/tonen/zaak-locatie-tonen.component.html
rename to src/main/app/src/app/zaken/zaak-locatie-tonen/zaak-locatie-tonen.component.html
diff --git a/src/main/app/src/app/zaken/zaak-locatie/tonen/zaak-locatie-tonen.component.less b/src/main/app/src/app/zaken/zaak-locatie-tonen/zaak-locatie-tonen.component.less
similarity index 100%
rename from src/main/app/src/app/zaken/zaak-locatie/tonen/zaak-locatie-tonen.component.less
rename to src/main/app/src/app/zaken/zaak-locatie-tonen/zaak-locatie-tonen.component.less
diff --git a/src/main/app/src/app/zaken/zaak-locatie/tonen/zaak-locatie-tonen.component.ts b/src/main/app/src/app/zaken/zaak-locatie-tonen/zaak-locatie-tonen.component.ts
similarity index 93%
rename from src/main/app/src/app/zaken/zaak-locatie/tonen/zaak-locatie-tonen.component.ts
rename to src/main/app/src/app/zaken/zaak-locatie-tonen/zaak-locatie-tonen.component.ts
index 92db5f44ee..59a9b43531 100644
--- a/src/main/app/src/app/zaken/zaak-locatie/tonen/zaak-locatie-tonen.component.ts
+++ b/src/main/app/src/app/zaken/zaak-locatie-tonen/zaak-locatie-tonen.component.ts
@@ -24,13 +24,13 @@ import * as source from "ol/source.js";
 import * as style from "ol/style.js";
 import WMTSTileGrid from "ol/tilegrid/WMTS.js";
 import { environment } from "src/environments/environment";
-import { LocationUtil } from "../../../shared/location/location-util";
+import { LocationUtil } from "../../shared/location/location-util";
 import {
   AddressResult,
   LocationService,
-} from "../../../shared/location/location.service";
-import { GeneratedType } from "../../../shared/utils/generated-types";
-import { GeometryType } from "../../model/geometryType";
+} from "../../shared/location/location.service";
+import { GeneratedType } from "../../shared/utils/generated-types";
+import { GeometryType } from "../model/geometryType";
 
 @Component({
   selector: "zac-locatie-tonen",
@@ -153,6 +153,12 @@ export class LocatieTonenComponent implements OnInit, AfterViewInit {
     }
   }
 
+  ngOnChanges(): void {
+    if (this.currentLocation) {
+      this.setLocation(this.currentLocation);
+    }
+  }
+
   private setLocation(geometry?: GeneratedType<"RestGeometry">) {
     this.clearPreviousMarker();
 
@@ -162,9 +168,7 @@ export class LocatieTonenComponent implements OnInit, AfterViewInit {
 
         const coordinate = LocationUtil.pointToCoordinate(geometry.point);
         this.addMarker(coordinate);
-        if ((this.map.getView()?.getZoom() ?? 0) < this.MAX_ZOOM) {
-          this.zoomToMarker(coordinate);
-        }
+        this.zoomToMarker(coordinate);
         this.locationService
           .coordinateToAddress(coordinate)
           .subscribe((objectData) => {
diff --git a/src/main/app/src/app/zaken/zoek/locatie-zoek/locatie-zoek.component.html b/src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.html
similarity index 81%
rename from src/main/app/src/app/zaken/zoek/locatie-zoek/locatie-zoek.component.html
rename to src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.html
index d958f4ebca..d9c1a8b757 100644
--- a/src/main/app/src/app/zaken/zoek/locatie-zoek/locatie-zoek.component.html
+++ b/src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.html
@@ -1,8 +1,24 @@
 <!--
-  ~ SPDX-FileCopyrightText: 2022 Atos, 2024 INFO.nl
+  ~ SPDX-FileCopyrightText: 2025 INFO.nl
   ~ SPDX-License-Identifier: EUPL-1.2+
   -->
 
+<mat-toolbar role="heading" class="gap-16">
+  <mat-icon>{{ zaak.zaakgeometrie ? "place" : "add_location_alt" }}</mat-icon>
+  <span class="flex-grow-1">
+    {{
+      (zaak.zaakgeometrie
+        ? "actie.zaak.locatie.wijzigen"
+        : "actie.zaak.locatie.toevoegen"
+      ) | translate
+    }}
+  </span>
+  <button mat-icon-button (click)="sideNav.close()">
+    <mat-icon>close</mat-icon>
+  </button>
+</mat-toolbar>
+<mat-divider></mat-divider>
+
 <div class="form">
   <div class="flex-row flex-col-md gap-10 flex-wrap">
     <div class="w100">
@@ -10,14 +26,14 @@
         <mat-card-content class="flex-row items-center">
           <div>{{ "coordinates" | translate }}</div>
           <zac-static-text
-            [value]="markerLocatie | location | empty"
+            [value]="markerLocatie$ | async | location | empty"
             class="flex-item flex-1"
           ></zac-static-text>
           <button
             mat-icon-button
             matSuffix
             (click)="clearLocation()"
-            disabled="{{ !markerLocatie }}"
+            [disabled]="!(markerLocatie$ | async)"
           >
             <mat-icon>link_off</mat-icon>
           </button>
@@ -53,8 +69,8 @@
       </zac-static-text>
       <div class="map-container">
         <div
-          [id]="'open-layers-map'"
           #openLayersMap
+          [id]="'open-layers-map'"
           class="open-layers-map"
           [ngClass]="{ readonly: readonly }"
         ></div>
diff --git a/src/main/app/src/app/zaken/zoek/locatie-zoek/locatie-zoek.component.less b/src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.less
similarity index 80%
rename from src/main/app/src/app/zaken/zoek/locatie-zoek/locatie-zoek.component.less
rename to src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.less
index 051a88200e..d80da8c6bd 100644
--- a/src/main/app/src/app/zaken/zoek/locatie-zoek/locatie-zoek.component.less
+++ b/src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.less
@@ -1,12 +1,19 @@
 /*
- * SPDX-FileCopyrightText: 2022 Atos
+ * SPDX-FileCopyrightText: 2025 INFO.nl
  * SPDX-License-Identifier: EUPL-1.2+
  */
 
+.form {
+  min-width: 840px;
+}
+
 .map-container {
   min-width: 840px;
   position: relative;
   margin: -15px 0 12px;
+  border: 1px solid var(--mat-tab-header-divider-color);
+  border-radius: 4px;
+  overflow: hidden;
 }
 
 .open-layers-map {
diff --git a/src/main/app/src/app/zaken/zoek/locatie-zoek/locatie-zoek.component.ts b/src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.ts
similarity index 78%
rename from src/main/app/src/app/zaken/zoek/locatie-zoek/locatie-zoek.component.ts
rename to src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.ts
index 02410a8c54..03a1fa78bc 100644
--- a/src/main/app/src/app/zaken/zoek/locatie-zoek/locatie-zoek.component.ts
+++ b/src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.ts
@@ -29,41 +29,45 @@ import * as proj from "ol/proj.js";
 import * as source from "ol/source.js";
 import * as style from "ol/style.js";
 import WMTSTileGrid from "ol/tilegrid/WMTS.js";
-import { Subject } from "rxjs";
+import { BehaviorSubject, Subject } from "rxjs";
 import { takeUntil } from "rxjs/operators";
 import { environment } from "src/environments/environment";
-import { LocationUtil } from "../../../shared/location/location-util";
+import { LocationUtil } from "../../shared/location/location-util";
 import {
   AddressResult,
   LocationService,
   SuggestResult,
-} from "../../../shared/location/location.service";
-import { GeneratedType } from "../../../shared/utils/generated-types";
-import { GeometryGegevens } from "../../model/geometry-gegevens";
-import { GeometryType } from "../../model/geometryType";
+} from "../../shared/location/location.service";
+import { GeneratedType } from "../../shared/utils/generated-types";
+import { GeometryGegevens } from "../model/geometry-gegevens";
+import { GeometryType } from "../model/geometryType";
+import { ZakenService } from "../zaken.service";
 
 @Component({
-  selector: "zac-locatie-zoek",
-  templateUrl: "./locatie-zoek.component.html",
-  styleUrls: ["./locatie-zoek.component.less"],
+  selector: "zac-case-location-edit",
+  templateUrl: "./zaak-locatie-wijzigen.component.html",
+  styleUrls: ["./zaak-locatie-wijzigen.component.less"],
 })
-export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
-  @Input({ required: true }) currentLocation!: GeneratedType<"RestGeometry">;
-  @Input() readonly = false;
+export class CaseLocationEditComponent
+  implements OnInit, AfterViewInit, OnDestroy
+{
+  @Input({ required: true }) zaak!: GeneratedType<"RestZaak">;
   @Input({ required: true }) sideNav!: MatDrawer;
-  @Input({ required: true }) reasonControl!: FormControl<string>;
   @Output() locatie = new EventEmitter<GeometryGegevens | null>();
-  @Output() locationChanged = new EventEmitter<
-    GeneratedType<"RestGeometry"> | undefined
-  >();
+
   @ViewChild("openLayersMap", { static: true }) openLayersMapRef: ElementRef;
-  markerLocatie?: GeneratedType<"RestGeometry">;
+
+  // markerLocatie?: GeneratedType<"RestGeometry">;
+  markerLocatie$ = new BehaviorSubject<GeneratedType<"RestGeometry"> | null>(
+    null,
+  );
   nearestAddress: AddressResult;
   searchControl = new FormControl();
+  reasonControl = new FormControl();
   searchResults: SuggestResult[] = [];
-  initialLocation: GeneratedType<"RestGeometry">;
 
   private unsubscribe$: Subject<void> = new Subject<void>();
+  protected readonly: boolean = false;
 
   private map: ol.Map;
   private view: ol.View;
@@ -101,10 +105,12 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
     }),
   });
 
-  constructor(private locationService: LocationService) {}
+  constructor(
+    private zakenService: ZakenService,
+    private locationService: LocationService,
+  ) {}
 
   ngOnInit(): void {
-    this.initialLocation = this.currentLocation;
     const projection = proj.get(this.EPSG3857);
     const projectionExtent = projection?.getExtent();
     const size = extent.getWidth(projectionExtent) / 256;
@@ -165,11 +171,24 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
     const modify = new interaction.Modify({ source: this.locationSource });
     this.map.addInteraction(modify);
 
+    this.readonly = !this.zaak.rechten.wijzigenLocatie;
+    this.reasonControl.disable();
+
     this.searchControl.valueChanges
       .pipe(takeUntil(this.unsubscribe$))
       .subscribe((value) => {
         this.searchAddresses(value);
       });
+
+    this.markerLocatie$
+      .pipe(takeUntil(this.unsubscribe$))
+      .subscribe((geometry) => {
+        if (LocationUtil.isSameGeometry(geometry, this.zaak.zaakgeometrie)) {
+          this.disableReasonControl();
+        } else {
+          this.reasonControl.enable();
+        }
+      });
   }
 
   ngAfterViewInit(): void {
@@ -196,16 +215,11 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
       this.openLayersMapRef.nativeElement.focus();
     });
 
-    if (this.currentLocation) {
-      this.setLocation(this.currentLocation, false);
+    if (this.zaak.zaakgeometrie) {
+      this.setLocation(this.zaak.zaakgeometrie, false);
     }
   }
 
-  ngOnDestroy(): void {
-    this.unsubscribe$.next();
-    this.unsubscribe$.complete();
-  }
-
   private searchAddresses(query: string): void {
     if (query) {
       this.locationService.addressSuggest(query).subscribe((data) => {
@@ -231,14 +245,20 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
   }
 
   clearLocation() {
+    this.disableReasonControl();
     this.setLocation();
   }
 
+  private disableReasonControl() {
+    this.reasonControl.disable();
+    this.reasonControl.reset();
+  }
+
   private setLocation(
     geometry?: GeneratedType<"RestGeometry">,
     fromSearch = true,
   ) {
-    this.markerLocatie = geometry;
+    this.markerLocatie$.next(geometry ?? null);
     this.clearPreviousMarker();
     this.searchControl.reset();
 
@@ -262,11 +282,6 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
         }
       }
     }
-
-    if (JSON.stringify(geometry) === JSON.stringify(this.initialLocation)) {
-      return;
-    }
-    this.locationChanged.emit(geometry);
   }
 
   private addMarker(coordinate: Coordinate) {
@@ -298,18 +313,29 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
   }
 
   cancel(): void {
-    this.currentLocation = this.initialLocation;
-    this.locationChanged.emit(this.initialLocation);
     void this.sideNav.close();
   }
 
   save(): void {
-    this.initialLocation = this.currentLocation;
+    this.zakenService
+      .updateZaakLocatie(
+        this.zaak.uuid,
+        this.reasonControl.value,
+        this.markerLocatie$.getValue() ?? undefined,
+      )
+      .subscribe({
+        next: () => {
+          this.sideNav.close();
+          this.locatie.emit();
+        },
+        error: (err) => {
+          console.error("Failed to update location:", err);
+        },
+      });
+  }
 
-    this.locatie.next(
-      this.markerLocatie
-        ? new GeometryGegevens(this.markerLocatie, this.reasonControl.value)
-        : null,
-    );
+  ngOnDestroy(): void {
+    this.unsubscribe$.next();
+    this.unsubscribe$.complete();
   }
 }
diff --git a/src/main/app/src/app/zaken/zaak-view/zaak-view.component.html b/src/main/app/src/app/zaken/zaak-view/zaak-view.component.html
index 0a4569a31e..af613c6855 100644
--- a/src/main/app/src/app/zaken/zaak-view/zaak-view.component.html
+++ b/src/main/app/src/app/zaken/zaak-view/zaak-view.component.html
@@ -59,6 +59,12 @@
       [loggedInUser]="loggedInUser"
       [sideNav]="actionsSidenav"
     ></zac-case-details-edit>
+    <zac-case-location-edit
+      *ngSwitchCase="'actie.zaak.locatie.toevoegen'"
+      [zaak]="zaak"
+      [sideNav]="actionsSidenav"
+      (locatie)="locationSelected()"
+    ></zac-case-location-edit>
     <zac-informatie-object-create-attended
       *ngSwitchCase="'actie.document.maken'"
       [sideNav]="actionsSidenav"
@@ -326,12 +332,6 @@
                     "
                     class="flex-item"
                   ></zac-static-text>
-                  <zac-static-text
-                    *ngIf="!locationFeatureCookie"
-                    [label]="'locatie' | translate"
-                    [value]="zaak.zaakgeometrie | location | empty"
-                    class="flex-item"
-                  ></zac-static-text>
                 </div>
 
                 <div class="flex flex-col gap-10">
@@ -347,13 +347,22 @@
               </div>
             </mat-tab>
 
-            <mat-tab *ngIf="zaak.zaakgeometrie && locationFeatureCookie">
+            <mat-tab *ngIf="zaak.zaakgeometrie">
               <ng-template mat-tab-label>
                 <mat-icon>place</mat-icon>
                 {{ "locatie" | translate }}</ng-template
               >
               <div id="locatie_tab" class="table-wrapper">
                 <div class="flex flex-col gap-10 editable">
+                  <button
+                    *ngIf="zaak.rechten.wijzigenLocatie"
+                    mat-icon-button
+                    mat-small-icon-button
+                    (click)="editLocationDetails()"
+                  >
+                    <mat-icon>edit</mat-icon>
+                  </button>
+
                   <zac-static-text
                     [label]="'coordinates' | translate"
                     [value]="zaak.zaakgeometrie | location | empty"
diff --git a/src/main/app/src/app/zaken/zaak-view/zaak-view.component.ts b/src/main/app/src/app/zaken/zaak-view/zaak-view.component.ts
index 355bbe78b1..7657a30728 100644
--- a/src/main/app/src/app/zaken/zaak-view/zaak-view.component.ts
+++ b/src/main/app/src/app/zaken/zaak-view/zaak-view.component.ts
@@ -142,10 +142,6 @@ export class ZaakViewComponent
   viewInitialized = false;
   loggedInUser!: GeneratedType<"RestLoggedInUser">;
 
-  locationFeatureCookie = document.cookie
-    .split("; ")
-    .some((cookie) => cookie.startsWith("locatie"));
-
   private zaakListener!: WebsocketListener;
   private zaakRollenListener!: WebsocketListener;
   private zaakBesluitenListener!: WebsocketListener;
@@ -534,6 +530,16 @@ export class ZaakViewComponent
           ),
         );
       }
+
+      if (this.zaak.rechten.wijzigenLocatie && !this.zaak.zaakgeometrie) {
+        this.menu.push(
+          new ButtonMenuItem(
+            "actie.zaak.locatie.toevoegen",
+            () => this.actionsSidenav.open(),
+            "add_location_alt",
+          ),
+        );
+      }
     }
   }
 
@@ -955,6 +961,13 @@ export class ZaakViewComponent
     }
   }
 
+  editLocationDetails(): void {
+    if (this.zaak.rechten.wijzigen) {
+      this.activeSideAction = "actie.zaak.locatie.toevoegen";
+      this.actionsSidenav.open();
+    }
+  }
+
   addOrEditZaakInitiator(): void {
     this.activeSideAction = "actie.initiator.toevoegen";
     this.actionsSidenav.open();
@@ -1247,6 +1260,11 @@ export class ZaakViewComponent
     this.updateZaak();
   }
 
+  locationSelected(): void {
+    this.sluitSidenav();
+    this.updateZaak();
+  }
+
   startZaakOntkoppelenDialog(
     gerelateerdeZaak: GeneratedType<"RestGerelateerdeZaak">,
   ): void {
diff --git a/src/main/app/src/app/zaken/zaken.module.ts b/src/main/app/src/app/zaken/zaken.module.ts
index 697eb99c23..6e59891189 100644
--- a/src/main/app/src/app/zaken/zaken.module.ts
+++ b/src/main/app/src/app/zaken/zaken.module.ts
@@ -28,7 +28,8 @@ import { CaseDetailsEditComponent } from "./zaak-details-wijzigen/zaak-details-w
 import { ZaakDocumentenComponent } from "./zaak-documenten/zaak-documenten.component";
 import { ZaakInitiatorToevoegenComponent } from "./zaak-initiator-toevoegen/zaak-initiator-toevoegen.component";
 import { ZaakLinkComponent } from "./zaak-link/zaak-link.component";
-import { LocatieTonenComponent } from "./zaak-locatie/tonen/zaak-locatie-tonen.component";
+import { LocatieTonenComponent } from "./zaak-locatie-tonen/zaak-locatie-tonen.component";
+import { CaseLocationEditComponent } from "./zaak-locatie-wijzigen/zaak-locatie-wijzigen.component";
 import { ZaakOntkoppelenDialogComponent } from "./zaak-ontkoppelen/zaak-ontkoppelen-dialog.component";
 import { ZaakOpschortenDialogComponent } from "./zaak-opschorten-dialog/zaak-opschorten-dialog.component";
 import { ZaakVerkortComponent } from "./zaak-verkort/zaak-verkort.component";
@@ -42,7 +43,6 @@ import { ZakenRoutingModule } from "./zaken-routing.module";
 import { ZakenVerdelenDialogComponent } from "./zaken-verdelen-dialog/zaken-verdelen-dialog.component";
 import { ZakenVrijgevenDialogComponent } from "./zaken-vrijgeven-dialog/zaken-vrijgeven-dialog.component";
 import { ZakenWerkvoorraadComponent } from "./zaken-werkvoorraad/zaken-werkvoorraad.component";
-import { LocatieZoekComponent } from "./zoek/locatie-zoek/locatie-zoek.component";
 
 @NgModule({
   declarations: [
@@ -64,9 +64,9 @@ import { LocatieZoekComponent } from "./zoek/locatie-zoek/locatie-zoek.component
     ZaakVerlengenDialogComponent,
     ZaakInitiatorToevoegenComponent,
     CaseDetailsEditComponent,
+    CaseLocationEditComponent,
     ZaakLinkComponent,
     NotitiesComponent,
-    LocatieZoekComponent,
     LocatieTonenComponent,
     ZaakDocumentenComponent,
     ZaakdataComponent,
diff --git a/src/main/app/src/assets/i18n/en.json b/src/main/app/src/assets/i18n/en.json
index d4f77eec9c..34faad6148 100644
--- a/src/main/app/src/assets/i18n/en.json
+++ b/src/main/app/src/assets/i18n/en.json
@@ -677,6 +677,8 @@
   "actie.vrijgeven": "Release",
   "actie.zaak.aanmaken": "Create case",
   "actie.zaak.wijzigen": "Edit case details",
+  "actie.zaak.locatie.toevoegen": "Add case locatie",
+  "actie.zaak.locatie.wijzigen": "Edit case location",
   "actie.zaak.afbreken": "Abort case",
   "actie.zaak.afbreken.reden": "Reason why case is aborted",
   "actie.zaak.afbreken.reden.-kies-": "- Select a reason why case is aborted -",
diff --git a/src/main/app/src/assets/i18n/nl.json b/src/main/app/src/assets/i18n/nl.json
index 1c8ab0c8f7..11e9816359 100644
--- a/src/main/app/src/assets/i18n/nl.json
+++ b/src/main/app/src/assets/i18n/nl.json
@@ -676,6 +676,8 @@
   "actie.wissen.aria-label": "Invoerveld wissen",
   "actie.vrijgeven": "Vrijgeven",
   "actie.zaak.aanmaken": "Zaak aanmaken",
+  "actie.zaak.locatie.toevoegen": "Zaaklocatie toevoegen",
+  "actie.zaak.locatie.wijzigen": "Zaaklocatie wijzigen",
   "actie.zaak.wijzigen": "Zaakgegevens bewerken",
   "actie.zaak.afbreken": "Zaak afbreken",
   "actie.zaak.afbreken.reden": "Reden waarom zaak wordt afgebroken",


Reviews:
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This PR introduces a sidebar form for editing the case's location details. Key changes include updated i18n keys for location actions, refactored component and module imports to support the new location editing, and modifications to the case view to incorporate a new location edit button.

### Reviewed Changes

Copilot reviewed 14 out of 15 changed files in this pull request and generated 2 comments.

<details>
<summary>Show a summary per file</summary>

| File | Description |
| ---- | ----------- |
| src/main/app/src/assets/i18n/nl.json | Added Dutch translations for new location actions |
| src/main/app/src/assets/i18n/en.json | Added English translations (note potential inconsistency in wording) |
| src/main/app/src/app/zaken/zaken.module.ts | Updated imports and declarations to reflect file renaming and new component usage |
| src/main/app/src/app/zaken/zaak-view.component.ts | Added logic to conditionally show and trigger the new location edit sidebar |
| src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.* | Renamed and refactored the location editing component |
| src/main/app/src/app/zaken/zaak-details-wijzigen/* | Updated form submission logic and removed obsolete location syncing code |
| src/main/app/package.json | Introduced a new dependency on lodash.isequal |
</details>


<details>
<summary>Files not reviewed (1)</summary>

* **src/main/app/package-lock.json**: Language not supported
</details>



state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T11:04:12Z
user: login: xiduzo
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T11:06:20Z
user: login: xiduzo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T11:06:45Z
user: login: xiduzo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T11:07:48Z
user: login: bas-info-nl
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-21T11:45:39Z
user: login: infonl-marcel
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T11:52:46Z
user: login: infonl-marcel
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T11:54:19Z
user: login: infonl-marcel
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T11:55:43Z
user: login: infonl-marcel
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T11:59:13Z
user: login: infonl-marcel
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T12:04:48Z
user: login: xiduzo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T12:12:59Z
user: login: xiduzo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T12:16:41Z
user: login: xiduzo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T12:17:14Z
user: login: xiduzo
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T12:34:35Z
user: login: infonl-marcel
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T13:25:35Z
user: login: infonl-marcel
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T13:25:50Z
user: login: xiduzo
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-21T13:38:27Z

Review comments:
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: xiduzo
body: why do we need this?
created_at: 2025-05-21T11:01:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -955,6 +961,13 @@ export class ZaakViewComponent
     }
   }
 
+  editLocationDetails(): void {
+    if (this.zaak.rechten.wijzigen) {
path: src/main/app/src/app/zaken/zaak-view/zaak-view.component.ts
user: login: Copilot
body: The permission check here uses 'wijzigen' while the menu button is only added when 'wijzigenLocatie' is true. Consider aligning the permission check to 'wijzigenLocatie' to ensure consistent access control.
```suggestion
    if (this.zaak.rechten.wijzigenLocatie) {
```
created_at: 2025-05-21T11:04:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -677,6 +677,8 @@
   "actie.vrijgeven": "Release",
   "actie.zaak.aanmaken": "Create case",
   "actie.zaak.wijzigen": "Edit case details",
+  "actie.zaak.locatie.toevoegen": "Add case locatie",
+  "actie.zaak.locatie.wijzigen": "Edit case details",
path: src/main/app/src/assets/i18n/en.json
user: login: Copilot
body: The translation for 'actie.zaak.locatie.wijzigen' is 'Edit case details', which appears inconsistent with the corresponding Dutch message 'Zaaklocatie wijzigen'. It may be clearer to use a translation such as 'Edit case location' for better consistency.
```suggestion
  "actie.zaak.locatie.wijzigen": "Edit case location",
```
created_at: 2025-05-21T11:04:11Z
author_association: CONTRIBUTOR
diff_hunk: @@ -165,11 +172,24 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
     const modify = new interaction.Modify({ source: this.locationSource });
     this.map.addInteraction(modify);
 
+    this.readonly = !this.zaak.rechten.wijzigenLocatie;
+    this.reasonControl.disable();
+
     this.searchControl.valueChanges
       .pipe(takeUntil(this.unsubscribe$))
       .subscribe((value) => {
         this.searchAddresses(value);
       });
+
+    this.markerLocatie$
+      .pipe(takeUntil(this.unsubscribe$))
+      .subscribe((geometry) => {
+        if (isEqual(geometry, this.zaak.zaakgeometrie)) {
path: src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.ts
user: login: xiduzo
body: ```suggestion
        if (JSON.stringify(geometry) === JSON.stringify(this.zaak.zaakgeometrie)) {
```
created_at: 2025-05-21T11:05:36Z
author_association: CONTRIBUTOR
diff_hunk: @@ -298,17 +314,29 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
   }
 
   cancel(): void {
-    this.currentLocation = this.initialLocation;
-    this.locationChanged.emit(this.initialLocation);
     void this.sideNav.close();
   }
 
   save(): void {
-    this.initialLocation = this.currentLocation;
-    if (!this.markerLocatie) return;
+    this.zakenService
+      .updateZaakLocatie(
+        this.zaak.uuid,
+        this.reasonControl.value,
+        this.markerLocatie$.getValue(),
+      )
+      .subscribe({
+        next: () => {
+          this.sideNav.close();
+          this.locatie.emit();
+        },
+        error: (err) => {
+          console.error("Failed to update location:", err);
path: src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.ts
user: login: xiduzo
body: and then..? should we show this to the user?
created_at: 2025-05-21T11:05:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -677,6 +677,8 @@
   "actie.vrijgeven": "Release",
   "actie.zaak.aanmaken": "Create case",
   "actie.zaak.wijzigen": "Edit case details",
+  "actie.zaak.locatie.toevoegen": "Add case locatie",
+  "actie.zaak.locatie.wijzigen": "Edit case details",
path: src/main/app/src/assets/i18n/en.json
user: login: xiduzo
body: ☝️  good point
created_at: 2025-05-21T11:06:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -955,6 +961,13 @@ export class ZaakViewComponent
     }
   }
 
+  editLocationDetails(): void {
+    if (this.zaak.rechten.wijzigen) {
path: src/main/app/src/app/zaken/zaak-view/zaak-view.component.ts
user: login: xiduzo
body: we have the `wijzigen_locatie`, it should get checked for this
created_at: 2025-05-21T11:07:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: bas-info-nl
body: We should use pinned versions !
created_at: 2025-05-21T11:39:33Z
author_association: MEMBER
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: bas-info-nl
body: Is it used for this comparison?
```
isEqual(geometry, this.zaak.zaakgeometrie)
```
 
created_at: 2025-05-21T11:45:33Z
author_association: MEMBER
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: infonl-marcel
body: deep comparison; way safer than JSO.stringify
created_at: 2025-05-21T11:52:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -165,11 +172,24 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
     const modify = new interaction.Modify({ source: this.locationSource });
     this.map.addInteraction(modify);
 
+    this.readonly = !this.zaak.rechten.wijzigenLocatie;
+    this.reasonControl.disable();
+
     this.searchControl.valueChanges
       .pipe(takeUntil(this.unsubscribe$))
       .subscribe((value) => {
         this.searchAddresses(value);
       });
+
+    this.markerLocatie$
+      .pipe(takeUntil(this.unsubscribe$))
+      .subscribe((geometry) => {
+        if (isEqual(geometry, this.zaak.zaakgeometrie)) {
path: src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.ts
user: login: infonl-marcel
body: JSON.stringify somparison is not very trustworthy in case of object comparing; and an object actually coming from a package we include here; deliberate choice. As well not to use the whol Lodash package just for this deep object compparing
created_at: 2025-05-21T11:54:19Z
author_association: CONTRIBUTOR
diff_hunk: @@ -298,17 +314,29 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
   }
 
   cancel(): void {
-    this.currentLocation = this.initialLocation;
-    this.locationChanged.emit(this.initialLocation);
     void this.sideNav.close();
   }
 
   save(): void {
-    this.initialLocation = this.currentLocation;
-    if (!this.markerLocatie) return;
+    this.zakenService
+      .updateZaakLocatie(
+        this.zaak.uuid,
+        this.reasonControl.value,
+        this.markerLocatie$.getValue(),
+      )
+      .subscribe({
+        next: () => {
+          this.sideNav.close();
+          this.locatie.emit();
+        },
+        error: (err) => {
+          console.error("Failed to update location:", err);
path: src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.ts
user: login: infonl-marcel
body: Nope; we might use somethging like Sentry in the future, which can pick this up for our own statistics and health checks
created_at: 2025-05-21T11:55:42Z
author_association: CONTRIBUTOR
diff_hunk: @@ -955,6 +961,13 @@ export class ZaakViewComponent
     }
   }
 
+  editLocationDetails(): void {
+    if (this.zaak.rechten.wijzigen) {
path: src/main/app/src/app/zaken/zaak-view/zaak-view.component.ts
user: login: infonl-marcel
body: This indeed is in the OPA; but gets converted:

```@param:JsonbProperty("wijzigen_locatie") val wijzigenLocatie: Boolean```

As well this is taken from the originating file.
created_at: 2025-05-21T11:59:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: infonl-marcel
body: > We should use pinned versions !

Good one Bas! Pinned
created_at: 2025-05-21T12:04:48Z
author_association: CONTRIBUTOR
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: xiduzo
body: but we now include a new package for just 1 method in the codebase. I'd prefer to make an util function that validates if a zaak geometrie is indeed the same. We only support a point for now so that is rather simple to validate.
created_at: 2025-05-21T12:12:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: xiduzo
body: ```ts
isSameGeometry(left: Geometry, right: Geometry) {
    if(left.type !== right.type) return false
    
    switch (left.type) {
      case GeometryType.POINT:
        return left.point.latitude === right.point.latitude && left.point.longitude === right.point.longitude;
      case GeometryType.POLYGON:
        // ....
        break;
      case GeometryType.GEOMETRY_COLLECTION:
        // ...
        break;
      default:
        return false
    }
  }
```
created_at: 2025-05-21T12:16:41Z
author_association: CONTRIBUTOR
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: xiduzo
body: ☝️ no need to make ZAC more dependent on an external package, I think
created_at: 2025-05-21T12:17:14Z
author_association: CONTRIBUTOR
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: xiduzo
body: ```ts
isSameGeometry(left: Geometry, right: Geometry) {
    if(left.type !== right.type) return false

    switch (left.type) {
      case GeometryType.POINT:
        return left.point.latitude === right.point.latitude && left.point.longitude === right.point.longitude;
      case GeometryType.POLYGON:
        return left.polygon.length === right.polygon.length && left.polygon.reduce((isSameShape, shape, shapeIndex) => {
          if(!isSameShape) return false // no need to continue
          
          const sameSize = shape.length === right.polygon[shapeIndex].length
          if(!sameSize) return false // no need to continue
          
            return shape.reduce((isSamePoint, point, pointIndex) => {
                if(!isSamePoint) return false // no need to continue
              
              const sameLatitude = point.latitude === right.polygon[shapeIndex][pointIndex].latitude
                if(!sameLatitude) return false // no need to continue
              
                return point.longitude === right.polygon[shapeIndex][pointIndex].longitude
            }, false)
        }, false)
        
      case GeometryType.GEOMETRY_COLLECTION:
        return left.geometrycollection.length === right.geometrycollection.length && left.geometrycollection.reduce((_acc, geometry, geometryIndex) => {
          return this.isSameGeometry(geometry, right.geometrycollection[geometryIndex])
        }, false)
      default:
        return false
    }
  }
```

Can use some unit-testing
created_at: 2025-05-21T12:34:34Z
author_association: CONTRIBUTOR
diff_hunk: @@ -38,6 +38,7 @@
     "@tanstack/angular-query-experimental": "5.76.0",
     "@types/proj4": "2.5.6",
     "bootstrap": "4.6.2",
+    "lodash.isequal": "^4.5.0",
path: src/main/app/package.json
user: login: infonl-marcel
body: Fixed; unit test WIP
created_at: 2025-05-21T13:25:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -165,11 +172,24 @@ export class LocatieZoekComponent implements OnInit, AfterViewInit, OnDestroy {
     const modify = new interaction.Modify({ source: this.locationSource });
     this.map.addInteraction(modify);
 
+    this.readonly = !this.zaak.rechten.wijzigenLocatie;
+    this.reasonControl.disable();
+
     this.searchControl.valueChanges
       .pipe(takeUntil(this.unsubscribe$))
       .subscribe((value) => {
         this.searchAddresses(value);
       });
+
+    this.markerLocatie$
+      .pipe(takeUntil(this.unsubscribe$))
+      .subscribe((geometry) => {
+        if (isEqual(geometry, this.zaak.zaakgeometrie)) {
path: src/main/app/src/app/zaken/zaak-locatie-wijzigen/zaak-locatie-wijzigen.component.ts
user: login: infonl-marcel
body: fixed
created_at: 2025-05-21T13:25:50Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-21T16:01:48Z
body: ## unit-test-results
100 files  ±0  144 suites  ±0   1m 55s ⏱️ -7s
606 tests ±0  606 ✅ ±0  0 💤 ±0  0 ❌ ±0 
762 runs  ±0  762 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit 7884db24. ± Comparison against base commit 73e7fa9d.

[test-results]:data:application/gzip;base64,H4sIAH/uLmgC/13MSw7CIBSF4a00jB3ci5RSN2N4NSG2xfAYGfcu1FbR4f+d5DzI5GYbyaVDgFNHYnbpnYyVNDnI5PxaAfsCZUx15sCPusas9T/d3L0QfGCSbv4BG4IPu4S81s+B0z2Oy1a+j1s3h1u3f9ovi0slyCAEM4oyiwpHBKYYUNCoBAgh1SiVOSNCj+T5AtY/fQwJAQAA

:recycle: This comment has been updated with latest results.
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-21T16:07:21Z
body: ## integration-test-results
 37 files  ±0   37 suites  ±0   43s ⏱️ -1s
132 tests ±0  132 ✅ ±0  0 💤 ±0  0 ❌ ±0 
150 runs  ±0  150 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit 7884db24. ± Comparison against base commit 73e7fa9d.

[test-results]:data:application/gzip;base64,H4sIAMPvLmgC/13MSw7CIBSF4a00jB3cCzSlbsbwanJjWwyFkXHvIrEtOvz+k5wnm2j2G7t2Yrh0bMuUTrkcdaKwFktRXKb0GVHwXbctW/uf7vQoCY4waZp/go8xxG+Jea2f/Y7jsinnY3VzWN3+2bAslArYoJR0hkuPBkcEaSRwsGgUKKXNqI0TiNAje70BlDhDMwYBAAA=

:recycle: This comment has been updated with latest results.
author_association: CONTRIBUTOR
user: login: codecov[bot]
created_at: 2025-05-21T16:07:42Z
body: ## [Codecov](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) Report
Attention: Patch coverage is `1.33333%` with `74 lines` in your changes missing coverage. Please review.
> Project coverage is 41.55%. Comparing base [(`73e7fa9`)](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/commit/73e7fa9de7c45c0f5061df5b40d3ea3392bfd21e?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) to head [(`7884db2`)](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/commit/7884db24e1b19104b4020c1b8088ab9abd311051?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl).
> Report is 5 commits behind head on main.

:white_check_mark: All tests successful. No failed tests found.

| [Files with missing lines](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) | Patch % | Lines |
|---|---|---|
| [...ocatie-wijzigen/zaak-locatie-wijzigen.component.ts](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&filepath=src%2Fmain%2Fapp%2Fsrc%2Fapp%2Fzaken%2Fzaak-locatie-wijzigen%2Fzaak-locatie-wijzigen.component.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl#diff-c3JjL21haW4vYXBwL3NyYy9hcHAvemFrZW4vemFhay1sb2NhdGllLXdpanppZ2VuL3phYWstbG9jYXRpZS13aWp6aWdlbi5jb21wb25lbnQudHM=) | 0.00% | [34 Missing and 1 partial :warning: ](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) |
| [.../main/app/src/app/shared/location/location-util.ts](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&filepath=src%2Fmain%2Fapp%2Fsrc%2Fapp%2Fshared%2Flocation%2Flocation-util.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl#diff-c3JjL21haW4vYXBwL3NyYy9hcHAvc2hhcmVkL2xvY2F0aW9uL2xvY2F0aW9uLXV0aWwudHM=) | 0.00% | [15 Missing :warning: ](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) |
| [...app/src/app/zaken/zaak-view/zaak-view.component.ts](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&filepath=src%2Fmain%2Fapp%2Fsrc%2Fapp%2Fzaken%2Fzaak-view%2Fzaak-view.component.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl#diff-c3JjL21haW4vYXBwL3NyYy9hcHAvemFrZW4vemFhay12aWV3L3phYWstdmlldy5jb21wb25lbnQudHM=) | 10.00% | [8 Missing and 1 partial :warning: ](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) |
| [...etails-wijzigen/zaak-details-wijzigen.component.ts](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&filepath=src%2Fmain%2Fapp%2Fsrc%2Fapp%2Fzaken%2Fzaak-details-wijzigen%2Fzaak-details-wijzigen.component.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl#diff-c3JjL21haW4vYXBwL3NyYy9hcHAvemFrZW4vemFhay1kZXRhaWxzLXdpanppZ2VuL3phYWstZGV0YWlscy13aWp6aWdlbi5jb21wb25lbnQudHM=) | 0.00% | [7 Missing :warning: ](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) |
| [...zaak-locatie-tonen/zaak-locatie-tonen.component.ts](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&filepath=src%2Fmain%2Fapp%2Fsrc%2Fapp%2Fzaken%2Fzaak-locatie-tonen%2Fzaak-locatie-tonen.component.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl#diff-c3JjL21haW4vYXBwL3NyYy9hcHAvemFrZW4vemFhay1sb2NhdGllLXRvbmVuL3phYWstbG9jYXRpZS10b25lbi5jb21wb25lbnQudHM=) | 0.00% | [5 Missing and 1 partial :warning: ](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) |
| [src/main/app/src/app/zaken/zaken.module.ts](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&filepath=src%2Fmain%2Fapp%2Fsrc%2Fapp%2Fzaken%2Fzaken.module.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl#diff-c3JjL21haW4vYXBwL3NyYy9hcHAvemFrZW4vemFrZW4ubW9kdWxlLnRz) | 0.00% | [2 Missing :warning: ](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) |

<details><summary>Additional details and impacted files</summary>


```diff
@@             Coverage Diff              @@
##               main    #3411      +/-   ##
============================================
- Coverage     41.56%   41.55%   -0.02%     
- Complexity     3887     3888       +1     
============================================
  Files          1392     1392              
  Lines         36399    36415      +16     
  Branches       4009     4009              
============================================
+ Hits          15130    15133       +3     
- Misses        20036    20048      +12     
- Partials       1233     1234       +1     
```

| [Flag](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) | Coverage Δ | |
|---|---|---|
| [integrationtests](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) | `45.28% <ø> (+0.08%)` | :arrow_up: |
| [unittests](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl) | `29.26% <1.33%> (-0.03%)` | :arrow_down: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl#carryforward-flags-in-the-pull-request-comment) to find out more.

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/infonl/dimpact-zaakafhandelcomponent/pull/3411?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=infonl).

<details><summary> :rocket: New features to boost your workflow: </summary>

- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE