From 82fc3c493df9c7a4a2b98063ea9ce1ca2e85e438 Mon Sep 17 00:00:00 2001 From: Edwin van den Houdt Date: Thu, 2 Jul 2026 21:25:57 +0200 Subject: [PATCH] =?UTF-8?q?feat(cibg):=20WP-12=20=E2=80=94=20CIBG=20Databl?= =?UTF-8?q?ock=20for=20application=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adopt the vendored CIBG Datablock (.data-block / .block-wrapper) as the way to show application data: - New app-data-block molecule (grey surface + white panel + projected rows, optional heading, stacked variant, aria-label) + stories. - data-row switches to a `div[app-data-row]` attribute selector so the
's direct child is a native
(HTML5.1 dl > div > dt+dd). This makes the definition list axe-clean — a bare custom element between
and its dt/dd trips axe's definition-list rule regardless of display:contents, a defect the dashboard shipped live. Re-enables a11y on the data-row / review-section / registration-summary stories (previously disabled pending this rework). - review-section folds onto app-data-block (drops its hand-carried classes). - registration-summary + dashboard "Persoonsgegevens (BRP)" drop app-card and render as datablocks; both wizards' review rows + the beroep row convert to the div selector. GREEN: lint, check:tokens, 178 tests, build, build-storybook, 136 axe stories. Co-Authored-By: Claude Opus 4.8 (1M context) --- documentation.json | 1234 +++++++++-------- .../intake-wizard/intake-wizard.component.ts | 12 +- src/app/registratie/ui/dashboard.page.ts | 16 +- .../registratie-wizard.component.ts | 18 +- .../registration-summary.component.ts | 53 +- .../registration-summary.stories.ts | 7 +- .../ui/data-block/data-block.component.ts | 33 + .../ui/data-block/data-block.stories.ts | 26 + .../shared/ui/data-row/data-row.component.ts | 17 +- .../shared/ui/data-row/data-row.stories.ts | 11 +- .../review-section.component.ts | 14 +- .../review-section/review-section.stories.ts | 11 +- 12 files changed, 798 insertions(+), 654 deletions(-) create mode 100644 src/app/shared/ui/data-block/data-block.component.ts create mode 100644 src/app/shared/ui/data-block/data-block.stories.ts diff --git a/documentation.json b/documentation.json index a9301af..481290f 100644 --- a/documentation.json +++ b/documentation.json @@ -329,52 +329,7 @@ }, { "name": "AdresDto", - "id": "interface-AdresDto-10d81af9017230c2e0704c882140be892d1e2a8d6343f8d169bcdb8e99516bc135a9b17faf4ea0fb5d4da561476db228b7f2dab7d27e4c262acdecbe1b7f6241", - "file": "src/app/registratie/contracts/dashboard-view.dto.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "export type RegistrationStatusDto =\n | { tag: 'Geregistreerd'; herregistratieDatum: string } // ISO date\n | { tag: 'Geschorst'; geschorstTot: string; reden: string }\n | { tag: 'Doorgehaald'; doorgehaaldOp: string; reden: string };\n\nexport interface RegistrationDto {\n bigNummer: string;\n naam: string;\n beroep: string;\n registratiedatum: string; // ISO date\n geboortedatum: string;\n status: RegistrationStatusDto;\n}\n\nexport interface AdresDto {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\nexport interface PersonDto {\n naam: string;\n geboortedatum: string; // ISO date\n adres: AdresDto;\n}\n\n/** Server-computed decisions. Rendered by the FE as-is (decision DTO, ADR-0001):\n the eligibility rule lives on the backend; the optional reason lets the UI\n explain itself without knowing the rule. */\nexport interface HerregistratieDecisions {\n eligibleForHerregistratie: boolean;\n herregistratieReason?: string;\n}\n\nexport interface DashboardViewDto {\n registration: RegistrationDto;\n person: PersonDto;\n decisions: HerregistratieDecisions;\n}\n", - "properties": [ - { - "name": "postcode", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 37 - }, - { - "name": "straat", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 36 - }, - { - "name": "woonplaats", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 38 - } - ], - "indexSignatures": [], - "kind": 172, - "methods": [], - "extends": [] - }, - { - "name": "AdresDto", - "id": "interface-AdresDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b-1", + "id": "interface-AdresDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b", "file": "src/app/shared/infrastructure/api-client.ts", "deprecated": false, "deprecationMessage": "", @@ -415,6 +370,51 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [] + }, + { + "name": "AdresDto", + "id": "interface-AdresDto-10d81af9017230c2e0704c882140be892d1e2a8d6343f8d169bcdb8e99516bc135a9b17faf4ea0fb5d4da561476db228b7f2dab7d27e4c262acdecbe1b7f6241-1", + "file": "src/app/registratie/contracts/dashboard-view.dto.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export type RegistrationStatusDto =\n | { tag: 'Geregistreerd'; herregistratieDatum: string } // ISO date\n | { tag: 'Geschorst'; geschorstTot: string; reden: string }\n | { tag: 'Doorgehaald'; doorgehaaldOp: string; reden: string };\n\nexport interface RegistrationDto {\n bigNummer: string;\n naam: string;\n beroep: string;\n registratiedatum: string; // ISO date\n geboortedatum: string;\n status: RegistrationStatusDto;\n}\n\nexport interface AdresDto {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\nexport interface PersonDto {\n naam: string;\n geboortedatum: string; // ISO date\n adres: AdresDto;\n}\n\n/** Server-computed decisions. Rendered by the FE as-is (decision DTO, ADR-0001):\n the eligibility rule lives on the backend; the optional reason lets the UI\n explain itself without knowing the rule. */\nexport interface HerregistratieDecisions {\n eligibleForHerregistratie: boolean;\n herregistratieReason?: string;\n}\n\nexport interface DashboardViewDto {\n registration: RegistrationDto;\n person: PersonDto;\n decisions: HerregistratieDecisions;\n}\n", + "properties": [ + { + "name": "postcode", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 37 + }, + { + "name": "straat", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 36 + }, + { + "name": "woonplaats", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 38 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -1170,7 +1170,42 @@ }, { "name": "BrpAddressDto", - "id": "interface-BrpAddressDto-029e98a059f908b1aab86b91327ec0c2a409efb766692f042935997cd36e685859ecf375e579b912496b2dac205dfd2c751f3a301b7486f0da9cb04cda7c704f", + "id": "interface-BrpAddressDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b", + "file": "src/app/shared/infrastructure/api-client.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export class ApiClient {\n private http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\n private baseUrl: string;\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\n\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\n this.http = http ? http : window as any;\n this.baseUrl = baseUrl ?? \"\";\n }\n\n /**\n * @return OK\n */\n health(): Promise {\n let url_ = this.baseUrl + \"/health\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processHealth(_response);\n });\n }\n\n protected processHealth(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n ready(): Promise {\n let url_ = this.baseUrl + \"/health/ready\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processReady(_response);\n });\n }\n\n protected processReady(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n dashboardView(): Promise {\n let url_ = this.baseUrl + \"/api/v1/dashboard-view\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processDashboardView(_response);\n });\n }\n\n protected processDashboardView(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as DashboardViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n notes(): Promise {\n let url_ = this.baseUrl + \"/api/v1/notes\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processNotes(_response);\n });\n }\n\n protected processNotes(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as AantekeningDto[];\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n address(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brp/address\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processAddress(_response);\n });\n }\n\n protected processAddress(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BrpAddressDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n diplomas(): Promise {\n let url_ = this.baseUrl + \"/api/v1/duo/diplomas\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processDiplomas(_response);\n });\n }\n\n protected processDiplomas(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as DuoLookupDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n policy(): Promise {\n let url_ = this.baseUrl + \"/api/v1/intake/policy\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processPolicy(_response);\n });\n }\n\n protected processPolicy(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as IntakePolicyDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n registrations(body: RegistratieRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/registrations\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processRegistrations(_response);\n });\n }\n\n protected processRegistrations(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n herregistraties(body: HerregistratieRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/herregistraties\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processHerregistraties(_response);\n });\n }\n\n protected processHerregistraties(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n intakes(body: IntakeRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/intakes\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processIntakes(_response);\n });\n }\n\n protected processIntakes(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n changeRequests(body: ChangeRequestRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/change-requests\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processChangeRequests(_response);\n });\n }\n\n protected processChangeRequests(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @param diplomaHerkomst (optional) \n * @param taalvaardigheid (optional) \n * @return OK\n */\n categories(wizardId: string, diplomaHerkomst?: string | undefined, taalvaardigheid?: string | undefined): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/categories?\";\n if (wizardId === undefined || wizardId === null)\n throw new globalThis.Error(\"The parameter 'wizardId' must be defined and cannot be null.\");\n else\n url_ += \"wizardId=\" + encodeURIComponent(\"\" + wizardId) + \"&\";\n if (diplomaHerkomst === null)\n throw new globalThis.Error(\"The parameter 'diplomaHerkomst' cannot be null.\");\n else if (diplomaHerkomst !== undefined)\n url_ += \"diplomaHerkomst=\" + encodeURIComponent(\"\" + diplomaHerkomst) + \"&\";\n if (taalvaardigheid === null)\n throw new globalThis.Error(\"The parameter 'taalvaardigheid' cannot be null.\");\n else if (taalvaardigheid !== undefined)\n url_ += \"taalvaardigheid=\" + encodeURIComponent(\"\" + taalvaardigheid) + \"&\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processCategories(_response);\n });\n }\n\n protected processCategories(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as UploadCategoriesDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n content(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/{documentId}/content\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processContent(_response);\n });\n }\n\n protected processContent(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @param localIds (optional) \n * @return OK\n */\n status(localIds?: string | undefined): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/status?\";\n if (localIds === null)\n throw new globalThis.Error(\"The parameter 'localIds' cannot be null.\");\n else if (localIds !== undefined)\n url_ += \"localIds=\" + encodeURIComponent(\"\" + localIds) + \"&\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processStatus(_response);\n });\n }\n\n protected processStatus(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as UploadStatusDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n uploads(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/{documentId}\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processUploads(_response);\n });\n }\n\n protected processUploads(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n uploads2(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/admin/uploads/{documentId}\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processUploads2(_response);\n });\n }\n\n protected processUploads2(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n return throwException(\"Forbidden\", status, _responseText, _headers);\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n applicationsAll(): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsAll(_response);\n });\n }\n\n protected processApplicationsAll(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationSummaryDto[];\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return Created\n */\n applicationsPOST(body: CreateApplicationRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsPOST(_response);\n });\n }\n\n protected processApplicationsPOST(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 201) {\n return response.text().then((_responseText) => {\n let result201: any = null;\n result201 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationDetailDto;\n return result201;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n applicationsGET(id: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsGET(_response);\n });\n }\n\n protected processApplicationsGET(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationDetailDto;\n return result200;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n applicationsPUT(id: string, body: DraftSyncRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsPUT(_response);\n });\n }\n\n protected processApplicationsPUT(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n applicationsDELETE(id: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsDELETE(_response);\n });\n }\n\n protected processApplicationsDELETE(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n submit(id: string, body: SubmitApplicationRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}/submit\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processSubmit(_response);\n });\n }\n\n protected processSubmit(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as SubmitApplicationResponse;\n return result200;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefGET(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefGET(_response);\n });\n }\n\n protected processBriefGET(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefPUT(body: SaveBriefRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefPUT(_response);\n });\n }\n\n protected processBriefPUT(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefSubmit(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/submit\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefSubmit(_response);\n });\n }\n\n protected processBriefSubmit(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n approve(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/approve\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApprove(_response);\n });\n }\n\n protected processApprove(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n reject(body: RejectBriefRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/reject\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processReject(_response);\n });\n }\n\n protected processReject(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n send(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/send\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processSend(_response);\n });\n }\n\n protected processSend(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefReset(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/reset\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefReset(_response);\n });\n }\n\n protected processBriefReset(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n}\n\nexport interface AantekeningDto {\n type?: string | undefined;\n omschrijving?: string | undefined;\n datum?: string | undefined;\n}\n\nexport interface AanvraagStatusDto {\n tag?: string | undefined;\n stepIndex?: number | undefined;\n stepCount?: number | undefined;\n referentie?: string | undefined;\n manual?: boolean | undefined;\n reden?: string | undefined;\n}\n\nexport interface AdresDto {\n straat?: string | undefined;\n postcode?: string | undefined;\n woonplaats?: string | undefined;\n}\n\nexport interface ApplicationDetailDto {\n id?: string | undefined;\n type?: string | undefined;\n status?: AanvraagStatusDto;\n draft?: any | undefined;\n documentIds?: string[] | undefined;\n createdAt?: string | undefined;\n updatedAt?: string | undefined;\n submittedAt?: string | undefined;\n}\n\nexport interface ApplicationSummaryDto {\n id?: string | undefined;\n type?: string | undefined;\n status?: AanvraagStatusDto;\n documentIds?: string[] | undefined;\n createdAt?: string | undefined;\n updatedAt?: string | undefined;\n submittedAt?: string | undefined;\n}\n\nexport interface BriefDto {\n briefId?: string | undefined;\n beroep?: string | undefined;\n templateId?: string | undefined;\n placeholders?: PlaceholderDefDto[] | undefined;\n sections?: LetterSectionDto[] | undefined;\n status?: BriefStatusDto;\n drafterId?: string | undefined;\n}\n\nexport interface BriefStatusDto {\n tag?: string | undefined;\n submittedBy?: string | undefined;\n submittedAt?: string | undefined;\n approvedBy?: string | undefined;\n approvedAt?: string | undefined;\n rejectedBy?: string | undefined;\n rejectedAt?: string | undefined;\n comments?: string | undefined;\n sentAt?: string | undefined;\n}\n\nexport interface BriefViewDto {\n brief?: BriefDto;\n availablePassages?: LibraryPassageDto[] | undefined;\n}\n\nexport interface BrpAddressDto {\n gevonden?: boolean;\n adres?: AdresDto;\n}\n\nexport interface ChangeRequestRequest {\n straat?: string | undefined;\n postcode?: string | undefined;\n woonplaats?: string | undefined;\n}\n\nexport interface CreateApplicationRequest {\n type?: string | undefined;\n}\n\nexport interface DashboardViewDto {\n registration?: RegistrationDto;\n person?: PersonDto;\n decisions?: HerregistratieDecisionsDto;\n}\n\nexport interface DocumentCategoryDto {\n categoryId?: string | undefined;\n label?: string | undefined;\n description?: string | undefined;\n required?: boolean;\n acceptedTypes?: string[] | undefined;\n maxSizeMb?: number;\n multiple?: boolean;\n allowPostDelivery?: boolean;\n}\n\nexport interface DocumentRefDto {\n categoryId?: string | undefined;\n channel?: string | undefined;\n documentId?: string | undefined;\n}\n\nexport interface DraftSyncRequest {\n draft?: any;\n stepIndex?: number;\n stepCount?: number;\n documentIds?: string[] | undefined;\n}\n\nexport interface DuoDiplomaDto {\n id?: string | undefined;\n naam?: string | undefined;\n instelling?: string | undefined;\n jaar?: number;\n beroep?: string | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface DuoLookupDto {\n diplomas?: DuoDiplomaDto[] | undefined;\n handmatig?: ManualDiplomaPolicyDto;\n}\n\nexport interface HerregistratieDecisionsDto {\n eligibleForHerregistratie?: boolean;\n herregistratieReason?: string | undefined;\n}\n\nexport interface HerregistratieRequest {\n uren?: number;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface IntakePolicyDto {\n scholingThreshold?: number;\n}\n\nexport interface IntakeRequest {\n uren?: number;\n}\n\nexport interface LetterBlockDto {\n type?: string | undefined;\n blockId?: string | undefined;\n content?: RichTextBlockDto;\n sourcePassageId?: string | undefined;\n sourceVersion?: number | undefined;\n edited?: boolean | undefined;\n}\n\nexport interface LetterSectionDto {\n sectionKey?: string | undefined;\n title?: string | undefined;\n required?: boolean;\n blocks?: LetterBlockDto[] | undefined;\n locked?: boolean;\n}\n\nexport interface LibraryPassageDto {\n passageId?: string | undefined;\n scope?: string | undefined;\n sectionKey?: string | undefined;\n label?: string | undefined;\n content?: RichTextBlockDto;\n version?: number;\n beroep?: string | undefined;\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface ParagraphDto {\n nodes?: RichTextNodeDto[] | undefined;\n list?: string | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\n}\n\nexport interface PlaceholderDefDto {\n key?: string | undefined;\n label?: string | undefined;\n autoResolvable?: boolean;\n fillable?: boolean | undefined;\n deprecated?: boolean | undefined;\n}\n\nexport interface PolicyQuestionDto {\n id?: string | undefined;\n vraag?: string | undefined;\n type?: string | undefined;\n}\n\nexport interface ProblemDetails {\n type?: string | undefined;\n title?: string | undefined;\n status?: number | undefined;\n detail?: string | undefined;\n instance?: string | undefined;\n\n [key: string]: any;\n}\n\nexport interface ReferentieResponse {\n referentie?: string | undefined;\n}\n\nexport interface RegistratieRequest {\n diplomaHerkomst?: string | undefined;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface RegistrationDto {\n bigNummer?: string | undefined;\n naam?: string | undefined;\n beroep?: string | undefined;\n registratiedatum?: string | undefined;\n geboortedatum?: string | undefined;\n status?: RegistrationStatusDto;\n}\n\nexport interface RegistrationStatusDto {\n tag?: string | undefined;\n herregistratieDatum?: string | undefined;\n geschorstTot?: string | undefined;\n reden?: string | undefined;\n doorgehaaldOp?: string | undefined;\n}\n\nexport interface RejectBriefRequest {\n comments?: string | undefined;\n}\n\nexport interface RichTextBlockDto {\n paragraphs?: ParagraphDto[] | undefined;\n}\n\nexport interface RichTextNodeDto {\n type?: string | undefined;\n text?: string | undefined;\n marks?: string[] | undefined;\n key?: string | undefined;\n}\n\nexport interface SaveBriefRequest {\n sections?: LetterSectionDto[] | undefined;\n}\n\nexport interface SubmitApplicationRequest {\n diplomaHerkomst?: string | undefined;\n uren?: number | undefined;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface SubmitApplicationResponse {\n referentie?: string | undefined;\n status?: AanvraagStatusDto;\n}\n\nexport interface UploadCategoriesDto {\n categories?: DocumentCategoryDto[] | undefined;\n}\n\nexport interface UploadStatusDto {\n results?: UploadStatusItemDto[] | undefined;\n}\n\nexport interface UploadStatusItemDto {\n localId?: string | undefined;\n status?: string | undefined;\n documentId?: string | undefined;\n}\n\nexport class SwaggerException extends Error {\n override message: string;\n status: number;\n response: string;\n headers: { [key: string]: any; };\n result: any;\n\n constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) {\n super();\n\n this.message = message;\n this.status = status;\n this.response = response;\n this.headers = headers;\n this.result = result;\n }\n\n protected isSwaggerException = true;\n\n static isSwaggerException(obj: any): obj is SwaggerException {\n return obj.isSwaggerException === true;\n }\n}\n\nfunction throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any {\n if (result !== null && result !== undefined)\n throw result;\n else\n throw new SwaggerException(message, status, response, headers, null);\n}", + "properties": [ + { + "name": "adres", + "deprecated": false, + "deprecationMessage": "", + "type": "AdresDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 1319 + }, + { + "name": "gevonden", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "indexKey": "", + "optional": true, + "description": "", + "line": 1318 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "BrpAddressDto", + "id": "interface-BrpAddressDto-029e98a059f908b1aab86b91327ec0c2a409efb766692f042935997cd36e685859ecf375e579b912496b2dac205dfd2c751f3a301b7486f0da9cb04cda7c704f-1", "file": "src/app/registratie/contracts/brp-address.dto.ts", "deprecated": false, "deprecationMessage": "", @@ -1203,41 +1238,6 @@ "description": "

WIRE CONTRACT for the BRP address lookup ("BFF-lite" — one screen-shaped call).

\n

In production this is GENERATED from the OpenAPI/TypeSpec spec and served by our\nown backend, which talks to the BRP behind an adapter. The frontend never sees\nthe BRP's own wire format. See docs/architecture/0001-bff-lite-decision-dtos.md.

\n

"Geen adres bekend" is a first-class outcome (gevonden: false), not an error —\nthe wizard falls back to manual entry (PRD §7). Slice 1 ships only the happy\npath (gevonden: true).

\n", "rawdescription": "\n\nWIRE CONTRACT for the BRP address lookup (\"BFF-lite\" — one screen-shaped call).\n\nIn production this is GENERATED from the OpenAPI/TypeSpec spec and served by our\nown backend, which talks to the BRP behind an adapter. The frontend never sees\nthe BRP's own wire format. See docs/architecture/0001-bff-lite-decision-dtos.md.\n\n\"Geen adres bekend\" is a first-class outcome (`gevonden: false`), not an error —\nthe wizard falls back to manual entry (PRD §7). Slice 1 ships only the happy\npath (gevonden: true).\n", "methods": [], - "extends": [] - }, - { - "name": "BrpAddressDto", - "id": "interface-BrpAddressDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b-1", - "file": "src/app/shared/infrastructure/api-client.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "export class ApiClient {\n private http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\n private baseUrl: string;\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\n\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\n this.http = http ? http : window as any;\n this.baseUrl = baseUrl ?? \"\";\n }\n\n /**\n * @return OK\n */\n health(): Promise {\n let url_ = this.baseUrl + \"/health\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processHealth(_response);\n });\n }\n\n protected processHealth(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n ready(): Promise {\n let url_ = this.baseUrl + \"/health/ready\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processReady(_response);\n });\n }\n\n protected processReady(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n dashboardView(): Promise {\n let url_ = this.baseUrl + \"/api/v1/dashboard-view\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processDashboardView(_response);\n });\n }\n\n protected processDashboardView(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as DashboardViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n notes(): Promise {\n let url_ = this.baseUrl + \"/api/v1/notes\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processNotes(_response);\n });\n }\n\n protected processNotes(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as AantekeningDto[];\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n address(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brp/address\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processAddress(_response);\n });\n }\n\n protected processAddress(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BrpAddressDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n diplomas(): Promise {\n let url_ = this.baseUrl + \"/api/v1/duo/diplomas\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processDiplomas(_response);\n });\n }\n\n protected processDiplomas(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as DuoLookupDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n policy(): Promise {\n let url_ = this.baseUrl + \"/api/v1/intake/policy\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processPolicy(_response);\n });\n }\n\n protected processPolicy(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as IntakePolicyDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n registrations(body: RegistratieRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/registrations\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processRegistrations(_response);\n });\n }\n\n protected processRegistrations(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n herregistraties(body: HerregistratieRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/herregistraties\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processHerregistraties(_response);\n });\n }\n\n protected processHerregistraties(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n intakes(body: IntakeRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/intakes\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processIntakes(_response);\n });\n }\n\n protected processIntakes(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n changeRequests(body: ChangeRequestRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/change-requests\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processChangeRequests(_response);\n });\n }\n\n protected processChangeRequests(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @param diplomaHerkomst (optional) \n * @param taalvaardigheid (optional) \n * @return OK\n */\n categories(wizardId: string, diplomaHerkomst?: string | undefined, taalvaardigheid?: string | undefined): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/categories?\";\n if (wizardId === undefined || wizardId === null)\n throw new globalThis.Error(\"The parameter 'wizardId' must be defined and cannot be null.\");\n else\n url_ += \"wizardId=\" + encodeURIComponent(\"\" + wizardId) + \"&\";\n if (diplomaHerkomst === null)\n throw new globalThis.Error(\"The parameter 'diplomaHerkomst' cannot be null.\");\n else if (diplomaHerkomst !== undefined)\n url_ += \"diplomaHerkomst=\" + encodeURIComponent(\"\" + diplomaHerkomst) + \"&\";\n if (taalvaardigheid === null)\n throw new globalThis.Error(\"The parameter 'taalvaardigheid' cannot be null.\");\n else if (taalvaardigheid !== undefined)\n url_ += \"taalvaardigheid=\" + encodeURIComponent(\"\" + taalvaardigheid) + \"&\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processCategories(_response);\n });\n }\n\n protected processCategories(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as UploadCategoriesDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n content(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/{documentId}/content\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processContent(_response);\n });\n }\n\n protected processContent(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @param localIds (optional) \n * @return OK\n */\n status(localIds?: string | undefined): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/status?\";\n if (localIds === null)\n throw new globalThis.Error(\"The parameter 'localIds' cannot be null.\");\n else if (localIds !== undefined)\n url_ += \"localIds=\" + encodeURIComponent(\"\" + localIds) + \"&\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processStatus(_response);\n });\n }\n\n protected processStatus(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as UploadStatusDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n uploads(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/{documentId}\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processUploads(_response);\n });\n }\n\n protected processUploads(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n uploads2(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/admin/uploads/{documentId}\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processUploads2(_response);\n });\n }\n\n protected processUploads2(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n return throwException(\"Forbidden\", status, _responseText, _headers);\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n applicationsAll(): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsAll(_response);\n });\n }\n\n protected processApplicationsAll(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationSummaryDto[];\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return Created\n */\n applicationsPOST(body: CreateApplicationRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsPOST(_response);\n });\n }\n\n protected processApplicationsPOST(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 201) {\n return response.text().then((_responseText) => {\n let result201: any = null;\n result201 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationDetailDto;\n return result201;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n applicationsGET(id: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsGET(_response);\n });\n }\n\n protected processApplicationsGET(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationDetailDto;\n return result200;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n applicationsPUT(id: string, body: DraftSyncRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsPUT(_response);\n });\n }\n\n protected processApplicationsPUT(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n applicationsDELETE(id: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsDELETE(_response);\n });\n }\n\n protected processApplicationsDELETE(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n submit(id: string, body: SubmitApplicationRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}/submit\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processSubmit(_response);\n });\n }\n\n protected processSubmit(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as SubmitApplicationResponse;\n return result200;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefGET(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefGET(_response);\n });\n }\n\n protected processBriefGET(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefPUT(body: SaveBriefRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefPUT(_response);\n });\n }\n\n protected processBriefPUT(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefSubmit(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/submit\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefSubmit(_response);\n });\n }\n\n protected processBriefSubmit(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n approve(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/approve\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApprove(_response);\n });\n }\n\n protected processApprove(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n reject(body: RejectBriefRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/reject\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processReject(_response);\n });\n }\n\n protected processReject(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n send(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/send\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processSend(_response);\n });\n }\n\n protected processSend(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefReset(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/reset\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefReset(_response);\n });\n }\n\n protected processBriefReset(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n}\n\nexport interface AantekeningDto {\n type?: string | undefined;\n omschrijving?: string | undefined;\n datum?: string | undefined;\n}\n\nexport interface AanvraagStatusDto {\n tag?: string | undefined;\n stepIndex?: number | undefined;\n stepCount?: number | undefined;\n referentie?: string | undefined;\n manual?: boolean | undefined;\n reden?: string | undefined;\n}\n\nexport interface AdresDto {\n straat?: string | undefined;\n postcode?: string | undefined;\n woonplaats?: string | undefined;\n}\n\nexport interface ApplicationDetailDto {\n id?: string | undefined;\n type?: string | undefined;\n status?: AanvraagStatusDto;\n draft?: any | undefined;\n documentIds?: string[] | undefined;\n createdAt?: string | undefined;\n updatedAt?: string | undefined;\n submittedAt?: string | undefined;\n}\n\nexport interface ApplicationSummaryDto {\n id?: string | undefined;\n type?: string | undefined;\n status?: AanvraagStatusDto;\n documentIds?: string[] | undefined;\n createdAt?: string | undefined;\n updatedAt?: string | undefined;\n submittedAt?: string | undefined;\n}\n\nexport interface BriefDto {\n briefId?: string | undefined;\n beroep?: string | undefined;\n templateId?: string | undefined;\n placeholders?: PlaceholderDefDto[] | undefined;\n sections?: LetterSectionDto[] | undefined;\n status?: BriefStatusDto;\n drafterId?: string | undefined;\n}\n\nexport interface BriefStatusDto {\n tag?: string | undefined;\n submittedBy?: string | undefined;\n submittedAt?: string | undefined;\n approvedBy?: string | undefined;\n approvedAt?: string | undefined;\n rejectedBy?: string | undefined;\n rejectedAt?: string | undefined;\n comments?: string | undefined;\n sentAt?: string | undefined;\n}\n\nexport interface BriefViewDto {\n brief?: BriefDto;\n availablePassages?: LibraryPassageDto[] | undefined;\n}\n\nexport interface BrpAddressDto {\n gevonden?: boolean;\n adres?: AdresDto;\n}\n\nexport interface ChangeRequestRequest {\n straat?: string | undefined;\n postcode?: string | undefined;\n woonplaats?: string | undefined;\n}\n\nexport interface CreateApplicationRequest {\n type?: string | undefined;\n}\n\nexport interface DashboardViewDto {\n registration?: RegistrationDto;\n person?: PersonDto;\n decisions?: HerregistratieDecisionsDto;\n}\n\nexport interface DocumentCategoryDto {\n categoryId?: string | undefined;\n label?: string | undefined;\n description?: string | undefined;\n required?: boolean;\n acceptedTypes?: string[] | undefined;\n maxSizeMb?: number;\n multiple?: boolean;\n allowPostDelivery?: boolean;\n}\n\nexport interface DocumentRefDto {\n categoryId?: string | undefined;\n channel?: string | undefined;\n documentId?: string | undefined;\n}\n\nexport interface DraftSyncRequest {\n draft?: any;\n stepIndex?: number;\n stepCount?: number;\n documentIds?: string[] | undefined;\n}\n\nexport interface DuoDiplomaDto {\n id?: string | undefined;\n naam?: string | undefined;\n instelling?: string | undefined;\n jaar?: number;\n beroep?: string | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface DuoLookupDto {\n diplomas?: DuoDiplomaDto[] | undefined;\n handmatig?: ManualDiplomaPolicyDto;\n}\n\nexport interface HerregistratieDecisionsDto {\n eligibleForHerregistratie?: boolean;\n herregistratieReason?: string | undefined;\n}\n\nexport interface HerregistratieRequest {\n uren?: number;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface IntakePolicyDto {\n scholingThreshold?: number;\n}\n\nexport interface IntakeRequest {\n uren?: number;\n}\n\nexport interface LetterBlockDto {\n type?: string | undefined;\n blockId?: string | undefined;\n content?: RichTextBlockDto;\n sourcePassageId?: string | undefined;\n sourceVersion?: number | undefined;\n edited?: boolean | undefined;\n}\n\nexport interface LetterSectionDto {\n sectionKey?: string | undefined;\n title?: string | undefined;\n required?: boolean;\n blocks?: LetterBlockDto[] | undefined;\n locked?: boolean;\n}\n\nexport interface LibraryPassageDto {\n passageId?: string | undefined;\n scope?: string | undefined;\n sectionKey?: string | undefined;\n label?: string | undefined;\n content?: RichTextBlockDto;\n version?: number;\n beroep?: string | undefined;\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface ParagraphDto {\n nodes?: RichTextNodeDto[] | undefined;\n list?: string | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\n}\n\nexport interface PlaceholderDefDto {\n key?: string | undefined;\n label?: string | undefined;\n autoResolvable?: boolean;\n fillable?: boolean | undefined;\n deprecated?: boolean | undefined;\n}\n\nexport interface PolicyQuestionDto {\n id?: string | undefined;\n vraag?: string | undefined;\n type?: string | undefined;\n}\n\nexport interface ProblemDetails {\n type?: string | undefined;\n title?: string | undefined;\n status?: number | undefined;\n detail?: string | undefined;\n instance?: string | undefined;\n\n [key: string]: any;\n}\n\nexport interface ReferentieResponse {\n referentie?: string | undefined;\n}\n\nexport interface RegistratieRequest {\n diplomaHerkomst?: string | undefined;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface RegistrationDto {\n bigNummer?: string | undefined;\n naam?: string | undefined;\n beroep?: string | undefined;\n registratiedatum?: string | undefined;\n geboortedatum?: string | undefined;\n status?: RegistrationStatusDto;\n}\n\nexport interface RegistrationStatusDto {\n tag?: string | undefined;\n herregistratieDatum?: string | undefined;\n geschorstTot?: string | undefined;\n reden?: string | undefined;\n doorgehaaldOp?: string | undefined;\n}\n\nexport interface RejectBriefRequest {\n comments?: string | undefined;\n}\n\nexport interface RichTextBlockDto {\n paragraphs?: ParagraphDto[] | undefined;\n}\n\nexport interface RichTextNodeDto {\n type?: string | undefined;\n text?: string | undefined;\n marks?: string[] | undefined;\n key?: string | undefined;\n}\n\nexport interface SaveBriefRequest {\n sections?: LetterSectionDto[] | undefined;\n}\n\nexport interface SubmitApplicationRequest {\n diplomaHerkomst?: string | undefined;\n uren?: number | undefined;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface SubmitApplicationResponse {\n referentie?: string | undefined;\n status?: AanvraagStatusDto;\n}\n\nexport interface UploadCategoriesDto {\n categories?: DocumentCategoryDto[] | undefined;\n}\n\nexport interface UploadStatusDto {\n results?: UploadStatusItemDto[] | undefined;\n}\n\nexport interface UploadStatusItemDto {\n localId?: string | undefined;\n status?: string | undefined;\n documentId?: string | undefined;\n}\n\nexport class SwaggerException extends Error {\n override message: string;\n status: number;\n response: string;\n headers: { [key: string]: any; };\n result: any;\n\n constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) {\n super();\n\n this.message = message;\n this.status = status;\n this.response = response;\n this.headers = headers;\n this.result = result;\n }\n\n protected isSwaggerException = true;\n\n static isSwaggerException(obj: any): obj is SwaggerException {\n return obj.isSwaggerException === true;\n }\n}\n\nfunction throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any {\n if (result !== null && result !== undefined)\n throw result;\n else\n throw new SwaggerException(message, status, response, headers, null);\n}", - "properties": [ - { - "name": "adres", - "deprecated": false, - "deprecationMessage": "", - "type": "AdresDto", - "indexKey": "", - "optional": true, - "description": "", - "line": 1319 - }, - { - "name": "gevonden", - "deprecated": false, - "deprecationMessage": "", - "type": "boolean", - "indexKey": "", - "optional": true, - "description": "", - "line": 1318 - } - ], - "indexSignatures": [], - "kind": 172, - "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -1426,52 +1426,7 @@ }, { "name": "DashboardViewDto", - "id": "interface-DashboardViewDto-10d81af9017230c2e0704c882140be892d1e2a8d6343f8d169bcdb8e99516bc135a9b17faf4ea0fb5d4da561476db228b7f2dab7d27e4c262acdecbe1b7f6241", - "file": "src/app/registratie/contracts/dashboard-view.dto.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "export type RegistrationStatusDto =\n | { tag: 'Geregistreerd'; herregistratieDatum: string } // ISO date\n | { tag: 'Geschorst'; geschorstTot: string; reden: string }\n | { tag: 'Doorgehaald'; doorgehaaldOp: string; reden: string };\n\nexport interface RegistrationDto {\n bigNummer: string;\n naam: string;\n beroep: string;\n registratiedatum: string; // ISO date\n geboortedatum: string;\n status: RegistrationStatusDto;\n}\n\nexport interface AdresDto {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\nexport interface PersonDto {\n naam: string;\n geboortedatum: string; // ISO date\n adres: AdresDto;\n}\n\n/** Server-computed decisions. Rendered by the FE as-is (decision DTO, ADR-0001):\n the eligibility rule lives on the backend; the optional reason lets the UI\n explain itself without knowing the rule. */\nexport interface HerregistratieDecisions {\n eligibleForHerregistratie: boolean;\n herregistratieReason?: string;\n}\n\nexport interface DashboardViewDto {\n registration: RegistrationDto;\n person: PersonDto;\n decisions: HerregistratieDecisions;\n}\n", - "properties": [ - { - "name": "decisions", - "deprecated": false, - "deprecationMessage": "", - "type": "HerregistratieDecisions", - "indexKey": "", - "optional": false, - "description": "", - "line": 58 - }, - { - "name": "person", - "deprecated": false, - "deprecationMessage": "", - "type": "PersonDto", - "indexKey": "", - "optional": false, - "description": "", - "line": 57 - }, - { - "name": "registration", - "deprecated": false, - "deprecationMessage": "", - "type": "RegistrationDto", - "indexKey": "", - "optional": false, - "description": "", - "line": 56 - } - ], - "indexSignatures": [], - "kind": 172, - "methods": [], - "extends": [] - }, - { - "name": "DashboardViewDto", - "id": "interface-DashboardViewDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b-1", + "id": "interface-DashboardViewDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b", "file": "src/app/shared/infrastructure/api-client.ts", "deprecated": false, "deprecationMessage": "", @@ -1512,6 +1467,51 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [] + }, + { + "name": "DashboardViewDto", + "id": "interface-DashboardViewDto-10d81af9017230c2e0704c882140be892d1e2a8d6343f8d169bcdb8e99516bc135a9b17faf4ea0fb5d4da561476db228b7f2dab7d27e4c262acdecbe1b7f6241-1", + "file": "src/app/registratie/contracts/dashboard-view.dto.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export type RegistrationStatusDto =\n | { tag: 'Geregistreerd'; herregistratieDatum: string } // ISO date\n | { tag: 'Geschorst'; geschorstTot: string; reden: string }\n | { tag: 'Doorgehaald'; doorgehaaldOp: string; reden: string };\n\nexport interface RegistrationDto {\n bigNummer: string;\n naam: string;\n beroep: string;\n registratiedatum: string; // ISO date\n geboortedatum: string;\n status: RegistrationStatusDto;\n}\n\nexport interface AdresDto {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\nexport interface PersonDto {\n naam: string;\n geboortedatum: string; // ISO date\n adres: AdresDto;\n}\n\n/** Server-computed decisions. Rendered by the FE as-is (decision DTO, ADR-0001):\n the eligibility rule lives on the backend; the optional reason lets the UI\n explain itself without knowing the rule. */\nexport interface HerregistratieDecisions {\n eligibleForHerregistratie: boolean;\n herregistratieReason?: string;\n}\n\nexport interface DashboardViewDto {\n registration: RegistrationDto;\n person: PersonDto;\n decisions: HerregistratieDecisions;\n}\n", + "properties": [ + { + "name": "decisions", + "deprecated": false, + "deprecationMessage": "", + "type": "HerregistratieDecisions", + "indexKey": "", + "optional": false, + "description": "", + "line": 58 + }, + { + "name": "person", + "deprecated": false, + "deprecationMessage": "", + "type": "PersonDto", + "indexKey": "", + "optional": false, + "description": "", + "line": 57 + }, + { + "name": "registration", + "deprecated": false, + "deprecationMessage": "", + "type": "RegistrationDto", + "indexKey": "", + "optional": false, + "description": "", + "line": 56 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -2285,82 +2285,7 @@ }, { "name": "DuoDiplomaDto", - "id": "interface-DuoDiplomaDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1", - "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "export interface DuoLookupDto {\n diplomas: DuoDiplomaDto[];\n handmatig: ManualDiplomaPolicyDto;\n}\n\nexport interface DuoDiplomaDto {\n id: string;\n naam: string;\n instelling: string;\n jaar: number;\n beroep: string; // server-derived profession\n policyQuestions: PolicyQuestionDto[]; // server-decided geldigheidsvragen\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen: string[]; // professions the user may declare for a manual diploma\n policyQuestions: PolicyQuestionDto[]; // maximal set applied to a manual diploma\n}\n\nexport interface PolicyQuestionDto {\n id: string;\n vraag: string;\n type: 'ja-nee' | 'tekst';\n}\n", - "properties": [ - { - "name": "beroep", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 25 - }, - { - "name": "id", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 21 - }, - { - "name": "instelling", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 23 - }, - { - "name": "jaar", - "deprecated": false, - "deprecationMessage": "", - "type": "number", - "indexKey": "", - "optional": false, - "description": "", - "line": 24 - }, - { - "name": "naam", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 22 - }, - { - "name": "policyQuestions", - "deprecated": false, - "deprecationMessage": "", - "type": "PolicyQuestionDto[]", - "indexKey": "", - "optional": false, - "description": "", - "line": 26 - } - ], - "indexSignatures": [], - "kind": 172, - "methods": [], - "extends": [] - }, - { - "name": "DuoDiplomaDto", - "id": "interface-DuoDiplomaDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b-1", + "id": "interface-DuoDiplomaDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b", "file": "src/app/shared/infrastructure/api-client.ts", "deprecated": false, "deprecationMessage": "", @@ -2431,6 +2356,81 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [] + }, + { + "name": "DuoDiplomaDto", + "id": "interface-DuoDiplomaDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1-1", + "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export interface DuoLookupDto {\n diplomas: DuoDiplomaDto[];\n handmatig: ManualDiplomaPolicyDto;\n}\n\nexport interface DuoDiplomaDto {\n id: string;\n naam: string;\n instelling: string;\n jaar: number;\n beroep: string; // server-derived profession\n policyQuestions: PolicyQuestionDto[]; // server-decided geldigheidsvragen\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen: string[]; // professions the user may declare for a manual diploma\n policyQuestions: PolicyQuestionDto[]; // maximal set applied to a manual diploma\n}\n\nexport interface PolicyQuestionDto {\n id: string;\n vraag: string;\n type: 'ja-nee' | 'tekst';\n}\n", + "properties": [ + { + "name": "beroep", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 25 + }, + { + "name": "id", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 21 + }, + { + "name": "instelling", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 23 + }, + { + "name": "jaar", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": false, + "description": "", + "line": 24 + }, + { + "name": "naam", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 22 + }, + { + "name": "policyQuestions", + "deprecated": false, + "deprecationMessage": "", + "type": "PolicyQuestionDto[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 26 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -2438,7 +2438,42 @@ }, { "name": "DuoLookupDto", - "id": "interface-DuoLookupDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1", + "id": "interface-DuoLookupDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b", + "file": "src/app/shared/infrastructure/api-client.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export class ApiClient {\n private http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\n private baseUrl: string;\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\n\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\n this.http = http ? http : window as any;\n this.baseUrl = baseUrl ?? \"\";\n }\n\n /**\n * @return OK\n */\n health(): Promise {\n let url_ = this.baseUrl + \"/health\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processHealth(_response);\n });\n }\n\n protected processHealth(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n ready(): Promise {\n let url_ = this.baseUrl + \"/health/ready\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processReady(_response);\n });\n }\n\n protected processReady(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n dashboardView(): Promise {\n let url_ = this.baseUrl + \"/api/v1/dashboard-view\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processDashboardView(_response);\n });\n }\n\n protected processDashboardView(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as DashboardViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n notes(): Promise {\n let url_ = this.baseUrl + \"/api/v1/notes\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processNotes(_response);\n });\n }\n\n protected processNotes(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as AantekeningDto[];\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n address(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brp/address\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processAddress(_response);\n });\n }\n\n protected processAddress(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BrpAddressDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n diplomas(): Promise {\n let url_ = this.baseUrl + \"/api/v1/duo/diplomas\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processDiplomas(_response);\n });\n }\n\n protected processDiplomas(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as DuoLookupDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n policy(): Promise {\n let url_ = this.baseUrl + \"/api/v1/intake/policy\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processPolicy(_response);\n });\n }\n\n protected processPolicy(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as IntakePolicyDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n registrations(body: RegistratieRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/registrations\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processRegistrations(_response);\n });\n }\n\n protected processRegistrations(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n herregistraties(body: HerregistratieRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/herregistraties\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processHerregistraties(_response);\n });\n }\n\n protected processHerregistraties(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n intakes(body: IntakeRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/intakes\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processIntakes(_response);\n });\n }\n\n protected processIntakes(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n changeRequests(body: ChangeRequestRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/change-requests\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processChangeRequests(_response);\n });\n }\n\n protected processChangeRequests(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @param diplomaHerkomst (optional) \n * @param taalvaardigheid (optional) \n * @return OK\n */\n categories(wizardId: string, diplomaHerkomst?: string | undefined, taalvaardigheid?: string | undefined): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/categories?\";\n if (wizardId === undefined || wizardId === null)\n throw new globalThis.Error(\"The parameter 'wizardId' must be defined and cannot be null.\");\n else\n url_ += \"wizardId=\" + encodeURIComponent(\"\" + wizardId) + \"&\";\n if (diplomaHerkomst === null)\n throw new globalThis.Error(\"The parameter 'diplomaHerkomst' cannot be null.\");\n else if (diplomaHerkomst !== undefined)\n url_ += \"diplomaHerkomst=\" + encodeURIComponent(\"\" + diplomaHerkomst) + \"&\";\n if (taalvaardigheid === null)\n throw new globalThis.Error(\"The parameter 'taalvaardigheid' cannot be null.\");\n else if (taalvaardigheid !== undefined)\n url_ += \"taalvaardigheid=\" + encodeURIComponent(\"\" + taalvaardigheid) + \"&\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processCategories(_response);\n });\n }\n\n protected processCategories(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as UploadCategoriesDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n content(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/{documentId}/content\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processContent(_response);\n });\n }\n\n protected processContent(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @param localIds (optional) \n * @return OK\n */\n status(localIds?: string | undefined): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/status?\";\n if (localIds === null)\n throw new globalThis.Error(\"The parameter 'localIds' cannot be null.\");\n else if (localIds !== undefined)\n url_ += \"localIds=\" + encodeURIComponent(\"\" + localIds) + \"&\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processStatus(_response);\n });\n }\n\n protected processStatus(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as UploadStatusDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n uploads(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/{documentId}\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processUploads(_response);\n });\n }\n\n protected processUploads(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n uploads2(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/admin/uploads/{documentId}\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processUploads2(_response);\n });\n }\n\n protected processUploads2(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n return throwException(\"Forbidden\", status, _responseText, _headers);\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n applicationsAll(): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsAll(_response);\n });\n }\n\n protected processApplicationsAll(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationSummaryDto[];\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return Created\n */\n applicationsPOST(body: CreateApplicationRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsPOST(_response);\n });\n }\n\n protected processApplicationsPOST(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 201) {\n return response.text().then((_responseText) => {\n let result201: any = null;\n result201 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationDetailDto;\n return result201;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n applicationsGET(id: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsGET(_response);\n });\n }\n\n protected processApplicationsGET(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationDetailDto;\n return result200;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n applicationsPUT(id: string, body: DraftSyncRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsPUT(_response);\n });\n }\n\n protected processApplicationsPUT(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n applicationsDELETE(id: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsDELETE(_response);\n });\n }\n\n protected processApplicationsDELETE(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n submit(id: string, body: SubmitApplicationRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}/submit\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processSubmit(_response);\n });\n }\n\n protected processSubmit(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as SubmitApplicationResponse;\n return result200;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefGET(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefGET(_response);\n });\n }\n\n protected processBriefGET(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefPUT(body: SaveBriefRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefPUT(_response);\n });\n }\n\n protected processBriefPUT(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefSubmit(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/submit\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefSubmit(_response);\n });\n }\n\n protected processBriefSubmit(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n approve(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/approve\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApprove(_response);\n });\n }\n\n protected processApprove(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n reject(body: RejectBriefRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/reject\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processReject(_response);\n });\n }\n\n protected processReject(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n send(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/send\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processSend(_response);\n });\n }\n\n protected processSend(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefReset(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/reset\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefReset(_response);\n });\n }\n\n protected processBriefReset(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n}\n\nexport interface AantekeningDto {\n type?: string | undefined;\n omschrijving?: string | undefined;\n datum?: string | undefined;\n}\n\nexport interface AanvraagStatusDto {\n tag?: string | undefined;\n stepIndex?: number | undefined;\n stepCount?: number | undefined;\n referentie?: string | undefined;\n manual?: boolean | undefined;\n reden?: string | undefined;\n}\n\nexport interface AdresDto {\n straat?: string | undefined;\n postcode?: string | undefined;\n woonplaats?: string | undefined;\n}\n\nexport interface ApplicationDetailDto {\n id?: string | undefined;\n type?: string | undefined;\n status?: AanvraagStatusDto;\n draft?: any | undefined;\n documentIds?: string[] | undefined;\n createdAt?: string | undefined;\n updatedAt?: string | undefined;\n submittedAt?: string | undefined;\n}\n\nexport interface ApplicationSummaryDto {\n id?: string | undefined;\n type?: string | undefined;\n status?: AanvraagStatusDto;\n documentIds?: string[] | undefined;\n createdAt?: string | undefined;\n updatedAt?: string | undefined;\n submittedAt?: string | undefined;\n}\n\nexport interface BriefDto {\n briefId?: string | undefined;\n beroep?: string | undefined;\n templateId?: string | undefined;\n placeholders?: PlaceholderDefDto[] | undefined;\n sections?: LetterSectionDto[] | undefined;\n status?: BriefStatusDto;\n drafterId?: string | undefined;\n}\n\nexport interface BriefStatusDto {\n tag?: string | undefined;\n submittedBy?: string | undefined;\n submittedAt?: string | undefined;\n approvedBy?: string | undefined;\n approvedAt?: string | undefined;\n rejectedBy?: string | undefined;\n rejectedAt?: string | undefined;\n comments?: string | undefined;\n sentAt?: string | undefined;\n}\n\nexport interface BriefViewDto {\n brief?: BriefDto;\n availablePassages?: LibraryPassageDto[] | undefined;\n}\n\nexport interface BrpAddressDto {\n gevonden?: boolean;\n adres?: AdresDto;\n}\n\nexport interface ChangeRequestRequest {\n straat?: string | undefined;\n postcode?: string | undefined;\n woonplaats?: string | undefined;\n}\n\nexport interface CreateApplicationRequest {\n type?: string | undefined;\n}\n\nexport interface DashboardViewDto {\n registration?: RegistrationDto;\n person?: PersonDto;\n decisions?: HerregistratieDecisionsDto;\n}\n\nexport interface DocumentCategoryDto {\n categoryId?: string | undefined;\n label?: string | undefined;\n description?: string | undefined;\n required?: boolean;\n acceptedTypes?: string[] | undefined;\n maxSizeMb?: number;\n multiple?: boolean;\n allowPostDelivery?: boolean;\n}\n\nexport interface DocumentRefDto {\n categoryId?: string | undefined;\n channel?: string | undefined;\n documentId?: string | undefined;\n}\n\nexport interface DraftSyncRequest {\n draft?: any;\n stepIndex?: number;\n stepCount?: number;\n documentIds?: string[] | undefined;\n}\n\nexport interface DuoDiplomaDto {\n id?: string | undefined;\n naam?: string | undefined;\n instelling?: string | undefined;\n jaar?: number;\n beroep?: string | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface DuoLookupDto {\n diplomas?: DuoDiplomaDto[] | undefined;\n handmatig?: ManualDiplomaPolicyDto;\n}\n\nexport interface HerregistratieDecisionsDto {\n eligibleForHerregistratie?: boolean;\n herregistratieReason?: string | undefined;\n}\n\nexport interface HerregistratieRequest {\n uren?: number;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface IntakePolicyDto {\n scholingThreshold?: number;\n}\n\nexport interface IntakeRequest {\n uren?: number;\n}\n\nexport interface LetterBlockDto {\n type?: string | undefined;\n blockId?: string | undefined;\n content?: RichTextBlockDto;\n sourcePassageId?: string | undefined;\n sourceVersion?: number | undefined;\n edited?: boolean | undefined;\n}\n\nexport interface LetterSectionDto {\n sectionKey?: string | undefined;\n title?: string | undefined;\n required?: boolean;\n blocks?: LetterBlockDto[] | undefined;\n locked?: boolean;\n}\n\nexport interface LibraryPassageDto {\n passageId?: string | undefined;\n scope?: string | undefined;\n sectionKey?: string | undefined;\n label?: string | undefined;\n content?: RichTextBlockDto;\n version?: number;\n beroep?: string | undefined;\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface ParagraphDto {\n nodes?: RichTextNodeDto[] | undefined;\n list?: string | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\n}\n\nexport interface PlaceholderDefDto {\n key?: string | undefined;\n label?: string | undefined;\n autoResolvable?: boolean;\n fillable?: boolean | undefined;\n deprecated?: boolean | undefined;\n}\n\nexport interface PolicyQuestionDto {\n id?: string | undefined;\n vraag?: string | undefined;\n type?: string | undefined;\n}\n\nexport interface ProblemDetails {\n type?: string | undefined;\n title?: string | undefined;\n status?: number | undefined;\n detail?: string | undefined;\n instance?: string | undefined;\n\n [key: string]: any;\n}\n\nexport interface ReferentieResponse {\n referentie?: string | undefined;\n}\n\nexport interface RegistratieRequest {\n diplomaHerkomst?: string | undefined;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface RegistrationDto {\n bigNummer?: string | undefined;\n naam?: string | undefined;\n beroep?: string | undefined;\n registratiedatum?: string | undefined;\n geboortedatum?: string | undefined;\n status?: RegistrationStatusDto;\n}\n\nexport interface RegistrationStatusDto {\n tag?: string | undefined;\n herregistratieDatum?: string | undefined;\n geschorstTot?: string | undefined;\n reden?: string | undefined;\n doorgehaaldOp?: string | undefined;\n}\n\nexport interface RejectBriefRequest {\n comments?: string | undefined;\n}\n\nexport interface RichTextBlockDto {\n paragraphs?: ParagraphDto[] | undefined;\n}\n\nexport interface RichTextNodeDto {\n type?: string | undefined;\n text?: string | undefined;\n marks?: string[] | undefined;\n key?: string | undefined;\n}\n\nexport interface SaveBriefRequest {\n sections?: LetterSectionDto[] | undefined;\n}\n\nexport interface SubmitApplicationRequest {\n diplomaHerkomst?: string | undefined;\n uren?: number | undefined;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface SubmitApplicationResponse {\n referentie?: string | undefined;\n status?: AanvraagStatusDto;\n}\n\nexport interface UploadCategoriesDto {\n categories?: DocumentCategoryDto[] | undefined;\n}\n\nexport interface UploadStatusDto {\n results?: UploadStatusItemDto[] | undefined;\n}\n\nexport interface UploadStatusItemDto {\n localId?: string | undefined;\n status?: string | undefined;\n documentId?: string | undefined;\n}\n\nexport class SwaggerException extends Error {\n override message: string;\n status: number;\n response: string;\n headers: { [key: string]: any; };\n result: any;\n\n constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) {\n super();\n\n this.message = message;\n this.status = status;\n this.response = response;\n this.headers = headers;\n this.result = result;\n }\n\n protected isSwaggerException = true;\n\n static isSwaggerException(obj: any): obj is SwaggerException {\n return obj.isSwaggerException === true;\n }\n}\n\nfunction throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any {\n if (result !== null && result !== undefined)\n throw result;\n else\n throw new SwaggerException(message, status, response, headers, null);\n}", + "properties": [ + { + "name": "diplomas", + "deprecated": false, + "deprecationMessage": "", + "type": "DuoDiplomaDto[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1372 + }, + { + "name": "handmatig", + "deprecated": false, + "deprecationMessage": "", + "type": "ManualDiplomaPolicyDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 1373 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "DuoLookupDto", + "id": "interface-DuoLookupDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1-1", "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", "deprecated": false, "deprecationMessage": "", @@ -2471,41 +2506,6 @@ "description": "

WIRE CONTRACT for the DUO diploma lookup ("BFF-lite" — one screen-shaped call\nreturning everything the beroep step needs).

\n

Each diploma carries its server-computed beroep (the profession it maps to)\nand the policyQuestions (geldigheidsvragen) that apply to it. These are\nDECISIONS computed by the backend from the diploma's attributes — the frontend\nrenders them, it does not derive them (decision-DTO pattern, ADR-0001). E.g. an\nEnglish-language diploma carries the Dutch-proficiency question.

\n

handmatig is the fallback when the diploma is not in the DUO list: the\nprofessions the user may declare and the MAXIMAL policy-question set that then\napplies (a manual diploma is unverified, so the strictest set is used).

\n", "rawdescription": "\n\nWIRE CONTRACT for the DUO diploma lookup (\"BFF-lite\" — one screen-shaped call\nreturning everything the beroep step needs).\n\nEach diploma carries its server-computed `beroep` (the profession it maps to)\nand the `policyQuestions` (geldigheidsvragen) that apply to it. These are\nDECISIONS computed by the backend from the diploma's attributes — the frontend\nrenders them, it does not derive them (decision-DTO pattern, ADR-0001). E.g. an\nEnglish-language diploma carries the Dutch-proficiency question.\n\n`handmatig` is the fallback when the diploma is not in the DUO list: the\nprofessions the user may declare and the MAXIMAL policy-question set that then\napplies (a manual diploma is unverified, so the strictest set is used).\n", "methods": [], - "extends": [] - }, - { - "name": "DuoLookupDto", - "id": "interface-DuoLookupDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b-1", - "file": "src/app/shared/infrastructure/api-client.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "export class ApiClient {\n private http: { fetch(url: RequestInfo, init?: RequestInit): Promise };\n private baseUrl: string;\n protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined;\n\n constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) {\n this.http = http ? http : window as any;\n this.baseUrl = baseUrl ?? \"\";\n }\n\n /**\n * @return OK\n */\n health(): Promise {\n let url_ = this.baseUrl + \"/health\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processHealth(_response);\n });\n }\n\n protected processHealth(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n ready(): Promise {\n let url_ = this.baseUrl + \"/health/ready\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processReady(_response);\n });\n }\n\n protected processReady(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n dashboardView(): Promise {\n let url_ = this.baseUrl + \"/api/v1/dashboard-view\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processDashboardView(_response);\n });\n }\n\n protected processDashboardView(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as DashboardViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n notes(): Promise {\n let url_ = this.baseUrl + \"/api/v1/notes\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processNotes(_response);\n });\n }\n\n protected processNotes(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as AantekeningDto[];\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n address(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brp/address\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processAddress(_response);\n });\n }\n\n protected processAddress(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BrpAddressDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n diplomas(): Promise {\n let url_ = this.baseUrl + \"/api/v1/duo/diplomas\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processDiplomas(_response);\n });\n }\n\n protected processDiplomas(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as DuoLookupDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n policy(): Promise {\n let url_ = this.baseUrl + \"/api/v1/intake/policy\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processPolicy(_response);\n });\n }\n\n protected processPolicy(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as IntakePolicyDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n registrations(body: RegistratieRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/registrations\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processRegistrations(_response);\n });\n }\n\n protected processRegistrations(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n herregistraties(body: HerregistratieRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/herregistraties\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processHerregistraties(_response);\n });\n }\n\n protected processHerregistraties(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n intakes(body: IntakeRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/intakes\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processIntakes(_response);\n });\n }\n\n protected processIntakes(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n changeRequests(body: ChangeRequestRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/change-requests\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processChangeRequests(_response);\n });\n }\n\n protected processChangeRequests(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ReferentieResponse;\n return result200;\n });\n } else if (status === 422) {\n return response.text().then((_responseText) => {\n let result422: any = null;\n result422 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Unprocessable Content\", status, _responseText, _headers, result422);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @param diplomaHerkomst (optional) \n * @param taalvaardigheid (optional) \n * @return OK\n */\n categories(wizardId: string, diplomaHerkomst?: string | undefined, taalvaardigheid?: string | undefined): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/categories?\";\n if (wizardId === undefined || wizardId === null)\n throw new globalThis.Error(\"The parameter 'wizardId' must be defined and cannot be null.\");\n else\n url_ += \"wizardId=\" + encodeURIComponent(\"\" + wizardId) + \"&\";\n if (diplomaHerkomst === null)\n throw new globalThis.Error(\"The parameter 'diplomaHerkomst' cannot be null.\");\n else if (diplomaHerkomst !== undefined)\n url_ += \"diplomaHerkomst=\" + encodeURIComponent(\"\" + diplomaHerkomst) + \"&\";\n if (taalvaardigheid === null)\n throw new globalThis.Error(\"The parameter 'taalvaardigheid' cannot be null.\");\n else if (taalvaardigheid !== undefined)\n url_ += \"taalvaardigheid=\" + encodeURIComponent(\"\" + taalvaardigheid) + \"&\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processCategories(_response);\n });\n }\n\n protected processCategories(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as UploadCategoriesDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n content(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/{documentId}/content\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processContent(_response);\n });\n }\n\n protected processContent(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @param localIds (optional) \n * @return OK\n */\n status(localIds?: string | undefined): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/status?\";\n if (localIds === null)\n throw new globalThis.Error(\"The parameter 'localIds' cannot be null.\");\n else if (localIds !== undefined)\n url_ += \"localIds=\" + encodeURIComponent(\"\" + localIds) + \"&\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processStatus(_response);\n });\n }\n\n protected processStatus(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as UploadStatusDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n uploads(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/uploads/{documentId}\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processUploads(_response);\n });\n }\n\n protected processUploads(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n uploads2(documentId: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/admin/uploads/{documentId}\";\n if (documentId === undefined || documentId === null)\n throw new globalThis.Error(\"The parameter 'documentId' must be defined.\");\n url_ = url_.replace(\"{documentId}\", encodeURIComponent(\"\" + documentId));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processUploads2(_response);\n });\n }\n\n protected processUploads2(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n return throwException(\"Forbidden\", status, _responseText, _headers);\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n applicationsAll(): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsAll(_response);\n });\n }\n\n protected processApplicationsAll(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationSummaryDto[];\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return Created\n */\n applicationsPOST(body: CreateApplicationRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsPOST(_response);\n });\n }\n\n protected processApplicationsPOST(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 201) {\n return response.text().then((_responseText) => {\n let result201: any = null;\n result201 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationDetailDto;\n return result201;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n applicationsGET(id: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsGET(_response);\n });\n }\n\n protected processApplicationsGET(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ApplicationDetailDto;\n return result200;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n applicationsPUT(id: string, body: DraftSyncRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsPUT(_response);\n });\n }\n\n protected processApplicationsPUT(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return No Content\n */\n applicationsDELETE(id: string): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"DELETE\",\n headers: {\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApplicationsDELETE(_response);\n });\n }\n\n protected processApplicationsDELETE(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 204) {\n return response.text().then((_responseText) => {\n return;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n submit(id: string, body: SubmitApplicationRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/applications/{id}/submit\";\n if (id === undefined || id === null)\n throw new globalThis.Error(\"The parameter 'id' must be defined.\");\n url_ = url_.replace(\"{id}\", encodeURIComponent(\"\" + id));\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processSubmit(_response);\n });\n }\n\n protected processSubmit(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as SubmitApplicationResponse;\n return result200;\n });\n } else if (status === 404) {\n return response.text().then((_responseText) => {\n return throwException(\"Not Found\", status, _responseText, _headers);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefGET(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"GET\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefGET(_response);\n });\n }\n\n protected processBriefGET(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefPUT(body: SaveBriefRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefPUT(_response);\n });\n }\n\n protected processBriefPUT(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefSubmit(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/submit\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefSubmit(_response);\n });\n }\n\n protected processBriefSubmit(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n approve(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/approve\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processApprove(_response);\n });\n }\n\n protected processApprove(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n reject(body: RejectBriefRequest): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/reject\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n const content_ = JSON.stringify(body);\n\n let options_: RequestInit = {\n body: content_,\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processReject(_response);\n });\n }\n\n protected processReject(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 403) {\n return response.text().then((_responseText) => {\n let result403: any = null;\n result403 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Forbidden\", status, _responseText, _headers, result403);\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n send(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/send\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processSend(_response);\n });\n }\n\n protected processSend(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefDto;\n return result200;\n });\n } else if (status === 409) {\n return response.text().then((_responseText) => {\n let result409: any = null;\n result409 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as ProblemDetails;\n return throwException(\"Conflict\", status, _responseText, _headers, result409);\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n\n /**\n * @return OK\n */\n briefReset(): Promise {\n let url_ = this.baseUrl + \"/api/v1/brief/reset\";\n url_ = url_.replace(/[?&]$/, \"\");\n\n let options_: RequestInit = {\n method: \"POST\",\n headers: {\n \"Accept\": \"application/json\"\n }\n };\n\n return this.http.fetch(url_, options_).then((_response: Response) => {\n return this.processBriefReset(_response);\n });\n }\n\n protected processBriefReset(response: Response): Promise {\n const status = response.status;\n let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); };\n if (status === 200) {\n return response.text().then((_responseText) => {\n let result200: any = null;\n result200 = _responseText === \"\" ? null : JSON.parse(_responseText, this.jsonParseReviver) as BriefViewDto;\n return result200;\n });\n } else if (status !== 200 && status !== 204) {\n return response.text().then((_responseText) => {\n return throwException(\"An unexpected server error occurred.\", status, _responseText, _headers);\n });\n }\n return Promise.resolve(null as any);\n }\n}\n\nexport interface AantekeningDto {\n type?: string | undefined;\n omschrijving?: string | undefined;\n datum?: string | undefined;\n}\n\nexport interface AanvraagStatusDto {\n tag?: string | undefined;\n stepIndex?: number | undefined;\n stepCount?: number | undefined;\n referentie?: string | undefined;\n manual?: boolean | undefined;\n reden?: string | undefined;\n}\n\nexport interface AdresDto {\n straat?: string | undefined;\n postcode?: string | undefined;\n woonplaats?: string | undefined;\n}\n\nexport interface ApplicationDetailDto {\n id?: string | undefined;\n type?: string | undefined;\n status?: AanvraagStatusDto;\n draft?: any | undefined;\n documentIds?: string[] | undefined;\n createdAt?: string | undefined;\n updatedAt?: string | undefined;\n submittedAt?: string | undefined;\n}\n\nexport interface ApplicationSummaryDto {\n id?: string | undefined;\n type?: string | undefined;\n status?: AanvraagStatusDto;\n documentIds?: string[] | undefined;\n createdAt?: string | undefined;\n updatedAt?: string | undefined;\n submittedAt?: string | undefined;\n}\n\nexport interface BriefDto {\n briefId?: string | undefined;\n beroep?: string | undefined;\n templateId?: string | undefined;\n placeholders?: PlaceholderDefDto[] | undefined;\n sections?: LetterSectionDto[] | undefined;\n status?: BriefStatusDto;\n drafterId?: string | undefined;\n}\n\nexport interface BriefStatusDto {\n tag?: string | undefined;\n submittedBy?: string | undefined;\n submittedAt?: string | undefined;\n approvedBy?: string | undefined;\n approvedAt?: string | undefined;\n rejectedBy?: string | undefined;\n rejectedAt?: string | undefined;\n comments?: string | undefined;\n sentAt?: string | undefined;\n}\n\nexport interface BriefViewDto {\n brief?: BriefDto;\n availablePassages?: LibraryPassageDto[] | undefined;\n}\n\nexport interface BrpAddressDto {\n gevonden?: boolean;\n adres?: AdresDto;\n}\n\nexport interface ChangeRequestRequest {\n straat?: string | undefined;\n postcode?: string | undefined;\n woonplaats?: string | undefined;\n}\n\nexport interface CreateApplicationRequest {\n type?: string | undefined;\n}\n\nexport interface DashboardViewDto {\n registration?: RegistrationDto;\n person?: PersonDto;\n decisions?: HerregistratieDecisionsDto;\n}\n\nexport interface DocumentCategoryDto {\n categoryId?: string | undefined;\n label?: string | undefined;\n description?: string | undefined;\n required?: boolean;\n acceptedTypes?: string[] | undefined;\n maxSizeMb?: number;\n multiple?: boolean;\n allowPostDelivery?: boolean;\n}\n\nexport interface DocumentRefDto {\n categoryId?: string | undefined;\n channel?: string | undefined;\n documentId?: string | undefined;\n}\n\nexport interface DraftSyncRequest {\n draft?: any;\n stepIndex?: number;\n stepCount?: number;\n documentIds?: string[] | undefined;\n}\n\nexport interface DuoDiplomaDto {\n id?: string | undefined;\n naam?: string | undefined;\n instelling?: string | undefined;\n jaar?: number;\n beroep?: string | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface DuoLookupDto {\n diplomas?: DuoDiplomaDto[] | undefined;\n handmatig?: ManualDiplomaPolicyDto;\n}\n\nexport interface HerregistratieDecisionsDto {\n eligibleForHerregistratie?: boolean;\n herregistratieReason?: string | undefined;\n}\n\nexport interface HerregistratieRequest {\n uren?: number;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface IntakePolicyDto {\n scholingThreshold?: number;\n}\n\nexport interface IntakeRequest {\n uren?: number;\n}\n\nexport interface LetterBlockDto {\n type?: string | undefined;\n blockId?: string | undefined;\n content?: RichTextBlockDto;\n sourcePassageId?: string | undefined;\n sourceVersion?: number | undefined;\n edited?: boolean | undefined;\n}\n\nexport interface LetterSectionDto {\n sectionKey?: string | undefined;\n title?: string | undefined;\n required?: boolean;\n blocks?: LetterBlockDto[] | undefined;\n locked?: boolean;\n}\n\nexport interface LibraryPassageDto {\n passageId?: string | undefined;\n scope?: string | undefined;\n sectionKey?: string | undefined;\n label?: string | undefined;\n content?: RichTextBlockDto;\n version?: number;\n beroep?: string | undefined;\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface ParagraphDto {\n nodes?: RichTextNodeDto[] | undefined;\n list?: string | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\n}\n\nexport interface PlaceholderDefDto {\n key?: string | undefined;\n label?: string | undefined;\n autoResolvable?: boolean;\n fillable?: boolean | undefined;\n deprecated?: boolean | undefined;\n}\n\nexport interface PolicyQuestionDto {\n id?: string | undefined;\n vraag?: string | undefined;\n type?: string | undefined;\n}\n\nexport interface ProblemDetails {\n type?: string | undefined;\n title?: string | undefined;\n status?: number | undefined;\n detail?: string | undefined;\n instance?: string | undefined;\n\n [key: string]: any;\n}\n\nexport interface ReferentieResponse {\n referentie?: string | undefined;\n}\n\nexport interface RegistratieRequest {\n diplomaHerkomst?: string | undefined;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface RegistrationDto {\n bigNummer?: string | undefined;\n naam?: string | undefined;\n beroep?: string | undefined;\n registratiedatum?: string | undefined;\n geboortedatum?: string | undefined;\n status?: RegistrationStatusDto;\n}\n\nexport interface RegistrationStatusDto {\n tag?: string | undefined;\n herregistratieDatum?: string | undefined;\n geschorstTot?: string | undefined;\n reden?: string | undefined;\n doorgehaaldOp?: string | undefined;\n}\n\nexport interface RejectBriefRequest {\n comments?: string | undefined;\n}\n\nexport interface RichTextBlockDto {\n paragraphs?: ParagraphDto[] | undefined;\n}\n\nexport interface RichTextNodeDto {\n type?: string | undefined;\n text?: string | undefined;\n marks?: string[] | undefined;\n key?: string | undefined;\n}\n\nexport interface SaveBriefRequest {\n sections?: LetterSectionDto[] | undefined;\n}\n\nexport interface SubmitApplicationRequest {\n diplomaHerkomst?: string | undefined;\n uren?: number | undefined;\n documents?: DocumentRefDto[] | undefined;\n}\n\nexport interface SubmitApplicationResponse {\n referentie?: string | undefined;\n status?: AanvraagStatusDto;\n}\n\nexport interface UploadCategoriesDto {\n categories?: DocumentCategoryDto[] | undefined;\n}\n\nexport interface UploadStatusDto {\n results?: UploadStatusItemDto[] | undefined;\n}\n\nexport interface UploadStatusItemDto {\n localId?: string | undefined;\n status?: string | undefined;\n documentId?: string | undefined;\n}\n\nexport class SwaggerException extends Error {\n override message: string;\n status: number;\n response: string;\n headers: { [key: string]: any; };\n result: any;\n\n constructor(message: string, status: number, response: string, headers: { [key: string]: any; }, result: any) {\n super();\n\n this.message = message;\n this.status = status;\n this.response = response;\n this.headers = headers;\n this.result = result;\n }\n\n protected isSwaggerException = true;\n\n static isSwaggerException(obj: any): obj is SwaggerException {\n return obj.isSwaggerException === true;\n }\n}\n\nfunction throwException(message: string, status: number, response: string, headers: { [key: string]: any; }, result?: any): any {\n if (result !== null && result !== undefined)\n throw result;\n else\n throw new SwaggerException(message, status, response, headers, null);\n}", - "properties": [ - { - "name": "diplomas", - "deprecated": false, - "deprecationMessage": "", - "type": "DuoDiplomaDto[] | undefined", - "indexKey": "", - "optional": true, - "description": "", - "line": 1372 - }, - { - "name": "handmatig", - "deprecated": false, - "deprecationMessage": "", - "type": "ManualDiplomaPolicyDto", - "indexKey": "", - "optional": true, - "description": "", - "line": 1373 - } - ], - "indexSignatures": [], - "kind": 172, - "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -3266,42 +3266,7 @@ }, { "name": "ManualDiplomaPolicyDto", - "id": "interface-ManualDiplomaPolicyDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1", - "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "export interface DuoLookupDto {\n diplomas: DuoDiplomaDto[];\n handmatig: ManualDiplomaPolicyDto;\n}\n\nexport interface DuoDiplomaDto {\n id: string;\n naam: string;\n instelling: string;\n jaar: number;\n beroep: string; // server-derived profession\n policyQuestions: PolicyQuestionDto[]; // server-decided geldigheidsvragen\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen: string[]; // professions the user may declare for a manual diploma\n policyQuestions: PolicyQuestionDto[]; // maximal set applied to a manual diploma\n}\n\nexport interface PolicyQuestionDto {\n id: string;\n vraag: string;\n type: 'ja-nee' | 'tekst';\n}\n", - "properties": [ - { - "name": "beroepen", - "deprecated": false, - "deprecationMessage": "", - "type": "string[]", - "indexKey": "", - "optional": false, - "description": "", - "line": 30 - }, - { - "name": "policyQuestions", - "deprecated": false, - "deprecationMessage": "", - "type": "PolicyQuestionDto[]", - "indexKey": "", - "optional": false, - "description": "", - "line": 31 - } - ], - "indexSignatures": [], - "kind": 172, - "methods": [], - "extends": [] - }, - { - "name": "ManualDiplomaPolicyDto", - "id": "interface-ManualDiplomaPolicyDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b-1", + "id": "interface-ManualDiplomaPolicyDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b", "file": "src/app/shared/infrastructure/api-client.ts", "deprecated": false, "deprecationMessage": "", @@ -3332,6 +3297,41 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [] + }, + { + "name": "ManualDiplomaPolicyDto", + "id": "interface-ManualDiplomaPolicyDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1-1", + "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export interface DuoLookupDto {\n diplomas: DuoDiplomaDto[];\n handmatig: ManualDiplomaPolicyDto;\n}\n\nexport interface DuoDiplomaDto {\n id: string;\n naam: string;\n instelling: string;\n jaar: number;\n beroep: string; // server-derived profession\n policyQuestions: PolicyQuestionDto[]; // server-decided geldigheidsvragen\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen: string[]; // professions the user may declare for a manual diploma\n policyQuestions: PolicyQuestionDto[]; // maximal set applied to a manual diploma\n}\n\nexport interface PolicyQuestionDto {\n id: string;\n vraag: string;\n type: 'ja-nee' | 'tekst';\n}\n", + "properties": [ + { + "name": "beroepen", + "deprecated": false, + "deprecationMessage": "", + "type": "string[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 30 + }, + { + "name": "policyQuestions", + "deprecated": false, + "deprecationMessage": "", + "type": "PolicyQuestionDto[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 31 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -3460,52 +3460,7 @@ }, { "name": "PersonDto", - "id": "interface-PersonDto-10d81af9017230c2e0704c882140be892d1e2a8d6343f8d169bcdb8e99516bc135a9b17faf4ea0fb5d4da561476db228b7f2dab7d27e4c262acdecbe1b7f6241", - "file": "src/app/registratie/contracts/dashboard-view.dto.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "export type RegistrationStatusDto =\n | { tag: 'Geregistreerd'; herregistratieDatum: string } // ISO date\n | { tag: 'Geschorst'; geschorstTot: string; reden: string }\n | { tag: 'Doorgehaald'; doorgehaaldOp: string; reden: string };\n\nexport interface RegistrationDto {\n bigNummer: string;\n naam: string;\n beroep: string;\n registratiedatum: string; // ISO date\n geboortedatum: string;\n status: RegistrationStatusDto;\n}\n\nexport interface AdresDto {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\nexport interface PersonDto {\n naam: string;\n geboortedatum: string; // ISO date\n adres: AdresDto;\n}\n\n/** Server-computed decisions. Rendered by the FE as-is (decision DTO, ADR-0001):\n the eligibility rule lives on the backend; the optional reason lets the UI\n explain itself without knowing the rule. */\nexport interface HerregistratieDecisions {\n eligibleForHerregistratie: boolean;\n herregistratieReason?: string;\n}\n\nexport interface DashboardViewDto {\n registration: RegistrationDto;\n person: PersonDto;\n decisions: HerregistratieDecisions;\n}\n", - "properties": [ - { - "name": "adres", - "deprecated": false, - "deprecationMessage": "", - "type": "AdresDto", - "indexKey": "", - "optional": false, - "description": "", - "line": 44 - }, - { - "name": "geboortedatum", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 43 - }, - { - "name": "naam", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 42 - } - ], - "indexSignatures": [], - "kind": 172, - "methods": [], - "extends": [] - }, - { - "name": "PersonDto", - "id": "interface-PersonDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b-1", + "id": "interface-PersonDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b", "file": "src/app/shared/infrastructure/api-client.ts", "deprecated": false, "deprecationMessage": "", @@ -3546,6 +3501,51 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [] + }, + { + "name": "PersonDto", + "id": "interface-PersonDto-10d81af9017230c2e0704c882140be892d1e2a8d6343f8d169bcdb8e99516bc135a9b17faf4ea0fb5d4da561476db228b7f2dab7d27e4c262acdecbe1b7f6241-1", + "file": "src/app/registratie/contracts/dashboard-view.dto.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export type RegistrationStatusDto =\n | { tag: 'Geregistreerd'; herregistratieDatum: string } // ISO date\n | { tag: 'Geschorst'; geschorstTot: string; reden: string }\n | { tag: 'Doorgehaald'; doorgehaaldOp: string; reden: string };\n\nexport interface RegistrationDto {\n bigNummer: string;\n naam: string;\n beroep: string;\n registratiedatum: string; // ISO date\n geboortedatum: string;\n status: RegistrationStatusDto;\n}\n\nexport interface AdresDto {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\nexport interface PersonDto {\n naam: string;\n geboortedatum: string; // ISO date\n adres: AdresDto;\n}\n\n/** Server-computed decisions. Rendered by the FE as-is (decision DTO, ADR-0001):\n the eligibility rule lives on the backend; the optional reason lets the UI\n explain itself without knowing the rule. */\nexport interface HerregistratieDecisions {\n eligibleForHerregistratie: boolean;\n herregistratieReason?: string;\n}\n\nexport interface DashboardViewDto {\n registration: RegistrationDto;\n person: PersonDto;\n decisions: HerregistratieDecisions;\n}\n", + "properties": [ + { + "name": "adres", + "deprecated": false, + "deprecationMessage": "", + "type": "AdresDto", + "indexKey": "", + "optional": false, + "description": "", + "line": 44 + }, + { + "name": "geboortedatum", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 43 + }, + { + "name": "naam", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 42 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -3756,52 +3756,7 @@ }, { "name": "PolicyQuestionDto", - "id": "interface-PolicyQuestionDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1", - "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "export interface DuoLookupDto {\n diplomas: DuoDiplomaDto[];\n handmatig: ManualDiplomaPolicyDto;\n}\n\nexport interface DuoDiplomaDto {\n id: string;\n naam: string;\n instelling: string;\n jaar: number;\n beroep: string; // server-derived profession\n policyQuestions: PolicyQuestionDto[]; // server-decided geldigheidsvragen\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen: string[]; // professions the user may declare for a manual diploma\n policyQuestions: PolicyQuestionDto[]; // maximal set applied to a manual diploma\n}\n\nexport interface PolicyQuestionDto {\n id: string;\n vraag: string;\n type: 'ja-nee' | 'tekst';\n}\n", - "properties": [ - { - "name": "id", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 35 - }, - { - "name": "type", - "deprecated": false, - "deprecationMessage": "", - "type": "\"ja-nee\" | \"tekst\"", - "indexKey": "", - "optional": false, - "description": "", - "line": 37 - }, - { - "name": "vraag", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 36 - } - ], - "indexSignatures": [], - "kind": 172, - "methods": [], - "extends": [] - }, - { - "name": "PolicyQuestionDto", - "id": "interface-PolicyQuestionDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b-1", + "id": "interface-PolicyQuestionDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b", "file": "src/app/shared/infrastructure/api-client.ts", "deprecated": false, "deprecationMessage": "", @@ -3842,6 +3797,51 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [] + }, + { + "name": "PolicyQuestionDto", + "id": "interface-PolicyQuestionDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1-1", + "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export interface DuoLookupDto {\n diplomas: DuoDiplomaDto[];\n handmatig: ManualDiplomaPolicyDto;\n}\n\nexport interface DuoDiplomaDto {\n id: string;\n naam: string;\n instelling: string;\n jaar: number;\n beroep: string; // server-derived profession\n policyQuestions: PolicyQuestionDto[]; // server-decided geldigheidsvragen\n}\n\nexport interface ManualDiplomaPolicyDto {\n beroepen: string[]; // professions the user may declare for a manual diploma\n policyQuestions: PolicyQuestionDto[]; // maximal set applied to a manual diploma\n}\n\nexport interface PolicyQuestionDto {\n id: string;\n vraag: string;\n type: 'ja-nee' | 'tekst';\n}\n", + "properties": [ + { + "name": "id", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 35 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "\"ja-nee\" | \"tekst\"", + "indexKey": "", + "optional": false, + "description": "", + "line": 37 + }, + { + "name": "vraag", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 36 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -4159,82 +4159,7 @@ }, { "name": "RegistrationDto", - "id": "interface-RegistrationDto-10d81af9017230c2e0704c882140be892d1e2a8d6343f8d169bcdb8e99516bc135a9b17faf4ea0fb5d4da561476db228b7f2dab7d27e4c262acdecbe1b7f6241", - "file": "src/app/registratie/contracts/dashboard-view.dto.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "interface", - "sourceCode": "export type RegistrationStatusDto =\n | { tag: 'Geregistreerd'; herregistratieDatum: string } // ISO date\n | { tag: 'Geschorst'; geschorstTot: string; reden: string }\n | { tag: 'Doorgehaald'; doorgehaaldOp: string; reden: string };\n\nexport interface RegistrationDto {\n bigNummer: string;\n naam: string;\n beroep: string;\n registratiedatum: string; // ISO date\n geboortedatum: string;\n status: RegistrationStatusDto;\n}\n\nexport interface AdresDto {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\nexport interface PersonDto {\n naam: string;\n geboortedatum: string; // ISO date\n adres: AdresDto;\n}\n\n/** Server-computed decisions. Rendered by the FE as-is (decision DTO, ADR-0001):\n the eligibility rule lives on the backend; the optional reason lets the UI\n explain itself without knowing the rule. */\nexport interface HerregistratieDecisions {\n eligibleForHerregistratie: boolean;\n herregistratieReason?: string;\n}\n\nexport interface DashboardViewDto {\n registration: RegistrationDto;\n person: PersonDto;\n decisions: HerregistratieDecisions;\n}\n", - "properties": [ - { - "name": "beroep", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 29 - }, - { - "name": "bigNummer", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 27 - }, - { - "name": "geboortedatum", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 31 - }, - { - "name": "naam", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 28 - }, - { - "name": "registratiedatum", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 30 - }, - { - "name": "status", - "deprecated": false, - "deprecationMessage": "", - "type": "RegistrationStatusDto", - "indexKey": "", - "optional": false, - "description": "", - "line": 32 - } - ], - "indexSignatures": [], - "kind": 172, - "methods": [], - "extends": [] - }, - { - "name": "RegistrationDto", - "id": "interface-RegistrationDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b-1", + "id": "interface-RegistrationDto-134629d19fe3b5e6a76daeb4f10c282202eb1b8380b939c25450bb44b86fcb3df7a15e5ead886ad958b8bb7f158457387fb6c11872acdb4893c4933c2fdef07b", "file": "src/app/shared/infrastructure/api-client.ts", "deprecated": false, "deprecationMessage": "", @@ -4305,6 +4230,81 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [] + }, + { + "name": "RegistrationDto", + "id": "interface-RegistrationDto-10d81af9017230c2e0704c882140be892d1e2a8d6343f8d169bcdb8e99516bc135a9b17faf4ea0fb5d4da561476db228b7f2dab7d27e4c262acdecbe1b7f6241-1", + "file": "src/app/registratie/contracts/dashboard-view.dto.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export type RegistrationStatusDto =\n | { tag: 'Geregistreerd'; herregistratieDatum: string } // ISO date\n | { tag: 'Geschorst'; geschorstTot: string; reden: string }\n | { tag: 'Doorgehaald'; doorgehaaldOp: string; reden: string };\n\nexport interface RegistrationDto {\n bigNummer: string;\n naam: string;\n beroep: string;\n registratiedatum: string; // ISO date\n geboortedatum: string;\n status: RegistrationStatusDto;\n}\n\nexport interface AdresDto {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\nexport interface PersonDto {\n naam: string;\n geboortedatum: string; // ISO date\n adres: AdresDto;\n}\n\n/** Server-computed decisions. Rendered by the FE as-is (decision DTO, ADR-0001):\n the eligibility rule lives on the backend; the optional reason lets the UI\n explain itself without knowing the rule. */\nexport interface HerregistratieDecisions {\n eligibleForHerregistratie: boolean;\n herregistratieReason?: string;\n}\n\nexport interface DashboardViewDto {\n registration: RegistrationDto;\n person: PersonDto;\n decisions: HerregistratieDecisions;\n}\n", + "properties": [ + { + "name": "beroep", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 29 + }, + { + "name": "bigNummer", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 27 + }, + { + "name": "geboortedatum", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 31 + }, + { + "name": "naam", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 28 + }, + { + "name": "registratiedatum", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 30 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "RegistrationStatusDto", + "indexKey": "", + "optional": false, + "description": "", + "line": 32 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], "extends": [], "isDuplicate": true, "duplicateId": 1, @@ -13257,7 +13257,7 @@ }, { "name": "DashboardPage", - "id": "component-DashboardPage-6c021cef985a857f2e51792f358a9f2d54c4da0e3afadf1304442ff1fa26108185f19c5607b1fbdc1a4f7f2908474e2edb4be104995a45a7b67379860711f730", + "id": "component-DashboardPage-bbba994d5f2f5f15769970d79a345aa04ec549c71f1af80fa5ee9572e0831ae7090aa78fb23cb2bf1392d80aaff4b0e2e0775c4952628c19ed887d0536692ebe", "file": "src/app/registratie/ui/dashboard.page.ts", "encapsulation": [], "entryComponents": [], @@ -13267,7 +13267,7 @@ "selector": "app-dashboard-page", "styleUrls": [], "styles": [], - "template": "\n
\n @if (aanvragen().length) {\n
\n @for (a of concepten(); track a.id) {\n \n }\n @if (ingediend().length) {\n \n @for (a of ingediend(); track a.id) {\n \n }\n \n }\n
\n }\n\n @if (store.pendingHerregistratie()) {\n Uw herregistratie-aanvraag is in behandeling.\n }\n\n \n \n @let tasks = tasksFor($any(p).registration);\n\n
\n @if (tasks.length) {\n \n } @else {\n Wat moet ik regelen\n

U heeft op dit moment niets openstaan.

\n }\n
\n\n
\n Mijn registratie\n
\n \n
\n \n
\n \n \n \n
\n
\n
\n
\n \n \n \n
\n\n
\n Specialismen en aantekeningen\n
\n \n \n \n \n \n \n \n \n

U heeft nog geen specialismen of aantekeningen.

\n
\n
\n
\n
\n\n
\n Wat wilt u doen?\n \n @for (a of acties; track a.to) {\n \n }\n \n
\n
\n
\n", + "template": "\n
\n @if (aanvragen().length) {\n
\n @for (a of concepten(); track a.id) {\n \n }\n @if (ingediend().length) {\n \n @for (a of ingediend(); track a.id) {\n \n }\n \n }\n
\n }\n\n @if (store.pendingHerregistratie()) {\n Uw herregistratie-aanvraag is in behandeling.\n }\n\n \n \n @let tasks = tasksFor($any(p).registration);\n\n
\n @if (tasks.length) {\n \n } @else {\n Wat moet ik regelen\n

U heeft op dit moment niets openstaan.

\n }\n
\n\n
\n Mijn registratie\n
\n \n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n\n
\n Specialismen en aantekeningen\n
\n \n \n \n \n \n \n \n \n

U heeft nog geen specialismen of aantekeningen.

\n
\n
\n
\n
\n\n
\n Wat wilt u doen?\n \n @for (a of acties; track a.to) {\n \n }\n \n
\n
\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -13283,7 +13283,7 @@ "indexKey": "", "optional": false, "description": "

The user's applications, sorted Concept → In behandeling → resolved. Empty →\nthe"Mijn aanvragen" section is hidden (see template).

\n", - "line": 129, + "line": 127, "rawdescription": "\nThe user's applications, sorted Concept → In behandeling → resolved. Empty →\nthe\"Mijn aanvragen\" section is hidden (see template).", "modifierKind": [ 124 @@ -13298,7 +13298,7 @@ "indexKey": "", "optional": false, "description": "

Primary transactional actions, as an "aanvragen" list (see CIBG's\ncomponenten/aanvragen). The core portal sections live in the header nav now;\nthe teaching pages (concepts/brief) are only reachable from here.

\n", - "line": 165, + "line": 163, "rawdescription": "\nPrimary transactional actions, as an \"aanvragen\" list (see CIBG's\ncomponenten/aanvragen). The core portal sections live in the header nav now;\nthe teaching pages (concepts/brief) are only reachable from here.", "modifierKind": [ 124, @@ -13314,7 +13314,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 118, + "line": 116, "modifierKind": [ 123 ] @@ -13328,7 +13328,7 @@ "indexKey": "", "optional": false, "description": "

A Concept ("lopende aanvraag") renders as a melding above the list; the rest\nas keuzelijst items — the two shapes need different HTML contexts.

\n", - "line": 137, + "line": 135, "rawdescription": "\nA Concept (\"lopende aanvraag\") renders as a melding above the list; the rest\nas keuzelijst items — the two shapes need different HTML contexts.", "modifierKind": [ 124 @@ -13343,7 +13343,7 @@ "indexKey": "", "optional": false, "description": "

Server-computed eligibility (rendered, not recomputed).

\n", - "line": 153, + "line": 151, "rawdescription": "\nServer-computed eligibility (rendered, not recomputed).", "modifierKind": [ 123, @@ -13359,7 +13359,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 138, + "line": 136, "modifierKind": [ 124 ] @@ -13373,7 +13373,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 140, + "line": 138, "modifierKind": [ 123, 148 @@ -13388,7 +13388,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 119, + "line": 117, "modifierKind": [ 123 ] @@ -13402,7 +13402,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 117, + "line": 115, "modifierKind": [ 124 ] @@ -13424,7 +13424,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 148, + "line": 146, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -13459,7 +13459,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 145, + "line": 143, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -13494,7 +13494,7 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 158, + "line": 156, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -13542,7 +13542,7 @@ "type": "component" }, { - "name": "CardComponent", + "name": "DataBlockComponent", "type": "component" }, { @@ -13580,7 +13580,7 @@ "description": "

Page:"Mijn overzicht" — the portal home, following the NL Design System\n"Mijn omgeving" pattern (side nav +"Wat moet ik regelen" +"Mijn zaken").

\n", "rawdescription": "\nPage:\"Mijn overzicht\" — the portal home, following the NL Design System\n\"Mijn omgeving\" pattern (side nav +\"Wat moet ik regelen\" +\"Mijn zaken\").", "type": "component", - "sourceCode": "import { Component, computed, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { SkeletonComponent } from '@shared/ui/skeleton/skeleton.component';\nimport { DataRowComponent } from '@shared/ui/data-row/data-row.component';\nimport { CardComponent } from '@shared/ui/card/card.component';\nimport { TaskListComponent } from '@shared/ui/task-list/task-list.component';\nimport { ApplicationListComponent } from '@shared/ui/application-list/application-list.component';\nimport { ApplicationLinkComponent } from '@shared/ui/application-link/application-link.component';\nimport { ChoiceListComponent } from '@shared/ui/choice-list/choice-list.component';\nimport { ASYNC } from '@shared/ui/async/async.component';\nimport { RegistrationSummaryComponent } from '@registratie/ui/registration-summary/registration-summary.component';\nimport { RegistrationTableComponent } from '@registratie/ui/registration-table/registration-table.component';\nimport { AanvraagBlockComponent } from '@registratie/ui/aanvraag-block/aanvraag-block.component';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\nimport { ApplicationsStore } from '@registratie/application/applications.store';\nimport { Registration } from '@registratie/domain/registration';\nimport { Aanvraag, AanvraagType } from '@registratie/domain/aanvraag';\nimport { tasksFromProfile } from '@registratie/domain/tasks';\n\n/** Page:\"Mijn overzicht\" — the portal home, following the NL Design System\n\"Mijn omgeving\" pattern (side nav +\"Wat moet ik regelen\" +\"Mijn zaken\"). */\n@Component({\n selector: 'app-dashboard-page',\n imports: [\n PageShellComponent, HeadingComponent, AlertComponent, SkeletonComponent,\n DataRowComponent, CardComponent, TaskListComponent, ApplicationListComponent, ApplicationLinkComponent,\n ChoiceListComponent, ...ASYNC,\n RegistrationSummaryComponent, RegistrationTableComponent, AanvraagBlockComponent,\n ],\n template: `\n \n
\n @if (aanvragen().length) {\n
\n @for (a of concepten(); track a.id) {\n \n }\n @if (ingediend().length) {\n \n @for (a of ingediend(); track a.id) {\n \n }\n \n }\n
\n }\n\n @if (store.pendingHerregistratie()) {\n Uw herregistratie-aanvraag is in behandeling.\n }\n\n \n \n @let tasks = tasksFor($any(p).registration);\n\n
\n @if (tasks.length) {\n \n } @else {\n Wat moet ik regelen\n

U heeft op dit moment niets openstaan.

\n }\n
\n\n
\n Mijn registratie\n
\n \n
\n \n
\n \n \n \n
\n
\n
\n
\n \n \n \n
\n\n
\n Specialismen en aantekeningen\n
\n \n \n \n \n \n \n \n \n

U heeft nog geen specialismen of aantekeningen.

\n
\n
\n
\n
\n\n
\n Wat wilt u doen?\n \n @for (a of acties; track a.to) {\n \n }\n \n
\n
\n
\n `,\n})\nexport class DashboardPage {\n protected store = inject(BigProfileStore);\n private apps = inject(ApplicationsStore);\n private router = inject(Router);\n\n constructor() {\n // Re-fetch on each visit so server-computed auto-approval transitions show up\n // (Concept → In behandeling → Goedgekeurd after the processing window).\n this.apps.reload();\n }\n\n /** The user's applications, sorted Concept → In behandeling → resolved. Empty →\n the\"Mijn aanvragen\" section is hidden (see template). */\n protected aanvragen = computed(() => {\n const rd = this.apps.applications();\n if (rd.tag !== 'Success') return [];\n const order: Record = { Concept: 0, InBehandeling: 1, Goedgekeurd: 2, Afgewezen: 2 };\n return rd.value.slice().sort((a, b) => order[a.status.tag] - order[b.status.tag]);\n });\n /** A Concept (\"lopende aanvraag\") renders as a melding above the list; the rest\n as keuzelijst items — the two shapes need different HTML contexts. */\n protected concepten = computed(() => this.aanvragen().filter((a) => a.status.tag === 'Concept'));\n protected ingediend = computed(() => this.aanvragen().filter((a) => a.status.tag !== 'Concept'));\n\n private readonly resumeRoutes: Record = {\n registratie: '/registreren',\n herregistratie: '/herregistratie',\n intake: '/intake',\n };\n protected resume(a: Aanvraag) {\n void this.router.navigate([this.resumeRoutes[a.type]], { queryParams: { aanvraag: a.id } });\n }\n protected cancelAanvraag(a: Aanvraag) {\n void this.apps.cancel(a.id);\n }\n\n /** Server-computed eligibility (rendered, not recomputed). */\n private readonly eligible = computed(() => {\n const d = this.store.decisions();\n return d.tag === 'Success' && d.value.eligibleForHerregistratie;\n });\n\n protected tasksFor(reg: Registration) {\n return tasksFromProfile(reg, this.eligible());\n }\n\n /** Primary transactional actions, as an \"aanvragen\" list (see CIBG's\n componenten/aanvragen). The core portal sections live in the header nav now;\n the teaching pages (concepts/brief) are only reachable from here. */\n protected readonly acties = [\n { to: '/registreren', titel: $localize`:@@dashboard.actie.inschrijven.titel:Inschrijven`, tekst: $localize`:@@dashboard.actie.inschrijven.tekst:Schrijf u in in het BIG-register via de registratiewizard.`, actie: $localize`:@@dashboard.actie.inschrijven.actie:Start inschrijving` },\n { to: '/herregistratie', titel: $localize`:@@dashboard.actie.herregistratie.titel:Herregistratie aanvragen`, tekst: $localize`:@@dashboard.actie.herregistratie.tekst:Verleng uw registratie voor de komende periode.`, actie: $localize`:@@dashboard.actie.herregistratie.actie:Vraag aan` },\n { to: '/intake', titel: $localize`:@@dashboard.actie.intake.titel:Herregistratie-intake`, tekst: $localize`:@@dashboard.actie.intake.tekst:Vragenlijst met vertakkingen.`, actie: $localize`:@@dashboard.actie.intake.actie:Start intake` },\n { to: '/registratie', titel: $localize`:@@dashboard.actie.wijzigen.titel:Gegevens wijzigen`, tekst: $localize`:@@dashboard.actie.wijzigen.tekst:Bekijk uw gegevens of geef een wijziging door.`, actie: $localize`:@@dashboard.actie.wijzigen.actie:Bekijk gegevens` },\n { to: '/concepts', titel: $localize`:@@dashboard.actie.concepten.titel:Functionele patronen`, tekst: $localize`:@@dashboard.actie.concepten.tekst:Bekijk de FP/TEA-bouwstenen van deze POC.`, actie: $localize`:@@dashboard.actie.concepten.actie:Bekijk patronen` },\n { to: '/brief', titel: $localize`:@@dashboard.actie.brief.titel:Brief opstellen`, tekst: $localize`:@@dashboard.actie.brief.tekst:Stel een brief samen uit vaste en vrije onderdelen.`, actie: $localize`:@@dashboard.actie.brief.actie:Start brief` },\n ];\n}\n", + "sourceCode": "import { Component, computed, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { SkeletonComponent } from '@shared/ui/skeleton/skeleton.component';\nimport { DataRowComponent } from '@shared/ui/data-row/data-row.component';\nimport { DataBlockComponent } from '@shared/ui/data-block/data-block.component';\nimport { TaskListComponent } from '@shared/ui/task-list/task-list.component';\nimport { ApplicationListComponent } from '@shared/ui/application-list/application-list.component';\nimport { ApplicationLinkComponent } from '@shared/ui/application-link/application-link.component';\nimport { ChoiceListComponent } from '@shared/ui/choice-list/choice-list.component';\nimport { ASYNC } from '@shared/ui/async/async.component';\nimport { RegistrationSummaryComponent } from '@registratie/ui/registration-summary/registration-summary.component';\nimport { RegistrationTableComponent } from '@registratie/ui/registration-table/registration-table.component';\nimport { AanvraagBlockComponent } from '@registratie/ui/aanvraag-block/aanvraag-block.component';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\nimport { ApplicationsStore } from '@registratie/application/applications.store';\nimport { Registration } from '@registratie/domain/registration';\nimport { Aanvraag, AanvraagType } from '@registratie/domain/aanvraag';\nimport { tasksFromProfile } from '@registratie/domain/tasks';\n\n/** Page:\"Mijn overzicht\" — the portal home, following the NL Design System\n\"Mijn omgeving\" pattern (side nav +\"Wat moet ik regelen\" +\"Mijn zaken\"). */\n@Component({\n selector: 'app-dashboard-page',\n imports: [\n PageShellComponent, HeadingComponent, AlertComponent, SkeletonComponent,\n DataRowComponent, DataBlockComponent, TaskListComponent, ApplicationListComponent, ApplicationLinkComponent,\n ChoiceListComponent, ...ASYNC,\n RegistrationSummaryComponent, RegistrationTableComponent, AanvraagBlockComponent,\n ],\n template: `\n \n
\n @if (aanvragen().length) {\n
\n @for (a of concepten(); track a.id) {\n \n }\n @if (ingediend().length) {\n \n @for (a of ingediend(); track a.id) {\n \n }\n \n }\n
\n }\n\n @if (store.pendingHerregistratie()) {\n Uw herregistratie-aanvraag is in behandeling.\n }\n\n \n \n @let tasks = tasksFor($any(p).registration);\n\n
\n @if (tasks.length) {\n \n } @else {\n Wat moet ik regelen\n

U heeft op dit moment niets openstaan.

\n }\n
\n\n
\n Mijn registratie\n
\n \n
\n \n
\n
\n
\n
\n
\n
\n \n \n \n
\n\n
\n Specialismen en aantekeningen\n
\n \n \n \n \n \n \n \n \n

U heeft nog geen specialismen of aantekeningen.

\n
\n
\n
\n
\n\n
\n Wat wilt u doen?\n \n @for (a of acties; track a.to) {\n \n }\n \n
\n
\n
\n `,\n})\nexport class DashboardPage {\n protected store = inject(BigProfileStore);\n private apps = inject(ApplicationsStore);\n private router = inject(Router);\n\n constructor() {\n // Re-fetch on each visit so server-computed auto-approval transitions show up\n // (Concept → In behandeling → Goedgekeurd after the processing window).\n this.apps.reload();\n }\n\n /** The user's applications, sorted Concept → In behandeling → resolved. Empty →\n the\"Mijn aanvragen\" section is hidden (see template). */\n protected aanvragen = computed(() => {\n const rd = this.apps.applications();\n if (rd.tag !== 'Success') return [];\n const order: Record = { Concept: 0, InBehandeling: 1, Goedgekeurd: 2, Afgewezen: 2 };\n return rd.value.slice().sort((a, b) => order[a.status.tag] - order[b.status.tag]);\n });\n /** A Concept (\"lopende aanvraag\") renders as a melding above the list; the rest\n as keuzelijst items — the two shapes need different HTML contexts. */\n protected concepten = computed(() => this.aanvragen().filter((a) => a.status.tag === 'Concept'));\n protected ingediend = computed(() => this.aanvragen().filter((a) => a.status.tag !== 'Concept'));\n\n private readonly resumeRoutes: Record = {\n registratie: '/registreren',\n herregistratie: '/herregistratie',\n intake: '/intake',\n };\n protected resume(a: Aanvraag) {\n void this.router.navigate([this.resumeRoutes[a.type]], { queryParams: { aanvraag: a.id } });\n }\n protected cancelAanvraag(a: Aanvraag) {\n void this.apps.cancel(a.id);\n }\n\n /** Server-computed eligibility (rendered, not recomputed). */\n private readonly eligible = computed(() => {\n const d = this.store.decisions();\n return d.tag === 'Success' && d.value.eligibleForHerregistratie;\n });\n\n protected tasksFor(reg: Registration) {\n return tasksFromProfile(reg, this.eligible());\n }\n\n /** Primary transactional actions, as an \"aanvragen\" list (see CIBG's\n componenten/aanvragen). The core portal sections live in the header nav now;\n the teaching pages (concepts/brief) are only reachable from here. */\n protected readonly acties = [\n { to: '/registreren', titel: $localize`:@@dashboard.actie.inschrijven.titel:Inschrijven`, tekst: $localize`:@@dashboard.actie.inschrijven.tekst:Schrijf u in in het BIG-register via de registratiewizard.`, actie: $localize`:@@dashboard.actie.inschrijven.actie:Start inschrijving` },\n { to: '/herregistratie', titel: $localize`:@@dashboard.actie.herregistratie.titel:Herregistratie aanvragen`, tekst: $localize`:@@dashboard.actie.herregistratie.tekst:Verleng uw registratie voor de komende periode.`, actie: $localize`:@@dashboard.actie.herregistratie.actie:Vraag aan` },\n { to: '/intake', titel: $localize`:@@dashboard.actie.intake.titel:Herregistratie-intake`, tekst: $localize`:@@dashboard.actie.intake.tekst:Vragenlijst met vertakkingen.`, actie: $localize`:@@dashboard.actie.intake.actie:Start intake` },\n { to: '/registratie', titel: $localize`:@@dashboard.actie.wijzigen.titel:Gegevens wijzigen`, tekst: $localize`:@@dashboard.actie.wijzigen.tekst:Bekijk uw gegevens of geef een wijziging door.`, actie: $localize`:@@dashboard.actie.wijzigen.actie:Bekijk gegevens` },\n { to: '/concepts', titel: $localize`:@@dashboard.actie.concepten.titel:Functionele patronen`, tekst: $localize`:@@dashboard.actie.concepten.tekst:Bekijk de FP/TEA-bouwstenen van deze POC.`, actie: $localize`:@@dashboard.actie.concepten.actie:Bekijk patronen` },\n { to: '/brief', titel: $localize`:@@dashboard.actie.brief.titel:Brief opstellen`, tekst: $localize`:@@dashboard.actie.brief.tekst:Stel een brief samen uit vaste en vrije onderdelen.`, actie: $localize`:@@dashboard.actie.brief.actie:Start brief` },\n ];\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -13590,24 +13590,112 @@ "deprecated": false, "deprecationMessage": "", "args": [], - "line": 119 + "line": 117 }, "extends": [] }, { - "name": "DataRowComponent", - "id": "component-DataRowComponent-002a1d88162fce122229333fbef8373023a211faf61de82cec0405773184b44afcd74c49ae0e8f957b46b8e5f6b1b66c12a6666e7cb1814003ea6a07ea3c76c7", - "file": "src/app/shared/ui/data-row/data-row.component.ts", + "name": "DataBlockComponent", + "id": "component-DataBlockComponent-3c7b0265fe8f84bb954cb85c2e100e2b591cf5da8ccbc0d65db14c3322de61e525f9b27e7e40e2e7deab456169cf8540bbd047a3b59fc5d7629a6c93e0481d90", + "file": "src/app/shared/ui/data-block/data-block.component.ts", "encapsulation": [], "entryComponents": [], "inputs": [], "outputs": [], "providers": [], - "selector": "app-data-row", + "selector": "app-data-block", "styleUrls": [], - "styles": [ - ":host{display:contents}" + "styles": [], + "template": "@if (heading()) { {{ heading() }} }\n
\n
\n
\n \n
\n
\n
\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "ariaLabel", + "defaultValue": "''", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "

Accessible name for the <dl> when there is no visible heading.

\n", + "line": 32, + "rawdescription": "\nAccessible name for the `
` when there is no visible heading.", + "required": false + }, + { + "name": "heading", + "defaultValue": "''", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 26, + "required": false + }, + { + "name": "level", + "defaultValue": "3", + "deprecated": false, + "deprecationMessage": "", + "type": "1 | 2 | 3 | 4 | 5", + "indexKey": "", + "optional": false, + "description": "

Heading level when heading is set (default h3, matching app-card).

\n", + "line": 28, + "rawdescription": "\nHeading level when `heading` is set (default h3, matching `app-card`).", + "required": false + }, + { + "name": "stacked", + "defaultValue": "false", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "

Stacks label above value (.data-block--stacked) for long content.

\n", + "line": 30, + "rawdescription": "\nStacks label above value (`.data-block--stacked`) for long content.", + "required": false + } ], + "outputsClass": [], + "propertiesClass": [], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "HeadingComponent", + "type": "component" + } + ], + "description": "

Molecule: CIBG Huisstijl Datablock (designsystem.cibg.nl/componenten/datablock)\n— THE way to show user/application data. A grey .data-block surface holds a white\n.block-wrapper panel with a <dl> of projected <app-data-row>s. Use stacked\n(.data-block--stacked) when labels/values are long and should stack. Replaces the\napp-card + dl idiom for data views (the datablock carries its own surface, so it is\nNOT wrapped in an app-card — see WP-12). When there is no visible heading, pass an\nariaLabel so the definition list is announced.

\n", + "rawdescription": "\nMolecule: CIBG Huisstijl **Datablock** (designsystem.cibg.nl/componenten/datablock)\n— THE way to show user/application data. A grey `.data-block` surface holds a white\n`.block-wrapper` panel with a `
` of projected ``s. Use `stacked`\n(`.data-block--stacked`) when labels/values are long and should stack. Replaces the\n`app-card + dl` idiom for data views (the datablock carries its own surface, so it is\nNOT wrapped in an `app-card` — see WP-12). When there is no visible `heading`, pass an\n`ariaLabel` so the definition list is announced.", + "type": "component", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\n\n/** Molecule: CIBG Huisstijl **Datablock** (designsystem.cibg.nl/componenten/datablock)\n — THE way to show user/application data. A grey `.data-block` surface holds a white\n `.block-wrapper` panel with a `
` of projected ``s. Use `stacked`\n (`.data-block--stacked`) when labels/values are long and should stack. Replaces the\n `app-card + dl` idiom for data views (the datablock carries its own surface, so it is\n NOT wrapped in an `app-card` — see WP-12). When there is no visible `heading`, pass an\n `ariaLabel` so the definition list is announced. */\n@Component({\n selector: 'app-data-block',\n imports: [HeadingComponent],\n template: `\n @if (heading()) { {{ heading() }} }\n
\n
\n
\n \n
\n
\n
\n `,\n})\nexport class DataBlockComponent {\n heading = input('');\n /** Heading level when `heading` is set (default h3, matching `app-card`). */\n level = input<1 | 2 | 3 | 4 | 5>(3);\n /** Stacks label above value (`.data-block--stacked`) for long content. */\n stacked = input(false);\n /** Accessible name for the `
` when there is no visible heading. */\n ariaLabel = input('');\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "", + "extends": [] + }, + { + "name": "DataRowComponent", + "id": "component-DataRowComponent-700c998e97f974b95a9a47cee45594ae1f691ed43d96d502c59f3950984ca9e11ba486c6f83df19afeb2923705a502d1f91edc876f2e7c0037ca1d71ab363243", + "file": "src/app/shared/ui/data-row/data-row.component.ts", + "encapsulation": [], + "entryComponents": [], + "host": {}, + "inputs": [], + "outputs": [], + "providers": [], + "selector": "div[app-data-row]", + "styleUrls": [], + "styles": [], "template": "
{{ key() }}
\n
{{ value() }}
\n", "templateUrl": [], "viewProviders": [], @@ -13621,7 +13709,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 16, + "line": 21, "required": true }, { @@ -13633,7 +13721,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 17, + "line": 22, "required": false } ], @@ -13646,13 +13734,13 @@ "hostListeners": [], "standalone": false, "imports": [], - "description": "

Molecule: one key/value row in a CIBG Huisstijl "controlestap" data summary\n(dt.col-md-4 / dd.col-md-8). display:contents so the dt/dd become direct\nflex children of the parent <dl class="row"> — the Bootstrap grid classes\nneed that to lay out correctly. Wrap several in a <dl class="row mb-0">.

\n", - "rawdescription": "\nMolecule: one key/value row in a CIBG Huisstijl \"controlestap\" data summary\n(`dt.col-md-4` / `dd.col-md-8`). `display:contents` so the dt/dd become direct\nflex children of the parent `
` — the Bootstrap grid classes\nneed that to lay out correctly. Wrap several in a `
`.", + "description": "

Molecule: one key/value row inside a CIBG Huisstijl Datablock (see\ndata-block.component.ts) — the row primitive of the datablock/controlestap\ndata summary. Used on a <div> so the <dl>'s direct child is a native element\n(the HTML5.1 dl > div > dt + dd grouping), which keeps the definition list\naxe-clean — a bare custom element between <dl> and its <dt>/<dd> trips axe's\ndefinition-list rule regardless of display:contents. The host is the Bootstrap\n.row; dt.col-md-4/dd.col-md-8 give the label/value widths. Wrap several in a\n<dl class="mb-0"> (a <app-data-block>). Project custom content (e.g. a badge)\ninto the <dd> via <ng-content>.

\n", + "rawdescription": "\nMolecule: one key/value row inside a CIBG Huisstijl **Datablock** (see\n`data-block.component.ts`) — the row primitive of the datablock/`controlestap`\ndata summary. Used on a `
` so the `
`'s direct child is a native element\n(the HTML5.1 `dl > div > dt + dd` grouping), which keeps the definition list\naxe-clean — a bare custom element between `
` and its `
/
` trips axe's\ndefinition-list rule regardless of `display:contents`. The host is the Bootstrap\n`.row`; `dt.col-md-4`/`dd.col-md-8` give the label/value widths. Wrap several in a\n`
` (a ``). Project custom content (e.g. a badge)\ninto the `
` via ``.", "type": "component", - "sourceCode": "import { Component, input } from '@angular/core';\n\n/** Molecule: one key/value row in a CIBG Huisstijl \"controlestap\" data summary\n (`dt.col-md-4` / `dd.col-md-8`). `display:contents` so the dt/dd become direct\n flex children of the parent `
` — the Bootstrap grid classes\n need that to lay out correctly. Wrap several in a `
`. */\n@Component({\n selector: 'app-data-row',\n styles: [`:host{display:contents}`],\n template: `\n
{{ key() }}
\n
{{ value() }}
\n `,\n})\nexport class DataRowComponent {\n key = input.required();\n value = input('');\n}\n", + "sourceCode": "import { Component, input } from '@angular/core';\n\n/** Molecule: one key/value row inside a CIBG Huisstijl **Datablock** (see\n `data-block.component.ts`) — the row primitive of the datablock/`controlestap`\n data summary. Used on a `
` so the `
`'s direct child is a native element\n (the HTML5.1 `dl > div > dt + dd` grouping), which keeps the definition list\n axe-clean — a bare custom element between `
` and its `
/
` trips axe's\n definition-list rule regardless of `display:contents`. The host is the Bootstrap\n `.row`; `dt.col-md-4`/`dd.col-md-8` give the label/value widths. Wrap several in a\n `
` (a ``). Project custom content (e.g. a badge)\n into the `
` via ``. */\n@Component({\n selector: 'div[app-data-row]',\n host: { class: 'row' },\n template: `\n
{{ key() }}
\n
{{ value() }}
\n `,\n})\nexport class DataRowComponent {\n key = input.required();\n value = input('');\n}\n", "assetsDirs": [], "styleUrlsData": "", - "stylesData": ":host{display:contents}\n", + "stylesData": "", "extends": [] }, { @@ -15515,7 +15603,7 @@ }, { "name": "IntakeWizardComponent", - "id": "component-IntakeWizardComponent-bda7aa46dbc7ddafdbd7d89444d06a03e087e92701c3f8ce5a12819757dddc0d73b2ad443bb3a580af1744375e8866fe9673960f8b2cdb5175c04221da1b8bc5", + "id": "component-IntakeWizardComponent-7b6ba6b6b8e98e6773c3038edd0203bdaabb83f21b5a32d45db26fa3a200cf6bdb85b6a158b978df99582980284a74188986c46de9c21c50de98e4ef097615f1", "file": "src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts", "encapsulation": [], "entryComponents": [], @@ -15525,7 +15613,7 @@ "selector": "app-intake-wizard", "styleUrls": [], "styles": [], - "template": " 0\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\"\n (goToStep)=\"dispatch({ tag: 'GaNaarStap', cursor: $event })\">\n\n @switch (step()) {\n @case ('buitenland') {\n \n \n \n @if (answers().buitenlandGewerkt === 'ja') {\n \n \n \n \n \n \n }\n }\n @case ('werk') {\n \n \n \n @if (scholingZichtbaar()) {\n \n \n \n }\n @if (answers().scholingGevolgd === 'ja') {\n \n \n \n }\n }\n @case ('review') {\n Controleer uw antwoorden en dien de aanvraag in.\n \n \n @if (answers().buitenlandGewerkt === 'ja') {\n \n \n }\n \n \n \n @if (scholingZichtbaar()) {\n \n }\n @if (answers().scholingGevolgd === 'ja') {\n \n }\n \n }\n }\n\n
\n \n
\n Opnieuw beginnen\n
\n
\n
\n\n", + "template": " 0\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\"\n (goToStep)=\"dispatch({ tag: 'GaNaarStap', cursor: $event })\">\n\n @switch (step()) {\n @case ('buitenland') {\n \n \n \n @if (answers().buitenlandGewerkt === 'ja') {\n \n \n \n \n \n \n }\n }\n @case ('werk') {\n \n \n \n @if (scholingZichtbaar()) {\n \n \n \n }\n @if (answers().scholingGevolgd === 'ja') {\n \n \n \n }\n }\n @case ('review') {\n Controleer uw antwoorden en dien de aanvraag in.\n \n
\n @if (answers().buitenlandGewerkt === 'ja') {\n
\n
\n }\n
\n \n
\n @if (scholingZichtbaar()) {\n
\n }\n @if (answers().scholingGevolgd === 'ja') {\n
\n }\n
\n }\n }\n\n
\n \n
\n Opnieuw beginnen\n
\n
\n
\n\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -15985,7 +16073,7 @@ "description": "

Organism: a BRANCHING intake questionnaire. All state lives in one signal\ndriven by the pure reduce (intake.machine.ts). Which step renders is derived\nfrom the answers via visibleSteps, never stored — so editing an earlier\nanswer immediately changes the remaining steps. Answers are persisted to\nsessionStorage so a page reload keeps the user's progress (cleared on tab close).

\n", "rawdescription": "\nOrganism: a BRANCHING intake questionnaire. All state lives in one signal\ndriven by the pure `reduce` (intake.machine.ts). Which step renders is derived\nfrom the answers via `visibleSteps`, never stored — so editing an earlier\nanswer immediately changes the remaining steps. Answers are persisted to\nsessionStorage so a page reload keeps the user's progress (cleared on tab close).", "type": "component", - "sourceCode": "import { Component, computed, effect, inject, input, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormFieldComponent } from '@shared/ui/form-field/form-field.component';\nimport { TextInputComponent } from '@shared/ui/text-input/text-input.component';\nimport { RadioGroupComponent, JA_NEE } from '@shared/ui/radio-group/radio-group.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { DataRowComponent } from '@shared/ui/data-row/data-row.component';\nimport { ReviewSectionComponent } from '@shared/ui/review-section/review-section.component';\nimport { ConfirmationComponent } from '@shared/ui/confirmation/confirmation.component';\nimport { WizardShellComponent, WizardError, WizardStatus, naarStapLabel } from '@shared/layout/wizard-shell/wizard-shell.component';\nimport { createStore } from '@shared/application/store';\nimport { whenTag } from '@shared/kernel/fp';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\nimport {\n IntakeState,\n IntakeMsg,\n Answers,\n StepId,\n initial,\n reduce,\n STEPS,\n lageUren,\n hasProgress,\n SCHOLING_THRESHOLD_DEFAULT,\n} from '@herregistratie/domain/intake.machine';\nimport { createDraftSync } from '@registratie/application/draft-sync';\nimport { IntakePolicyStore } from '@herregistratie/application/intake-policy.store';\n\n/** Organism: a BRANCHING intake questionnaire. All state lives in one signal\n driven by the pure `reduce` (intake.machine.ts). Which step renders is derived\n from the answers via `visibleSteps`, never stored — so editing an earlier\n answer immediately changes the remaining steps. Answers are persisted to\n sessionStorage so a page reload keeps the user's progress (cleared on tab close). */\n@Component({\n selector: 'app-intake-wizard',\n imports: [FormsModule, FormFieldComponent, TextInputComponent, RadioGroupComponent, ButtonComponent, AlertComponent, DataRowComponent, ReviewSectionComponent, ConfirmationComponent, WizardShellComponent],\n template: `\n 0\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\"\n (goToStep)=\"dispatch({ tag: 'GaNaarStap', cursor: $event })\">\n\n @switch (step()) {\n @case ('buitenland') {\n \n \n \n @if (answers().buitenlandGewerkt === 'ja') {\n \n \n \n \n \n \n }\n }\n @case ('werk') {\n \n \n \n @if (scholingZichtbaar()) {\n \n \n \n }\n @if (answers().scholingGevolgd === 'ja') {\n \n \n \n }\n }\n @case ('review') {\n Controleer uw antwoorden en dien de aanvraag in.\n \n \n @if (answers().buitenlandGewerkt === 'ja') {\n \n \n }\n \n \n \n @if (scholingZichtbaar()) {\n \n }\n @if (answers().scholingGevolgd === 'ja') {\n \n }\n \n }\n }\n\n
\n \n
\n Opnieuw beginnen\n
\n
\n
\n \n `,\n})\nexport class IntakeWizardComponent {\n private profile = inject(BigProfileStore);\n // Server-owned policy (scholing threshold): fetched from the backend via the\n // application facade, not hardcoded. The backend stays the authority on submit.\n private policyStore = inject(IntakePolicyStore);\n private store = createStore(initial, reduce);\n\n /** Optional seed so Storybook / the showcase can mount any state directly. */\n seed = input(initial);\n\n readonly jaNee = JA_NEE;\n readonly state = this.store.model;\n readonly dispatch = this.store.dispatch;\n\n // Backend draft-sync (replaces sessionStorage); the intake has no uploads.\n private draftSync = createDraftSync({\n type: 'intake',\n snapshot: () => {\n const s = this.state();\n if (s.tag !== 'Answering' || !hasProgress(s)) return null;\n return { draft: s, stepIndex: s.cursor, stepCount: STEPS.length, documentIds: [] };\n },\n onResume: (draft) => this.dispatch({ tag: 'Seed', state: draft as IntakeState }),\n enabled: () => this.seed() === initial,\n });\n\n private answering = computed(() => whenTag(this.state(), 'Answering'));\n /** Public so the showcase can render the (fixed) step list next to the wizard. */\n readonly steps = STEPS;\n protected cursor = computed(() => this.answering()?.cursor ?? 0);\n protected answers = computed(() => this.answering()?.answers ?? {});\n protected step = computed(() => STEPS[Math.min(this.cursor(), STEPS.length - 1)]);\n /** Server-owned threshold from the policy endpoint (mirrored into machine state). */\n protected scholingThreshold = computed(() => this.answering()?.scholingThreshold ?? SCHOLING_THRESHOLD_DEFAULT);\n /** Whether the inline scholing question is shown (and required) in the 'werk' step. */\n protected scholingZichtbaar = computed(() => lageUren(this.answers(), this.scholingThreshold()));\n protected failedError = computed(() => whenTag(this.state(), 'Failed')?.error ?? '');\n\n // --- Presentational wiring for the shared wizard shell ---------------------\n readonly stepLabels = [$localize`:@@intake.step.buitenland:Buitenland`, $localize`:@@intake.step.werk:Werk`, $localize`:@@intake.step.controle:Controle`];\n private stepTitles: Record = {\n buitenland: $localize`:@@intake.title.buitenland:Werken in het buitenland`,\n werk: $localize`:@@intake.title.werk:Werkervaring in Nederland`,\n review: $localize`:@@intake.title.review:Controleren en indienen`,\n };\n protected stepTitle = computed(() => this.stepTitles[this.step()]);\n protected primaryLabel = computed(() => {\n if (this.step() === 'review') return $localize`:@@intake.indienen:Aanvraag indienen`;\n const next = this.cursor() + 1;\n return naarStapLabel(next + 1, this.stepLabels[next]);\n });\n protected errorMessage = computed(() => $localize`:@@wizard.indienenMislukt:Indienen mislukt:` + ` ${this.failedError()}`);\n protected shellStatus = computed(() => {\n switch (this.state().tag) {\n case 'Answering': return 'editing';\n case 'Submitting': return 'submitting';\n case 'Submitted': return 'submitted';\n case 'Failed': return 'failed';\n }\n });\n /** Current step's field errors, flattened for the shell's error summary. The\n field ids match the answer keys, so the summary anchors jump to the field. */\n protected errorList = computed(() => {\n const e = this.answering()?.errors ?? {};\n return (Object.keys(e) as (keyof Answers)[])\n .filter((k) => e[k])\n .map((k) => ({ id: k, message: e[k]! }));\n });\n\n protected err = (k: keyof Answers) => this.answering()?.errors[k] ?? '';\n protected set = (key: keyof Answers, value: string) => this.dispatch({ tag: 'SetAnswer', key, value });\n\n constructor() {\n // An explicit seed (stories/tests) wins; otherwise resume the backend draft\n // (`?aanvraag=`) or start fresh. Persistence is the draftSync controller's job.\n const seeded = this.seed();\n queueMicrotask(() => (seeded !== initial ? this.dispatch({ tag: 'Seed', state: seeded }) : this.draftSync.resume()));\n // Apply the server-owned threshold into machine state as it arrives. Track\n // only the policy value; untrack the dispatch (it reads the state signal\n // internally, which would otherwise make this effect loop on its own write).\n effect(() => {\n const scholingThreshold = this.policyStore.scholingThreshold();\n untracked(() => this.dispatch({ tag: 'SetPolicy', scholingThreshold }));\n });\n }\n\n onPrimary() {\n const s = this.state();\n if (s.tag !== 'Answering') return;\n this.dispatch(this.step() === 'review' ? { tag: 'Submit' } : { tag: 'Next' });\n this.runIfSubmitting();\n }\n\n onRetry() {\n this.dispatch({ tag: 'Retry' });\n this.runIfSubmitting();\n }\n\n restart() {\n this.draftSync.reset();\n this.dispatch({ tag: 'Seed', state: initial });\n }\n\n /** The effect: when we enter Submitting, submit through the aanvraag lifecycle,\n flip the optimistic cross-page flag, then dispatch the outcome (commit/rollback). */\n private async runIfSubmitting() {\n const s = this.state();\n if (s.tag !== 'Submitting') return;\n this.profile.beginHerregistratie();\n const r = await this.draftSync.submit({ uren: s.data.uren });\n if (r.ok) {\n this.dispatch({ tag: 'SubmitConfirmed' });\n this.profile.confirmHerregistratie();\n } else {\n this.dispatch({ tag: 'SubmitFailed', error: r.error });\n this.profile.rollbackHerregistratie();\n }\n }\n}\n", + "sourceCode": "import { Component, computed, effect, inject, input, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormFieldComponent } from '@shared/ui/form-field/form-field.component';\nimport { TextInputComponent } from '@shared/ui/text-input/text-input.component';\nimport { RadioGroupComponent, JA_NEE } from '@shared/ui/radio-group/radio-group.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { DataRowComponent } from '@shared/ui/data-row/data-row.component';\nimport { ReviewSectionComponent } from '@shared/ui/review-section/review-section.component';\nimport { ConfirmationComponent } from '@shared/ui/confirmation/confirmation.component';\nimport { WizardShellComponent, WizardError, WizardStatus, naarStapLabel } from '@shared/layout/wizard-shell/wizard-shell.component';\nimport { createStore } from '@shared/application/store';\nimport { whenTag } from '@shared/kernel/fp';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\nimport {\n IntakeState,\n IntakeMsg,\n Answers,\n StepId,\n initial,\n reduce,\n STEPS,\n lageUren,\n hasProgress,\n SCHOLING_THRESHOLD_DEFAULT,\n} from '@herregistratie/domain/intake.machine';\nimport { createDraftSync } from '@registratie/application/draft-sync';\nimport { IntakePolicyStore } from '@herregistratie/application/intake-policy.store';\n\n/** Organism: a BRANCHING intake questionnaire. All state lives in one signal\n driven by the pure `reduce` (intake.machine.ts). Which step renders is derived\n from the answers via `visibleSteps`, never stored — so editing an earlier\n answer immediately changes the remaining steps. Answers are persisted to\n sessionStorage so a page reload keeps the user's progress (cleared on tab close). */\n@Component({\n selector: 'app-intake-wizard',\n imports: [FormsModule, FormFieldComponent, TextInputComponent, RadioGroupComponent, ButtonComponent, AlertComponent, DataRowComponent, ReviewSectionComponent, ConfirmationComponent, WizardShellComponent],\n template: `\n 0\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\"\n (goToStep)=\"dispatch({ tag: 'GaNaarStap', cursor: $event })\">\n\n @switch (step()) {\n @case ('buitenland') {\n \n \n \n @if (answers().buitenlandGewerkt === 'ja') {\n \n \n \n \n \n \n }\n }\n @case ('werk') {\n \n \n \n @if (scholingZichtbaar()) {\n \n \n \n }\n @if (answers().scholingGevolgd === 'ja') {\n \n \n \n }\n }\n @case ('review') {\n Controleer uw antwoorden en dien de aanvraag in.\n \n
\n @if (answers().buitenlandGewerkt === 'ja') {\n
\n
\n }\n
\n \n
\n @if (scholingZichtbaar()) {\n
\n }\n @if (answers().scholingGevolgd === 'ja') {\n
\n }\n
\n }\n }\n\n
\n \n
\n Opnieuw beginnen\n
\n
\n
\n \n `,\n})\nexport class IntakeWizardComponent {\n private profile = inject(BigProfileStore);\n // Server-owned policy (scholing threshold): fetched from the backend via the\n // application facade, not hardcoded. The backend stays the authority on submit.\n private policyStore = inject(IntakePolicyStore);\n private store = createStore(initial, reduce);\n\n /** Optional seed so Storybook / the showcase can mount any state directly. */\n seed = input(initial);\n\n readonly jaNee = JA_NEE;\n readonly state = this.store.model;\n readonly dispatch = this.store.dispatch;\n\n // Backend draft-sync (replaces sessionStorage); the intake has no uploads.\n private draftSync = createDraftSync({\n type: 'intake',\n snapshot: () => {\n const s = this.state();\n if (s.tag !== 'Answering' || !hasProgress(s)) return null;\n return { draft: s, stepIndex: s.cursor, stepCount: STEPS.length, documentIds: [] };\n },\n onResume: (draft) => this.dispatch({ tag: 'Seed', state: draft as IntakeState }),\n enabled: () => this.seed() === initial,\n });\n\n private answering = computed(() => whenTag(this.state(), 'Answering'));\n /** Public so the showcase can render the (fixed) step list next to the wizard. */\n readonly steps = STEPS;\n protected cursor = computed(() => this.answering()?.cursor ?? 0);\n protected answers = computed(() => this.answering()?.answers ?? {});\n protected step = computed(() => STEPS[Math.min(this.cursor(), STEPS.length - 1)]);\n /** Server-owned threshold from the policy endpoint (mirrored into machine state). */\n protected scholingThreshold = computed(() => this.answering()?.scholingThreshold ?? SCHOLING_THRESHOLD_DEFAULT);\n /** Whether the inline scholing question is shown (and required) in the 'werk' step. */\n protected scholingZichtbaar = computed(() => lageUren(this.answers(), this.scholingThreshold()));\n protected failedError = computed(() => whenTag(this.state(), 'Failed')?.error ?? '');\n\n // --- Presentational wiring for the shared wizard shell ---------------------\n readonly stepLabels = [$localize`:@@intake.step.buitenland:Buitenland`, $localize`:@@intake.step.werk:Werk`, $localize`:@@intake.step.controle:Controle`];\n private stepTitles: Record = {\n buitenland: $localize`:@@intake.title.buitenland:Werken in het buitenland`,\n werk: $localize`:@@intake.title.werk:Werkervaring in Nederland`,\n review: $localize`:@@intake.title.review:Controleren en indienen`,\n };\n protected stepTitle = computed(() => this.stepTitles[this.step()]);\n protected primaryLabel = computed(() => {\n if (this.step() === 'review') return $localize`:@@intake.indienen:Aanvraag indienen`;\n const next = this.cursor() + 1;\n return naarStapLabel(next + 1, this.stepLabels[next]);\n });\n protected errorMessage = computed(() => $localize`:@@wizard.indienenMislukt:Indienen mislukt:` + ` ${this.failedError()}`);\n protected shellStatus = computed(() => {\n switch (this.state().tag) {\n case 'Answering': return 'editing';\n case 'Submitting': return 'submitting';\n case 'Submitted': return 'submitted';\n case 'Failed': return 'failed';\n }\n });\n /** Current step's field errors, flattened for the shell's error summary. The\n field ids match the answer keys, so the summary anchors jump to the field. */\n protected errorList = computed(() => {\n const e = this.answering()?.errors ?? {};\n return (Object.keys(e) as (keyof Answers)[])\n .filter((k) => e[k])\n .map((k) => ({ id: k, message: e[k]! }));\n });\n\n protected err = (k: keyof Answers) => this.answering()?.errors[k] ?? '';\n protected set = (key: keyof Answers, value: string) => this.dispatch({ tag: 'SetAnswer', key, value });\n\n constructor() {\n // An explicit seed (stories/tests) wins; otherwise resume the backend draft\n // (`?aanvraag=`) or start fresh. Persistence is the draftSync controller's job.\n const seeded = this.seed();\n queueMicrotask(() => (seeded !== initial ? this.dispatch({ tag: 'Seed', state: seeded }) : this.draftSync.resume()));\n // Apply the server-owned threshold into machine state as it arrives. Track\n // only the policy value; untrack the dispatch (it reads the state signal\n // internally, which would otherwise make this effect loop on its own write).\n effect(() => {\n const scholingThreshold = this.policyStore.scholingThreshold();\n untracked(() => this.dispatch({ tag: 'SetPolicy', scholingThreshold }));\n });\n }\n\n onPrimary() {\n const s = this.state();\n if (s.tag !== 'Answering') return;\n this.dispatch(this.step() === 'review' ? { tag: 'Submit' } : { tag: 'Next' });\n this.runIfSubmitting();\n }\n\n onRetry() {\n this.dispatch({ tag: 'Retry' });\n this.runIfSubmitting();\n }\n\n restart() {\n this.draftSync.reset();\n this.dispatch({ tag: 'Seed', state: initial });\n }\n\n /** The effect: when we enter Submitting, submit through the aanvraag lifecycle,\n flip the optimistic cross-page flag, then dispatch the outcome (commit/rollback). */\n private async runIfSubmitting() {\n const s = this.state();\n if (s.tag !== 'Submitting') return;\n this.profile.beginHerregistratie();\n const r = await this.draftSync.submit({ uren: s.data.uren });\n if (r.ok) {\n this.dispatch({ tag: 'SubmitConfirmed' });\n this.profile.confirmHerregistratie();\n } else {\n this.dispatch({ tag: 'SubmitFailed', error: r.error });\n this.profile.rollbackHerregistratie();\n }\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -18129,7 +18217,7 @@ }, { "name": "RegistratieWizardComponent", - "id": "component-RegistratieWizardComponent-ba2c674ab681ab986914fb38da77932c3dd88b94f5b7e2e95e4838f2bed9141ef7af97d97f8ef36a28760184d38828f9020373a104d71ed68a3a2d30982d339d", + "id": "component-RegistratieWizardComponent-dfda02e63388faa6d885924ae49f12ad44cc873e3c79993ef01ef844d046c5659282dd8fdc3dd014e77461b1642758eec277b168959185c7db46884796a5b56a", "file": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", "encapsulation": [], "entryComponents": [], @@ -18139,7 +18227,7 @@ "selector": "app-registratie-wizard", "styleUrls": [], "styles": [], - "template": " 0\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n i18n-submittingLabel=\"@@regWizard.submitting\" submittingLabel=\"Uw registratie wordt verwerkt…\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\"\n (goToStep)=\"dispatch({ tag: 'GaNaarStap', cursor: $event })\">\n\n @switch (step()) {\n @case ('adres') {\n @if (adresStatus() === 'laden') {\n \n } @else {\n @switch (adresStatus()) {\n @case ('gevonden') {\n Vooraf ingevuld op basis van de BRP. Controleer en pas zo nodig aan.\n }\n @case ('geen') {\n We vonden geen adres in de BRP. Vul uw adres hieronder handmatig in.\n }\n @case ('fout') {\n We konden de BRP nu niet bereiken. Vul uw adres hieronder handmatig in.\n }\n }\n \n \n \n \n @if (draft().correspondentie === 'email') {\n \n \n \n }\n }\n }\n @case ('beroep') {\n \n \n \n \n \n\n @if (handmatigActief()) {\n Een handmatig ingevoerd diploma kan niet automatisch worden geverifieerd. Kies uw beroep en beantwoord de aanvullende vragen; uw aanvraag wordt daarna handmatig beoordeeld.\n \n \n \n } @else if (draft().beroep) {\n
\n \n
\n }\n\n @for (q of actieveVragen($any(data)); track q.id) {\n \n @if (q.type === 'ja-nee') {\n \n } @else {\n \n }\n \n }\n
\n \n \n \n
\n\n \n @if (err('documenten')) {\n {{ err('documenten') }}\n }\n }\n @case ('controle') {\n Controleer uw gegevens en dien de registratie in.\n \n \n \n \n @if (draft().correspondentie === 'email') {\n \n }\n \n \n \n \n @for (item of samenvattingVragen(); track item.vraag) {\n \n }\n \n }\n }\n\n
\n \n

Uw referentienummer is {{ referentie() }}. Bewaar dit nummer voor uw administratie.

\n
\n Nieuwe registratie starten\n
\n
\n
\n\n", + "template": " 0\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n i18n-submittingLabel=\"@@regWizard.submitting\" submittingLabel=\"Uw registratie wordt verwerkt…\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\"\n (goToStep)=\"dispatch({ tag: 'GaNaarStap', cursor: $event })\">\n\n @switch (step()) {\n @case ('adres') {\n @if (adresStatus() === 'laden') {\n \n } @else {\n @switch (adresStatus()) {\n @case ('gevonden') {\n Vooraf ingevuld op basis van de BRP. Controleer en pas zo nodig aan.\n }\n @case ('geen') {\n We vonden geen adres in de BRP. Vul uw adres hieronder handmatig in.\n }\n @case ('fout') {\n We konden de BRP nu niet bereiken. Vul uw adres hieronder handmatig in.\n }\n }\n \n \n \n \n @if (draft().correspondentie === 'email') {\n \n \n \n }\n }\n }\n @case ('beroep') {\n \n \n \n \n \n\n @if (handmatigActief()) {\n Een handmatig ingevoerd diploma kan niet automatisch worden geverifieerd. Kies uw beroep en beantwoord de aanvullende vragen; uw aanvraag wordt daarna handmatig beoordeeld.\n \n \n \n } @else if (draft().beroep) {\n
\n
\n
\n }\n\n @for (q of actieveVragen($any(data)); track q.id) {\n \n @if (q.type === 'ja-nee') {\n \n } @else {\n \n }\n \n }\n
\n \n \n \n
\n\n \n @if (err('documenten')) {\n {{ err('documenten') }}\n }\n }\n @case ('controle') {\n Controleer uw gegevens en dien de registratie in.\n \n
\n
\n
\n @if (draft().correspondentie === 'email') {\n
\n }\n
\n \n
\n
\n @for (item of samenvattingVragen(); track item.vraag) {\n
\n }\n
\n }\n }\n\n
\n \n

Uw referentienummer is {{ referentie() }}. Bewaar dit nummer voor uw administratie.

\n
\n Nieuwe registratie starten\n
\n
\n
\n\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -18926,7 +19014,7 @@ "description": "

Organism: the BIG-registration wizard. All state lives in one signal driven by\nthe pure reduce (registratie-wizard.machine.ts). The BRP address prefills the\ndraft via an effect; the DUO diploma list renders through ; choosing\na diploma reveals its server-derived beroep. The draft is persisted to the\nbackend as a Concept aanvraag (createDraftSync) so a reload — or a"Verder gaan"\nfrom the dashboard via ?aanvraag=<id> — resumes progress. Built from existing\natoms/molecules.

\n", "rawdescription": "\nOrganism: the BIG-registration wizard. All state lives in one signal driven by\nthe pure `reduce` (registratie-wizard.machine.ts). The BRP address prefills the\ndraft via an effect; the DUO diploma list renders through ; choosing\na diploma reveals its server-derived beroep. The draft is persisted to the\nbackend as a Concept aanvraag (createDraftSync) so a reload — or a\"Verder gaan\"\nfrom the dashboard via `?aanvraag=` — resumes progress. Built from existing\natoms/molecules.", "type": "component", - "sourceCode": "import { Component, computed, effect, inject, input, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormFieldComponent } from '@shared/ui/form-field/form-field.component';\nimport { TextInputComponent } from '@shared/ui/text-input/text-input.component';\nimport { RadioGroupComponent, JA_NEE } from '@shared/ui/radio-group/radio-group.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { SkeletonComponent } from '@shared/ui/skeleton/skeleton.component';\nimport { DataRowComponent } from '@shared/ui/data-row/data-row.component';\nimport { ReviewSectionComponent } from '@shared/ui/review-section/review-section.component';\nimport { ConfirmationComponent } from '@shared/ui/confirmation/confirmation.component';\nimport { WizardShellComponent, WizardError, WizardStatus, naarStapLabel } from '@shared/layout/wizard-shell/wizard-shell.component';\nimport { ASYNC } from '@shared/ui/async/async.component';\nimport { AddressFieldsComponent } from '@registratie/ui/address-fields/address-fields.component';\nimport { createStore } from '@shared/application/store';\nimport { whenTag } from '@shared/kernel/fp';\nimport { RemoteData } from '@shared/application/remote-data';\nimport { RegistratieLookupStore } from '@registratie/application/registratie-lookup.store';\nimport { DuoLookupDto, PolicyQuestionDto } from '@registratie/contracts/duo-diplomas.dto';\nimport {\n RegistratieState,\n RegistratieMsg,\n Draft,\n DraftField,\n Correspondentie,\n StepId,\n initial,\n reduce,\n hasProgress,\n STEPS,\n} from '@registratie/domain/registratie-wizard.machine';\nimport { createDraftSync } from '@registratie/application/draft-sync';\nimport { DocumentUploadComponent } from '@shared/ui/upload/document-upload/document-upload.component';\nimport { createUploadController } from '@shared/upload/upload-controller';\nimport { UploadAdapter } from '@shared/upload/upload.adapter';\nimport { UploadState, initialUpload, deliveryRefs } from '@shared/upload/upload.machine';\n\nconst KANALEN = [\n { value: 'email', label: $localize`:@@registratie.kanaalEmail:E-mail` },\n { value: 'post', label: $localize`:@@registratie.kanaalPost:Post` },\n];\nconst HANDMATIG = '__handmatig__'; // sentinel option:\"my diploma isn't listed\"\n/** The server-owned geldigheidsvraag whose\"ja\" answer requires a Dutch-taalvaardigheid\n upload (proof of the confirmed B2 level). Stable id shared with the backend. */\nconst NL_TAALVAARDIGHEID_VRAAG = 'nl-taalvaardigheid';\n\n/** Organism: the BIG-registration wizard. All state lives in one signal driven by\n the pure `reduce` (registratie-wizard.machine.ts). The BRP address prefills the\n draft via an effect; the DUO diploma list renders through ; choosing\n a diploma reveals its server-derived beroep. The draft is persisted to the\n backend as a Concept aanvraag (createDraftSync) so a reload — or a\"Verder gaan\"\n from the dashboard via `?aanvraag=` — resumes progress. Built from existing\n atoms/molecules. */\n@Component({\n selector: 'app-registratie-wizard',\n imports: [\n FormsModule, FormFieldComponent, TextInputComponent, RadioGroupComponent, ButtonComponent,\n AlertComponent, SkeletonComponent, DataRowComponent, ReviewSectionComponent, ConfirmationComponent, WizardShellComponent,\n AddressFieldsComponent, DocumentUploadComponent, ...ASYNC,\n ],\n template: `\n 0\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n i18n-submittingLabel=\"@@regWizard.submitting\" submittingLabel=\"Uw registratie wordt verwerkt…\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\"\n (goToStep)=\"dispatch({ tag: 'GaNaarStap', cursor: $event })\">\n\n @switch (step()) {\n @case ('adres') {\n @if (adresStatus() === 'laden') {\n \n } @else {\n @switch (adresStatus()) {\n @case ('gevonden') {\n Vooraf ingevuld op basis van de BRP. Controleer en pas zo nodig aan.\n }\n @case ('geen') {\n We vonden geen adres in de BRP. Vul uw adres hieronder handmatig in.\n }\n @case ('fout') {\n We konden de BRP nu niet bereiken. Vul uw adres hieronder handmatig in.\n }\n }\n \n \n \n \n @if (draft().correspondentie === 'email') {\n \n \n \n }\n }\n }\n @case ('beroep') {\n \n \n \n \n \n\n @if (handmatigActief()) {\n Een handmatig ingevoerd diploma kan niet automatisch worden geverifieerd. Kies uw beroep en beantwoord de aanvullende vragen; uw aanvraag wordt daarna handmatig beoordeeld.\n \n \n \n } @else if (draft().beroep) {\n
\n \n
\n }\n\n @for (q of actieveVragen($any(data)); track q.id) {\n \n @if (q.type === 'ja-nee') {\n \n } @else {\n \n }\n \n }\n
\n \n \n \n
\n\n \n @if (err('documenten')) {\n {{ err('documenten') }}\n }\n }\n @case ('controle') {\n Controleer uw gegevens en dien de registratie in.\n \n \n \n \n @if (draft().correspondentie === 'email') {\n \n }\n \n \n \n \n @for (item of samenvattingVragen(); track item.vraag) {\n \n }\n \n }\n }\n\n
\n \n

Uw referentienummer is {{ referentie() }}. Bewaar dit nummer voor uw administratie.

\n
\n Nieuwe registratie starten\n
\n
\n
\n \n `,\n})\nexport class RegistratieWizardComponent {\n private lookup = inject(RegistratieLookupStore);\n private uploadAdapter = inject(UploadAdapter);\n private store = createStore(initial, reduce);\n\n /** Preview/download link for a completed upload; the dev-simulation `demo-*` ids\n have no stored bytes, so they get no link. */\n protected previewUrlFor = (documentId: string): string | undefined =>\n documentId.startsWith('demo-') ? undefined : this.uploadAdapter.contentUrl(documentId);\n\n /** Optional seed so Storybook / tests can mount any state directly. */\n seed = input(initial);\n\n readonly kanalen = KANALEN;\n readonly stepLabels = [$localize`:@@regWizard.step.adres:Adres`, $localize`:@@regWizard.step.beroep:Beroep`, $localize`:@@regWizard.step.controle:Controle`]; // short labels for the stepper\n private stepTitles = [$localize`:@@regWizard.title.adres:Adres en correspondentievoorkeur`, $localize`:@@regWizard.title.beroep:Beroep op basis van uw diploma`, $localize`:@@regWizard.title.controle:Controleren en indienen`];\n readonly state = this.store.model;\n readonly dispatch = this.store.dispatch;\n\n private invullen = computed(() => whenTag(this.state(), 'Invullen'));\n protected cursor = computed(() => this.invullen()?.cursor ?? 0);\n protected draft = computed(() => this.invullen()?.draft ?? { antwoorden: {} });\n protected upload = computed(() => this.invullen()?.upload ?? initialUpload);\n protected uploadCtl = createUploadController({\n wizardId: 'registratie',\n getUpload: () => this.upload(),\n dispatch: (msg) => this.dispatch({ tag: 'Upload', msg }),\n // Required documents depend on answers (server decides): a diploma upload only for a\n // manual diploma; a Dutch-taalvaardigheid upload only once the applicant confirms\n // (\"ja\") the B2 language requirement.\n getCategoryParams: () => ({\n diplomaHerkomst: this.draft().diplomaHerkomst,\n taalvaardigheid: this.draft().antwoorden[NL_TAALVAARDIGHEID_VRAAG],\n }),\n });\n // Backend draft-sync (replaces sessionStorage): create a Concept once the user has\n // made progress, then debounced-sync the whole machine snapshot; resume by `?aanvraag`.\n private draftSync = createDraftSync({\n type: 'registratie',\n snapshot: () => {\n const s = this.state();\n if (s.tag !== 'Invullen' || !hasProgress(s)) return null;\n const documentIds = deliveryRefs(s.upload).filter((r) => r.channel === 'digital' && r.documentId).map((r) => r.documentId!);\n return { draft: s, stepIndex: s.cursor, stepCount: STEPS.length, documentIds };\n },\n onResume: (draft) => this.dispatch({ tag: 'Seed', state: draft as RegistratieState }),\n enabled: () => this.seed() === initial,\n });\n protected step = computed(() => STEPS[Math.min(this.cursor(), STEPS.length - 1)]);\n protected stepTitle = computed(() => this.stepTitles[Math.min(this.cursor(), this.stepTitles.length - 1)]);\n protected referentie = computed(() => whenTag(this.state(), 'Ingediend')?.referentie ?? '');\n protected failedError = computed(() => whenTag(this.state(), 'Mislukt')?.error ?? '');\n\n // --- Presentational wiring for the shared wizard shell ---------------------\n protected primaryLabel = computed(() => {\n if (this.step() === 'controle') return $localize`:@@regWizard.indienen:Registratie indienen`;\n const next = this.cursor() + 1;\n return naarStapLabel(next + 1, this.stepLabels[next]);\n });\n protected errorMessage = computed(() => $localize`:@@regWizard.indienenMislukt:Het indienen is niet gelukt:` + ` ${this.failedError()}`);\n protected shellStatus = computed(() => {\n switch (this.state().tag) {\n case 'Invullen': return 'editing';\n case 'Indienen': return 'submitting';\n case 'Ingediend': return 'submitted';\n case 'Mislukt': return 'failed';\n }\n });\n /** Current step's errors (incl. per-question), flattened for the error summary. */\n protected errorList = computed(() => {\n const e = this.invullen()?.errors ?? {};\n const out: WizardError[] = [];\n for (const [k, v] of Object.entries(e)) {\n if (k !== 'antwoorden' && typeof v === 'string' && v) out.push({ id: k, message: v });\n }\n for (const [qid, msg] of Object.entries(e.antwoorden ?? {})) {\n if (msg) out.push({ id: 'vraag-' + qid, message: msg });\n }\n return out;\n });\n protected adresSamenvatting = computed(() => {\n const d = this.draft();\n return [d.straat, [d.postcode, d.woonplaats].filter(Boolean).join(' ')].filter(Boolean).join(', ');\n });\n // Readable labels for the controle summary (instead of raw enum values).\n protected adresHerkomstLabel = computed(() => ({ brp: $localize`:@@regWizard.herkomst.adresBrp:Automatisch uit de BRP`, handmatig: $localize`:@@regWizard.herkomst.adresHandmatig:Handmatig ingevoerd` }[this.draft().adresHerkomst ?? 'handmatig']));\n protected correspondentieLabel = computed(() => ({ email: $localize`:@@regWizard.corr.email:Per e-mail`, post: $localize`:@@regWizard.corr.post:Per post` }[this.draft().correspondentie ?? 'post']));\n protected diplomaHerkomstLabel = computed(() => ({ duo: $localize`:@@regWizard.herkomst.diplomaDuo:Geverifieerd via DUO`, handmatig: $localize`:@@regWizard.herkomst.diplomaHandmatig:Handmatig ingevoerd (wordt beoordeeld)` }[this.draft().diplomaHerkomst ?? 'handmatig']));\n\n /** BRP lookup outcome (laden/gevonden/geen/fout) and the parsed DUO lookup, both\n served by the application facade — the wizard renders, it does not fetch/parse. */\n protected adresStatus = this.lookup.adresStatus;\n protected lookupRd: () => RemoteData = this.lookup.duoLookup;\n\n /** Parsed lookup as a plain value (or null) — used outside the beroep step (the\n controle summary) where the template variable isn't in scope. */\n private duoData = computed(() => {\n const rd = this.lookupRd();\n return rd.tag === 'Success' ? rd.value : null;\n });\n\n readonly jaNee = JA_NEE;\n\n protected err = (k: DraftField | 'correspondentie' | 'diploma' | 'documenten') => this.invullen()?.errors[k] ?? '';\n protected vraagErr = (id: string) => this.invullen()?.errors.antwoorden?.[id] ?? '';\n protected antwoord = (id: string) => this.draft().antwoorden[id] ?? ''; // runtime guard: missing key → undefined\n protected set = (key: DraftField, value: string) => this.dispatch({ tag: 'SetField', key, value });\n protected setKanaal = (value: string) => this.dispatch({ tag: 'SetCorrespondentie', value: value as Correspondentie });\n\n /** True while the user is entering a diploma manually (not in the DUO list). */\n protected handmatigActief = computed(() => this.draft().diplomaHerkomst === 'handmatig');\n /** The radio selection: a diploma id, or the\"not listed\" sentinel in manual mode. */\n protected diplomaKeuze = computed(() => (this.handmatigActief() ? HANDMATIG : this.draft().diplomaId ?? ''));\n\n protected diplomaOptions = (data: DuoLookupDto) => [\n ...data.diplomas.map((d) => ({ value: d.id, label: `${d.naam} — ${d.instelling} (${d.jaar})` })),\n { value: HANDMATIG, label: $localize`:@@regWizard.diplomaNietBij:Mijn diploma staat er niet bij` },\n ];\n\n protected beroepOptions = (data: DuoLookupDto) => data.handmatig.beroepen.map((b) => ({ value: b, label: b }));\n\n /** The policy questions that apply to the current choice (server-decided). */\n protected actieveVragen = (data: DuoLookupDto): PolicyQuestionDto[] => {\n if (this.handmatigActief()) return data.handmatig.policyQuestions;\n return data.diplomas.find((d) => d.id === this.draft().diplomaId)?.policyQuestions ?? [];\n };\n\n /** Answered policy questions for the controle summary (question text + answer). */\n protected samenvattingVragen = computed(() => {\n const data = this.duoData();\n const d = this.draft();\n if (!data) return [] as { vraag: string; antwoord: string }[];\n const alle = [...data.diplomas.flatMap((x) => x.policyQuestions), ...data.handmatig.policyQuestions];\n return (d.vraagIds ?? []).map((id) => ({ vraag: alle.find((q) => q.id === id)?.vraag ?? id, antwoord: d.antwoorden[id] ?? '' }));\n });\n\n protected onDiplomaKeuze(data: DuoLookupDto, id: string) {\n if (id === HANDMATIG) {\n this.dispatch({ tag: 'KiesHandmatig', vraagIds: data.handmatig.policyQuestions.map((q) => q.id) });\n return;\n }\n const d = data.diplomas.find((x) => x.id === id);\n if (d) this.dispatch({ tag: 'KiesDiploma', diplomaId: d.id, beroep: d.beroep, vraagIds: d.policyQuestions.map((q) => q.id) });\n }\n\n constructor() {\n // An explicit seed (stories/tests) wins; otherwise resume from the backend draft\n // (`?aanvraag=`), or start fresh. Persistence is the draftSync controller's job.\n const seeded = this.seed();\n queueMicrotask(() => (seeded !== initial ? this.dispatch({ tag: 'Seed', state: seeded }) : this.draftSync.resume()));\n // Prefill the address from the BRP lookup as it arrives. Track only the facade's\n // parsed prefill signal; untrack the dispatch (it reads the state signal, which\n // would otherwise make this effect loop on its own write). Don't clobber\n // edits/restored data. A null prefill (loading/error/geen adres) leaves manual entry.\n effect(() => {\n const a = this.lookup.prefillAdres();\n if (!a) return;\n untracked(() => {\n const s = this.state();\n if (s.tag !== 'Invullen' || s.draft.straat) return;\n this.dispatch({ tag: 'PrefillAdres', straat: a.straat, postcode: a.postcode, woonplaats: a.woonplaats });\n });\n });\n // A11y: focus management (step heading on step change, error summary on a\n // failed submit) now lives in the shared WizardShellComponent.\n }\n\n onPrimary() {\n const s = this.state();\n if (s.tag !== 'Invullen') return;\n this.dispatch(this.step() === 'controle' ? { tag: 'Submit' } : { tag: 'Next' });\n this.runIfIndienen();\n }\n\n onRetry() {\n this.dispatch({ tag: 'Retry' });\n this.runIfIndienen();\n }\n\n /** Reset the wizard to a fresh start. Reload the BRP lookup so the address\n re-prefills, keeping the form and the\"vooraf ingevuld\" note consistent. */\n restart() {\n this.draftSync.reset(); // discard the current Concept; a fresh one starts on next progress\n this.dispatch({ tag: 'Seed', state: initial });\n this.lookup.reloadAdres();\n }\n\n /** The effect: when we enter Indienen, submit through the aanvraag lifecycle\n (duo → auto-approve, handmatig → manual), then dispatch the outcome. */\n private async runIfIndienen() {\n const s = this.state();\n if (s.tag !== 'Indienen') return;\n const r = await this.draftSync.submit({ diplomaHerkomst: s.data.diplomaHerkomst, documents: s.data.documents });\n if (r.ok) this.dispatch({ tag: 'SubmitConfirmed', referentie: r.value.referentie ?? '' });\n else this.dispatch({ tag: 'SubmitFailed', error: r.error });\n }\n}\n", + "sourceCode": "import { Component, computed, effect, inject, input, untracked } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormFieldComponent } from '@shared/ui/form-field/form-field.component';\nimport { TextInputComponent } from '@shared/ui/text-input/text-input.component';\nimport { RadioGroupComponent, JA_NEE } from '@shared/ui/radio-group/radio-group.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { SkeletonComponent } from '@shared/ui/skeleton/skeleton.component';\nimport { DataRowComponent } from '@shared/ui/data-row/data-row.component';\nimport { ReviewSectionComponent } from '@shared/ui/review-section/review-section.component';\nimport { ConfirmationComponent } from '@shared/ui/confirmation/confirmation.component';\nimport { WizardShellComponent, WizardError, WizardStatus, naarStapLabel } from '@shared/layout/wizard-shell/wizard-shell.component';\nimport { ASYNC } from '@shared/ui/async/async.component';\nimport { AddressFieldsComponent } from '@registratie/ui/address-fields/address-fields.component';\nimport { createStore } from '@shared/application/store';\nimport { whenTag } from '@shared/kernel/fp';\nimport { RemoteData } from '@shared/application/remote-data';\nimport { RegistratieLookupStore } from '@registratie/application/registratie-lookup.store';\nimport { DuoLookupDto, PolicyQuestionDto } from '@registratie/contracts/duo-diplomas.dto';\nimport {\n RegistratieState,\n RegistratieMsg,\n Draft,\n DraftField,\n Correspondentie,\n StepId,\n initial,\n reduce,\n hasProgress,\n STEPS,\n} from '@registratie/domain/registratie-wizard.machine';\nimport { createDraftSync } from '@registratie/application/draft-sync';\nimport { DocumentUploadComponent } from '@shared/ui/upload/document-upload/document-upload.component';\nimport { createUploadController } from '@shared/upload/upload-controller';\nimport { UploadAdapter } from '@shared/upload/upload.adapter';\nimport { UploadState, initialUpload, deliveryRefs } from '@shared/upload/upload.machine';\n\nconst KANALEN = [\n { value: 'email', label: $localize`:@@registratie.kanaalEmail:E-mail` },\n { value: 'post', label: $localize`:@@registratie.kanaalPost:Post` },\n];\nconst HANDMATIG = '__handmatig__'; // sentinel option:\"my diploma isn't listed\"\n/** The server-owned geldigheidsvraag whose\"ja\" answer requires a Dutch-taalvaardigheid\n upload (proof of the confirmed B2 level). Stable id shared with the backend. */\nconst NL_TAALVAARDIGHEID_VRAAG = 'nl-taalvaardigheid';\n\n/** Organism: the BIG-registration wizard. All state lives in one signal driven by\n the pure `reduce` (registratie-wizard.machine.ts). The BRP address prefills the\n draft via an effect; the DUO diploma list renders through ; choosing\n a diploma reveals its server-derived beroep. The draft is persisted to the\n backend as a Concept aanvraag (createDraftSync) so a reload — or a\"Verder gaan\"\n from the dashboard via `?aanvraag=` — resumes progress. Built from existing\n atoms/molecules. */\n@Component({\n selector: 'app-registratie-wizard',\n imports: [\n FormsModule, FormFieldComponent, TextInputComponent, RadioGroupComponent, ButtonComponent,\n AlertComponent, SkeletonComponent, DataRowComponent, ReviewSectionComponent, ConfirmationComponent, WizardShellComponent,\n AddressFieldsComponent, DocumentUploadComponent, ...ASYNC,\n ],\n template: `\n 0\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n i18n-submittingLabel=\"@@regWizard.submitting\" submittingLabel=\"Uw registratie wordt verwerkt…\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\"\n (goToStep)=\"dispatch({ tag: 'GaNaarStap', cursor: $event })\">\n\n @switch (step()) {\n @case ('adres') {\n @if (adresStatus() === 'laden') {\n \n } @else {\n @switch (adresStatus()) {\n @case ('gevonden') {\n Vooraf ingevuld op basis van de BRP. Controleer en pas zo nodig aan.\n }\n @case ('geen') {\n We vonden geen adres in de BRP. Vul uw adres hieronder handmatig in.\n }\n @case ('fout') {\n We konden de BRP nu niet bereiken. Vul uw adres hieronder handmatig in.\n }\n }\n \n \n \n \n @if (draft().correspondentie === 'email') {\n \n \n \n }\n }\n }\n @case ('beroep') {\n \n \n \n \n \n\n @if (handmatigActief()) {\n Een handmatig ingevoerd diploma kan niet automatisch worden geverifieerd. Kies uw beroep en beantwoord de aanvullende vragen; uw aanvraag wordt daarna handmatig beoordeeld.\n \n \n \n } @else if (draft().beroep) {\n
\n
\n
\n }\n\n @for (q of actieveVragen($any(data)); track q.id) {\n \n @if (q.type === 'ja-nee') {\n \n } @else {\n \n }\n \n }\n
\n \n \n \n
\n\n \n @if (err('documenten')) {\n {{ err('documenten') }}\n }\n }\n @case ('controle') {\n Controleer uw gegevens en dien de registratie in.\n \n
\n
\n
\n @if (draft().correspondentie === 'email') {\n
\n }\n
\n \n
\n
\n @for (item of samenvattingVragen(); track item.vraag) {\n
\n }\n
\n }\n }\n\n
\n \n

Uw referentienummer is {{ referentie() }}. Bewaar dit nummer voor uw administratie.

\n
\n Nieuwe registratie starten\n
\n
\n
\n \n `,\n})\nexport class RegistratieWizardComponent {\n private lookup = inject(RegistratieLookupStore);\n private uploadAdapter = inject(UploadAdapter);\n private store = createStore(initial, reduce);\n\n /** Preview/download link for a completed upload; the dev-simulation `demo-*` ids\n have no stored bytes, so they get no link. */\n protected previewUrlFor = (documentId: string): string | undefined =>\n documentId.startsWith('demo-') ? undefined : this.uploadAdapter.contentUrl(documentId);\n\n /** Optional seed so Storybook / tests can mount any state directly. */\n seed = input(initial);\n\n readonly kanalen = KANALEN;\n readonly stepLabels = [$localize`:@@regWizard.step.adres:Adres`, $localize`:@@regWizard.step.beroep:Beroep`, $localize`:@@regWizard.step.controle:Controle`]; // short labels for the stepper\n private stepTitles = [$localize`:@@regWizard.title.adres:Adres en correspondentievoorkeur`, $localize`:@@regWizard.title.beroep:Beroep op basis van uw diploma`, $localize`:@@regWizard.title.controle:Controleren en indienen`];\n readonly state = this.store.model;\n readonly dispatch = this.store.dispatch;\n\n private invullen = computed(() => whenTag(this.state(), 'Invullen'));\n protected cursor = computed(() => this.invullen()?.cursor ?? 0);\n protected draft = computed(() => this.invullen()?.draft ?? { antwoorden: {} });\n protected upload = computed(() => this.invullen()?.upload ?? initialUpload);\n protected uploadCtl = createUploadController({\n wizardId: 'registratie',\n getUpload: () => this.upload(),\n dispatch: (msg) => this.dispatch({ tag: 'Upload', msg }),\n // Required documents depend on answers (server decides): a diploma upload only for a\n // manual diploma; a Dutch-taalvaardigheid upload only once the applicant confirms\n // (\"ja\") the B2 language requirement.\n getCategoryParams: () => ({\n diplomaHerkomst: this.draft().diplomaHerkomst,\n taalvaardigheid: this.draft().antwoorden[NL_TAALVAARDIGHEID_VRAAG],\n }),\n });\n // Backend draft-sync (replaces sessionStorage): create a Concept once the user has\n // made progress, then debounced-sync the whole machine snapshot; resume by `?aanvraag`.\n private draftSync = createDraftSync({\n type: 'registratie',\n snapshot: () => {\n const s = this.state();\n if (s.tag !== 'Invullen' || !hasProgress(s)) return null;\n const documentIds = deliveryRefs(s.upload).filter((r) => r.channel === 'digital' && r.documentId).map((r) => r.documentId!);\n return { draft: s, stepIndex: s.cursor, stepCount: STEPS.length, documentIds };\n },\n onResume: (draft) => this.dispatch({ tag: 'Seed', state: draft as RegistratieState }),\n enabled: () => this.seed() === initial,\n });\n protected step = computed(() => STEPS[Math.min(this.cursor(), STEPS.length - 1)]);\n protected stepTitle = computed(() => this.stepTitles[Math.min(this.cursor(), this.stepTitles.length - 1)]);\n protected referentie = computed(() => whenTag(this.state(), 'Ingediend')?.referentie ?? '');\n protected failedError = computed(() => whenTag(this.state(), 'Mislukt')?.error ?? '');\n\n // --- Presentational wiring for the shared wizard shell ---------------------\n protected primaryLabel = computed(() => {\n if (this.step() === 'controle') return $localize`:@@regWizard.indienen:Registratie indienen`;\n const next = this.cursor() + 1;\n return naarStapLabel(next + 1, this.stepLabels[next]);\n });\n protected errorMessage = computed(() => $localize`:@@regWizard.indienenMislukt:Het indienen is niet gelukt:` + ` ${this.failedError()}`);\n protected shellStatus = computed(() => {\n switch (this.state().tag) {\n case 'Invullen': return 'editing';\n case 'Indienen': return 'submitting';\n case 'Ingediend': return 'submitted';\n case 'Mislukt': return 'failed';\n }\n });\n /** Current step's errors (incl. per-question), flattened for the error summary. */\n protected errorList = computed(() => {\n const e = this.invullen()?.errors ?? {};\n const out: WizardError[] = [];\n for (const [k, v] of Object.entries(e)) {\n if (k !== 'antwoorden' && typeof v === 'string' && v) out.push({ id: k, message: v });\n }\n for (const [qid, msg] of Object.entries(e.antwoorden ?? {})) {\n if (msg) out.push({ id: 'vraag-' + qid, message: msg });\n }\n return out;\n });\n protected adresSamenvatting = computed(() => {\n const d = this.draft();\n return [d.straat, [d.postcode, d.woonplaats].filter(Boolean).join(' ')].filter(Boolean).join(', ');\n });\n // Readable labels for the controle summary (instead of raw enum values).\n protected adresHerkomstLabel = computed(() => ({ brp: $localize`:@@regWizard.herkomst.adresBrp:Automatisch uit de BRP`, handmatig: $localize`:@@regWizard.herkomst.adresHandmatig:Handmatig ingevoerd` }[this.draft().adresHerkomst ?? 'handmatig']));\n protected correspondentieLabel = computed(() => ({ email: $localize`:@@regWizard.corr.email:Per e-mail`, post: $localize`:@@regWizard.corr.post:Per post` }[this.draft().correspondentie ?? 'post']));\n protected diplomaHerkomstLabel = computed(() => ({ duo: $localize`:@@regWizard.herkomst.diplomaDuo:Geverifieerd via DUO`, handmatig: $localize`:@@regWizard.herkomst.diplomaHandmatig:Handmatig ingevoerd (wordt beoordeeld)` }[this.draft().diplomaHerkomst ?? 'handmatig']));\n\n /** BRP lookup outcome (laden/gevonden/geen/fout) and the parsed DUO lookup, both\n served by the application facade — the wizard renders, it does not fetch/parse. */\n protected adresStatus = this.lookup.adresStatus;\n protected lookupRd: () => RemoteData = this.lookup.duoLookup;\n\n /** Parsed lookup as a plain value (or null) — used outside the beroep step (the\n controle summary) where the template variable isn't in scope. */\n private duoData = computed(() => {\n const rd = this.lookupRd();\n return rd.tag === 'Success' ? rd.value : null;\n });\n\n readonly jaNee = JA_NEE;\n\n protected err = (k: DraftField | 'correspondentie' | 'diploma' | 'documenten') => this.invullen()?.errors[k] ?? '';\n protected vraagErr = (id: string) => this.invullen()?.errors.antwoorden?.[id] ?? '';\n protected antwoord = (id: string) => this.draft().antwoorden[id] ?? ''; // runtime guard: missing key → undefined\n protected set = (key: DraftField, value: string) => this.dispatch({ tag: 'SetField', key, value });\n protected setKanaal = (value: string) => this.dispatch({ tag: 'SetCorrespondentie', value: value as Correspondentie });\n\n /** True while the user is entering a diploma manually (not in the DUO list). */\n protected handmatigActief = computed(() => this.draft().diplomaHerkomst === 'handmatig');\n /** The radio selection: a diploma id, or the\"not listed\" sentinel in manual mode. */\n protected diplomaKeuze = computed(() => (this.handmatigActief() ? HANDMATIG : this.draft().diplomaId ?? ''));\n\n protected diplomaOptions = (data: DuoLookupDto) => [\n ...data.diplomas.map((d) => ({ value: d.id, label: `${d.naam} — ${d.instelling} (${d.jaar})` })),\n { value: HANDMATIG, label: $localize`:@@regWizard.diplomaNietBij:Mijn diploma staat er niet bij` },\n ];\n\n protected beroepOptions = (data: DuoLookupDto) => data.handmatig.beroepen.map((b) => ({ value: b, label: b }));\n\n /** The policy questions that apply to the current choice (server-decided). */\n protected actieveVragen = (data: DuoLookupDto): PolicyQuestionDto[] => {\n if (this.handmatigActief()) return data.handmatig.policyQuestions;\n return data.diplomas.find((d) => d.id === this.draft().diplomaId)?.policyQuestions ?? [];\n };\n\n /** Answered policy questions for the controle summary (question text + answer). */\n protected samenvattingVragen = computed(() => {\n const data = this.duoData();\n const d = this.draft();\n if (!data) return [] as { vraag: string; antwoord: string }[];\n const alle = [...data.diplomas.flatMap((x) => x.policyQuestions), ...data.handmatig.policyQuestions];\n return (d.vraagIds ?? []).map((id) => ({ vraag: alle.find((q) => q.id === id)?.vraag ?? id, antwoord: d.antwoorden[id] ?? '' }));\n });\n\n protected onDiplomaKeuze(data: DuoLookupDto, id: string) {\n if (id === HANDMATIG) {\n this.dispatch({ tag: 'KiesHandmatig', vraagIds: data.handmatig.policyQuestions.map((q) => q.id) });\n return;\n }\n const d = data.diplomas.find((x) => x.id === id);\n if (d) this.dispatch({ tag: 'KiesDiploma', diplomaId: d.id, beroep: d.beroep, vraagIds: d.policyQuestions.map((q) => q.id) });\n }\n\n constructor() {\n // An explicit seed (stories/tests) wins; otherwise resume from the backend draft\n // (`?aanvraag=`), or start fresh. Persistence is the draftSync controller's job.\n const seeded = this.seed();\n queueMicrotask(() => (seeded !== initial ? this.dispatch({ tag: 'Seed', state: seeded }) : this.draftSync.resume()));\n // Prefill the address from the BRP lookup as it arrives. Track only the facade's\n // parsed prefill signal; untrack the dispatch (it reads the state signal, which\n // would otherwise make this effect loop on its own write). Don't clobber\n // edits/restored data. A null prefill (loading/error/geen adres) leaves manual entry.\n effect(() => {\n const a = this.lookup.prefillAdres();\n if (!a) return;\n untracked(() => {\n const s = this.state();\n if (s.tag !== 'Invullen' || s.draft.straat) return;\n this.dispatch({ tag: 'PrefillAdres', straat: a.straat, postcode: a.postcode, woonplaats: a.woonplaats });\n });\n });\n // A11y: focus management (step heading on step change, error summary on a\n // failed submit) now lives in the shared WizardShellComponent.\n }\n\n onPrimary() {\n const s = this.state();\n if (s.tag !== 'Invullen') return;\n this.dispatch(this.step() === 'controle' ? { tag: 'Submit' } : { tag: 'Next' });\n this.runIfIndienen();\n }\n\n onRetry() {\n this.dispatch({ tag: 'Retry' });\n this.runIfIndienen();\n }\n\n /** Reset the wizard to a fresh start. Reload the BRP lookup so the address\n re-prefills, keeping the form and the\"vooraf ingevuld\" note consistent. */\n restart() {\n this.draftSync.reset(); // discard the current Concept; a fresh one starts on next progress\n this.dispatch({ tag: 'Seed', state: initial });\n this.lookup.reloadAdres();\n }\n\n /** The effect: when we enter Indienen, submit through the aanvraag lifecycle\n (duo → auto-approve, handmatig → manual), then dispatch the outcome. */\n private async runIfIndienen() {\n const s = this.state();\n if (s.tag !== 'Indienen') return;\n const r = await this.draftSync.submit({ diplomaHerkomst: s.data.diplomaHerkomst, documents: s.data.documents });\n if (r.ok) this.dispatch({ tag: 'SubmitConfirmed', referentie: r.value.referentie ?? '' });\n else this.dispatch({ tag: 'SubmitFailed', error: r.error });\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -19012,7 +19100,7 @@ }, { "name": "RegistrationSummaryComponent", - "id": "component-RegistrationSummaryComponent-0c72a32c35018434c62e017a9419b6c5a68a91bd9c71b8f5343fddadb49227ecd9aa8fc7d9dfe7bac4206bbe66896ad590710768d27c2714f6522a5d7132a941", + "id": "component-RegistrationSummaryComponent-43f69cd13bc198c5af28e830fb9f0e9f4dff76d9ee57d702d06036fdabf56ccd8a23a387cc498bb6a51e85c44b276396685520e1f5ae92a9dccf8109e21af4c5", "file": "src/app/registratie/ui/registration-summary/registration-summary.component.ts", "encapsulation": [], "entryComponents": [], @@ -19022,7 +19110,7 @@ "selector": "app-registration-summary", "styleUrls": [], "styles": [], - "template": "\n
\n \n \n \n \n \n \n \n \n @switch (reg().status.tag) {\n @case ('Geregistreerd') {\n \n }\n @case ('Geschorst') {\n \n \n }\n @case ('Doorgehaald') {\n \n \n }\n }\n
\n
\n", + "template": "\n
\n
\n
\n
\n \n
\n
\n \n @switch (reg().status.tag) {\n @case ('Geregistreerd') {\n
\n }\n @case ('Geschorst') {\n
\n
\n }\n @case ('Doorgehaald') {\n
\n
\n }\n }\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -19035,7 +19123,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 42, + "line": 41, "required": true } ], @@ -19050,7 +19138,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 44, + "line": 43, "modifierKind": [ 124 ] @@ -19064,7 +19152,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 43, + "line": 42, "modifierKind": [ 124 ] @@ -19090,14 +19178,14 @@ "type": "component" }, { - "name": "CardComponent", + "name": "DataBlockComponent", "type": "component" } ], - "description": "

Organism: registration summary card. Composes data-row molecules + status-badge atom.

\n", - "rawdescription": "\nOrganism: registration summary card. Composes data-row molecules + status-badge atom.", + "description": "

Organism: registration summary in a CIBG Datablock. Composes data-row rows +\nstatus-badge atom (no card wrapper — the datablock carries its own surface).

\n", + "rawdescription": "\nOrganism: registration summary in a CIBG Datablock. Composes data-row rows +\nstatus-badge atom (no card wrapper — the datablock carries its own surface).", "type": "component", - "sourceCode": "import { Component, input } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Registration } from '@registratie/domain/registration';\nimport { statusColor, statusLabel } from '@registratie/domain/registration.policy';\nimport { DataRowComponent } from '@shared/ui/data-row/data-row.component';\nimport { StatusBadgeComponent } from '@shared/ui/status-badge/status-badge.component';\nimport { CardComponent } from '@shared/ui/card/card.component';\n\n/** Organism: registration summary card. Composes data-row molecules + status-badge atom. */\n@Component({\n selector: 'app-registration-summary',\n imports: [DatePipe, DataRowComponent, StatusBadgeComponent, CardComponent],\n template: `\n \n
\n \n \n \n \n \n \n \n \n @switch (reg().status.tag) {\n @case ('Geregistreerd') {\n \n }\n @case ('Geschorst') {\n \n \n }\n @case ('Doorgehaald') {\n \n \n }\n }\n
\n
\n `,\n})\nexport class RegistrationSummaryComponent {\n reg = input.required();\n protected label = () => statusLabel(this.reg().status.tag);\n protected color = () => statusColor(this.reg().status.tag);\n}\n", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Registration } from '@registratie/domain/registration';\nimport { statusColor, statusLabel } from '@registratie/domain/registration.policy';\nimport { DataRowComponent } from '@shared/ui/data-row/data-row.component';\nimport { StatusBadgeComponent } from '@shared/ui/status-badge/status-badge.component';\nimport { DataBlockComponent } from '@shared/ui/data-block/data-block.component';\n\n/** Organism: registration summary in a CIBG Datablock. Composes data-row rows +\n status-badge atom (no card wrapper — the datablock carries its own surface). */\n@Component({\n selector: 'app-registration-summary',\n imports: [DatePipe, DataRowComponent, StatusBadgeComponent, DataBlockComponent],\n template: `\n \n
\n
\n
\n
\n \n
\n
\n \n @switch (reg().status.tag) {\n @case ('Geregistreerd') {\n
\n }\n @case ('Geschorst') {\n
\n
\n }\n @case ('Doorgehaald') {\n
\n
\n }\n }\n
\n `,\n})\nexport class RegistrationSummaryComponent {\n reg = input.required();\n protected label = () => statusLabel(this.reg().status.tag);\n protected color = () => statusColor(this.reg().status.tag);\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -19316,7 +19404,7 @@ }, { "name": "ReviewSectionComponent", - "id": "component-ReviewSectionComponent-d2dfb7d0cad1f7d39d747ae75cdbe6236c977c2ec70efd7393787dc4092014c38628d30f66b7111216d406f8a5ed0b84bcde588bc0a3833e0bd8afc381ed251e", + "id": "component-ReviewSectionComponent-e8d955afba1fc3c265c283f41e1197173ef18ea7cd7a45ca9fd73b9b846fc7125207d282dbe1456e62e897850b107f96d45906bce4d959aa075fdc3fdb402f73", "file": "src/app/shared/ui/review-section/review-section.component.ts", "encapsulation": [], "entryComponents": [], @@ -19326,7 +19414,7 @@ "selector": "app-review-section", "styleUrls": [], "styles": [], - "template": "
\n

{{ heading() }}

\n @if (showEdit()) {\n \n }\n
\n
\n
\n
\n \n
\n
\n
\n", + "template": "
\n

{{ heading() }}

\n @if (showEdit()) {\n \n }\n
\n\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -19339,7 +19427,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 30, + "line": 26, "required": false }, { @@ -19350,7 +19438,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 29, + "line": 25, "required": false }, { @@ -19361,7 +19449,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 28, + "line": 24, "required": true }, { @@ -19372,7 +19460,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 31, + "line": 27, "required": false } ], @@ -19385,7 +19473,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 33, + "line": 29, "required": false } ], @@ -19406,7 +19494,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 35, + "line": 31, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -19432,11 +19520,16 @@ "hostBindings": [], "hostListeners": [], "standalone": false, - "imports": [], - "description": "

Molecule: one section of a CIBG Huisstijl "controlestap" (wizard review step) —\na heading with a "Wijzigen" link, and the section's <app-data-row>s in a\n.data-block > .block-wrapper > dl.row. Domain-free; the caller supplies the\nheading and decides what "Wijzigen" does (typically jump back to a step).

\n", - "rawdescription": "\nMolecule: one section of a CIBG Huisstijl \"controlestap\" (wizard review step) —\na heading with a \"Wijzigen\" link, and the section's ``s in a\n`.data-block > .block-wrapper > dl.row`. Domain-free; the caller supplies the\nheading and decides what \"Wijzigen\" does (typically jump back to a step).", + "imports": [ + { + "name": "DataBlockComponent", + "type": "component" + } + ], + "description": "

Molecule: one section of a CIBG Huisstijl "controlestap" (wizard review step) —\na heading with a "Wijzigen" link, and the section's <app-data-row>s in a CIBG\nDatablock (composes <app-data-block>). Domain-free; the caller supplies the\nheading and decides what "Wijzigen" does (typically jump back to a step).

\n", + "rawdescription": "\nMolecule: one section of a CIBG Huisstijl \"controlestap\" (wizard review step) —\na heading with a \"Wijzigen\" link, and the section's ``s in a CIBG\nDatablock (composes ``). Domain-free; the caller supplies the\nheading and decides what \"Wijzigen\" does (typically jump back to a step).", "type": "component", - "sourceCode": "import { Component, input, output } from '@angular/core';\n\n/** Molecule: one section of a CIBG Huisstijl \"controlestap\" (wizard review step) —\n a heading with a \"Wijzigen\" link, and the section's ``s in a\n `.data-block > .block-wrapper > dl.row`. Domain-free; the caller supplies the\n heading and decides what \"Wijzigen\" does (typically jump back to a step). */\n@Component({\n selector: 'app-review-section',\n template: `\n
\n

{{ heading() }}

\n @if (showEdit()) {\n \n }\n
\n
\n
\n
\n \n
\n
\n
\n `,\n})\nexport class ReviewSectionComponent {\n heading = input.required();\n editLabel = input($localize`:@@reviewSection.wijzigen:Wijzigen`);\n editAriaLabel = input('');\n showEdit = input(true);\n\n edit = output();\n\n protected onEdit(ev: Event) {\n ev.preventDefault(); // fragment href resolves against , not the route\n this.edit.emit();\n }\n}\n", + "sourceCode": "import { Component, input, output } from '@angular/core';\nimport { DataBlockComponent } from '@shared/ui/data-block/data-block.component';\n\n/** Molecule: one section of a CIBG Huisstijl \"controlestap\" (wizard review step) —\n a heading with a \"Wijzigen\" link, and the section's ``s in a CIBG\n Datablock (composes ``). Domain-free; the caller supplies the\n heading and decides what \"Wijzigen\" does (typically jump back to a step). */\n@Component({\n selector: 'app-review-section',\n imports: [DataBlockComponent],\n template: `\n
\n

{{ heading() }}

\n @if (showEdit()) {\n \n }\n
\n \n `,\n})\nexport class ReviewSectionComponent {\n heading = input.required();\n editLabel = input($localize`:@@reviewSection.wijzigen:Wijzigen`);\n editAriaLabel = input('');\n showEdit = input(true);\n\n edit = output();\n\n protected onEdit(ev: Event) {\n ev.preventDefault(); // fragment href resolves against , not the route\n this.edit.emit();\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -22023,16 +22116,6 @@ "rawdescription": "Used by the shell to find what to poll on return: still-in-flight uploads.", "description": "

Used by the shell to find what to poll on return: still-in-flight uploads.

\n" }, - { - "name": "initial", - "ctype": "miscellaneous", - "subtype": "variable", - "file": "src/app/brief/domain/brief.machine.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "BriefState", - "defaultValue": "{ tag: 'loading' }" - }, { "name": "initial", "ctype": "miscellaneous", @@ -22073,6 +22156,16 @@ "type": "RegistratieState", "defaultValue": "{ tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {}, upload: initialUpload }" }, + { + "name": "initial", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/brief/domain/brief.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "BriefState", + "defaultValue": "{ tag: 'loading' }" + }, { "name": "initialUpload", "ctype": "miscellaneous", @@ -26197,50 +26290,6 @@ } ] }, - { - "name": "reduce", - "file": "src/app/brief/domain/brief.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "BriefState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "m", - "type": "BriefMsg", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "BriefState", - "jsdoctags": [ - { - "name": "s", - "type": "BriefState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "m", - "type": "BriefMsg", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "reduce", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -26417,6 +26466,50 @@ } ] }, + { + "name": "reduce", + "file": "src/app/brief/domain/brief.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "BriefState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "BriefMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "BriefState", + "jsdoctags": [ + { + "name": "s", + "type": "BriefState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "BriefMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "reduceUpload", "file": "src/app/shared/upload/upload.machine.ts", @@ -29235,18 +29328,6 @@ "defaultValue": "{\n info: $localize`:@@alert.icon.info:Informatie`,\n ok: $localize`:@@alert.icon.ok:Gelukt`,\n warning: $localize`:@@alert.icon.warning:Waarschuwing`,\n error: $localize`:@@alert.icon.error:Foutmelding`,\n}" } ], - "src/app/brief/domain/brief.machine.ts": [ - { - "name": "initial", - "ctype": "miscellaneous", - "subtype": "variable", - "file": "src/app/brief/domain/brief.machine.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "BriefState", - "defaultValue": "{ tag: 'loading' }" - } - ], "src/app/herregistratie/domain/herregistratie.machine.ts": [ { "name": "initial", @@ -29307,6 +29388,18 @@ "defaultValue": "{\n tag: 'Editing',\n draft: { straat: '', postcode: '', woonplaats: '' },\n errors: {},\n}" } ], + "src/app/brief/domain/brief.machine.ts": [ + { + "name": "initial", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/brief/domain/brief.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "BriefState", + "defaultValue": "{ tag: 'loading' }" + } + ], "src/app/shared/ui/radio-group/radio-group.component.ts": [ { "name": "JA_NEE", @@ -39790,6 +39883,15 @@ "coverageCount": "1/3", "status": "medium" }, + { + "filePath": "src/app/shared/ui/data-block/data-block.component.ts", + "type": "component", + "linktype": "component", + "name": "DataBlockComponent", + "coveragePercent": 80, + "coverageCount": "4/5", + "status": "very-good" + }, { "filePath": "src/app/shared/ui/data-row/data-row.component.ts", "type": "component", diff --git a/src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts b/src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts index 5cbb944..5c9843a 100644 --- a/src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts +++ b/src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts @@ -88,21 +88,21 @@ import { IntakePolicyStore } from '@herregistratie/application/intake-policy.sto - +
@if (answers().buitenlandGewerkt === 'ja') { - - +
+
}
- +
@if (scholingZichtbaar()) { - +
} @if (answers().scholingGevolgd === 'ja') { - +
}
} diff --git a/src/app/registratie/ui/dashboard.page.ts b/src/app/registratie/ui/dashboard.page.ts index da09009..1b0b246 100644 --- a/src/app/registratie/ui/dashboard.page.ts +++ b/src/app/registratie/ui/dashboard.page.ts @@ -5,7 +5,7 @@ import { HeadingComponent } from '@shared/ui/heading/heading.component'; import { AlertComponent } from '@shared/ui/alert/alert.component'; import { SkeletonComponent } from '@shared/ui/skeleton/skeleton.component'; import { DataRowComponent } from '@shared/ui/data-row/data-row.component'; -import { CardComponent } from '@shared/ui/card/card.component'; +import { DataBlockComponent } from '@shared/ui/data-block/data-block.component'; import { TaskListComponent } from '@shared/ui/task-list/task-list.component'; import { ApplicationListComponent } from '@shared/ui/application-list/application-list.component'; import { ApplicationLinkComponent } from '@shared/ui/application-link/application-link.component'; @@ -26,7 +26,7 @@ import { tasksFromProfile } from '@registratie/domain/tasks'; selector: 'app-dashboard-page', imports: [ PageShellComponent, HeadingComponent, AlertComponent, SkeletonComponent, - DataRowComponent, CardComponent, TaskListComponent, ApplicationListComponent, ApplicationLinkComponent, + DataRowComponent, DataBlockComponent, TaskListComponent, ApplicationListComponent, ApplicationLinkComponent, ChoiceListComponent, ...ASYNC, RegistrationSummaryComponent, RegistrationTableComponent, AanvraagBlockComponent, ], @@ -70,13 +70,11 @@ import { tasksFromProfile } from '@registratie/domain/tasks';
- -
- - - -
-
+ +
+
+
+
diff --git a/src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts b/src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts index 2e8abc7..f9496aa 100644 --- a/src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts +++ b/src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts @@ -122,8 +122,8 @@ const NL_TAALVAARDIGHEID_VRAAG = 'nl-taalvaardigheid'; [ngModel]="draft().beroep ?? ''" (ngModelChange)="dispatch({ tag: 'DeclareerBeroep', beroep: $event })" /> } @else if (draft().beroep) { -
- +
+
} @@ -162,20 +162,20 @@ const NL_TAALVAARDIGHEID_VRAAG = 'nl-taalvaardigheid'; - - - +
+
+
@if (draft().correspondentie === 'email') { - +
}
- - +
+
@for (item of samenvattingVragen(); track item.vraag) { - +
}
} diff --git a/src/app/registratie/ui/registration-summary/registration-summary.component.ts b/src/app/registratie/ui/registration-summary/registration-summary.component.ts index b83c7db..616cccf 100644 --- a/src/app/registratie/ui/registration-summary/registration-summary.component.ts +++ b/src/app/registratie/ui/registration-summary/registration-summary.component.ts @@ -4,38 +4,37 @@ import { Registration } from '@registratie/domain/registration'; import { statusColor, statusLabel } from '@registratie/domain/registration.policy'; import { DataRowComponent } from '@shared/ui/data-row/data-row.component'; import { StatusBadgeComponent } from '@shared/ui/status-badge/status-badge.component'; -import { CardComponent } from '@shared/ui/card/card.component'; +import { DataBlockComponent } from '@shared/ui/data-block/data-block.component'; -/** Organism: registration summary card. Composes data-row molecules + status-badge atom. */ +/** Organism: registration summary in a CIBG Datablock. Composes data-row rows + + status-badge atom (no card wrapper — the datablock carries its own surface). */ @Component({ selector: 'app-registration-summary', - imports: [DatePipe, DataRowComponent, StatusBadgeComponent, CardComponent], + imports: [DatePipe, DataRowComponent, StatusBadgeComponent, DataBlockComponent], template: ` - -
- - - - - - - - - @switch (reg().status.tag) { - @case ('Geregistreerd') { - - } - @case ('Geschorst') { - - - } - @case ('Doorgehaald') { - - - } + +
+
+
+
+ +
+
+ + @switch (reg().status.tag) { + @case ('Geregistreerd') { +
} -
-
+ @case ('Geschorst') { +
+
+ } + @case ('Doorgehaald') { +
+
+ } + } + `, }) export class RegistrationSummaryComponent { diff --git a/src/app/registratie/ui/registration-summary/registration-summary.stories.ts b/src/app/registratie/ui/registration-summary/registration-summary.stories.ts index f6e1baa..2cdb887 100644 --- a/src/app/registratie/ui/registration-summary/registration-summary.stories.ts +++ b/src/app/registratie/ui/registration-summary/registration-summary.stories.ts @@ -13,16 +13,11 @@ const base = { const meta: Meta = { title: 'Organisms/Registration Summary', component: RegistrationSummaryComponent, - parameters: { - // Structural: app-data-row's host sits between the
and its
/
— - // fixed by the WP-12 Datablock rework. See docs/backlog/WP-12-datablock.md. - a11y: { disable: true }, - }, }; export default meta; type Story = StoryObj; -// Each story feeds a different union variant; the card renders only the rows +// Each story feeds a different union variant; the datablock renders only the rows // that variant's data supports (note Doorgehaald has no herregistratie date). export const Geregistreerd: Story = { args: { reg: { ...base, status: { tag: 'Geregistreerd', herregistratieDatum: '2027-09-01' } } }, diff --git a/src/app/shared/ui/data-block/data-block.component.ts b/src/app/shared/ui/data-block/data-block.component.ts new file mode 100644 index 0000000..dfe9400 --- /dev/null +++ b/src/app/shared/ui/data-block/data-block.component.ts @@ -0,0 +1,33 @@ +import { Component, input } from '@angular/core'; +import { HeadingComponent } from '@shared/ui/heading/heading.component'; + +/** Molecule: CIBG Huisstijl **Datablock** (designsystem.cibg.nl/componenten/datablock) + — THE way to show user/application data. A grey `.data-block` surface holds a white + `.block-wrapper` panel with a `
` of projected ``s. Use `stacked` + (`.data-block--stacked`) when labels/values are long and should stack. Replaces the + `app-card + dl` idiom for data views (the datablock carries its own surface, so it is + NOT wrapped in an `app-card` — see WP-12). When there is no visible `heading`, pass an + `ariaLabel` so the definition list is announced. */ +@Component({ + selector: 'app-data-block', + imports: [HeadingComponent], + template: ` + @if (heading()) { {{ heading() }} } +
+
+
+ +
+
+
+ `, +}) +export class DataBlockComponent { + heading = input(''); + /** Heading level when `heading` is set (default h3, matching `app-card`). */ + level = input<1 | 2 | 3 | 4 | 5>(3); + /** Stacks label above value (`.data-block--stacked`) for long content. */ + stacked = input(false); + /** Accessible name for the `
` when there is no visible heading. */ + ariaLabel = input(''); +} diff --git a/src/app/shared/ui/data-block/data-block.stories.ts b/src/app/shared/ui/data-block/data-block.stories.ts new file mode 100644 index 0000000..88586aa --- /dev/null +++ b/src/app/shared/ui/data-block/data-block.stories.ts @@ -0,0 +1,26 @@ +import type { Meta, StoryObj } from '@storybook/angular'; +import { moduleMetadata } from '@storybook/angular'; +import { DataBlockComponent } from './data-block.component'; +import { DataRowComponent } from '@shared/ui/data-row/data-row.component'; + +const meta: Meta = { + title: 'Molecules/Data Block', + component: DataBlockComponent, + decorators: [moduleMetadata({ imports: [DataRowComponent] })], + render: (args) => ({ + props: args, + template: ` + +
+
+
+
+
`, + }), +}; +export default meta; +type Story = StoryObj; + +export const Default: Story = { args: { heading: 'Persoonsgegevens (BRP)' } }; +export const ZonderKop: Story = { args: { ariaLabel: 'Registratiegegevens' } }; +export const Stacked: Story = { args: { heading: 'Toelichting', stacked: true } }; diff --git a/src/app/shared/ui/data-row/data-row.component.ts b/src/app/shared/ui/data-row/data-row.component.ts index 8d4ae37..3494076 100644 --- a/src/app/shared/ui/data-row/data-row.component.ts +++ b/src/app/shared/ui/data-row/data-row.component.ts @@ -1,12 +1,17 @@ import { Component, input } from '@angular/core'; -/** Molecule: one key/value row in a CIBG Huisstijl "controlestap" data summary - (`dt.col-md-4` / `dd.col-md-8`). `display:contents` so the dt/dd become direct - flex children of the parent `
` — the Bootstrap grid classes - need that to lay out correctly. Wrap several in a `
`. */ +/** Molecule: one key/value row inside a CIBG Huisstijl **Datablock** (see + `data-block.component.ts`) — the row primitive of the datablock/`controlestap` + data summary. Used on a `
` so the `
`'s direct child is a native element + (the HTML5.1 `dl > div > dt + dd` grouping), which keeps the definition list + axe-clean — a bare custom element between `
` and its `
/
` trips axe's + definition-list rule regardless of `display:contents`. The host is the Bootstrap + `.row`; `dt.col-md-4`/`dd.col-md-8` give the label/value widths. Wrap several in a + `
` (a ``). Project custom content (e.g. a badge) + into the `
` via ``. */ @Component({ - selector: 'app-data-row', - styles: [`:host{display:contents}`], + selector: 'div[app-data-row]', + host: { class: 'row' }, template: `
{{ key() }}
{{ value() }}
diff --git a/src/app/shared/ui/data-row/data-row.stories.ts b/src/app/shared/ui/data-row/data-row.stories.ts index 5a1b042..42a4dd3 100644 --- a/src/app/shared/ui/data-row/data-row.stories.ts +++ b/src/app/shared/ui/data-row/data-row.stories.ts @@ -6,16 +6,11 @@ const meta: Meta = { component: DataRowComponent, render: (args) => ({ props: args, - // Rows are dt.col-md-4/dd.col-md-8 flex children of a Bootstrap .row dl (CIBG controlestap). - template: `
`, + // A row is a `.row`
grouping dt.col-md-4/dd.col-md-8 inside the datablock
+ // (HTML5.1 dl > div > dt+dd — a native div child keeps the definition list axe-clean). + template: `
`, }), args: { key: 'BIG-nummer', value: '19012345601' }, - parameters: { - // Structural: app-data-row's host sits between the
and its
/
— - // axe's definition-list rule needs them adjacent regardless of `display:contents`. - // WP-12 (CIBG Datablock) reworks this markup; see docs/backlog/WP-12-datablock.md. - a11y: { disable: true }, - }, }; export default meta; type Story = StoryObj; diff --git a/src/app/shared/ui/review-section/review-section.component.ts b/src/app/shared/ui/review-section/review-section.component.ts index f921165..7be0647 100644 --- a/src/app/shared/ui/review-section/review-section.component.ts +++ b/src/app/shared/ui/review-section/review-section.component.ts @@ -1,11 +1,13 @@ import { Component, input, output } from '@angular/core'; +import { DataBlockComponent } from '@shared/ui/data-block/data-block.component'; /** Molecule: one section of a CIBG Huisstijl "controlestap" (wizard review step) — - a heading with a "Wijzigen" link, and the section's ``s in a - `.data-block > .block-wrapper > dl.row`. Domain-free; the caller supplies the + a heading with a "Wijzigen" link, and the section's ``s in a CIBG + Datablock (composes ``). Domain-free; the caller supplies the heading and decides what "Wijzigen" does (typically jump back to a step). */ @Component({ selector: 'app-review-section', + imports: [DataBlockComponent], template: `

{{ heading() }}

@@ -15,13 +17,7 @@ import { Component, input, output } from '@angular/core';
}
-
-
-
- -
-
-
+ `, }) export class ReviewSectionComponent { diff --git a/src/app/shared/ui/review-section/review-section.stories.ts b/src/app/shared/ui/review-section/review-section.stories.ts index 8467240..3362c47 100644 --- a/src/app/shared/ui/review-section/review-section.stories.ts +++ b/src/app/shared/ui/review-section/review-section.stories.ts @@ -11,16 +11,11 @@ const meta: Meta = { props: args, template: ` - - - +
+
+
`, }), - parameters: { - // Structural: app-data-row's host sits between the
and its
/
— - // fixed by the WP-12 Datablock rework. See docs/backlog/WP-12-datablock.md. - a11y: { disable: true }, - }, }; export default meta; type Story = StoryObj;