Enables dry-run checking before committing to case adoption. The preflight shares the same side-effect-free checks (steps 1–3) as the real take-ownership handler, so it cannot drift from what will actually succeed. Returns the same status codes and error shapes as the real endpoint (200 with wouldSucceed:true, or 409/404/422 if it would fail). Portal renders a "Vooraf controleren" button for legacy cases, surfaced through the existing actions block pattern. Confirmed in smoke.sh with two cases: one where preflight predicts success (and writes nothing), one where it predicts a named invariant failure (matching what the real call reproduces). Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
76 lines
2.1 KiB
HTML
76 lines
2.1 KiB
HTML
<form (ngSubmit)="submit()">
|
|
@if (isWriteThrough) {
|
|
<p class="banner banner--warning" data-testid="write-through-disclaimer">
|
|
Gevalideerd door het legacy systeem — Angular voegt hier geen eigen validatie toe.
|
|
</p>
|
|
}
|
|
|
|
@if (banner) {
|
|
<p class="banner banner--error" data-testid="edit-details-banner">{{ banner }}</p>
|
|
}
|
|
|
|
<label>
|
|
Achternaam
|
|
<input type="text" name="surname" required [(ngModel)]="surname" />
|
|
</label>
|
|
@if (fieldErrors['surname']; as error) {
|
|
<p class="field-error" data-testid="field-error-surname">{{ error }}</p>
|
|
}
|
|
|
|
<label>
|
|
Voorletters
|
|
<input type="text" name="initials" required [(ngModel)]="initials" />
|
|
</label>
|
|
|
|
<label>
|
|
Straat
|
|
<input type="text" name="street" [(ngModel)]="street" />
|
|
</label>
|
|
|
|
<label>
|
|
Huisnummer
|
|
<input type="text" name="number" [(ngModel)]="number" />
|
|
</label>
|
|
@if (fieldErrors['address.number']; as error) {
|
|
<p class="field-error" data-testid="field-error-address.number">{{ error }}</p>
|
|
}
|
|
|
|
<label>
|
|
Postcode
|
|
<input type="text" name="postalCode" [(ngModel)]="postalCode" />
|
|
</label>
|
|
@if (fieldErrors['address.postalCode']; as error) {
|
|
<p class="field-error" data-testid="field-error-address.postalCode">{{ error }}</p>
|
|
}
|
|
|
|
<label>
|
|
Plaats
|
|
<input type="text" name="city" [(ngModel)]="city" />
|
|
</label>
|
|
|
|
<label>
|
|
E-mail
|
|
<input type="email" name="email" [(ngModel)]="email" />
|
|
</label>
|
|
@if (fieldErrors['email']; as error) {
|
|
<p class="field-error" data-testid="field-error-email">{{ error }}</p>
|
|
}
|
|
|
|
<label>
|
|
Telefoon
|
|
<input type="text" name="phone" [(ngModel)]="phone" />
|
|
</label>
|
|
@if (fieldErrors['phone']; as error) {
|
|
<p class="field-error" data-testid="field-error-phone">{{ error }}</p>
|
|
}
|
|
|
|
<label>
|
|
Voorkeurskanaal
|
|
<input type="text" name="preferredChannel" required [(ngModel)]="preferredChannel" />
|
|
</label>
|
|
|
|
<button type="submit" class="btn btn--primary" data-testid="save-details-submit" [disabled]="saving()">
|
|
{{ saving() ? 'Bezig met opslaan…' : 'Opslaan' }}
|
|
</button>
|
|
</form>
|