diff --git a/documentation.json b/documentation.json index 5bd8843..373a2ee 100644 --- a/documentation.json +++ b/documentation.json @@ -46,6 +46,240 @@ "methods": [], "extends": [] }, + { + "name": "AantekeningDto", + "id": "interface-AantekeningDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "datum", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 927 + }, + { + "name": "omschrijving", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 926 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 925 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "Aanvraag", + "id": "interface-Aanvraag-53ef41435da1a133ef1e82f9615dfa958c569d482f40c63208278c47ecf4a2f5b96432a289ce386460dfe4b27d3380ba7c4b8d23cdbbf77bc686df72f5e684c1", + "file": "src/app/registratie/domain/aanvraag.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export type AanvraagType = 'registratie' | 'herregistratie' | 'intake';\n\nexport type AanvraagStatus =\n | { tag: 'Concept'; stepIndex: number; stepCount: number }\n | { tag: 'InBehandeling'; referentie: string; manual: boolean } // manual=true → \"wordt handmatig beoordeeld\"\n | { tag: 'Goedgekeurd'; referentie: string }\n | { tag: 'Afgewezen'; referentie: string; reden: string };\n\nexport interface Aanvraag {\n id: string;\n type: AanvraagType;\n status: AanvraagStatus;\n documentIds: string[];\n createdAt: string;\n updatedAt: string;\n submittedAt?: string;\n}\n\n/** Detail adds the opaque wizard snapshot used to resume a Concept. */\nexport interface AanvraagDetail extends Aanvraag {\n draft: unknown;\n}\n", + "properties": [ + { + "name": "createdAt", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 24 + }, + { + "name": "documentIds", + "deprecated": false, + "deprecationMessage": "", + "type": "string[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 23 + }, + { + "name": "id", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 20 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "AanvraagStatus", + "indexKey": "", + "optional": false, + "description": "", + "line": 22 + }, + { + "name": "submittedAt", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 26 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "AanvraagType", + "indexKey": "", + "optional": false, + "description": "", + "line": 21 + }, + { + "name": "updatedAt", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 25 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "AanvraagDetail", + "id": "interface-AanvraagDetail-53ef41435da1a133ef1e82f9615dfa958c569d482f40c63208278c47ecf4a2f5b96432a289ce386460dfe4b27d3380ba7c4b8d23cdbbf77bc686df72f5e684c1", + "file": "src/app/registratie/domain/aanvraag.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "export type AanvraagType = 'registratie' | 'herregistratie' | 'intake';\n\nexport type AanvraagStatus =\n | { tag: 'Concept'; stepIndex: number; stepCount: number }\n | { tag: 'InBehandeling'; referentie: string; manual: boolean } // manual=true → \"wordt handmatig beoordeeld\"\n | { tag: 'Goedgekeurd'; referentie: string }\n | { tag: 'Afgewezen'; referentie: string; reden: string };\n\nexport interface Aanvraag {\n id: string;\n type: AanvraagType;\n status: AanvraagStatus;\n documentIds: string[];\n createdAt: string;\n updatedAt: string;\n submittedAt?: string;\n}\n\n/** Detail adds the opaque wizard snapshot used to resume a Concept. */\nexport interface AanvraagDetail extends Aanvraag {\n draft: unknown;\n}\n", + "properties": [ + { + "name": "draft", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 31 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

Detail adds the opaque wizard snapshot used to resume a Concept.

\n", + "rawdescription": "\nDetail adds the opaque wizard snapshot used to resume a Concept.", + "methods": [], + "extends": [ + "Aanvraag" + ] + }, + { + "name": "AanvraagStatusDto", + "id": "interface-AanvraagStatusDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "manual", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 935 + }, + { + "name": "reden", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 936 + }, + { + "name": "referentie", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 934 + }, + { + "name": "stepCount", + "deprecated": false, + "deprecationMessage": "", + "type": "number | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 933 + }, + { + "name": "stepIndex", + "deprecated": false, + "deprecationMessage": "", + "type": "number | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 932 + }, + { + "name": "tag", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 931 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, { "name": "Adres", "id": "interface-Adres-07cec46d80a41919e40d0bcb002981627d1a30edb363d64a0a140a8af2c38ad85be5603d88030d0704870800694c5bed9c709ae6891fe83e646e90c1a67cf548", @@ -93,14 +327,59 @@ "methods": [], "extends": [] }, + { + "name": "AdresDto", + "id": "interface-AdresDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "postcode", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 941 + }, + { + "name": "straat", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 940 + }, + { + "name": "woonplaats", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 942 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, { "name": "AdresValue", - "id": "interface-AdresValue-1e0b1a46198e647fedabf1bd8f892a2cc7444c7741a9a2454ce1ba38bb7d7b7787621fd7c35778bb545b72b34d355ed53f3a644b2eab266a4a981469c6ea70ba", + "id": "interface-AdresValue-d490884516bc8cb66cff8f7590026db7300f61f6d03a910f4ad9e35b8967f4d0a64c253d42298b5da3747313c5c44e27cf983756b915eec75ced3508b6e3c6d6", "file": "src/app/registratie/ui/address-fields/address-fields.component.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Component, input, output } 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';\n\nexport interface AdresValue {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\nexport type AdresErrors = Partial>;\n\n/** Organism: the editable address block (straat / postcode / woonplaats), grouped\n in a fieldset/legend. Pure & presentational — values in via `value`, errors in\n via `errors`, every keystroke out via `fieldChange`. No store, no services, no\n internal state; the container owns the Model and decides what a change means\n (registratie-wizard dispatches SetField; change-request-form sets its props).\n Composes the form-field molecule (×3) so labels/error wiring stay consistent. */\n@Component({\n selector: 'app-address-fields',\n imports: [FormsModule, FormFieldComponent, TextInputComponent],\n template: `\n
\n {{ legend() }}\n \n \n \n \n \n \n \n \n \n
\n `,\n})\nexport class AddressFieldsComponent {\n value = input.required();\n errors = input({});\n /** Prefix for field ids/labels — keeps them unique if two blocks ever co-exist. */\n idPrefix = input('adres');\n legend = input('Adres');\n fieldChange = output<{ key: keyof AdresValue; value: string }>();\n}\n", + "sourceCode": "import { Component, input, output } 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';\n\nexport interface AdresValue {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\nexport type AdresErrors = Partial>;\n\n/** Organism: the editable address block (straat / postcode / woonplaats), grouped\n in a fieldset/legend. Pure & presentational — values in via `value`, errors in\n via `errors`, every keystroke out via `fieldChange`. No store, no services, no\n internal state; the container owns the Model and decides what a change means\n (registratie-wizard dispatches SetField; change-request-form sets its props).\n Composes the form-field molecule (×3) so labels/error wiring stay consistent. */\n@Component({\n selector: 'app-address-fields',\n imports: [FormsModule, FormFieldComponent, TextInputComponent],\n styles: [`\n fieldset{border:0;margin:0;padding:0;min-inline-size:0}\n legend{padding:0;font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-end:var(--rhc-space-max-md)}\n app-form-field + app-form-field{display:block;margin-block-start:var(--rhc-space-max-lg)}\n `],\n template: `\n
\n {{ legend() }}\n \n \n \n \n \n \n \n \n \n
\n `,\n})\nexport class AddressFieldsComponent {\n value = input.required();\n errors = input({});\n /** Prefix for field ids/labels — keeps them unique if two blocks ever co-exist. */\n idPrefix = input('adres');\n legend = input($localize`:@@address.legend:Adres`);\n fieldChange = output<{ key: keyof AdresValue; value: string }>();\n}\n", "properties": [ { "name": "postcode", @@ -140,12 +419,12 @@ }, { "name": "Answers", - "id": "interface-Answers-13704a2a04ab3cffa46cbc109ee84699b236928e1c2649f459e18e4daf323047e8b21cdd5a21440c5fd696a605a09feb673b4020394ba7954ae35162f1bd2732", + "id": "interface-Answers-609d18870aac1c3c8425f67e97c964d0503c535eea13c6c7e39c96904be318eb571893c8dc545b7005f66f09f7e19bcf73b4f880459bdb63fce0aa7291c838a5", "file": "src/app/herregistratie/domain/intake.machine.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\n\n/**\n * A FIXED 3-step wizard with progressive disclosure. The steps never change in\n * number (always `STEPS`); instead, follow-up questions appear *inline within a\n * step* depending on earlier answers — answer \"buiten Nederland gewerkt? → ja\"\n * and the country/hours questions reveal in the same step; report few hours and\n * the scholing-question reveals inside the 'werk' step. \"Is this field required\n * right now\" is a pure function (`validateStep`/`lageUren`), so it's trivial to\n * test and impossible to get out of sync with the data.\n */\n\nexport type JaNee = 'ja' | 'nee';\n\n/** The three fixed steps. Each step groups one or more questions. */\nexport type StepId = 'buitenland' | 'werk' | 'review';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually, and branches may never ask some fields. */\nexport interface Answers {\n buitenlandGewerkt?: JaNee; // Q1\n land?: string; // Q1a — only when buitenlandGewerkt === 'ja'\n buitenlandseUren?: string; // Q1b — only when buitenlandGewerkt === 'ja'\n uren?: string; // Q2 — uren in NL\n scholingGevolgd?: JaNee; // Q3 — only when total hours are below the threshold\n punten?: string; // Q4\n}\n\n/** What we have after the review step parses — guaranteed valid/typed. */\nexport interface ValidIntake {\n werktBuitenland: boolean;\n land?: string;\n buitenlandseUren?: Uren;\n uren: Uren;\n aanvullendeScholing?: boolean;\n punten?: Uren; // only collected when aanvullende scholing is gevolgd (scholingGevolgd === 'ja')\n}\n\n/** Demo fallback only — the real threshold is a SERVER-OWNED policy value fetched\n at runtime (see IntakePolicyDto / SetPolicy). ponytail: default is the offline\n fallback; the server value wins. */\nexport const SCHOLING_THRESHOLD_DEFAULT = 1000;\n\n/** True when NL-hours are low enough that the scholing question must be answered.\n The threshold is passed in (server-owned), not hardcoded. */\nexport function lageUren(a: Answers, scholingThreshold = SCHOLING_THRESHOLD_DEFAULT): boolean {\n const r = parseUren(a.uren ?? '');\n return r.ok && r.value < scholingThreshold;\n}\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['buitenland', 'werk', 'review'];\n\n/** Per-field error map: one message per question, since a step holds several. */\ntype Errors = Partial>;\n\nexport type IntakeState =\n | { tag: 'Answering'; answers: Answers; cursor: number; errors: Errors; scholingThreshold: number }\n | { tag: 'Submitting'; data: ValidIntake }\n | { tag: 'Submitted'; data: ValidIntake }\n | { tag: 'Failed'; data: ValidIntake; error: string };\n\nexport const initial: IntakeState = { tag: 'Answering', answers: {}, cursor: 0, errors: {}, scholingThreshold: SCHOLING_THRESHOLD_DEFAULT };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, a: Answers, scholingThreshold: number): Result {\n const errors: Errors = {};\n switch (step) {\n case 'buitenland':\n if (!a.buitenlandGewerkt) errors.buitenlandGewerkt = 'Maak een keuze.';\n else if (a.buitenlandGewerkt === 'ja') {\n if (!a.land || a.land.trim() === '') errors.land = 'Vul een land in.';\n const u = parseUren(a.buitenlandseUren ?? '');\n if (!u.ok) errors.buitenlandseUren = u.error;\n }\n break;\n case 'werk': {\n const u = parseUren(a.uren ?? '');\n if (!u.ok) errors.uren = u.error;\n if (lageUren(a, scholingThreshold) && !a.scholingGevolgd) errors.scholingGevolgd = 'Maak een keuze.';\n // Nascholingspunten are only asked (and required) when scholing was followed.\n if (a.scholingGevolgd === 'ja') {\n const p = parseUren(a.punten ?? '');\n if (!p.ok) errors.punten = p.error;\n }\n break;\n }\n case 'review':\n break; // review shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole questionnaire into a ValidIntake (called on submit). */\nfunction validateAll(a: Answers, scholingThreshold: number): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, a, scholingThreshold);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const uren = parseUren(a.uren ?? '');\n // validateStep guaranteed uren parses, but keep the compiler happy.\n if (!uren.ok) return err(errors);\n\n const werktBuitenland = a.buitenlandGewerkt === 'ja';\n const buitenland = parseUren(a.buitenlandseUren ?? '');\n // Punten are only collected when aanvullende scholing was gevolgd.\n const punten = a.scholingGevolgd === 'ja' ? parseUren(a.punten ?? '') : undefined;\n return ok({\n werktBuitenland,\n land: werktBuitenland ? a.land : undefined,\n buitenlandseUren: werktBuitenland && buitenland.ok ? buitenland.value : undefined,\n uren: uren.value,\n aanvullendeScholing: lageUren(a, scholingThreshold) ? a.scholingGevolgd === 'ja' : undefined,\n punten: punten?.ok ? punten.value : undefined,\n });\n}\n\nexport function setAnswer(s: IntakeState, key: keyof Answers, value: string): IntakeState {\n if (s.tag !== 'Answering') return s;\n // Steps are fixed, so editing an answer never moves the cursor — it only\n // reveals/hides inline questions within the current step.\n return { ...s, answers: { ...s.answers, [key]: value } };\n}\n\nexport function next(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering') return s;\n const r = validateStep(currentStep(s), s.answers, s.scholingThreshold);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\n/** Apply a server-owned policy value (e.g. the scholing threshold). */\nexport function setPolicy(s: IntakeState, scholingThreshold: number): IntakeState {\n return s.tag === 'Answering' ? { ...s, scholingThreshold } : s;\n}\n\nexport function back(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\nexport function submit(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering') return s;\n const r = validateAll(s.answers, s.scholingThreshold);\n return r.ok ? { tag: 'Submitting', data: r.value } : { ...s, errors: r.error };\n}\n\nexport function resolve(s: IntakeState, r: Result): IntakeState {\n if (s.tag !== 'Submitting') return s;\n return r.ok ? { tag: 'Submitted', data: s.data } : { tag: 'Failed', data: s.data, error: r.error };\n}\n\nexport type IntakeMsg =\n | { tag: 'SetAnswer'; key: keyof Answers; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'SetPolicy'; scholingThreshold: number }\n | { tag: 'Seed'; state: IntakeState };\n\nexport function reduce(s: IntakeState, m: IntakeMsg): IntakeState {\n switch (m.tag) {\n case 'SetAnswer':\n return setAnswer(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'SetPolicy':\n return setPolicy(s, m.scholingThreshold);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\n\n/**\n * A FIXED 3-step wizard with progressive disclosure. The steps never change in\n * number (always `STEPS`); instead, follow-up questions appear *inline within a\n * step* depending on earlier answers — answer \"buiten Nederland gewerkt? → ja\"\n * and the country/hours questions reveal in the same step; report few hours and\n * the scholing-question reveals inside the 'werk' step. \"Is this field required\n * right now\" is a pure function (`validateStep`/`lageUren`), so it's trivial to\n * test and impossible to get out of sync with the data.\n */\n\nexport type JaNee = 'ja' | 'nee';\n\n/** The three fixed steps. Each step groups one or more questions. */\nexport type StepId = 'buitenland' | 'werk' | 'review';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually, and branches may never ask some fields. */\nexport interface Answers {\n buitenlandGewerkt?: JaNee; // Q1\n land?: string; // Q1a — only when buitenlandGewerkt === 'ja'\n buitenlandseUren?: string; // Q1b — only when buitenlandGewerkt === 'ja'\n uren?: string; // Q2 — uren in NL\n scholingGevolgd?: JaNee; // Q3 — only when total hours are below the threshold\n punten?: string; // Q4\n}\n\n/** What we have after the review step parses — guaranteed valid/typed. */\nexport interface ValidIntake {\n werktBuitenland: boolean;\n land?: string;\n buitenlandseUren?: Uren;\n uren: Uren;\n aanvullendeScholing?: boolean;\n punten?: Uren; // only collected when aanvullende scholing is gevolgd (scholingGevolgd === 'ja')\n}\n\n/** Demo fallback only — the real threshold is a SERVER-OWNED policy value fetched\n at runtime (see IntakePolicyDto / SetPolicy). ponytail: default is the offline\n fallback; the server value wins. */\nexport const SCHOLING_THRESHOLD_DEFAULT = 1000;\n\n/** True when NL-hours are low enough that the scholing question must be answered.\n The threshold is passed in (server-owned), not hardcoded. */\nexport function lageUren(a: Answers, scholingThreshold = SCHOLING_THRESHOLD_DEFAULT): boolean {\n const r = parseUren(a.uren ?? '');\n return r.ok && r.value < scholingThreshold;\n}\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['buitenland', 'werk', 'review'];\n\n/** Per-field error map: one message per question, since a step holds several. */\ntype Errors = Partial>;\n\nexport type IntakeState =\n | { tag: 'Answering'; answers: Answers; cursor: number; errors: Errors; scholingThreshold: number }\n | { tag: 'Submitting'; data: ValidIntake }\n | { tag: 'Submitted'; data: ValidIntake }\n | { tag: 'Failed'; data: ValidIntake; error: string };\n\nexport const initial: IntakeState = { tag: 'Answering', answers: {}, cursor: 0, errors: {}, scholingThreshold: SCHOLING_THRESHOLD_DEFAULT };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Has the user meaningfully started, so it's worth persisting as a Concept?\n (No auto-prefill here — pristine means truly untouched.) */\nexport function hasProgress(s: Extract): boolean {\n return s.cursor > 0 || Object.keys(s.answers).length > 0;\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, a: Answers, scholingThreshold: number): Result {\n const errors: Errors = {};\n switch (step) {\n case 'buitenland':\n if (!a.buitenlandGewerkt) errors.buitenlandGewerkt = $localize`:@@validation.maakKeuze:Maak een keuze.`;\n else if (a.buitenlandGewerkt === 'ja') {\n if (!a.land || a.land.trim() === '') errors.land = $localize`:@@validation.land:Vul een land in.`;\n const u = parseUren(a.buitenlandseUren ?? '');\n if (!u.ok) errors.buitenlandseUren = u.error;\n }\n break;\n case 'werk': {\n const u = parseUren(a.uren ?? '');\n if (!u.ok) errors.uren = u.error;\n if (lageUren(a, scholingThreshold) && !a.scholingGevolgd) errors.scholingGevolgd = $localize`:@@validation.maakKeuze:Maak een keuze.`;\n // Nascholingspunten are only asked (and required) when scholing was followed.\n if (a.scholingGevolgd === 'ja') {\n const p = parseUren(a.punten ?? '');\n if (!p.ok) errors.punten = p.error;\n }\n break;\n }\n case 'review':\n break; // review shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole questionnaire into a ValidIntake (called on submit). */\nfunction validateAll(a: Answers, scholingThreshold: number): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, a, scholingThreshold);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const uren = parseUren(a.uren ?? '');\n // validateStep guaranteed uren parses, but keep the compiler happy.\n if (!uren.ok) return err(errors);\n\n const werktBuitenland = a.buitenlandGewerkt === 'ja';\n const buitenland = parseUren(a.buitenlandseUren ?? '');\n // Punten are only collected when aanvullende scholing was gevolgd.\n const punten = a.scholingGevolgd === 'ja' ? parseUren(a.punten ?? '') : undefined;\n return ok({\n werktBuitenland,\n land: werktBuitenland ? a.land : undefined,\n buitenlandseUren: werktBuitenland && buitenland.ok ? buitenland.value : undefined,\n uren: uren.value,\n aanvullendeScholing: lageUren(a, scholingThreshold) ? a.scholingGevolgd === 'ja' : undefined,\n punten: punten?.ok ? punten.value : undefined,\n });\n}\n\nexport function setAnswer(s: IntakeState, key: keyof Answers, value: string): IntakeState {\n if (s.tag !== 'Answering') return s;\n // Steps are fixed, so editing an answer never moves the cursor — it only\n // reveals/hides inline questions within the current step.\n return { ...s, answers: { ...s.answers, [key]: value } };\n}\n\nexport function next(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering') return s;\n const r = validateStep(currentStep(s), s.answers, s.scholingThreshold);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\n/** Apply a server-owned policy value (e.g. the scholing threshold). */\nexport function setPolicy(s: IntakeState, scholingThreshold: number): IntakeState {\n return s.tag === 'Answering' ? { ...s, scholingThreshold } : s;\n}\n\nexport function back(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\nexport function submit(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering') return s;\n const r = validateAll(s.answers, s.scholingThreshold);\n return r.ok ? { tag: 'Submitting', data: r.value } : { ...s, errors: r.error };\n}\n\nexport function resolve(s: IntakeState, r: Result): IntakeState {\n if (s.tag !== 'Submitting') return s;\n return r.ok ? { tag: 'Submitted', data: s.data } : { tag: 'Failed', data: s.data, error: r.error };\n}\n\nexport type IntakeMsg =\n | { tag: 'SetAnswer'; key: keyof Answers; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'SetPolicy'; scholingThreshold: number }\n | { tag: 'Seed'; state: IntakeState };\n\nexport function reduce(s: IntakeState, m: IntakeMsg): IntakeState {\n switch (m.tag) {\n case 'SetAnswer':\n return setAnswer(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'SetPolicy':\n return setPolicy(s, m.scholingThreshold);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", "properties": [ { "name": "buitenlandGewerkt", @@ -215,6 +494,186 @@ "methods": [], "extends": [] }, + { + "name": "ApplicationDetailDto", + "id": "interface-ApplicationDetailDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "createdAt", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 951 + }, + { + "name": "documentIds", + "deprecated": false, + "deprecationMessage": "", + "type": "string[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 950 + }, + { + "name": "draft", + "deprecated": false, + "deprecationMessage": "", + "type": "any | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 949 + }, + { + "name": "id", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 946 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "AanvraagStatusDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 948 + }, + { + "name": "submittedAt", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 953 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 947 + }, + { + "name": "updatedAt", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 952 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "ApplicationSummaryDto", + "id": "interface-ApplicationSummaryDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "createdAt", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 961 + }, + { + "name": "documentIds", + "deprecated": false, + "deprecationMessage": "", + "type": "string[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 960 + }, + { + "name": "id", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 957 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "AanvraagStatusDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 959 + }, + { + "name": "submittedAt", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 963 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 958 + }, + { + "name": "updatedAt", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 962 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, { "name": "BigProfile", "id": "interface-BigProfile-c363e317899ff3cd424b0033c2f57ea14e9617f52401171543b5a82d67046a894a2806afc198812808d0080b3093471e081f7e79b12f2c8c37eef68785e47a43", @@ -254,12 +713,12 @@ }, { "name": "BreadcrumbItem", - "id": "interface-BreadcrumbItem-4dedba5c509fabd51900b3062e33290365b01e1fdc64a11c5ce7fe12f20201b340d7fcfbe61254b0d0b7a386ab40a29795bd467542fb1a353f4d9bda46e65688", + "id": "interface-BreadcrumbItem-7a679e70f2a541a876a02dd5999150ec5793ddf654bc902768c5252ea53b8996450966dfd31873d31e9d849880b3d6358b90711564a19f4c228576bc2214e19c", "file": "src/app/shared/layout/breadcrumb/breadcrumb.component.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nexport interface BreadcrumbItem {\n label: string;\n link?: string; // omit on the current (last) page\n}\n\n/** Chrome: breadcrumb navigation. Renders the RHC/Utrecht breadcrumb pattern; the\n last item is the current page (no link, aria-current). Domain-free — the caller\n supplies the trail. */\n@Component({\n selector: 'app-breadcrumb',\n imports: [RouterLink],\n styles: [`\n :host{display:block}\n .list{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md);align-items:center;list-style:none;margin:0;padding:0}\n .sep{color:var(--rhc-color-foreground-subtle)}\n `],\n template: `\n \n `,\n})\nexport class BreadcrumbComponent {\n items = input.required();\n}\n", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nexport interface BreadcrumbItem {\n label: string;\n link?: string; // omit on the current (last) page\n}\n\n/** Chrome: breadcrumb navigation. Renders the RHC/Utrecht breadcrumb pattern; the\n last item is the current page (no link, aria-current). Domain-free — the caller\n supplies the trail. */\n@Component({\n selector: 'app-breadcrumb',\n imports: [RouterLink],\n styles: [`\n :host{display:block}\n .list{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md);align-items:center;list-style:none;margin:0;padding:0;font-size:var(--rhc-text-font-size-sm)}\n .crumb{display:inline-flex;align-items:center;gap:var(--rhc-space-max-md)}\n a{color:var(--rhc-color-foreground-link);text-decoration:underline}\n a:hover{color:var(--rhc-color-foreground-link-hover)}\n .current{color:var(--rhc-color-foreground-subtle)}\n .sep{color:var(--rhc-color-foreground-subtle)}\n /* Inverse: on the blue header bar, everything is white. */\n :host(.inverse) a,\n :host(.inverse) .current,\n :host(.inverse) .sep { color: var(--rhc-color-foreground-on-primary); }\n `],\n template: `\n \n `,\n})\nexport class BreadcrumbComponent {\n items = input.required();\n}\n", "properties": [ { "name": "label", @@ -289,7 +748,42 @@ }, { "name": "BrpAddressDto", - "id": "interface-BrpAddressDto-029e98a059f908b1aab86b91327ec0c2a409efb766692f042935997cd36e685859ecf375e579b912496b2dac205dfd2c751f3a301b7486f0da9cb04cda7c704f", + "id": "interface-BrpAddressDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": 968 + }, + { + "name": "gevonden", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "indexKey": "", + "optional": true, + "description": "", + "line": 967 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "BrpAddressDto", + "id": "interface-BrpAddressDto-029e98a059f908b1aab86b91327ec0c2a409efb766692f042935997cd36e685859ecf375e579b912496b2dac205dfd2c751f3a301b7486f0da9cb04cda7c704f-1", "file": "src/app/registratie/contracts/brp-address.dto.ts", "deprecated": false, "deprecationMessage": "", @@ -322,52 +816,115 @@ "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": [] + "extends": [], + "isDuplicate": true, + "duplicateId": 1, + "duplicateName": "BrpAddressDto-1" }, { - "name": "ChangeRequest", - "id": "interface-ChangeRequest-38a13207972e7e101ba989ca2fe390d3a6f353165e03bc0434fe9785b321fba0e953ae0b969ca459acee20e21173dcb190fb46590517af703b89243b5dd45aba", - "file": "src/app/registratie/ui/change-request-form/change-request-form.component.ts", + "name": "ChangeRequestRequest", + "id": "interface-ChangeRequestRequest-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "file": "src/app/shared/infrastructure/api-client.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Component, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\nimport { AddressFieldsComponent, AdresValue } from '@registratie/ui/address-fields/address-fields.component';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\n\n/** A submitted change request carries a *parsed* postcode (branded Postcode),\n not a raw string — downstream code can't receive an unvalidated one. */\nexport interface ChangeRequest {\n street: string;\n zip: Postcode;\n city: string;\n}\n\n/** Organism: change-request (adreswijziging) form. Reuses the same form-field\n molecule + text-input/button atoms as the login form. Field errors come\n straight from the parser's Result — no parallel \"is it valid\" flag to drift. */\n@Component({\n selector: 'app-change-request-form',\n imports: [FormsModule, ButtonComponent, HeadingComponent, AddressFieldsComponent],\n template: `\n Adreswijziging doorgeven\n
\n \n
\n Wijziging indienen\n
\n \n `,\n})\nexport class ChangeRequestFormComponent {\n street = '';\n zip = '';\n city = '';\n streetError = signal('');\n zipError = signal('');\n submitted = output();\n\n onAdres(e: { key: keyof AdresValue; value: string }) {\n if (e.key === 'straat') this.street = e.value;\n else if (e.key === 'postcode') this.zip = e.value;\n else this.city = e.value;\n }\n\n onSubmit() {\n const street = this.street.trim();\n this.streetError.set(street ? '' : 'Vul straat en huisnummer in.');\n\n const postcode = parsePostcode(this.zip);\n this.zipError.set(postcode.ok ? '' : postcode.error);\n\n if (!street || !postcode.ok) return;\n this.submitted.emit({ street, zip: postcode.value, city: this.city.trim() });\n }\n}\n", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "city", + "name": "postcode", "deprecated": false, "deprecationMessage": "", - "type": "string", + "type": "string | undefined", "indexKey": "", - "optional": false, + "optional": true, "description": "", - "line": 13 + "line": 973 }, { - "name": "street", + "name": "straat", "deprecated": false, "deprecationMessage": "", - "type": "string", + "type": "string | undefined", "indexKey": "", - "optional": false, + "optional": true, "description": "", - "line": 11 + "line": 972 }, { - "name": "zip", + "name": "woonplaats", "deprecated": false, "deprecationMessage": "", - "type": "Postcode", + "type": "string | undefined", "indexKey": "", - "optional": false, + "optional": true, "description": "", - "line": 12 + "line": 974 } ], "indexSignatures": [], "kind": 172, - "description": "

A submitted change request carries a parsed postcode (branded Postcode),\nnot a raw string — downstream code can't receive an unvalidated one.

\n", - "rawdescription": "\nA submitted change request carries a *parsed* postcode (branded Postcode),\nnot a raw string — downstream code can't receive an unvalidated one.", + "methods": [], + "extends": [] + }, + { + "name": "CreateApplicationRequest", + "id": "interface-CreateApplicationRequest-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 978 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "Crumb", + "id": "interface-Crumb-88fb29ef3974e1a6599728a6d40b6bafed2354ec6dde840b2d2de49ba648633c1da50552c711f9fd85f8f0985e4ae96627c05ab2890bf0f4c1894ed28e0f0797", + "file": "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { BreadcrumbItem } from './breadcrumb.component';\n\n/** Route → breadcrumb label + parent. The app has a small fixed route set\n (see app.routes.ts), so a static map is enough — no per-page wiring.\n ponytail: static map, not a breadcrumb service; revisit if routes go dynamic. */\ninterface Crumb { label: string; parent?: string }\n\nconst ROUTES: Record = {\n '/dashboard': { label: $localize`:@@crumb.dashboard:Mijn overzicht` },\n '/registratie': { label: $localize`:@@crumb.registratie:Mijn gegevens`, parent: '/dashboard' },\n '/registreren': { label: $localize`:@@crumb.registreren:Inschrijven`, parent: '/dashboard' },\n '/herregistratie': { label: $localize`:@@crumb.herregistratie:Herregistratie`, parent: '/dashboard' },\n '/intake': { label: $localize`:@@crumb.intake:Herregistratie-intake`, parent: '/dashboard' },\n '/concepts': { label: $localize`:@@crumb.concepts:Functionele patronen`, parent: '/dashboard' },\n};\n\n/** Build the breadcrumb trail for a router url (query/fragment stripped).\n Returns [] for unknown routes (e.g. /login) so the bar can hide itself. */\nexport function trailFor(url: string): BreadcrumbItem[] {\n const path = url.split(/[?#]/)[0];\n const trail: BreadcrumbItem[] = [];\n let cursor: string | undefined = path;\n while (cursor) {\n const node: Crumb | undefined = ROUTES[cursor];\n if (!node) break;\n trail.unshift({ label: node.label, link: cursor });\n cursor = node.parent;\n }\n // The current (last) page is not a link.\n if (trail.length) delete trail[trail.length - 1].link;\n return trail;\n}\n", + "properties": [ + { + "name": "label", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 6 + }, + { + "name": "parent", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 6 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

Route → breadcrumb label + parent. The app has a small fixed route set\n(see app.routes.ts), so a static map is enough — no per-page wiring.\nponytail: static map, not a breadcrumb service; revisit if routes go dynamic.

\n", + "rawdescription": "\nRoute → breadcrumb label + parent. The app has a small fixed route set\n(see app.routes.ts), so a static map is enough — no per-page wiring.\nponytail: static map, not a breadcrumb service; revisit if routes go dynamic.", "methods": [], "extends": [] }, @@ -410,7 +967,52 @@ }, { "name": "DashboardViewDto", - "id": "interface-DashboardViewDto-b39e266ec8fabdaddad87f1e15a5b1b86e45d84ac2c95028b4e676c2eb425fd675c77383c3d4f8f88f4a072f3eb88a954eb0f8755597224ebef59da18d24fda0", + "id": "interface-DashboardViewDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "decisions", + "deprecated": false, + "deprecationMessage": "", + "type": "HerregistratieDecisionsDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 984 + }, + { + "name": "person", + "deprecated": false, + "deprecationMessage": "", + "type": "PersonDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 983 + }, + { + "name": "registration", + "deprecated": false, + "deprecationMessage": "", + "type": "RegistrationDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 982 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "DashboardViewDto", + "id": "interface-DashboardViewDto-b39e266ec8fabdaddad87f1e15a5b1b86e45d84ac2c95028b4e676c2eb425fd675c77383c3d4f8f88f4a072f3eb88a954eb0f8755597224ebef59da18d24fda0-1", "file": "src/app/registratie/contracts/dashboard-view.dto.ts", "deprecated": false, "deprecationMessage": "", @@ -453,143 +1055,254 @@ "description": "

WIRE CONTRACT for the dashboard screen — the "BFF-lite" response.

\n

In production this type is GENERATED from the OpenAPI/TypeSpec spec (one source\nof truth for both sides), and the decisions block is computed BY THE BACKEND\n— never recomputed on the client. The frontend renders decisions; it does not\nown the rules. See docs/architecture/0001-bff-lite-decision-dtos.md.

\n

One screen-shaped call replaces the previous three (BIG-register + BRP + …),\nso the page always sees one consistent snapshot instead of three independently\nloading/erroring resources.

\n", "rawdescription": "\n\nWIRE CONTRACT for the dashboard screen — the \"BFF-lite\" response.\n\nIn production this type is GENERATED from the OpenAPI/TypeSpec spec (one source\nof truth for both sides), and the `decisions` block is computed BY THE BACKEND\n— never recomputed on the client. The frontend renders decisions; it does not\nown the rules. See docs/architecture/0001-bff-lite-decision-dtos.md.\n\nOne screen-shaped call replaces the previous three (BIG-register + BRP + …),\nso the page always sees one consistent snapshot instead of three independently\nloading/erroring resources.\n", "methods": [], - "extends": [] + "extends": [], + "isDuplicate": true, + "duplicateId": 1, + "duplicateName": "DashboardViewDto-1" }, { - "name": "Draft", - "id": "interface-Draft-6ed41f6a28b6c00dc907f54219be9c1d7955aa11bc22f128620d2206b1ea12e6730533ac33f5f5df7b8d7c8d7f977584b3a0a3e98a6c2c3b91d1afe6411278e2", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "name": "DocumentCategory", + "id": "interface-DocumentCategory-cd384c135d0cf4c44c9dd96f8fcafc852f27015dbdd1ed429e118bb2db250d6e0782800ab04ef957e392a5bb408ce5a9a8c8184a696dc2130d513426479e88c7", + "file": "src/app/shared/upload/upload.machine.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\nimport { Email, parseEmail } from '@registratie/domain/value-objects/email';\n\n/**\n * A FIXED 3-step registration wizard. The steps never change in number (always\n * `STEPS`): (1) adres + correspondentievoorkeur, (2) beroep o.b.v. diploma,\n * (3) controle & indienen. Follow-up questions appear *inline within a step*\n * (e.g. choosing 'email' reveals the e-mail field). \"Is this field required\n * right now\" is a pure function (`validateStep`), so it is trivial to test and\n * impossible to get out of sync with the data. Invariants live here, not in the\n * UI: the wizard reaches `Indienen` only when a complete `ValidRegistratie` parses.\n */\n\nexport type StepId = 'adres' | 'beroep' | 'controle';\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['adres', 'beroep', 'controle'];\n\n/** Where a piece of data came from — recorded on the aggregate (PRD §5). */\nexport type AdresHerkomst = 'brp' | 'handmatig';\nexport type DiplomaHerkomst = 'duo' | 'handmatig';\nexport type Correspondentie = 'email' | 'post';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually. Adres fields are kept flat so one `SetField` message\n serves them all (mirrors the intake machine). */\nexport interface Draft {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n adresHerkomst?: AdresHerkomst;\n correspondentie?: Correspondentie;\n email?: string;\n diplomaId?: string;\n diplomaHerkomst?: DiplomaHerkomst;\n beroep?: string; // DERIVED from the chosen DUO diploma (or declared for a manual one)\n vraagIds?: string[]; // ids of the policy questions that apply to the chosen diploma\n antwoorden: Record; // geldigheidsantwoorden, keyed by question id\n}\n\n/** What we have after the controle step parses — guaranteed valid/typed. */\nexport interface ValidRegistratie {\n adres: { straat: string; postcode: Postcode; woonplaats: string };\n adresHerkomst: AdresHerkomst;\n correspondentie: Correspondentie;\n email?: Email; // only when correspondentie === 'email'\n diplomaId: string;\n diplomaHerkomst: DiplomaHerkomst;\n beroep: string;\n antwoorden: Record;\n}\n\n/** Text fields settable via SetField. */\nexport type DraftField = 'straat' | 'postcode' | 'woonplaats' | 'email';\n\n/** Per-field error map. `antwoorden` holds per-policy-question errors, keyed by\n question id (a step can show several questions). */\nexport interface Errors {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n email?: string;\n correspondentie?: string;\n diploma?: string;\n antwoorden?: Record;\n}\n\nexport type RegistratieState =\n | { tag: 'Invullen'; draft: Draft; cursor: number; errors: Errors }\n | { tag: 'Indienen'; data: ValidRegistratie }\n | { tag: 'Ingediend'; data: ValidRegistratie; referentie: string }\n | { tag: 'Mislukt'; data: ValidRegistratie; error: string };\n\nconst emptyDraft: Draft = { antwoorden: {} };\nexport const initial: RegistratieState = { tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {} };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, d: Draft): Result {\n const errors: Errors = {};\n switch (step) {\n case 'adres': {\n if (!d.straat || d.straat.trim() === '') errors.straat = 'Vul een straat en huisnummer in.';\n const pc = parsePostcode(d.postcode ?? '');\n if (!pc.ok) errors.postcode = pc.error;\n if (!d.woonplaats || d.woonplaats.trim() === '') errors.woonplaats = 'Vul een woonplaats in.';\n if (!d.correspondentie) errors.correspondentie = 'Maak een keuze.';\n // E-mail is only required when 'email' is the chosen channel.\n if (d.correspondentie === 'email') {\n const e = parseEmail(d.email ?? '');\n if (!e.ok) errors.email = e.error;\n }\n break;\n }\n case 'beroep': {\n // A diploma must be chosen (or declared manually); its beroep is then known.\n if (!d.diplomaId || !d.beroep) {\n errors.diploma = 'Kies het diploma waarmee u zich wilt registreren, of voer het handmatig in.';\n break;\n }\n // Every policy question the chosen diploma raised must be answered. Which\n // questions apply is server-decided (carried in `vraagIds`); we only check\n // they're answered.\n const open: Record = {};\n for (const id of d.vraagIds ?? []) {\n if (!(d.antwoorden[id] ?? '').trim()) open[id] = 'Beantwoord deze vraag.';\n }\n if (Object.keys(open).length > 0) errors.antwoorden = open;\n break;\n }\n case 'controle':\n break; // controle shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole wizard into a ValidRegistratie (called on submit). */\nfunction validateAll(d: Draft): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, d);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const pc = parsePostcode(d.postcode ?? '');\n // validateStep guaranteed these parse, but keep the compiler happy.\n if (!pc.ok || !d.diplomaId || !d.beroep || !d.correspondentie) return err(errors);\n const email = d.correspondentie === 'email' ? parseEmail(d.email ?? '') : undefined;\n // Keep only the answers to the questions that actually applied.\n const vraagIds = d.vraagIds ?? [];\n const antwoorden = Object.fromEntries(vraagIds.map((id) => [id, d.antwoorden[id] ?? '']));\n\n return ok({\n adres: { straat: d.straat!, postcode: pc.value, woonplaats: d.woonplaats! },\n adresHerkomst: d.adresHerkomst ?? 'handmatig',\n correspondentie: d.correspondentie,\n email: email?.ok ? email.value : undefined,\n diplomaId: d.diplomaId,\n diplomaHerkomst: d.diplomaHerkomst ?? 'handmatig',\n beroep: d.beroep,\n antwoorden,\n });\n}\n\nexport function setField(s: RegistratieState, key: DraftField, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const draft: Draft = { ...s.draft, [key]: value };\n // Editing an address field means the user owns it now — not the BRP copy.\n if (key === 'straat' || key === 'postcode' || key === 'woonplaats') draft.adresHerkomst = 'handmatig';\n return { ...s, draft };\n}\n\nexport function setCorrespondentie(s: RegistratieState, value: Correspondentie): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, correspondentie: value } };\n}\n\n/** Prefill the address from a BRP lookup and flag its origin (PRD §7). */\nexport function prefillAdres(s: RegistratieState, straat: string, postcode: string, woonplaats: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, straat, postcode, woonplaats, adresHerkomst: 'brp' } };\n}\n\n/** Pick a DUO diploma; the beroep is derived from it and the applicable policy\n questions (`vraagIds`) come with it (both server-computed, passed in). */\nexport function kiesDiploma(s: RegistratieState, diplomaId: string, beroep: string, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId, beroep, vraagIds, diplomaHerkomst: 'duo' }, errors: {} };\n}\n\n/** Switch to manual diploma entry: the diploma isn't in DUO, so the MAXIMAL\n policy-question set applies and the entry is flagged handmatig/unverified. The\n beroep is declared separately (declareerBeroep). */\nexport function kiesHandmatig(s: RegistratieState, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId: 'handmatig', beroep: undefined, vraagIds, diplomaHerkomst: 'handmatig' }, errors: {} };\n}\n\n/** Declare the beroep for a manually-entered diploma (chosen from a fixed list). */\nexport function declareerBeroep(s: RegistratieState, beroep: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, beroep } };\n}\n\nexport function setAntwoord(s: RegistratieState, vraagId: string, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, antwoorden: { ...s.draft.antwoorden, [vraagId]: value } } };\n}\n\nexport function next(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateStep(currentStep(s), s.draft);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\nexport function back(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\n/** Jump back to an earlier step to correct data (controle → step N). Forward\n jumps are not allowed (would skip validation). Preserves the draft. */\nexport function gaNaarStap(s: RegistratieState, cursor: number): RegistratieState {\n if (s.tag !== 'Invullen' || cursor < 0 || cursor >= s.cursor) return s;\n return { ...s, cursor, errors: {} };\n}\n\nexport function submit(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateAll(s.draft);\n return r.ok ? { tag: 'Indienen', data: r.value } : { ...s, errors: r.error };\n}\n\nexport function resolve(s: RegistratieState, r: Result): RegistratieState {\n if (s.tag !== 'Indienen') return s;\n return r.ok ? { tag: 'Ingediend', data: s.data, referentie: r.value } : { tag: 'Mislukt', data: s.data, error: r.error };\n}\n\nexport type RegistratieMsg =\n | { tag: 'SetField'; key: DraftField; value: string }\n | { tag: 'SetCorrespondentie'; value: Correspondentie }\n | { tag: 'PrefillAdres'; straat: string; postcode: string; woonplaats: string }\n | { tag: 'KiesDiploma'; diplomaId: string; beroep: string; vraagIds: string[] }\n | { tag: 'KiesHandmatig'; vraagIds: string[] }\n | { tag: 'DeclareerBeroep'; beroep: string }\n | { tag: 'SetAntwoord'; vraagId: string; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'GaNaarStap'; cursor: number }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Seed'; state: RegistratieState };\n\nexport function reduce(s: RegistratieState, m: RegistratieMsg): RegistratieState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'SetCorrespondentie':\n return setCorrespondentie(s, m.value);\n case 'PrefillAdres':\n return prefillAdres(s, m.straat, m.postcode, m.woonplaats);\n case 'KiesDiploma':\n return kiesDiploma(s, m.diplomaId, m.beroep, m.vraagIds);\n case 'KiesHandmatig':\n return kiesHandmatig(s, m.vraagIds);\n case 'DeclareerBeroep':\n return declareerBeroep(s, m.beroep);\n case 'SetAntwoord':\n return setAntwoord(s, m.vraagId, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'GaNaarStap':\n return gaNaarStap(s, m.cursor);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Mislukt' ? { tag: 'Indienen', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Indienen' ? { tag: 'Ingediend', data: s.data, referentie: m.referentie } : s;\n case 'SubmitFailed':\n return s.tag === 'Indienen' ? { tag: 'Mislukt', data: s.data, error: m.error } : s;\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "sourceCode": "import { assertNever } from '@shared/kernel/fp';\n\n/**\n * Pure upload domain (no Angular). Reusable across wizards: the host wizard folds\n * `UploadState` into its Model and delegates upload `Msg`s to `reduceUpload`.\n * Illegal states are unrepresentable by construction; the few transitions a union\n * can't express (channel↔upload exclusivity, single-file categories) are enforced\n * here in the reducer. Effects live in the shell (upload-shell.service.ts).\n */\n\nexport type UploadStatus =\n | { type: 'idle' }\n | { type: 'queued' }\n | { type: 'uploading'; progressPct: number }\n | { type: 'complete'; documentId: string }\n | { type: 'failed'; reason: string }\n | { type: 'deleting'; documentId: string } // carries the id so a failed delete can revert\n | { type: 'deleted' };\n\nexport interface Upload {\n localId: string; // client-generated UUID; the sync tag / status key\n categoryId: string;\n fileName: string;\n fileSizeMb: number;\n status: UploadStatus;\n backgroundSync: boolean;\n}\n\nexport type DeliveryChannel = 'digital' | 'post';\n\nexport interface DocumentCategory {\n categoryId: string;\n label: string;\n description: string;\n required: boolean;\n acceptedTypes: string[];\n maxSizeMb: number;\n multiple: boolean;\n allowPostDelivery: boolean;\n}\n\nexport interface UploadState {\n categories: DocumentCategory[];\n uploads: Upload[];\n deliveryChannel: Record; // categoryId → channel; default 'digital'\n rejections: Record; // categoryId → client-side validation message (transient)\n backgroundSyncAvailable: boolean;\n categoriesError?: string;\n}\n\nexport const initialUpload: UploadState = {\n categories: [],\n uploads: [],\n deliveryChannel: {},\n rejections: {},\n backgroundSyncAvailable: false,\n};\n\nexport type UploadMsg =\n | { type: 'CategoriesLoaded'; categories: DocumentCategory[] }\n | { type: 'CategoriesLoadFailed'; reason: string }\n | { type: 'BackgroundSyncAvailability'; available: boolean }\n | { type: 'FileSelected'; categoryId: string; localId: string; fileName: string; fileSizeMb: number }\n | { type: 'FileRejected'; categoryId: string; reason: 'type' | 'size' | 'multiple' }\n | { type: 'UploadQueued'; localId: string; backgroundSync: boolean }\n | { type: 'UploadProgress'; localId: string; progressPct: number }\n | { type: 'UploadComplete'; localId: string; documentId: string }\n | { type: 'UploadFailed'; localId: string; reason: string }\n | { type: 'UploadRetried'; localId: string }\n | { type: 'UploadRemoved'; localId: string }\n | { type: 'UploadDeleteRequested'; localId: string; documentId: string }\n | { type: 'UploadDeleting'; localId: string }\n | { type: 'UploadDeleteComplete'; localId: string }\n | { type: 'UploadDeleteFailed'; localId: string; reason: string }\n | { type: 'DeliveryChannelChanged'; categoryId: string; channel: DeliveryChannel }\n | {\n type: 'BackgroundUploadsReturned';\n results: Array<{ localId: string } & ({ success: true; documentId: string } | { success: false; reason: string })>;\n };\n\nconst REJECTION_MESSAGES: Record<'type' | 'size' | 'multiple', string> = {\n type: $localize`:@@upload.reject.type:Dit bestandstype is niet toegestaan voor deze categorie.`,\n size: $localize`:@@upload.reject.size:Dit bestand is te groot.`,\n multiple: $localize`:@@upload.reject.multiple:U kunt voor deze categorie maar één bestand uploaden.`,\n};\n\nconst ACTIVE: ReadonlyArray = ['queued', 'uploading', 'complete'];\n\n/** A required category is satisfied by an initiated upload OR a post-delivery choice. */\nexport function categorySatisfied(s: UploadState, categoryId: string): boolean {\n if (s.deliveryChannel[categoryId] === 'post') return true;\n return s.uploads.some((u) => u.categoryId === categoryId && ACTIVE.includes(u.status.type));\n}\n\nexport function requiredCategoriesSatisfied(s: UploadState): boolean {\n return s.categories.filter((c) => c.required).every((c) => categorySatisfied(s, c.categoryId));\n}\n\n/**\n * FE format-validation (never authority — the server re-validates). Returns the\n * rejection reason for one file, or null if it passes the category's type/size.\n */\nexport function rejectReason(cat: DocumentCategory, file: { type: string; sizeMb: number }): 'type' | 'size' | null {\n if (cat.acceptedTypes.length > 0 && !cat.acceptedTypes.includes(file.type)) return 'type';\n if (cat.maxSizeMb > 0 && file.sizeMb > cat.maxSizeMb) return 'size';\n return null;\n}\n\n/** Map one upload's status, leaving the rest of the list untouched. */\nfunction mapUpload(s: UploadState, localId: string, f: (u: Upload) => Upload): UploadState {\n return { ...s, uploads: s.uploads.map((u) => (u.localId === localId ? f(u) : u)) };\n}\n\nconst find = (s: UploadState, localId: string) => s.uploads.find((u) => u.localId === localId);\nconst categoryOf = (s: UploadState, categoryId: string) => s.categories.find((c) => c.categoryId === categoryId);\n\nexport function reduceUpload(s: UploadState, m: UploadMsg): UploadState {\n switch (m.type) {\n case 'CategoriesLoaded': {\n const deliveryChannel = { ...s.deliveryChannel };\n for (const c of m.categories) deliveryChannel[c.categoryId] ??= 'digital';\n return { ...s, categories: m.categories, deliveryChannel, categoriesError: undefined };\n }\n case 'CategoriesLoadFailed':\n return { ...s, categoriesError: m.reason };\n case 'BackgroundSyncAvailability':\n return { ...s, backgroundSyncAvailable: m.available };\n\n case 'FileSelected': {\n // Reject at dispatch: unknown category, or a category set to post-delivery.\n if (!categoryOf(s, m.categoryId) || s.deliveryChannel[m.categoryId] === 'post') return s;\n const cat = categoryOf(s, m.categoryId)!;\n // Single-file categories: a new selection replaces any existing upload.\n const uploads = cat.multiple ? s.uploads : s.uploads.filter((u) => u.categoryId !== m.categoryId);\n const next: Upload = {\n localId: m.localId,\n categoryId: m.categoryId,\n fileName: m.fileName,\n fileSizeMb: m.fileSizeMb,\n status: { type: 'queued' },\n backgroundSync: false,\n };\n const { [m.categoryId]: _cleared, ...rejections } = s.rejections;\n return { ...s, uploads: [...uploads, next], rejections };\n }\n case 'FileRejected':\n return { ...s, rejections: { ...s.rejections, [m.categoryId]: REJECTION_MESSAGES[m.reason] } };\n\n case 'UploadQueued':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'queued' }, backgroundSync: m.backgroundSync }));\n case 'UploadProgress':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'uploading', progressPct: m.progressPct } }));\n case 'UploadComplete':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'complete', documentId: m.documentId } }));\n case 'UploadFailed':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'failed', reason: m.reason } }));\n case 'UploadRetried':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'queued' } }));\n\n case 'UploadRemoved':\n return { ...s, uploads: s.uploads.filter((u) => u.localId !== m.localId) };\n\n case 'UploadDeleteRequested':\n case 'UploadDeleting':\n // Both mark the in-flight delete; keep the documentId so a failure can revert.\n return mapUpload(s, m.localId, (u) => {\n const documentId = u.status.type === 'complete' ? u.status.documentId\n : u.status.type === 'deleting' ? u.status.documentId : '';\n return { ...u, status: { type: 'deleting', documentId } };\n });\n case 'UploadDeleteComplete':\n return { ...s, uploads: s.uploads.filter((u) => u.localId !== m.localId) };\n case 'UploadDeleteFailed':\n return mapUpload(s, m.localId, (u) =>\n u.status.type === 'deleting' ? { ...u, status: { type: 'complete', documentId: u.status.documentId } } : u);\n\n case 'DeliveryChannelChanged': {\n const cat = categoryOf(s, m.categoryId);\n // Reject post for a category that doesn't permit it.\n if (m.channel === 'post' && (!cat || !cat.allowPostDelivery)) return s;\n const deliveryChannel = { ...s.deliveryChannel, [m.categoryId]: m.channel };\n // Switching to post removes that category's uploads; switching to digital starts clean.\n const uploads = s.uploads.filter((u) => u.categoryId !== m.categoryId);\n return { ...s, deliveryChannel, uploads };\n }\n\n case 'BackgroundUploadsReturned': {\n let next = s;\n for (const r of m.results) {\n next = mapUpload(next, r.localId, (u) => ({\n ...u,\n status: r.success ? { type: 'complete', documentId: r.documentId } : { type: 'failed', reason: r.reason },\n }));\n }\n return next;\n }\n\n default:\n return assertNever(m);\n }\n}\n\n/** The submit payload fragment: digital docs carry their documentId, post categories the channel. */\nexport function deliveryRefs(s: UploadState): Array<{ categoryId: string; channel: DeliveryChannel; documentId?: string }> {\n const refs: Array<{ categoryId: string; channel: DeliveryChannel; documentId?: string }> = [];\n for (const c of s.categories) {\n if (s.deliveryChannel[c.categoryId] === 'post') {\n refs.push({ categoryId: c.categoryId, channel: 'post' });\n } else {\n for (const u of s.uploads) {\n if (u.categoryId === c.categoryId && u.status.type === 'complete') {\n refs.push({ categoryId: c.categoryId, channel: 'digital', documentId: u.status.documentId });\n }\n }\n }\n }\n return refs;\n}\n\n/** Used by the shell to find what to poll on return: still-in-flight uploads. */\nexport const inFlight = (s: UploadState): Upload[] =>\n s.uploads.filter((u) => u.status.type === 'queued' || u.status.type === 'uploading');\n", "properties": [ { - "name": "adresHerkomst", + "name": "acceptedTypes", "deprecated": false, "deprecationMessage": "", - "type": "AdresHerkomst", + "type": "string[]", "indexKey": "", - "optional": true, + "optional": false, "description": "", - "line": 32 + "line": 36 }, { - "name": "antwoorden", + "name": "allowPostDelivery", "deprecated": false, "deprecationMessage": "", - "type": "Record", + "type": "boolean", "indexKey": "", "optional": false, "description": "", "line": 39 }, { - "name": "beroep", + "name": "categoryId", "deprecated": false, "deprecationMessage": "", "type": "string", "indexKey": "", - "optional": true, + "optional": false, "description": "", - "line": 37 + "line": 32 }, { - "name": "correspondentie", - "deprecated": false, - "deprecationMessage": "", - "type": "Correspondentie", - "indexKey": "", - "optional": true, - "description": "", - "line": 33 - }, - { - "name": "diplomaHerkomst", - "deprecated": false, - "deprecationMessage": "", - "type": "DiplomaHerkomst", - "indexKey": "", - "optional": true, - "description": "", - "line": 36 - }, - { - "name": "diplomaId", + "name": "description", "deprecated": false, "deprecationMessage": "", "type": "string", "indexKey": "", - "optional": true, - "description": "", - "line": 35 - }, - { - "name": "email", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": true, + "optional": false, "description": "", "line": 34 }, { - "name": "postcode", + "name": "label", "deprecated": false, "deprecationMessage": "", "type": "string", "indexKey": "", - "optional": true, + "optional": false, "description": "", - "line": 30 + "line": 33 }, { - "name": "straat", + "name": "maxSizeMb", "deprecated": false, "deprecationMessage": "", - "type": "string", + "type": "number", "indexKey": "", - "optional": true, + "optional": false, "description": "", - "line": 29 + "line": 37 }, { - "name": "vraagIds", + "name": "multiple", "deprecated": false, "deprecationMessage": "", - "type": "string[]", + "type": "boolean", "indexKey": "", - "optional": true, + "optional": false, "description": "", "line": 38 }, { - "name": "woonplaats", + "name": "required", "deprecated": false, "deprecationMessage": "", - "type": "string", + "type": "boolean", "indexKey": "", - "optional": true, + "optional": false, "description": "", - "line": 31 + "line": 35 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "DocumentCategoryDto", + "id": "interface-DocumentCategoryDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "acceptedTypes", + "deprecated": false, + "deprecationMessage": "", + "type": "string[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 992 + }, + { + "name": "allowPostDelivery", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "indexKey": "", + "optional": true, + "description": "", + "line": 995 + }, + { + "name": "categoryId", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 988 + }, + { + "name": "description", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 990 + }, + { + "name": "label", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 989 + }, + { + "name": "maxSizeMb", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": true, + "description": "", + "line": 993 + }, + { + "name": "multiple", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "indexKey": "", + "optional": true, + "description": "", + "line": 994 + }, + { + "name": "required", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "indexKey": "", + "optional": true, + "description": "", + "line": 991 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "DocumentRefDto", + "id": "interface-DocumentRefDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "categoryId", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 999 + }, + { + "name": "channel", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1000 + }, + { + "name": "documentId", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1001 } ], "indexSignatures": [], "kind": 172, - "description": "

One record carried across every step (and persisted). All optional: the user\nfills it in gradually. Adres fields are kept flat so one SetField message\nserves them all (mirrors the intake machine).

\n", - "rawdescription": "\nOne record carried across every step (and persisted). All optional: the user\nfills it in gradually. Adres fields are kept flat so one `SetField` message\nserves them all (mirrors the intake machine).", "methods": [], "extends": [] }, { "name": "Draft", - "id": "interface-Draft-097a742aa05bc7bbfee387dd3ea5b2ac382815db8ca18107e699d11e6da110cdeae2eb377bcea284f415cfd263937c3b0f6e7ed2ee9090d660d898dddefe3a4f-1", + "id": "interface-Draft-d3a799f0e07d1170099acce3acff423674ca7f22594847e870e6e02647d914a5263109f13f637ef9de59ab53bd41d63d7e8b60d6d14428a693efa5576b933439", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n uren: string;\n jaren: string;\n punten: string;\n}\n\n/** What we have AFTER parsing — branded/typed, guaranteed valid. */\nexport interface Valid {\n uren: Uren;\n jaren: number;\n punten: number;\n}\n\n/**\n * The whole wizard as one tagged union. `step` and `errors` exist ONLY while\n * Editing; Submitting/Submitted/Failed carry a `Valid` payload and nothing else.\n * So \"submitting while a field is invalid\" or \"showing the success screen with\n * errors set\" are unrepresentable — the bug class is gone by construction.\n */\nexport type WizardState =\n | { tag: 'Editing'; step: 1 | 2; draft: Draft; errors: Partial> }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: WizardState = { tag: 'Editing', step: 1, draft: { uren: '', jaren: '', punten: '' }, errors: {} };\n\n/** Parse every field; on success hand back a Valid, else the per-field errors. */\nfunction validate(draft: Draft): Result>, Valid> {\n const uren = parseUren(draft.uren);\n const jaren = parseUren(draft.jaren);\n const punten = parseUren(draft.punten);\n const errors: Partial> = {};\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n if (!punten.ok) errors.punten = punten.error;\n if (uren.ok && jaren.ok && punten.ok) {\n return { ok: true, value: { uren: uren.value, jaren: jaren.value, punten: punten.value } };\n }\n return { ok: false, error: errors };\n}\n\n/** Step 1 → 2: advance only when BOTH step-1 fields parse. Illegal elsewhere = no-op. */\nexport function next(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 1) return s;\n const uren = parseUren(s.draft.uren);\n const jaren = parseUren(s.draft.jaren);\n const errors: Partial> = {};\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n return Object.keys(errors).length === 0 ? { ...s, step: 2, errors: {} } : { ...s, errors };\n}\n\nexport function back(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 2) return s;\n return { ...s, step: 1, errors: {} };\n}\n\n/** Step 2 submit: parse everything; move to Submitting only with Valid data. */\nexport function submit(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 2) return s;\n const result = validate(s.draft);\n return result.ok ? { tag: 'Submitting', data: result.value } : { ...s, errors: result.error };\n}\n\n/** Resolve the async submit. Only meaningful while Submitting. */\nexport function resolve(s: WizardState, r: Result): WizardState {\n if (s.tag !== 'Submitting') return s;\n return r.ok ? { tag: 'Submitted', data: s.data } : { tag: 'Failed', data: s.data, error: r.error };\n}\n\n/** Update one draft field while editing; ignored in any other state. */\nexport function setField(s: WizardState, key: keyof Draft, value: string): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, draft: { ...s.draft, [key]: value } };\n}\n\n/**\n * Every event that can happen to the wizard, as one message type. The component\n * sends a WizardMsg; `reduce` decides the next state. This is the Elm\n * Model+Msg+update pattern: ONE pure function describes all state changes.\n */\nexport type WizardMsg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Seed'; state: WizardState }; // mount a specific state (stories/showcase)\n\nexport function reduce(s: WizardState, m: WizardMsg): WizardState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\nimport {\n UploadState,\n UploadMsg,\n initialUpload,\n reduceUpload,\n requiredCategoriesSatisfied,\n deliveryRefs,\n} from '@shared/upload/upload.machine';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n uren: string;\n jaren: string;\n punten: string;\n}\n\nexport type StepErrors = Partial>;\n\n/** What we have AFTER parsing — branded/typed, guaranteed valid. */\nexport interface Valid {\n uren: Uren;\n jaren: number;\n punten: number;\n documents: Array<{ categoryId: string; channel: 'digital' | 'post'; documentId?: string }>;\n}\n\n/**\n * The whole wizard as one tagged union. `step` and `errors` exist ONLY while\n * Editing; Submitting/Submitted/Failed carry a `Valid` payload and nothing else.\n * So \"submitting while a field is invalid\" or \"showing the success screen with\n * errors set\" are unrepresentable — the bug class is gone by construction.\n */\nexport type WizardState =\n | { tag: 'Editing'; step: 1 | 2 | 3; draft: Draft; errors: StepErrors; upload: UploadState }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: WizardState = { tag: 'Editing', step: 1, draft: { uren: '', jaren: '', punten: '' }, errors: {}, upload: initialUpload };\n\n/** Has the user meaningfully started, so it's worth persisting as a Concept? */\nexport function hasProgress(s: Extract): boolean {\n return s.step > 1 || !!s.draft.uren || !!s.draft.jaren || !!s.draft.punten || deliveryRefs(s.upload).some((r) => r.channel === 'digital' && !!r.documentId);\n}\n\n/** Parse every field; on success hand back a Valid, else the per-field errors. */\nfunction validate(draft: Draft, upload: UploadState): Result {\n const uren = parseUren(draft.uren);\n const jaren = parseUren(draft.jaren);\n const punten = parseUren(draft.punten);\n const errors: StepErrors = {};\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n if (!punten.ok) errors.punten = punten.error;\n if (!requiredCategoriesSatisfied(upload)) {\n errors.documenten = $localize`:@@validation.documenten:Lever de verplichte documenten aan (upload of kies \"per post nasturen\").`;\n }\n if (uren.ok && jaren.ok && punten.ok && !errors.documenten) {\n return { ok: true, value: { uren: uren.value, jaren: jaren.value, punten: punten.value, documents: deliveryRefs(upload) } };\n }\n return { ok: false, error: errors };\n}\n\n/** Advance one step, gating on that step's fields. Illegal elsewhere = no-op. */\nexport function next(s: WizardState): WizardState {\n if (s.tag !== 'Editing') return s;\n const errors: StepErrors = {};\n if (s.step === 1) {\n const uren = parseUren(s.draft.uren);\n const jaren = parseUren(s.draft.jaren);\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n return Object.keys(errors).length === 0 ? { ...s, step: 2, errors: {} } : { ...s, errors };\n }\n if (s.step === 2) {\n const punten = parseUren(s.draft.punten);\n if (!punten.ok) errors.punten = punten.error;\n return punten.ok ? { ...s, step: 3, errors: {} } : { ...s, errors };\n }\n return s;\n}\n\nexport function back(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step === 1) return s;\n return { ...s, step: (s.step - 1) as 1 | 2, errors: {} };\n}\n\n/** Step 3 submit: parse everything + require documents; Submitting only with Valid. */\nexport function submit(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 3) return s;\n const result = validate(s.draft, s.upload);\n return result.ok ? { tag: 'Submitting', data: result.value } : { ...s, errors: result.error };\n}\n\n/** Route an upload sub-message through the pure upload reducer (Editing only). */\nexport function upload(s: WizardState, msg: UploadMsg): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, upload: reduceUpload(s.upload, msg) };\n}\n\n/** Resolve the async submit. Only meaningful while Submitting. */\nexport function resolve(s: WizardState, r: Result): WizardState {\n if (s.tag !== 'Submitting') return s;\n return r.ok ? { tag: 'Submitted', data: s.data } : { tag: 'Failed', data: s.data, error: r.error };\n}\n\n/** Update one draft field while editing; ignored in any other state. */\nexport function setField(s: WizardState, key: keyof Draft, value: string): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, draft: { ...s.draft, [key]: value } };\n}\n\n/**\n * Every event that can happen to the wizard, as one message type. The component\n * sends a WizardMsg; `reduce` decides the next state. This is the Elm\n * Model+Msg+update pattern: ONE pure function describes all state changes.\n */\nexport type WizardMsg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Upload'; msg: UploadMsg }\n | { tag: 'Seed'; state: WizardState }; // mount a specific state (stories/showcase)\n\nexport function reduce(s: WizardState, m: WizardMsg): WizardState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Upload':\n return upload(s, m.msg);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", "properties": [ { "name": "jaren", @@ -599,7 +1312,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 7 + "line": 15 }, { "name": "punten", @@ -609,7 +1322,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 8 + "line": 16 }, { "name": "uren", @@ -619,7 +1332,54 @@ "indexKey": "", "optional": false, "description": "", + "line": 14 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

What the user is typing (raw, possibly invalid).

\n", + "rawdescription": "\nWhat the user is typing (raw, possibly invalid).", + "methods": [], + "extends": [] + }, + { + "name": "Draft", + "id": "interface-Draft-69e87ea9a6c36bd372087191f1524450d62f799934711812731fbbd8f034a9e92b7928082471c429b82990c34c47b84b6493735cb994ec6fdfb81b200e990467-1", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\n/** After parsing — postcode is the branded type, so downstream can't get a raw one. */\nexport interface Valid {\n straat: string;\n postcode: Postcode;\n woonplaats: string;\n}\n\nexport type Errors = Partial>;\n\n/**\n * The change-request (adreswijziging) form as one tagged union — the SAME idiom\n * as the wizards, just single-step. `draft`/`errors` exist only while Editing;\n * Submitting/Submitted/Failed carry the parsed `Valid`. Illegal states (submitting\n * an invalid draft, a success screen with errors) are unrepresentable.\n */\nexport type State =\n | { tag: 'Editing'; draft: Draft; errors: Errors }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid; referentie: string }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: State = {\n tag: 'Editing',\n draft: { straat: '', postcode: '', woonplaats: '' },\n errors: {},\n};\n\n/** Parse via the value objects; on success hand back a Valid, else per-field errors. */\nfunction validate(draft: Draft): Result {\n const straat = draft.straat.trim();\n const postcode = parsePostcode(draft.postcode);\n const errors: Errors = {};\n if (!straat) errors.straat = $localize`:@@validation.straat:Vul straat en huisnummer in.`;\n if (!postcode.ok) errors.postcode = postcode.error;\n if (straat && postcode.ok) {\n return { ok: true, value: { straat, postcode: postcode.value, woonplaats: draft.woonplaats.trim() } };\n }\n return { ok: false, error: errors };\n}\n\nexport type Msg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Reset' }\n | { tag: 'Seed'; state: State }; // mount a specific state (stories/tests)\n\nexport function reduce(s: State, m: Msg): State {\n switch (m.tag) {\n case 'SetField':\n return s.tag === 'Editing' ? { ...s, draft: { ...s.draft, [m.key]: m.value } } : s;\n case 'Submit': {\n if (s.tag !== 'Editing') return s;\n const r = validate(s.draft);\n return r.ok ? { tag: 'Submitting', data: r.value } : { ...s, errors: r.error };\n }\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data, referentie: m.referentie } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Reset':\n return initial;\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "properties": [ + { + "name": "postcode", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 7 + }, + { + "name": "straat", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", "line": 6 + }, + { + "name": "woonplaats", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 8 } ], "indexSignatures": [], @@ -632,9 +1392,384 @@ "duplicateId": 1, "duplicateName": "Draft-1" }, + { + "name": "Draft", + "id": "interface-Draft-b7c3c5d493aa141ca68cb964e63408db7152b07336b239864d3c430b84d8eb3e650d1a3abaf3fda253444af942c45f86138a5d8229832d49bda94eec35c33546-2", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\nimport { Email, parseEmail } from '@registratie/domain/value-objects/email';\nimport {\n UploadState,\n UploadMsg,\n DeliveryChannel,\n initialUpload,\n reduceUpload,\n requiredCategoriesSatisfied,\n deliveryRefs,\n} from '@shared/upload/upload.machine';\n\n/**\n * A FIXED 3-step registration wizard. The steps never change in number (always\n * `STEPS`): (1) adres + correspondentievoorkeur, (2) beroep o.b.v. diploma,\n * (3) controle & indienen. Follow-up questions appear *inline within a step*\n * (e.g. choosing 'email' reveals the e-mail field). \"Is this field required\n * right now\" is a pure function (`validateStep`), so it is trivial to test and\n * impossible to get out of sync with the data. Invariants live here, not in the\n * UI: the wizard reaches `Indienen` only when a complete `ValidRegistratie` parses.\n */\n\nexport type StepId = 'adres' | 'beroep' | 'controle';\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['adres', 'beroep', 'controle'];\n\n/** Where a piece of data came from — recorded on the aggregate (PRD §5). */\nexport type AdresHerkomst = 'brp' | 'handmatig';\nexport type DiplomaHerkomst = 'duo' | 'handmatig';\nexport type Correspondentie = 'email' | 'post';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually. Adres fields are kept flat so one `SetField` message\n serves them all (mirrors the intake machine). */\nexport interface Draft {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n adresHerkomst?: AdresHerkomst;\n correspondentie?: Correspondentie;\n email?: string;\n diplomaId?: string;\n diplomaHerkomst?: DiplomaHerkomst;\n beroep?: string; // DERIVED from the chosen DUO diploma (or declared for a manual one)\n vraagIds?: string[]; // ids of the policy questions that apply to the chosen diploma\n antwoorden: Record; // geldigheidsantwoorden, keyed by question id\n}\n\n/** What we have after the controle step parses — guaranteed valid/typed. */\nexport interface ValidRegistratie {\n adres: { straat: string; postcode: Postcode; woonplaats: string };\n adresHerkomst: AdresHerkomst;\n correspondentie: Correspondentie;\n email?: Email; // only when correspondentie === 'email'\n diplomaId: string;\n diplomaHerkomst: DiplomaHerkomst;\n beroep: string;\n antwoorden: Record;\n documents: Array<{ categoryId: string; channel: DeliveryChannel; documentId?: string }>;\n}\n\n/** Text fields settable via SetField. */\nexport type DraftField = 'straat' | 'postcode' | 'woonplaats' | 'email';\n\n/** Per-field error map. `antwoorden` holds per-policy-question errors, keyed by\n question id (a step can show several questions). */\nexport interface Errors {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n email?: string;\n correspondentie?: string;\n diploma?: string;\n documenten?: string;\n antwoorden?: Record;\n}\n\nexport type RegistratieState =\n | { tag: 'Invullen'; draft: Draft; cursor: number; errors: Errors; upload: UploadState }\n | { tag: 'Indienen'; data: ValidRegistratie }\n | { tag: 'Ingediend'; data: ValidRegistratie; referentie: string }\n | { tag: 'Mislukt'; data: ValidRegistratie; error: string };\n\nconst emptyDraft: Draft = { antwoorden: {} };\nexport const initial: RegistratieState = { tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {}, upload: initialUpload };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Has the user meaningfully started, so it's worth persisting as a Concept? Excludes\n the automatic BRP address prefill on step 0 — a bare page visit creates nothing.\n ponytail: an address typed at step 0 without any of these signals is not yet\n persisted (created once they advance/choose); accepted regression vs. sessionStorage. */\nexport function hasProgress(s: Extract): boolean {\n const d = s.draft;\n return (\n s.cursor > 0 ||\n !!d.correspondentie ||\n !!d.email ||\n !!d.diplomaId ||\n !!d.beroep ||\n deliveryRefs(s.upload).some((r) => r.channel === 'digital' && !!r.documentId)\n );\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, d: Draft, upload: UploadState): Result {\n const errors: Errors = {};\n switch (step) {\n case 'adres': {\n if (!d.straat || d.straat.trim() === '') errors.straat = $localize`:@@validation.straat2:Vul een straat en huisnummer in.`;\n const pc = parsePostcode(d.postcode ?? '');\n if (!pc.ok) errors.postcode = pc.error;\n if (!d.woonplaats || d.woonplaats.trim() === '') errors.woonplaats = $localize`:@@validation.woonplaats:Vul een woonplaats in.`;\n if (!d.correspondentie) errors.correspondentie = $localize`:@@validation.maakKeuze:Maak een keuze.`;\n // E-mail is only required when 'email' is the chosen channel.\n if (d.correspondentie === 'email') {\n const e = parseEmail(d.email ?? '');\n if (!e.ok) errors.email = e.error;\n }\n break;\n }\n case 'beroep': {\n // A diploma must be chosen (or declared manually); its beroep is then known.\n if (!d.diplomaId || !d.beroep) {\n errors.diploma = $localize`:@@validation.diploma:Kies het diploma waarmee u zich wilt registreren, of voer het handmatig in.`;\n break;\n }\n // Every policy question the chosen diploma raised must be answered. Which\n // questions apply is server-decided (carried in `vraagIds`); we only check\n // they're answered.\n const open: Record = {};\n for (const id of d.vraagIds ?? []) {\n if (!(d.antwoorden[id] ?? '').trim()) open[id] = $localize`:@@validation.beantwoordVraag:Beantwoord deze vraag.`;\n }\n if (Object.keys(open).length > 0) errors.antwoorden = open;\n // Required documents for this wizard attach to the beroep step (inline upload).\n if (!requiredCategoriesSatisfied(upload)) {\n errors.documenten = $localize`:@@validation.documenten:Lever de verplichte documenten aan (upload of kies \"per post nasturen\").`;\n }\n break;\n }\n case 'controle':\n break; // controle shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole wizard into a ValidRegistratie (called on submit). */\nfunction validateAll(d: Draft, upload: UploadState): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, d, upload);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const pc = parsePostcode(d.postcode ?? '');\n // validateStep guaranteed these parse, but keep the compiler happy.\n if (!pc.ok || !d.diplomaId || !d.beroep || !d.correspondentie) return err(errors);\n const email = d.correspondentie === 'email' ? parseEmail(d.email ?? '') : undefined;\n // Keep only the answers to the questions that actually applied.\n const vraagIds = d.vraagIds ?? [];\n const antwoorden = Object.fromEntries(vraagIds.map((id) => [id, d.antwoorden[id] ?? '']));\n\n return ok({\n adres: { straat: d.straat!, postcode: pc.value, woonplaats: d.woonplaats! },\n adresHerkomst: d.adresHerkomst ?? 'handmatig',\n correspondentie: d.correspondentie,\n email: email?.ok ? email.value : undefined,\n diplomaId: d.diplomaId,\n diplomaHerkomst: d.diplomaHerkomst ?? 'handmatig',\n beroep: d.beroep,\n antwoorden,\n documents: deliveryRefs(upload),\n });\n}\n\nexport function setField(s: RegistratieState, key: DraftField, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const draft: Draft = { ...s.draft, [key]: value };\n // Editing an address field means the user owns it now — not the BRP copy.\n if (key === 'straat' || key === 'postcode' || key === 'woonplaats') draft.adresHerkomst = 'handmatig';\n return { ...s, draft };\n}\n\nexport function setCorrespondentie(s: RegistratieState, value: Correspondentie): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, correspondentie: value } };\n}\n\n/** Prefill the address from a BRP lookup and flag its origin (PRD §7). */\nexport function prefillAdres(s: RegistratieState, straat: string, postcode: string, woonplaats: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, straat, postcode, woonplaats, adresHerkomst: 'brp' } };\n}\n\n/** Pick a DUO diploma; the beroep is derived from it and the applicable policy\n questions (`vraagIds`) come with it (both server-computed, passed in). */\nexport function kiesDiploma(s: RegistratieState, diplomaId: string, beroep: string, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId, beroep, vraagIds, diplomaHerkomst: 'duo' }, errors: {} };\n}\n\n/** Switch to manual diploma entry: the diploma isn't in DUO, so the MAXIMAL\n policy-question set applies and the entry is flagged handmatig/unverified. The\n beroep is declared separately (declareerBeroep). */\nexport function kiesHandmatig(s: RegistratieState, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId: 'handmatig', beroep: undefined, vraagIds, diplomaHerkomst: 'handmatig' }, errors: {} };\n}\n\n/** Declare the beroep for a manually-entered diploma (chosen from a fixed list). */\nexport function declareerBeroep(s: RegistratieState, beroep: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, beroep } };\n}\n\nexport function setAntwoord(s: RegistratieState, vraagId: string, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, antwoorden: { ...s.draft.antwoorden, [vraagId]: value } } };\n}\n\nexport function next(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateStep(currentStep(s), s.draft, s.upload);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\nexport function back(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\n/** Jump back to an earlier step to correct data (controle → step N). Forward\n jumps are not allowed (would skip validation). Preserves the draft. */\nexport function gaNaarStap(s: RegistratieState, cursor: number): RegistratieState {\n if (s.tag !== 'Invullen' || cursor < 0 || cursor >= s.cursor) return s;\n return { ...s, cursor, errors: {} };\n}\n\nexport function submit(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateAll(s.draft, s.upload);\n return r.ok ? { tag: 'Indienen', data: r.value } : { ...s, errors: r.error };\n}\n\n/** Route an upload sub-message through the pure upload reducer (Invullen only). */\nexport function upload(s: RegistratieState, msg: UploadMsg): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, upload: reduceUpload(s.upload, msg) };\n}\n\nexport function resolve(s: RegistratieState, r: Result): RegistratieState {\n if (s.tag !== 'Indienen') return s;\n return r.ok ? { tag: 'Ingediend', data: s.data, referentie: r.value } : { tag: 'Mislukt', data: s.data, error: r.error };\n}\n\nexport type RegistratieMsg =\n | { tag: 'SetField'; key: DraftField; value: string }\n | { tag: 'SetCorrespondentie'; value: Correspondentie }\n | { tag: 'PrefillAdres'; straat: string; postcode: string; woonplaats: string }\n | { tag: 'KiesDiploma'; diplomaId: string; beroep: string; vraagIds: string[] }\n | { tag: 'KiesHandmatig'; vraagIds: string[] }\n | { tag: 'DeclareerBeroep'; beroep: string }\n | { tag: 'SetAntwoord'; vraagId: string; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'GaNaarStap'; cursor: number }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Upload'; msg: UploadMsg }\n | { tag: 'Seed'; state: RegistratieState };\n\nexport function reduce(s: RegistratieState, m: RegistratieMsg): RegistratieState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'SetCorrespondentie':\n return setCorrespondentie(s, m.value);\n case 'PrefillAdres':\n return prefillAdres(s, m.straat, m.postcode, m.woonplaats);\n case 'KiesDiploma':\n return kiesDiploma(s, m.diplomaId, m.beroep, m.vraagIds);\n case 'KiesHandmatig':\n return kiesHandmatig(s, m.vraagIds);\n case 'DeclareerBeroep':\n return declareerBeroep(s, m.beroep);\n case 'SetAntwoord':\n return setAntwoord(s, m.vraagId, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'GaNaarStap':\n return gaNaarStap(s, m.cursor);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Mislukt' ? { tag: 'Indienen', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Indienen' ? { tag: 'Ingediend', data: s.data, referentie: m.referentie } : s;\n case 'SubmitFailed':\n return s.tag === 'Indienen' ? { tag: 'Mislukt', data: s.data, error: m.error } : s;\n case 'Upload':\n return upload(s, m.msg);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "properties": [ + { + "name": "adresHerkomst", + "deprecated": false, + "deprecationMessage": "", + "type": "AdresHerkomst", + "indexKey": "", + "optional": true, + "description": "", + "line": 41 + }, + { + "name": "antwoorden", + "deprecated": false, + "deprecationMessage": "", + "type": "Record", + "indexKey": "", + "optional": false, + "description": "", + "line": 48 + }, + { + "name": "beroep", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 46 + }, + { + "name": "correspondentie", + "deprecated": false, + "deprecationMessage": "", + "type": "Correspondentie", + "indexKey": "", + "optional": true, + "description": "", + "line": 42 + }, + { + "name": "diplomaHerkomst", + "deprecated": false, + "deprecationMessage": "", + "type": "DiplomaHerkomst", + "indexKey": "", + "optional": true, + "description": "", + "line": 45 + }, + { + "name": "diplomaId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 44 + }, + { + "name": "email", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 43 + }, + { + "name": "postcode", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 39 + }, + { + "name": "straat", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 38 + }, + { + "name": "vraagIds", + "deprecated": false, + "deprecationMessage": "", + "type": "string[]", + "indexKey": "", + "optional": true, + "description": "", + "line": 47 + }, + { + "name": "woonplaats", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 40 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

One record carried across every step (and persisted). All optional: the user\nfills it in gradually. Adres fields are kept flat so one SetField message\nserves them all (mirrors the intake machine).

\n", + "rawdescription": "\nOne record carried across every step (and persisted). All optional: the user\nfills it in gradually. Adres fields are kept flat so one `SetField` message\nserves them all (mirrors the intake machine).", + "methods": [], + "extends": [], + "isDuplicate": true, + "duplicateId": 2, + "duplicateName": "Draft-2" + }, + { + "name": "DraftSnapshot", + "id": "interface-DraftSnapshot-50317a3496db98ee3a6c673faa9f2ec80371dd1003d718acbbd05c46a936a7275199ebafeabde226732b818a914d6c7410b17e8c640db4152ef530fdede44c09", + "file": "src/app/registratie/application/draft-sync.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { DestroyRef, effect, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Result } from '@shared/kernel/fp';\nimport { runSubmit, SUBMIT_FAILED } from '@shared/application/submit';\nimport { SubmitApplicationRequest, SubmitApplicationResponse } from '@shared/infrastructure/api-client';\nimport { AanvraagType } from '@registratie/domain/aanvraag';\nimport { ApplicationsAdapter } from '@registratie/infrastructure/applications.adapter';\n\n/** What a wizard persists per step: the opaque machine snapshot + progress + docs. */\nexport interface DraftSnapshot {\n draft: unknown;\n stepIndex: number;\n stepCount: number;\n documentIds: string[];\n}\n\nexport interface DraftSyncDeps {\n type: AanvraagType;\n /** The machine snapshot while it's worth persisting; null when not (pristine/done). */\n snapshot: () => DraftSnapshot | null;\n /** Seed the machine from a resumed draft (null → start fresh). Called once, on init. */\n onResume: (draft: unknown | null) => void;\n /** Draft-sync only runs in the real app — false in Storybook/tests (explicit seed). */\n enabled: () => boolean;\n}\n\nconst DEBOUNCE_MS = 600; // ponytail: fixed debounce; tune if the sync feels laggy/chatty.\n\n/**\n * The effectful glue that replaces per-wizard sessionStorage with a backend-owned\n * Concept (PRD 0001, phase D). Instantiated in a field initializer (like\n * `createStore`/`createUploadController`). Responsibilities:\n *\n * - resume: if the URL carries `?aanvraag=`, load that draft and seed the machine;\n * - create-on-first-progress: the Concept is created lazily the first time the wizard\n * reports a non-null snapshot, and the id is stamped into the URL (so a reload resumes);\n * - debounced draft sync on every subsequent change.\n *\n * Inert without a Router (stories) or when `enabled()` is false — no network, no resume.\n */\nexport function createDraftSync(deps: DraftSyncDeps) {\n const adapter = inject(ApplicationsAdapter);\n const router = inject(Router, { optional: true });\n const route = inject(ActivatedRoute, { optional: true });\n const active = () => deps.enabled() && !!router && !!route;\n\n let id: string | undefined;\n let ensuring: Promise | undefined; // in-flight create, so we never create twice\n let timer: ReturnType | undefined;\n\n const ensureId = (): Promise => {\n if (id) return Promise.resolve(id);\n ensuring ??= adapter.create(deps.type).then((newId) => {\n id = newId;\n // Stamp the id into the URL (no navigation) so a reload resumes this Concept.\n void router!.navigate([], { relativeTo: route!, queryParams: { aanvraag: newId }, queryParamsHandling: 'merge', replaceUrl: true });\n return newId;\n });\n return ensuring;\n };\n\n const flush = async () => {\n const snap = deps.snapshot();\n if (!snap) return;\n const theId = await ensureId();\n await adapter.syncDraft(theId, { draft: snap.draft, stepIndex: snap.stepIndex, stepCount: snap.stepCount, documentIds: snap.documentIds });\n };\n\n // One effect watches the snapshot; each change resets a debounce timer. The timer's\n // callback only does network I/O (never dispatch), so it can't livelock the store.\n effect(() => {\n if (!active()) return;\n const snap = deps.snapshot(); // tracked: fires on every machine change\n if (!snap) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => void flush(), DEBOUNCE_MS);\n });\n\n inject(DestroyRef).onDestroy(() => timer && clearTimeout(timer));\n\n return {\n /** Resolve the initial state: resume a linked Concept, or start fresh. */\n resume() {\n if (!active()) {\n deps.onResume(null);\n return;\n }\n const linked = route!.snapshot.queryParamMap.get('aanvraag');\n if (!linked) {\n deps.onResume(null);\n return;\n }\n id = linked;\n adapter\n .detail(linked)\n .then((dto) => deps.onResume(dto.draft ?? null))\n .catch(() => deps.onResume(null)); // unknown/deleted id → start fresh\n },\n\n /** Submit through the aanvraag lifecycle: ensure the Concept exists, then\n `POST /applications/{id}/submit` (server sets autoApprovable + transitions).\n Folded into a Result like the old submit-* commands. */\n submit(body: SubmitApplicationRequest): Promise> {\n return runSubmit(async () => adapter.submit(await ensureId(), body), SUBMIT_FAILED);\n },\n\n /** Detach from the current Concept (a new one is created on next progress) and\n drop the `?aanvraag` link. Used when the wizard restarts. */\n reset() {\n id = undefined;\n ensuring = undefined;\n if (active()) void router!.navigate([], { relativeTo: route!, queryParams: { aanvraag: null }, queryParamsHandling: 'merge', replaceUrl: true });\n },\n };\n}\n", + "properties": [ + { + "name": "documentIds", + "deprecated": false, + "deprecationMessage": "", + "type": "string[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 14 + }, + { + "name": "draft", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 11 + }, + { + "name": "stepCount", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": false, + "description": "", + "line": 13 + }, + { + "name": "stepIndex", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": false, + "description": "", + "line": 12 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

What a wizard persists per step: the opaque machine snapshot + progress + docs.

\n", + "rawdescription": "\nWhat a wizard persists per step: the opaque machine snapshot + progress + docs.", + "methods": [], + "extends": [] + }, + { + "name": "DraftSyncDeps", + "id": "interface-DraftSyncDeps-50317a3496db98ee3a6c673faa9f2ec80371dd1003d718acbbd05c46a936a7275199ebafeabde226732b818a914d6c7410b17e8c640db4152ef530fdede44c09", + "file": "src/app/registratie/application/draft-sync.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { DestroyRef, effect, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { Result } from '@shared/kernel/fp';\nimport { runSubmit, SUBMIT_FAILED } from '@shared/application/submit';\nimport { SubmitApplicationRequest, SubmitApplicationResponse } from '@shared/infrastructure/api-client';\nimport { AanvraagType } from '@registratie/domain/aanvraag';\nimport { ApplicationsAdapter } from '@registratie/infrastructure/applications.adapter';\n\n/** What a wizard persists per step: the opaque machine snapshot + progress + docs. */\nexport interface DraftSnapshot {\n draft: unknown;\n stepIndex: number;\n stepCount: number;\n documentIds: string[];\n}\n\nexport interface DraftSyncDeps {\n type: AanvraagType;\n /** The machine snapshot while it's worth persisting; null when not (pristine/done). */\n snapshot: () => DraftSnapshot | null;\n /** Seed the machine from a resumed draft (null → start fresh). Called once, on init. */\n onResume: (draft: unknown | null) => void;\n /** Draft-sync only runs in the real app — false in Storybook/tests (explicit seed). */\n enabled: () => boolean;\n}\n\nconst DEBOUNCE_MS = 600; // ponytail: fixed debounce; tune if the sync feels laggy/chatty.\n\n/**\n * The effectful glue that replaces per-wizard sessionStorage with a backend-owned\n * Concept (PRD 0001, phase D). Instantiated in a field initializer (like\n * `createStore`/`createUploadController`). Responsibilities:\n *\n * - resume: if the URL carries `?aanvraag=`, load that draft and seed the machine;\n * - create-on-first-progress: the Concept is created lazily the first time the wizard\n * reports a non-null snapshot, and the id is stamped into the URL (so a reload resumes);\n * - debounced draft sync on every subsequent change.\n *\n * Inert without a Router (stories) or when `enabled()` is false — no network, no resume.\n */\nexport function createDraftSync(deps: DraftSyncDeps) {\n const adapter = inject(ApplicationsAdapter);\n const router = inject(Router, { optional: true });\n const route = inject(ActivatedRoute, { optional: true });\n const active = () => deps.enabled() && !!router && !!route;\n\n let id: string | undefined;\n let ensuring: Promise | undefined; // in-flight create, so we never create twice\n let timer: ReturnType | undefined;\n\n const ensureId = (): Promise => {\n if (id) return Promise.resolve(id);\n ensuring ??= adapter.create(deps.type).then((newId) => {\n id = newId;\n // Stamp the id into the URL (no navigation) so a reload resumes this Concept.\n void router!.navigate([], { relativeTo: route!, queryParams: { aanvraag: newId }, queryParamsHandling: 'merge', replaceUrl: true });\n return newId;\n });\n return ensuring;\n };\n\n const flush = async () => {\n const snap = deps.snapshot();\n if (!snap) return;\n const theId = await ensureId();\n await adapter.syncDraft(theId, { draft: snap.draft, stepIndex: snap.stepIndex, stepCount: snap.stepCount, documentIds: snap.documentIds });\n };\n\n // One effect watches the snapshot; each change resets a debounce timer. The timer's\n // callback only does network I/O (never dispatch), so it can't livelock the store.\n effect(() => {\n if (!active()) return;\n const snap = deps.snapshot(); // tracked: fires on every machine change\n if (!snap) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => void flush(), DEBOUNCE_MS);\n });\n\n inject(DestroyRef).onDestroy(() => timer && clearTimeout(timer));\n\n return {\n /** Resolve the initial state: resume a linked Concept, or start fresh. */\n resume() {\n if (!active()) {\n deps.onResume(null);\n return;\n }\n const linked = route!.snapshot.queryParamMap.get('aanvraag');\n if (!linked) {\n deps.onResume(null);\n return;\n }\n id = linked;\n adapter\n .detail(linked)\n .then((dto) => deps.onResume(dto.draft ?? null))\n .catch(() => deps.onResume(null)); // unknown/deleted id → start fresh\n },\n\n /** Submit through the aanvraag lifecycle: ensure the Concept exists, then\n `POST /applications/{id}/submit` (server sets autoApprovable + transitions).\n Folded into a Result like the old submit-* commands. */\n submit(body: SubmitApplicationRequest): Promise> {\n return runSubmit(async () => adapter.submit(await ensureId(), body), SUBMIT_FAILED);\n },\n\n /** Detach from the current Concept (a new one is created on next progress) and\n drop the `?aanvraag` link. Used when the wizard restarts. */\n reset() {\n id = undefined;\n ensuring = undefined;\n if (active()) void router!.navigate([], { relativeTo: route!, queryParams: { aanvraag: null }, queryParamsHandling: 'merge', replaceUrl: true });\n },\n };\n}\n", + "properties": [ + { + "name": "enabled", + "deprecated": false, + "deprecationMessage": "", + "type": "function", + "indexKey": "", + "optional": false, + "description": "

Draft-sync only runs in the real app — false in Storybook/tests (explicit seed).

\n", + "line": 24, + "rawdescription": "\nDraft-sync only runs in the real app — false in Storybook/tests (explicit seed)." + }, + { + "name": "onResume", + "deprecated": false, + "deprecationMessage": "", + "type": "function", + "indexKey": "", + "optional": false, + "description": "

Seed the machine from a resumed draft (null → start fresh). Called once, on init.

\n", + "line": 22, + "rawdescription": "\nSeed the machine from a resumed draft (null → start fresh). Called once, on init." + }, + { + "name": "snapshot", + "deprecated": false, + "deprecationMessage": "", + "type": "function", + "indexKey": "", + "optional": false, + "description": "

The machine snapshot while it's worth persisting; null when not (pristine/done).

\n", + "line": 20, + "rawdescription": "\nThe machine snapshot while it's worth persisting; null when not (pristine/done)." + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "AanvraagType", + "indexKey": "", + "optional": false, + "description": "", + "line": 18 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "DraftSyncRequest", + "id": "interface-DraftSyncRequest-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "documentIds", + "deprecated": false, + "deprecationMessage": "", + "type": "string[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1008 + }, + { + "name": "draft", + "deprecated": false, + "deprecationMessage": "", + "type": "any", + "indexKey": "", + "optional": true, + "description": "", + "line": 1005 + }, + { + "name": "stepCount", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": true, + "description": "", + "line": 1007 + }, + { + "name": "stepIndex", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": true, + "description": "", + "line": 1006 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, { "name": "DuoDiplomaDto", - "id": "interface-DuoDiplomaDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1", + "id": "interface-DuoDiplomaDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "beroep", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1016 + }, + { + "name": "id", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1012 + }, + { + "name": "instelling", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1014 + }, + { + "name": "jaar", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": true, + "description": "", + "line": 1015 + }, + { + "name": "naam", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1013 + }, + { + "name": "policyQuestions", + "deprecated": false, + "deprecationMessage": "", + "type": "PolicyQuestionDto[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1017 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "DuoDiplomaDto", + "id": "interface-DuoDiplomaDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1-1", "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", "deprecated": false, "deprecationMessage": "", @@ -705,11 +1840,49 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [], + "isDuplicate": true, + "duplicateId": 1, + "duplicateName": "DuoDiplomaDto-1" + }, + { + "name": "DuoLookupDto", + "id": "interface-DuoLookupDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": 1021 + }, + { + "name": "handmatig", + "deprecated": false, + "deprecationMessage": "", + "type": "ManualDiplomaPolicyDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 1022 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], "extends": [] }, { "name": "DuoLookupDto", - "id": "interface-DuoLookupDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1", + "id": "interface-DuoLookupDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1-1", "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", "deprecated": false, "deprecationMessage": "", @@ -742,16 +1915,19 @@ "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": [] + "extends": [], + "isDuplicate": true, + "duplicateId": 1, + "duplicateName": "DuoLookupDto-1" }, { "name": "Errors", - "id": "interface-Errors-6ed41f6a28b6c00dc907f54219be9c1d7955aa11bc22f128620d2206b1ea12e6730533ac33f5f5df7b8d7c8d7f977584b3a0a3e98a6c2c3b91d1afe6411278e2", + "id": "interface-Errors-b7c3c5d493aa141ca68cb964e63408db7152b07336b239864d3c430b84d8eb3e650d1a3abaf3fda253444af942c45f86138a5d8229832d49bda94eec35c33546", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\nimport { Email, parseEmail } from '@registratie/domain/value-objects/email';\n\n/**\n * A FIXED 3-step registration wizard. The steps never change in number (always\n * `STEPS`): (1) adres + correspondentievoorkeur, (2) beroep o.b.v. diploma,\n * (3) controle & indienen. Follow-up questions appear *inline within a step*\n * (e.g. choosing 'email' reveals the e-mail field). \"Is this field required\n * right now\" is a pure function (`validateStep`), so it is trivial to test and\n * impossible to get out of sync with the data. Invariants live here, not in the\n * UI: the wizard reaches `Indienen` only when a complete `ValidRegistratie` parses.\n */\n\nexport type StepId = 'adres' | 'beroep' | 'controle';\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['adres', 'beroep', 'controle'];\n\n/** Where a piece of data came from — recorded on the aggregate (PRD §5). */\nexport type AdresHerkomst = 'brp' | 'handmatig';\nexport type DiplomaHerkomst = 'duo' | 'handmatig';\nexport type Correspondentie = 'email' | 'post';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually. Adres fields are kept flat so one `SetField` message\n serves them all (mirrors the intake machine). */\nexport interface Draft {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n adresHerkomst?: AdresHerkomst;\n correspondentie?: Correspondentie;\n email?: string;\n diplomaId?: string;\n diplomaHerkomst?: DiplomaHerkomst;\n beroep?: string; // DERIVED from the chosen DUO diploma (or declared for a manual one)\n vraagIds?: string[]; // ids of the policy questions that apply to the chosen diploma\n antwoorden: Record; // geldigheidsantwoorden, keyed by question id\n}\n\n/** What we have after the controle step parses — guaranteed valid/typed. */\nexport interface ValidRegistratie {\n adres: { straat: string; postcode: Postcode; woonplaats: string };\n adresHerkomst: AdresHerkomst;\n correspondentie: Correspondentie;\n email?: Email; // only when correspondentie === 'email'\n diplomaId: string;\n diplomaHerkomst: DiplomaHerkomst;\n beroep: string;\n antwoorden: Record;\n}\n\n/** Text fields settable via SetField. */\nexport type DraftField = 'straat' | 'postcode' | 'woonplaats' | 'email';\n\n/** Per-field error map. `antwoorden` holds per-policy-question errors, keyed by\n question id (a step can show several questions). */\nexport interface Errors {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n email?: string;\n correspondentie?: string;\n diploma?: string;\n antwoorden?: Record;\n}\n\nexport type RegistratieState =\n | { tag: 'Invullen'; draft: Draft; cursor: number; errors: Errors }\n | { tag: 'Indienen'; data: ValidRegistratie }\n | { tag: 'Ingediend'; data: ValidRegistratie; referentie: string }\n | { tag: 'Mislukt'; data: ValidRegistratie; error: string };\n\nconst emptyDraft: Draft = { antwoorden: {} };\nexport const initial: RegistratieState = { tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {} };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, d: Draft): Result {\n const errors: Errors = {};\n switch (step) {\n case 'adres': {\n if (!d.straat || d.straat.trim() === '') errors.straat = 'Vul een straat en huisnummer in.';\n const pc = parsePostcode(d.postcode ?? '');\n if (!pc.ok) errors.postcode = pc.error;\n if (!d.woonplaats || d.woonplaats.trim() === '') errors.woonplaats = 'Vul een woonplaats in.';\n if (!d.correspondentie) errors.correspondentie = 'Maak een keuze.';\n // E-mail is only required when 'email' is the chosen channel.\n if (d.correspondentie === 'email') {\n const e = parseEmail(d.email ?? '');\n if (!e.ok) errors.email = e.error;\n }\n break;\n }\n case 'beroep': {\n // A diploma must be chosen (or declared manually); its beroep is then known.\n if (!d.diplomaId || !d.beroep) {\n errors.diploma = 'Kies het diploma waarmee u zich wilt registreren, of voer het handmatig in.';\n break;\n }\n // Every policy question the chosen diploma raised must be answered. Which\n // questions apply is server-decided (carried in `vraagIds`); we only check\n // they're answered.\n const open: Record = {};\n for (const id of d.vraagIds ?? []) {\n if (!(d.antwoorden[id] ?? '').trim()) open[id] = 'Beantwoord deze vraag.';\n }\n if (Object.keys(open).length > 0) errors.antwoorden = open;\n break;\n }\n case 'controle':\n break; // controle shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole wizard into a ValidRegistratie (called on submit). */\nfunction validateAll(d: Draft): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, d);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const pc = parsePostcode(d.postcode ?? '');\n // validateStep guaranteed these parse, but keep the compiler happy.\n if (!pc.ok || !d.diplomaId || !d.beroep || !d.correspondentie) return err(errors);\n const email = d.correspondentie === 'email' ? parseEmail(d.email ?? '') : undefined;\n // Keep only the answers to the questions that actually applied.\n const vraagIds = d.vraagIds ?? [];\n const antwoorden = Object.fromEntries(vraagIds.map((id) => [id, d.antwoorden[id] ?? '']));\n\n return ok({\n adres: { straat: d.straat!, postcode: pc.value, woonplaats: d.woonplaats! },\n adresHerkomst: d.adresHerkomst ?? 'handmatig',\n correspondentie: d.correspondentie,\n email: email?.ok ? email.value : undefined,\n diplomaId: d.diplomaId,\n diplomaHerkomst: d.diplomaHerkomst ?? 'handmatig',\n beroep: d.beroep,\n antwoorden,\n });\n}\n\nexport function setField(s: RegistratieState, key: DraftField, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const draft: Draft = { ...s.draft, [key]: value };\n // Editing an address field means the user owns it now — not the BRP copy.\n if (key === 'straat' || key === 'postcode' || key === 'woonplaats') draft.adresHerkomst = 'handmatig';\n return { ...s, draft };\n}\n\nexport function setCorrespondentie(s: RegistratieState, value: Correspondentie): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, correspondentie: value } };\n}\n\n/** Prefill the address from a BRP lookup and flag its origin (PRD §7). */\nexport function prefillAdres(s: RegistratieState, straat: string, postcode: string, woonplaats: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, straat, postcode, woonplaats, adresHerkomst: 'brp' } };\n}\n\n/** Pick a DUO diploma; the beroep is derived from it and the applicable policy\n questions (`vraagIds`) come with it (both server-computed, passed in). */\nexport function kiesDiploma(s: RegistratieState, diplomaId: string, beroep: string, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId, beroep, vraagIds, diplomaHerkomst: 'duo' }, errors: {} };\n}\n\n/** Switch to manual diploma entry: the diploma isn't in DUO, so the MAXIMAL\n policy-question set applies and the entry is flagged handmatig/unverified. The\n beroep is declared separately (declareerBeroep). */\nexport function kiesHandmatig(s: RegistratieState, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId: 'handmatig', beroep: undefined, vraagIds, diplomaHerkomst: 'handmatig' }, errors: {} };\n}\n\n/** Declare the beroep for a manually-entered diploma (chosen from a fixed list). */\nexport function declareerBeroep(s: RegistratieState, beroep: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, beroep } };\n}\n\nexport function setAntwoord(s: RegistratieState, vraagId: string, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, antwoorden: { ...s.draft.antwoorden, [vraagId]: value } } };\n}\n\nexport function next(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateStep(currentStep(s), s.draft);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\nexport function back(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\n/** Jump back to an earlier step to correct data (controle → step N). Forward\n jumps are not allowed (would skip validation). Preserves the draft. */\nexport function gaNaarStap(s: RegistratieState, cursor: number): RegistratieState {\n if (s.tag !== 'Invullen' || cursor < 0 || cursor >= s.cursor) return s;\n return { ...s, cursor, errors: {} };\n}\n\nexport function submit(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateAll(s.draft);\n return r.ok ? { tag: 'Indienen', data: r.value } : { ...s, errors: r.error };\n}\n\nexport function resolve(s: RegistratieState, r: Result): RegistratieState {\n if (s.tag !== 'Indienen') return s;\n return r.ok ? { tag: 'Ingediend', data: s.data, referentie: r.value } : { tag: 'Mislukt', data: s.data, error: r.error };\n}\n\nexport type RegistratieMsg =\n | { tag: 'SetField'; key: DraftField; value: string }\n | { tag: 'SetCorrespondentie'; value: Correspondentie }\n | { tag: 'PrefillAdres'; straat: string; postcode: string; woonplaats: string }\n | { tag: 'KiesDiploma'; diplomaId: string; beroep: string; vraagIds: string[] }\n | { tag: 'KiesHandmatig'; vraagIds: string[] }\n | { tag: 'DeclareerBeroep'; beroep: string }\n | { tag: 'SetAntwoord'; vraagId: string; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'GaNaarStap'; cursor: number }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Seed'; state: RegistratieState };\n\nexport function reduce(s: RegistratieState, m: RegistratieMsg): RegistratieState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'SetCorrespondentie':\n return setCorrespondentie(s, m.value);\n case 'PrefillAdres':\n return prefillAdres(s, m.straat, m.postcode, m.woonplaats);\n case 'KiesDiploma':\n return kiesDiploma(s, m.diplomaId, m.beroep, m.vraagIds);\n case 'KiesHandmatig':\n return kiesHandmatig(s, m.vraagIds);\n case 'DeclareerBeroep':\n return declareerBeroep(s, m.beroep);\n case 'SetAntwoord':\n return setAntwoord(s, m.vraagId, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'GaNaarStap':\n return gaNaarStap(s, m.cursor);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Mislukt' ? { tag: 'Indienen', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Indienen' ? { tag: 'Ingediend', data: s.data, referentie: m.referentie } : s;\n case 'SubmitFailed':\n return s.tag === 'Indienen' ? { tag: 'Mislukt', data: s.data, error: m.error } : s;\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\nimport { Email, parseEmail } from '@registratie/domain/value-objects/email';\nimport {\n UploadState,\n UploadMsg,\n DeliveryChannel,\n initialUpload,\n reduceUpload,\n requiredCategoriesSatisfied,\n deliveryRefs,\n} from '@shared/upload/upload.machine';\n\n/**\n * A FIXED 3-step registration wizard. The steps never change in number (always\n * `STEPS`): (1) adres + correspondentievoorkeur, (2) beroep o.b.v. diploma,\n * (3) controle & indienen. Follow-up questions appear *inline within a step*\n * (e.g. choosing 'email' reveals the e-mail field). \"Is this field required\n * right now\" is a pure function (`validateStep`), so it is trivial to test and\n * impossible to get out of sync with the data. Invariants live here, not in the\n * UI: the wizard reaches `Indienen` only when a complete `ValidRegistratie` parses.\n */\n\nexport type StepId = 'adres' | 'beroep' | 'controle';\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['adres', 'beroep', 'controle'];\n\n/** Where a piece of data came from — recorded on the aggregate (PRD §5). */\nexport type AdresHerkomst = 'brp' | 'handmatig';\nexport type DiplomaHerkomst = 'duo' | 'handmatig';\nexport type Correspondentie = 'email' | 'post';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually. Adres fields are kept flat so one `SetField` message\n serves them all (mirrors the intake machine). */\nexport interface Draft {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n adresHerkomst?: AdresHerkomst;\n correspondentie?: Correspondentie;\n email?: string;\n diplomaId?: string;\n diplomaHerkomst?: DiplomaHerkomst;\n beroep?: string; // DERIVED from the chosen DUO diploma (or declared for a manual one)\n vraagIds?: string[]; // ids of the policy questions that apply to the chosen diploma\n antwoorden: Record; // geldigheidsantwoorden, keyed by question id\n}\n\n/** What we have after the controle step parses — guaranteed valid/typed. */\nexport interface ValidRegistratie {\n adres: { straat: string; postcode: Postcode; woonplaats: string };\n adresHerkomst: AdresHerkomst;\n correspondentie: Correspondentie;\n email?: Email; // only when correspondentie === 'email'\n diplomaId: string;\n diplomaHerkomst: DiplomaHerkomst;\n beroep: string;\n antwoorden: Record;\n documents: Array<{ categoryId: string; channel: DeliveryChannel; documentId?: string }>;\n}\n\n/** Text fields settable via SetField. */\nexport type DraftField = 'straat' | 'postcode' | 'woonplaats' | 'email';\n\n/** Per-field error map. `antwoorden` holds per-policy-question errors, keyed by\n question id (a step can show several questions). */\nexport interface Errors {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n email?: string;\n correspondentie?: string;\n diploma?: string;\n documenten?: string;\n antwoorden?: Record;\n}\n\nexport type RegistratieState =\n | { tag: 'Invullen'; draft: Draft; cursor: number; errors: Errors; upload: UploadState }\n | { tag: 'Indienen'; data: ValidRegistratie }\n | { tag: 'Ingediend'; data: ValidRegistratie; referentie: string }\n | { tag: 'Mislukt'; data: ValidRegistratie; error: string };\n\nconst emptyDraft: Draft = { antwoorden: {} };\nexport const initial: RegistratieState = { tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {}, upload: initialUpload };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Has the user meaningfully started, so it's worth persisting as a Concept? Excludes\n the automatic BRP address prefill on step 0 — a bare page visit creates nothing.\n ponytail: an address typed at step 0 without any of these signals is not yet\n persisted (created once they advance/choose); accepted regression vs. sessionStorage. */\nexport function hasProgress(s: Extract): boolean {\n const d = s.draft;\n return (\n s.cursor > 0 ||\n !!d.correspondentie ||\n !!d.email ||\n !!d.diplomaId ||\n !!d.beroep ||\n deliveryRefs(s.upload).some((r) => r.channel === 'digital' && !!r.documentId)\n );\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, d: Draft, upload: UploadState): Result {\n const errors: Errors = {};\n switch (step) {\n case 'adres': {\n if (!d.straat || d.straat.trim() === '') errors.straat = $localize`:@@validation.straat2:Vul een straat en huisnummer in.`;\n const pc = parsePostcode(d.postcode ?? '');\n if (!pc.ok) errors.postcode = pc.error;\n if (!d.woonplaats || d.woonplaats.trim() === '') errors.woonplaats = $localize`:@@validation.woonplaats:Vul een woonplaats in.`;\n if (!d.correspondentie) errors.correspondentie = $localize`:@@validation.maakKeuze:Maak een keuze.`;\n // E-mail is only required when 'email' is the chosen channel.\n if (d.correspondentie === 'email') {\n const e = parseEmail(d.email ?? '');\n if (!e.ok) errors.email = e.error;\n }\n break;\n }\n case 'beroep': {\n // A diploma must be chosen (or declared manually); its beroep is then known.\n if (!d.diplomaId || !d.beroep) {\n errors.diploma = $localize`:@@validation.diploma:Kies het diploma waarmee u zich wilt registreren, of voer het handmatig in.`;\n break;\n }\n // Every policy question the chosen diploma raised must be answered. Which\n // questions apply is server-decided (carried in `vraagIds`); we only check\n // they're answered.\n const open: Record = {};\n for (const id of d.vraagIds ?? []) {\n if (!(d.antwoorden[id] ?? '').trim()) open[id] = $localize`:@@validation.beantwoordVraag:Beantwoord deze vraag.`;\n }\n if (Object.keys(open).length > 0) errors.antwoorden = open;\n // Required documents for this wizard attach to the beroep step (inline upload).\n if (!requiredCategoriesSatisfied(upload)) {\n errors.documenten = $localize`:@@validation.documenten:Lever de verplichte documenten aan (upload of kies \"per post nasturen\").`;\n }\n break;\n }\n case 'controle':\n break; // controle shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole wizard into a ValidRegistratie (called on submit). */\nfunction validateAll(d: Draft, upload: UploadState): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, d, upload);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const pc = parsePostcode(d.postcode ?? '');\n // validateStep guaranteed these parse, but keep the compiler happy.\n if (!pc.ok || !d.diplomaId || !d.beroep || !d.correspondentie) return err(errors);\n const email = d.correspondentie === 'email' ? parseEmail(d.email ?? '') : undefined;\n // Keep only the answers to the questions that actually applied.\n const vraagIds = d.vraagIds ?? [];\n const antwoorden = Object.fromEntries(vraagIds.map((id) => [id, d.antwoorden[id] ?? '']));\n\n return ok({\n adres: { straat: d.straat!, postcode: pc.value, woonplaats: d.woonplaats! },\n adresHerkomst: d.adresHerkomst ?? 'handmatig',\n correspondentie: d.correspondentie,\n email: email?.ok ? email.value : undefined,\n diplomaId: d.diplomaId,\n diplomaHerkomst: d.diplomaHerkomst ?? 'handmatig',\n beroep: d.beroep,\n antwoorden,\n documents: deliveryRefs(upload),\n });\n}\n\nexport function setField(s: RegistratieState, key: DraftField, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const draft: Draft = { ...s.draft, [key]: value };\n // Editing an address field means the user owns it now — not the BRP copy.\n if (key === 'straat' || key === 'postcode' || key === 'woonplaats') draft.adresHerkomst = 'handmatig';\n return { ...s, draft };\n}\n\nexport function setCorrespondentie(s: RegistratieState, value: Correspondentie): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, correspondentie: value } };\n}\n\n/** Prefill the address from a BRP lookup and flag its origin (PRD §7). */\nexport function prefillAdres(s: RegistratieState, straat: string, postcode: string, woonplaats: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, straat, postcode, woonplaats, adresHerkomst: 'brp' } };\n}\n\n/** Pick a DUO diploma; the beroep is derived from it and the applicable policy\n questions (`vraagIds`) come with it (both server-computed, passed in). */\nexport function kiesDiploma(s: RegistratieState, diplomaId: string, beroep: string, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId, beroep, vraagIds, diplomaHerkomst: 'duo' }, errors: {} };\n}\n\n/** Switch to manual diploma entry: the diploma isn't in DUO, so the MAXIMAL\n policy-question set applies and the entry is flagged handmatig/unverified. The\n beroep is declared separately (declareerBeroep). */\nexport function kiesHandmatig(s: RegistratieState, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId: 'handmatig', beroep: undefined, vraagIds, diplomaHerkomst: 'handmatig' }, errors: {} };\n}\n\n/** Declare the beroep for a manually-entered diploma (chosen from a fixed list). */\nexport function declareerBeroep(s: RegistratieState, beroep: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, beroep } };\n}\n\nexport function setAntwoord(s: RegistratieState, vraagId: string, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, antwoorden: { ...s.draft.antwoorden, [vraagId]: value } } };\n}\n\nexport function next(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateStep(currentStep(s), s.draft, s.upload);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\nexport function back(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\n/** Jump back to an earlier step to correct data (controle → step N). Forward\n jumps are not allowed (would skip validation). Preserves the draft. */\nexport function gaNaarStap(s: RegistratieState, cursor: number): RegistratieState {\n if (s.tag !== 'Invullen' || cursor < 0 || cursor >= s.cursor) return s;\n return { ...s, cursor, errors: {} };\n}\n\nexport function submit(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateAll(s.draft, s.upload);\n return r.ok ? { tag: 'Indienen', data: r.value } : { ...s, errors: r.error };\n}\n\n/** Route an upload sub-message through the pure upload reducer (Invullen only). */\nexport function upload(s: RegistratieState, msg: UploadMsg): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, upload: reduceUpload(s.upload, msg) };\n}\n\nexport function resolve(s: RegistratieState, r: Result): RegistratieState {\n if (s.tag !== 'Indienen') return s;\n return r.ok ? { tag: 'Ingediend', data: s.data, referentie: r.value } : { tag: 'Mislukt', data: s.data, error: r.error };\n}\n\nexport type RegistratieMsg =\n | { tag: 'SetField'; key: DraftField; value: string }\n | { tag: 'SetCorrespondentie'; value: Correspondentie }\n | { tag: 'PrefillAdres'; straat: string; postcode: string; woonplaats: string }\n | { tag: 'KiesDiploma'; diplomaId: string; beroep: string; vraagIds: string[] }\n | { tag: 'KiesHandmatig'; vraagIds: string[] }\n | { tag: 'DeclareerBeroep'; beroep: string }\n | { tag: 'SetAntwoord'; vraagId: string; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'GaNaarStap'; cursor: number }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Upload'; msg: UploadMsg }\n | { tag: 'Seed'; state: RegistratieState };\n\nexport function reduce(s: RegistratieState, m: RegistratieMsg): RegistratieState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'SetCorrespondentie':\n return setCorrespondentie(s, m.value);\n case 'PrefillAdres':\n return prefillAdres(s, m.straat, m.postcode, m.woonplaats);\n case 'KiesDiploma':\n return kiesDiploma(s, m.diplomaId, m.beroep, m.vraagIds);\n case 'KiesHandmatig':\n return kiesHandmatig(s, m.vraagIds);\n case 'DeclareerBeroep':\n return declareerBeroep(s, m.beroep);\n case 'SetAntwoord':\n return setAntwoord(s, m.vraagId, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'GaNaarStap':\n return gaNaarStap(s, m.cursor);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Mislukt' ? { tag: 'Indienen', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Indienen' ? { tag: 'Ingediend', data: s.data, referentie: m.referentie } : s;\n case 'SubmitFailed':\n return s.tag === 'Indienen' ? { tag: 'Mislukt', data: s.data, error: m.error } : s;\n case 'Upload':\n return upload(s, m.msg);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", "properties": [ { "name": "antwoorden", @@ -761,7 +1937,7 @@ "indexKey": "", "optional": true, "description": "", - "line": 66 + "line": 77 }, { "name": "correspondentie", @@ -771,7 +1947,7 @@ "indexKey": "", "optional": true, "description": "", - "line": 64 + "line": 74 }, { "name": "diploma", @@ -781,7 +1957,17 @@ "indexKey": "", "optional": true, "description": "", - "line": 65 + "line": 75 + }, + { + "name": "documenten", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 76 }, { "name": "email", @@ -791,7 +1977,7 @@ "indexKey": "", "optional": true, "description": "", - "line": 63 + "line": 73 }, { "name": "postcode", @@ -801,7 +1987,7 @@ "indexKey": "", "optional": true, "description": "", - "line": 61 + "line": 71 }, { "name": "straat", @@ -811,7 +1997,7 @@ "indexKey": "", "optional": true, "description": "", - "line": 60 + "line": 70 }, { "name": "woonplaats", @@ -821,7 +2007,7 @@ "indexKey": "", "optional": true, "description": "", - "line": 62 + "line": 72 } ], "indexSignatures": [], @@ -831,6 +2017,51 @@ "methods": [], "extends": [] }, + { + "name": "Glyph", + "id": "interface-Glyph-bc824192fb4b5b1e5ca46093e18a138c2c643d35be29ea257636d0b96b1867c3aa6d37f84437e9315f4e8157cdd99351b9bb1fe0f58adadd7cafca9c69d46185", + "file": "src/app/shared/ui/upload/upload-status-icon/upload-status-icon.component.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Component, computed, input } from '@angular/core';\nimport type { UploadStatus } from '@shared/upload/upload.machine';\n\ninterface Glyph {\n char: string;\n label: string;\n color: string;\n}\n\n/** Atom: a small status glyph for one upload. Pure UI — glyph, colour and a11y\n label derive purely from the status type. */\n@Component({\n selector: 'app-upload-status-icon',\n styles: [`\n .glyph { font-weight: var(--rhc-text-font-weight-semi-bold); }\n `],\n template: `\n @if (glyph()) {\n \n {{ glyph()!.char }}\n \n }\n `,\n})\nexport class UploadStatusIconComponent {\n status = input.required();\n\n protected readonly glyph = computed(() => {\n switch (this.status()) {\n case 'queued':\n return { char: '…', label: $localize`:@@upload.status.queued:In wachtrij`, color: 'var(--rhc-color-foreground-subtle)' };\n case 'uploading':\n return { char: '↑', label: $localize`:@@upload.status.uploading:Bezig met uploaden`, color: 'var(--rhc-color-lintblauw-600)' };\n case 'complete':\n return { char: '✓', label: $localize`:@@upload.status.complete:Geüpload`, color: 'var(--rhc-color-groen-500)' };\n case 'failed':\n return { char: '✕', label: $localize`:@@upload.status.failed:Mislukt`, color: 'var(--rhc-color-rood-500)' };\n case 'deleting':\n return { char: '⟳', label: $localize`:@@upload.status.deleting:Bezig met verwijderen`, color: 'var(--rhc-color-foreground-subtle)' };\n case 'idle':\n case 'deleted':\n return null;\n }\n });\n}\n", + "properties": [ + { + "name": "char", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 5 + }, + { + "name": "color", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 7 + }, + { + "name": "label", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 6 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, { "name": "HerregistratieDecisions", "id": "interface-HerregistratieDecisions-b39e266ec8fabdaddad87f1e15a5b1b86e45d84ac2c95028b4e676c2eb425fd675c77383c3d4f8f88f4a072f3eb88a954eb0f8755597224ebef59da18d24fda0", @@ -869,13 +2100,83 @@ "extends": [] }, { - "name": "IntakePolicyDto", - "id": "interface-IntakePolicyDto-1c35bbad790b2fa78117a69dd0537aa3737a0ede256f3d6834bedb78c85cb056d6f571ed0667abc30f5f6c9eff3e6561723917f21ba9f67b0712fd109594b27a", - "file": "src/app/herregistratie/contracts/intake-policy.dto.ts", + "name": "HerregistratieDecisionsDto", + "id": "interface-HerregistratieDecisionsDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "file": "src/app/shared/infrastructure/api-client.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "export interface IntakePolicyDto {\n /** Below this many NL-hours the scholing question is required. */\n scholingThreshold: number;\n}\n", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "eligibleForHerregistratie", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "indexKey": "", + "optional": true, + "description": "", + "line": 1026 + }, + { + "name": "herregistratieReason", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1027 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "HerregistratieRequest", + "id": "interface-HerregistratieRequest-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "documents", + "deprecated": false, + "deprecationMessage": "", + "type": "DocumentRefDto[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1032 + }, + { + "name": "uren", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": true, + "description": "", + "line": 1031 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "IntakePolicyDto", + "id": "interface-IntakePolicyDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "scholingThreshold", @@ -883,22 +2184,79 @@ "deprecationMessage": "", "type": "number", "indexKey": "", - "optional": false, - "description": "

Below this many NL-hours the scholing question is required.

\n", - "line": 11, - "rawdescription": "\nBelow this many NL-hours the scholing question is required." + "optional": true, + "description": "", + "line": 1036 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "IntakeRequest", + "id": "interface-IntakeRequest-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "uren", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": true, + "description": "", + "line": 1040 } ], "indexSignatures": [], "kind": 172, - "description": "

WIRE CONTRACT for intake policy values owned by the backend.

\n

This is the "config value" shape of moving policy off the client: instead of\nhardcoding the scholing threshold in the frontend, the backend ships the value\nand the UI applies it for instant feedback. The backend remains the AUTHORITY\n— it re-validates on submit. See docs/architecture/0001-bff-lite-decision-dtos.md.

\n", - "rawdescription": "\n\nWIRE CONTRACT for intake policy values owned by the backend.\n\nThis is the \"config value\" shape of moving policy off the client: instead of\nhardcoding the scholing threshold in the frontend, the backend ships the value\nand the UI applies it for instant feedback. The backend remains the AUTHORITY\n— it re-validates on submit. See docs/architecture/0001-bff-lite-decision-dtos.md.\n", "methods": [], "extends": [] }, { "name": "ManualDiplomaPolicyDto", - "id": "interface-ManualDiplomaPolicyDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1", + "id": "interface-ManualDiplomaPolicyDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "beroepen", + "deprecated": false, + "deprecationMessage": "", + "type": "string[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1044 + }, + { + "name": "policyQuestions", + "deprecated": false, + "deprecationMessage": "", + "type": "PolicyQuestionDto[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1045 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "ManualDiplomaPolicyDto", + "id": "interface-ManualDiplomaPolicyDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1-1", "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", "deprecated": false, "deprecationMessage": "", @@ -929,6 +2287,50 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [], + "isDuplicate": true, + "duplicateId": 1, + "duplicateName": "ManualDiplomaPolicyDto-1" + }, + { + "name": "NavItem", + "id": "interface-NavItem-9a0c974f175932b74bac6b9499d52109b91e008e20aad37498229296c31027ce1e8d9451f5e195926b0514ff3961eb9c0632cdf710292f5b143d4233c1358e45", + "file": "src/app/shared/layout/side-nav/side-nav.component.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\n\nexport interface NavItem {\n readonly label: string;\n readonly to: string;\n}\n\n/** Organism: vertical side navigation for the \"Mijn omgeving\" portal. The active\n route is marked with `routerLinkActive`. Domain-free — the caller supplies the\n items (English-named shared chrome). */\n@Component({\n selector: 'app-side-nav',\n imports: [RouterLink, RouterLinkActive],\n styles: [`\n :host{display:block}\n .list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-xs)}\n .item{\n display:block;\n padding:var(--rhc-space-max-md) var(--rhc-space-max-lg);\n color:var(--rhc-color-foreground-default);\n text-decoration:none;\n border-radius:var(--rhc-border-radius-sm);\n border-inline-start:var(--rhc-border-width-md) solid transparent;\n }\n .item:hover{background:var(--rhc-color-cool-grey-100)}\n .item.active{\n background:var(--rhc-color-lintblauw-100);\n border-inline-start-color:var(--rhc-color-lintblauw-700);\n color:var(--rhc-color-lintblauw-700);\n font-weight:var(--rhc-text-font-weight-semi-bold);\n }\n `],\n template: `\n \n `,\n})\nexport class SideNavComponent {\n items = input.required();\n ariaLabel = input($localize`:@@sideNav.aria:Mijn omgeving`);\n}\n", + "properties": [ + { + "name": "label", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 5, + "modifierKind": [ + 148 + ] + }, + { + "name": "to", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 6, + "modifierKind": [ + 148 + ] + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], "extends": [] }, { @@ -976,9 +2378,99 @@ "methods": [], "extends": [] }, + { + "name": "PersonDto", + "id": "interface-PersonDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": 1051 + }, + { + "name": "geboortedatum", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1050 + }, + { + "name": "naam", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1049 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, { "name": "PolicyQuestionDto", - "id": "interface-PolicyQuestionDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1", + "id": "interface-PolicyQuestionDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "id", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1055 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1057 + }, + { + "name": "vraag", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1056 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "PolicyQuestionDto", + "id": "interface-PolicyQuestionDto-03b724eabc3fb95affe36abb0bef921275f0c9eeefd35fab64dd906d4d76e5a38fe849098232c0aaeaf7dd32fa6c0a7b7f2a1bfbbf4c03de4a440f860b3c46e1-1", "file": "src/app/registratie/contracts/duo-diplomas.dto.ts", "deprecated": false, "deprecationMessage": "", @@ -1019,16 +2511,159 @@ "indexSignatures": [], "kind": 172, "methods": [], + "extends": [], + "isDuplicate": true, + "duplicateId": 1, + "duplicateName": "PolicyQuestionDto-1" + }, + { + "name": "PortalTask", + "id": "interface-PortalTask-e2ec47648b64280fa4fd94b4eaee89246ecffd3a61445af27da0ceabf3d15e930edde33ead2e70732bb9fc2a42be434d45e188deb4d62b6d39553c8d8cca458e", + "file": "src/app/registratie/domain/tasks.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Registration } from './registration';\nimport { herregistratieDeadline } from './registration.policy';\n\n/**\n * What the dashboard's \"Wat moet ik regelen\" list needs. Pure presentation data\n * derived from the registration — no Angular. Mirrors the shared TaskItem shape.\n */\nexport interface PortalTask {\n title: string;\n description: string;\n to: string;\n actionLabel: string;\n}\n\nfunction formatNL(d: Date): string {\n return d.toLocaleDateString('nl-NL', { day: 'numeric', month: 'long', year: 'numeric' });\n}\n\n/**\n * Derive the open tasks for a professional (pure). Eligibility is the server's\n * decision (`decisions.eligibleForHerregistratie`), passed in — the FE renders it,\n * it does not recompute the rule (ADR-0001). The deadline is still formatted\n * client-side for the task copy (presentation, not a rule).\n */\nexport function tasksFromProfile(reg: Registration, eligibleForHerregistratie: boolean): PortalTask[] {\n const tasks: PortalTask[] = [];\n\n if (eligibleForHerregistratie) {\n const deadline = herregistratieDeadline(reg);\n tasks.push({\n title: $localize`:@@task.herregistratie.title:Vraag uw herregistratie aan`,\n description: deadline\n ? $localize`:@@task.herregistratie.deadline:Verleng uw registratie vóór ${formatNL(deadline)}:deadline:.`\n : $localize`:@@task.herregistratie.nodeadline:U kunt nu uw herregistratie aanvragen.`,\n to: '/herregistratie',\n actionLabel: $localize`:@@task.herregistratie.action:Herregistratie aanvragen`,\n });\n }\n\n if (reg.status.tag === 'Geschorst') {\n tasks.push({\n title: $localize`:@@task.geschorst.title:Uw registratie is geschorst`,\n description: reg.status.reden,\n to: '/registratie',\n actionLabel: $localize`:@@task.bekijkGegevens.action:Bekijk uw gegevens`,\n });\n }\n\n if (reg.status.tag === 'Doorgehaald') {\n tasks.push({\n title: $localize`:@@task.doorgehaald.title:Uw registratie is doorgehaald`,\n description: reg.status.reden,\n to: '/registratie',\n actionLabel: $localize`:@@task.bekijkGegevens.action:Bekijk uw gegevens`,\n });\n }\n\n return tasks;\n}\n", + "properties": [ + { + "name": "actionLabel", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 12 + }, + { + "name": "description", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 10 + }, + { + "name": "title", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 9 + }, + { + "name": "to", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 11 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

What the dashboard's "Wat moet ik regelen" list needs. Pure presentation data\nderived from the registration — no Angular. Mirrors the shared TaskItem shape.

\n", + "rawdescription": "\n\nWhat the dashboard's \"Wat moet ik regelen\" list needs. Pure presentation data\nderived from the registration — no Angular. Mirrors the shared TaskItem shape.\n", + "methods": [], + "extends": [] + }, + { + "name": "ProblemDetails", + "id": "interface-ProblemDetails-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "detail", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1064 + }, + { + "name": "instance", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1065 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "number | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1063 + }, + { + "name": "title", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1062 + }, + { + "name": "type", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1061 + } + ], + "indexSignatures": [ + { + "id": "index-declaration-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "args": [ + { + "name": "key", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "any", + "line": 1065, + "deprecated": false, + "deprecationMessage": "" + } + ], + "kind": 182, + "methods": [], "extends": [] }, { "name": "RadioOption", - "id": "interface-RadioOption-a4c75390d3b62730cdd6f53a2ffcb3badde60f23c9104d57d8f8221d038f1dc96a229916ee28bbec4a54dd41e0e88c838ea46b35facfab0ddb5fea79fed37cc0", + "id": "interface-RadioOption-6203162055a34b4133e76690b148d45884cd1f41bf3d478fb1a54123a7aeb725b01d619611cf73b9807dd8144cc9d276b36a7e8f90d0b3191e1948a4452929fd", "file": "src/app/shared/ui/radio-group/radio-group.component.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Component, forwardRef, input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface RadioOption {\n value: string;\n label: string;\n}\n\n/** Atom: a radio group. Thin wrapper over the Utrecht/RHC radio CSS, wired as a\n form control so it works with ngModel just like the text-input atom. */\n@Component({\n selector: 'app-radio-group',\n styles: [`\n .rhc-radio-option {\n display: flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n }\n `],\n template: `\n \n @for (opt of options(); track opt.value) {\n \n }\n \n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true }],\n})\nexport class RadioGroupComponent implements ControlValueAccessor {\n options = input.required();\n name = input.required();\n invalid = input(false);\n\n value = '';\n disabled = false;\n onChange: (v: string) => void = () => {};\n onTouched: () => void = () => {};\n\n select(v: string) {\n this.value = v;\n this.onChange(v);\n }\n writeValue(v: string) { this.value = v ?? ''; }\n registerOnChange(fn: (v: string) => void) { this.onChange = fn; }\n registerOnTouched(fn: () => void) { this.onTouched = fn; }\n setDisabledState(d: boolean) { this.disabled = d; }\n}\n", + "sourceCode": "import { Component, forwardRef, input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface RadioOption {\n value: string;\n label: string;\n}\n\n/** The ubiquitous yes/no option pair. Language-agnostic now the labels are\n localized, so it lives next to RadioOption and both wizards import it. */\nexport const JA_NEE: RadioOption[] = [\n { value: 'ja', label: $localize`:@@common.ja:Ja` },\n { value: 'nee', label: $localize`:@@common.nee:Nee` },\n];\n\n/** Atom: a radio group. Thin wrapper over the Utrecht/RHC radio CSS, wired as a\n form control so it works with ngModel just like the text-input atom. */\n@Component({\n selector: 'app-radio-group',\n styles: [`\n .rhc-radio-option {\n display: flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n }\n `],\n template: `\n \n @for (opt of options(); track opt.value) {\n \n }\n \n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true }],\n})\nexport class RadioGroupComponent implements ControlValueAccessor {\n options = input.required();\n name = input.required();\n invalid = input(false);\n\n value = '';\n disabled = false;\n onChange: (v: string) => void = () => {};\n onTouched: () => void = () => {};\n\n select(v: string) {\n this.value = v;\n this.onChange(v);\n }\n writeValue(v: string) { this.value = v ?? ''; }\n registerOnChange(fn: (v: string) => void) { this.onChange = fn; }\n registerOnTouched(fn: () => void) { this.onTouched = fn; }\n setDisabledState(d: boolean) { this.disabled = d; }\n}\n", "properties": [ { "name": "label", @@ -1056,6 +2691,66 @@ "methods": [], "extends": [] }, + { + "name": "ReferentieResponse", + "id": "interface-ReferentieResponse-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "referentie", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1071 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "RegistratieRequest", + "id": "interface-RegistratieRequest-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "diplomaHerkomst", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1075 + }, + { + "name": "documents", + "deprecated": false, + "deprecationMessage": "", + "type": "DocumentRefDto[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1076 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, { "name": "Registration", "id": "interface-Registration-8e28c6bf4ec154e4db100e2ec1ee19fe9c2d50bc429733f8288f32277ce91963f67ec0363028632e71cfb7e05ce25001908c8dd8ee66d732632d67b993c0645b", @@ -1131,6 +2826,146 @@ "methods": [], "extends": [] }, + { + "name": "RegistrationDto", + "id": "interface-RegistrationDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "beroep", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1082 + }, + { + "name": "bigNummer", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1080 + }, + { + "name": "geboortedatum", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1084 + }, + { + "name": "naam", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1081 + }, + { + "name": "registratiedatum", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1083 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "RegistrationStatusDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 1085 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "RegistrationStatusDto", + "id": "interface-RegistrationStatusDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "doorgehaaldOp", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1093 + }, + { + "name": "geschorstTot", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1091 + }, + { + "name": "herregistratieDatum", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1090 + }, + { + "name": "reden", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1092 + }, + { + "name": "tag", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1089 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, { "name": "Session", "id": "interface-Session-4f483129ecb1f3747a600d06904b954a4950b10c4da782d9635896d2c39feaa7777d0e9ed018efa5d4252fd44a29035a431e7dcc15ec19c903f710b163e162f2", @@ -1174,14 +3009,102 @@ "methods": [], "extends": [] }, + { + "name": "SessionPort", + "id": "interface-SessionPort-b7e5164e08b624cba74c620b09293f05c3bbaa75eeed03e9cc66f5ea5d87f1d9e4e51a4a7f43d648f5bb2a5a51f58b8f5880929eab6cc03156cef468fdda90dc", + "file": "src/app/shared/application/session.port.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { InjectionToken, Signal } from '@angular/core';\n\n/**\n * A shared seam for the chrome to show \"who is logged in\" + log out, WITHOUT\n * shared/ depending on the auth context (the import-direction rule forbids that).\n * Auth provides this token at the app root (see app.config.ts); the shared header\n * injects it. SessionStore satisfies this shape structurally.\n */\nexport interface SessionPort {\n readonly session: Signal<{ naam: string } | null>;\n logout(): void;\n}\n\nexport const SESSION_PORT = new InjectionToken('SESSION_PORT');\n", + "properties": [ + { + "name": "session", + "deprecated": false, + "deprecationMessage": "", + "type": "Signal", + "indexKey": "", + "optional": false, + "description": "", + "line": 10, + "modifierKind": [ + 148 + ] + } + ], + "indexSignatures": [], + "kind": 174, + "description": "

A shared seam for the chrome to show "who is logged in" + log out, WITHOUT\nshared/ depending on the auth context (the import-direction rule forbids that).\nAuth provides this token at the app root (see app.config.ts); the shared header\ninjects it. SessionStore satisfies this shape structurally.

\n", + "rawdescription": "\n\nA shared seam for the chrome to show \"who is logged in\" + log out, WITHOUT\nshared/ depending on the auth context (the import-direction rule forbids that).\nAuth provides this token at the app root (see app.config.ts); the shared header\ninjects it. SessionStore satisfies this shape structurally.\n", + "methods": [ + { + "name": "logout", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 11, + "deprecated": false, + "deprecationMessage": "" + } + ], + "extends": [] + }, + { + "name": "StatusItem", + "id": "interface-StatusItem-bb80b81784601579976fed392f1c4e638f6945087adb775183c617fc8b015821f1a9ce89762fe24adcdab49c8761256a98fd3e6fe0251d3a6f250ef0aed7b62b", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport {\n ApiClient,\n DocumentCategoryDto,\n UploadStatusItemDto,\n} from '@shared/infrastructure/api-client';\nimport { problemDetail } from '@shared/infrastructure/api-error';\nimport { currentScenario } from '@shared/infrastructure/scenario';\nimport { environment } from '../../../environments/environment';\nimport { DocumentCategory } from './upload.machine';\n\n/** One arrived/known status item from poll-on-return. */\nexport interface StatusItem {\n localId: string;\n status: string; // 'complete' | 'unknown'\n documentId?: string;\n}\n\nexport interface XhrUploadRequest {\n localId: string;\n categoryId: string;\n wizardId: string;\n file: File;\n}\n\n/** A live upload: progress is reported via the callback; cancel aborts the XHR. */\nexport interface XhrUploadHandle {\n done: Promise<{ documentId: string }>;\n cancel: () => void;\n}\n\n/** Sentinel rejection so the caller can tell a user-cancel from a real failure. */\nexport const UPLOAD_ABORTED = Symbol('upload-aborted');\n\n/**\n * Infrastructure: the only place upload HTTP lives. Reads (categories, status,\n * delete) go through the NSwag client; the multipart POST is hand-written XHR\n * because the generated client is JSON-only (the endpoint is ExcludeFromDescription)\n * and we need upload-progress events + cancellation, which fetch can't give us.\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadAdapter {\n private client = inject(ApiClient);\n\n categoriesResource(wizardId: string) {\n return resource({ loader: () => this.client.categories(wizardId).then((r) => (r.categories ?? []).map(toCategory)) });\n }\n\n /** Poll-on-return: which client localIds have arrived at the BFF. */\n status(localIds: string[]): Promise {\n if (localIds.length === 0) return Promise.resolve([]);\n return this.client.status(localIds.join(',')).then((r) => (r.results ?? []).map(toStatusItem));\n }\n\n /** User delete; throws a ProblemDetails (e.g. 409 once linked) the caller maps. */\n deleteDocument(documentId: string): Promise {\n return this.client.uploads(documentId);\n }\n\n /**\n * Direct URL to the stored bytes, for a preview/download link (``) — the\n * server serves it inline for pdf/image, attachment otherwise. Not a fetch: the\n * browser opens it. demo-* ids (dev simulation) have no bytes and 404 here.\n */\n contentUrl(documentId: string): string {\n return `${environment.apiBaseUrl}/api/v1/uploads/${documentId}/content`;\n }\n\n /**\n * Multipart upload with progress + cancel. ponytail: XHR (not fetch keepalive) —\n * progress events need XHR; the keepalive/background gap is covered by\n * poll-on-return (UploadShellService.pollReturning). Swap in a Service Worker\n * transport behind UploadTransport for true background sync.\n */\n xhrUpload(req: XhrUploadRequest, onProgress: (pct: number) => void): XhrUploadHandle {\n const scenario = currentScenario();\n if (scenario === 'upload-slow' || scenario === 'upload-fail') return simulateUpload(scenario, onProgress);\n\n const xhr = new XMLHttpRequest();\n const form = new FormData();\n form.append('file', req.file);\n form.append('categoryId', req.categoryId);\n form.append('localId', req.localId);\n form.append('wizardId', req.wizardId);\n\n let aborted = false;\n const done = new Promise<{ documentId: string }>((resolve, reject) => {\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) onProgress(Math.round((e.loaded / e.total) * 100));\n });\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve({ documentId: JSON.parse(xhr.responseText).documentId });\n } catch {\n reject(genericError());\n }\n } else {\n reject(parseError(xhr.responseText));\n }\n });\n xhr.addEventListener('error', () => reject(genericError()));\n xhr.addEventListener('abort', () => (aborted ? reject(UPLOAD_ABORTED) : reject(genericError())));\n });\n\n xhr.open('POST', `${environment.apiBaseUrl}/api/v1/uploads`);\n xhr.send(form);\n return { done, cancel: () => ((aborted = true), xhr.abort()) };\n }\n}\n\nconst UPLOAD_FAILED = $localize`:@@upload.failed:Uploaden is niet gelukt. Probeer het opnieuw.`;\nconst genericError = (): string => UPLOAD_FAILED;\n\n/**\n * Demo-only (dev): the real XHR POST finishes instantly for metadata, so progress\n * and failure can't otherwise be shown. Drives the progress bar over ~2.5s, then\n * succeeds (`upload-slow`) or fails (`upload-fail`). ponytail: timer-based, cancel\n * via the returned handle; no network.\n */\nfunction simulateUpload(scenario: 'upload-slow' | 'upload-fail', onProgress: (pct: number) => void): XhrUploadHandle {\n let pct = 0;\n let cancelled = false;\n const done = new Promise<{ documentId: string }>((resolve, reject) => {\n const tick = () => {\n if (cancelled) {\n reject(UPLOAD_ABORTED);\n } else if (pct < 100) {\n pct += 10;\n onProgress(Math.min(pct, 100));\n setTimeout(tick, 250);\n } else if (scenario === 'upload-fail') {\n reject(UPLOAD_FAILED);\n } else {\n resolve({ documentId: `demo-${crypto.randomUUID()}` });\n }\n };\n setTimeout(tick, 250);\n });\n return { done, cancel: () => void (cancelled = true) };\n}\nconst parseError = (body: string): string => {\n try {\n return problemDetail(JSON.parse(body), UPLOAD_FAILED);\n } catch {\n return genericError();\n }\n};\n\n/** Wire DTO (all fields optional) → domain. */\nfunction toCategory(c: DocumentCategoryDto): DocumentCategory {\n return {\n categoryId: c.categoryId ?? '',\n label: c.label ?? '',\n description: c.description ?? '',\n required: c.required ?? false,\n acceptedTypes: c.acceptedTypes ?? [],\n maxSizeMb: c.maxSizeMb ?? 0,\n multiple: c.multiple ?? false,\n allowPostDelivery: c.allowPostDelivery ?? false,\n };\n}\n\nfunction toStatusItem(s: UploadStatusItemDto): StatusItem {\n return { localId: s.localId ?? '', status: s.status ?? 'unknown', documentId: s.documentId ?? undefined };\n}\n", + "properties": [ + { + "name": "documentId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 16 + }, + { + "name": "localId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 14 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 15 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

One arrived/known status item from poll-on-return.

\n", + "rawdescription": "\nOne arrived/known status item from poll-on-return.", + "methods": [], + "extends": [] + }, { "name": "Store", - "id": "interface-Store-de6d0ec7e0704c5d9490e9a33e624477e924daff53384c527eb4aaa76178bd1716ada071d7e46af3e0a859a7cbec63cdc114f61db5d36b61e49effcd5ac744f9", + "id": "interface-Store-a37705502ee39f3c0f29e4d6e9d75da640c8cbb0fcb82100a1baddfda3a85596b08019b398ef1a18152e1de16af4828538d42a8d93886e0509d7a17caaaa4233", "file": "src/app/shared/application/store.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Signal, signal } from '@angular/core';\n\n/**\n * A tiny \"Elm-style\" store. The whole idea: all state lives in ONE value\n * (the Model). The only way to change it is to send a message (Msg) to a PURE\n * function `update(model, msg)` that returns the next Model. Nothing else\n * mutates state, so to understand the app you only read the update function.\n *\n * Side effects (HTTP, timers) do NOT go in `update` — that stays pure and easy\n * to test. Instead, effectful \"command\" functions call the network and then\n * `dispatch` a message describing what happened (e.g. Loaded / Failed).\n */\nexport interface Store {\n /** The current state, as a read-only Angular signal. */\n readonly model: Signal;\n /** Send a message; the model becomes update(model, msg). */\n dispatch(msg: Msg): void;\n}\n\nexport function createStore(\n init: Model,\n update: (model: Model, msg: Msg) => Model,\n): Store {\n const model = signal(init);\n return {\n model: model.asReadonly(),\n dispatch: (msg) => model.set(update(model(), msg)),\n };\n}\n", + "sourceCode": "import { Signal, signal } from '@angular/core';\n\n/**\n * A tiny \"Elm-style\" store. The whole idea: all state lives in ONE value\n * (the Model). The only way to change it is to send a message (Msg) to a PURE\n * function `update(model, msg)` that returns the next Model. Nothing else\n * mutates state, so to understand the app you only read the update function.\n *\n * Side effects (HTTP, timers) do NOT go in `update` — that stays pure and easy\n * to test. Instead, effectful \"command\" functions call the network and then\n * `dispatch` a message describing what happened (e.g. Loaded / Failed).\n */\nexport interface Store {\n /** The current state, as a read-only Angular signal. */\n readonly model: Signal;\n /** Send a message; the model becomes update(model, msg). */\n dispatch(msg: Msg): void;\n}\n\nexport function createStore(\n init: Model,\n update: (model: Model, msg: Msg) => Model,\n): Store {\n const model = signal(init);\n return {\n model: model.asReadonly(),\n // Use `.update` (raw current value, no tracked read) not `set(update(model(), …))`:\n // dispatch is a command and must never subscribe its caller to `model`. Reading\n // `model()` here inside an effect that also dispatches makes the effect depend on\n // its own write and livelock the main thread (crashed the upload wizards).\n dispatch: (msg) => model.update((m) => update(m, msg)),\n };\n}\n", "properties": [ { "name": "model", @@ -1240,15 +3163,566 @@ ], "extends": [] }, + { + "name": "SubmitApplicationRequest", + "id": "interface-SubmitApplicationRequest-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "diplomaHerkomst", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1097 + }, + { + "name": "documents", + "deprecated": false, + "deprecationMessage": "", + "type": "DocumentRefDto[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1099 + }, + { + "name": "uren", + "deprecated": false, + "deprecationMessage": "", + "type": "number | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1098 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "SubmitApplicationResponse", + "id": "interface-SubmitApplicationResponse-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "referentie", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1103 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "AanvraagStatusDto", + "indexKey": "", + "optional": true, + "description": "", + "line": 1104 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "TaskItem", + "id": "interface-TaskItem-0de17745750573b2f302d6355409064bc5a2cd3835cbb67b5935992409efa3154c91acd23eea7fe469c1837582f24c0d8b14aa8bad0761bd63e1231b2cd427a4", + "file": "src/app/shared/ui/task-list/task-list.component.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { LinkComponent } from '@shared/ui/link/link.component';\n\n/** Presentational task shape — what \"Wat moet ik regelen\" renders. Domain-free so\n shared/ stays independent of any context (a context's task type that has these\n fields is structurally assignable). */\nexport interface TaskItem {\n readonly title: string;\n readonly description: string;\n readonly to: string;\n readonly actionLabel: string;\n}\n\n/** Molecule: the \"Wat moet ik regelen\" action list (NL Design System \"Mijn\n omgeving\" pattern). Each task is a titled row with a call to action. */\n@Component({\n selector: 'app-task-list',\n imports: [LinkComponent],\n styles: [`\n :host{display:block}\n .tasks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-md)}\n .task{\n display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md) var(--rhc-space-max-xl);\n align-items:center;justify-content:space-between;\n background:var(--rhc-color-wit);\n border:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-inline-start:var(--rhc-border-width-md) solid var(--rhc-color-lintblauw-700);\n border-radius:var(--rhc-border-radius-md);\n padding:var(--rhc-space-max-lg) var(--rhc-space-max-xl);\n }\n .title{margin:0 0 var(--rhc-space-max-xs);font-weight:var(--rhc-text-font-weight-semi-bold)}\n .desc{margin:0;color:var(--rhc-color-foreground-subtle);font-size:var(--rhc-text-font-size-sm)}\n .cta{flex:0 0 auto}\n `],\n template: `\n
    \n @for (t of tasks(); track t.title) {\n
  • \n
    \n

    {{ t.title }}

    \n

    {{ t.description }}

    \n
    \n {{ t.actionLabel }} →\n
  • \n }\n
\n `,\n})\nexport class TaskListComponent {\n tasks = input.required();\n}\n", + "properties": [ + { + "name": "actionLabel", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 11, + "modifierKind": [ + 148 + ] + }, + { + "name": "description", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 9, + "modifierKind": [ + 148 + ] + }, + { + "name": "title", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 8, + "modifierKind": [ + 148 + ] + }, + { + "name": "to", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 10, + "modifierKind": [ + 148 + ] + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

Presentational task shape — what "Wat moet ik regelen" renders. Domain-free so\nshared/ stays independent of any context (a context's task type that has these\nfields is structurally assignable).

\n", + "rawdescription": "\nPresentational task shape — what \"Wat moet ik regelen\" renders. Domain-free so\nshared/ stays independent of any context (a context's task type that has these\nfields is structurally assignable).", + "methods": [], + "extends": [] + }, + { + "name": "Upload", + "id": "interface-Upload-cd384c135d0cf4c44c9dd96f8fcafc852f27015dbdd1ed429e118bb2db250d6e0782800ab04ef957e392a5bb408ce5a9a8c8184a696dc2130d513426479e88c7", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { assertNever } from '@shared/kernel/fp';\n\n/**\n * Pure upload domain (no Angular). Reusable across wizards: the host wizard folds\n * `UploadState` into its Model and delegates upload `Msg`s to `reduceUpload`.\n * Illegal states are unrepresentable by construction; the few transitions a union\n * can't express (channel↔upload exclusivity, single-file categories) are enforced\n * here in the reducer. Effects live in the shell (upload-shell.service.ts).\n */\n\nexport type UploadStatus =\n | { type: 'idle' }\n | { type: 'queued' }\n | { type: 'uploading'; progressPct: number }\n | { type: 'complete'; documentId: string }\n | { type: 'failed'; reason: string }\n | { type: 'deleting'; documentId: string } // carries the id so a failed delete can revert\n | { type: 'deleted' };\n\nexport interface Upload {\n localId: string; // client-generated UUID; the sync tag / status key\n categoryId: string;\n fileName: string;\n fileSizeMb: number;\n status: UploadStatus;\n backgroundSync: boolean;\n}\n\nexport type DeliveryChannel = 'digital' | 'post';\n\nexport interface DocumentCategory {\n categoryId: string;\n label: string;\n description: string;\n required: boolean;\n acceptedTypes: string[];\n maxSizeMb: number;\n multiple: boolean;\n allowPostDelivery: boolean;\n}\n\nexport interface UploadState {\n categories: DocumentCategory[];\n uploads: Upload[];\n deliveryChannel: Record; // categoryId → channel; default 'digital'\n rejections: Record; // categoryId → client-side validation message (transient)\n backgroundSyncAvailable: boolean;\n categoriesError?: string;\n}\n\nexport const initialUpload: UploadState = {\n categories: [],\n uploads: [],\n deliveryChannel: {},\n rejections: {},\n backgroundSyncAvailable: false,\n};\n\nexport type UploadMsg =\n | { type: 'CategoriesLoaded'; categories: DocumentCategory[] }\n | { type: 'CategoriesLoadFailed'; reason: string }\n | { type: 'BackgroundSyncAvailability'; available: boolean }\n | { type: 'FileSelected'; categoryId: string; localId: string; fileName: string; fileSizeMb: number }\n | { type: 'FileRejected'; categoryId: string; reason: 'type' | 'size' | 'multiple' }\n | { type: 'UploadQueued'; localId: string; backgroundSync: boolean }\n | { type: 'UploadProgress'; localId: string; progressPct: number }\n | { type: 'UploadComplete'; localId: string; documentId: string }\n | { type: 'UploadFailed'; localId: string; reason: string }\n | { type: 'UploadRetried'; localId: string }\n | { type: 'UploadRemoved'; localId: string }\n | { type: 'UploadDeleteRequested'; localId: string; documentId: string }\n | { type: 'UploadDeleting'; localId: string }\n | { type: 'UploadDeleteComplete'; localId: string }\n | { type: 'UploadDeleteFailed'; localId: string; reason: string }\n | { type: 'DeliveryChannelChanged'; categoryId: string; channel: DeliveryChannel }\n | {\n type: 'BackgroundUploadsReturned';\n results: Array<{ localId: string } & ({ success: true; documentId: string } | { success: false; reason: string })>;\n };\n\nconst REJECTION_MESSAGES: Record<'type' | 'size' | 'multiple', string> = {\n type: $localize`:@@upload.reject.type:Dit bestandstype is niet toegestaan voor deze categorie.`,\n size: $localize`:@@upload.reject.size:Dit bestand is te groot.`,\n multiple: $localize`:@@upload.reject.multiple:U kunt voor deze categorie maar één bestand uploaden.`,\n};\n\nconst ACTIVE: ReadonlyArray = ['queued', 'uploading', 'complete'];\n\n/** A required category is satisfied by an initiated upload OR a post-delivery choice. */\nexport function categorySatisfied(s: UploadState, categoryId: string): boolean {\n if (s.deliveryChannel[categoryId] === 'post') return true;\n return s.uploads.some((u) => u.categoryId === categoryId && ACTIVE.includes(u.status.type));\n}\n\nexport function requiredCategoriesSatisfied(s: UploadState): boolean {\n return s.categories.filter((c) => c.required).every((c) => categorySatisfied(s, c.categoryId));\n}\n\n/**\n * FE format-validation (never authority — the server re-validates). Returns the\n * rejection reason for one file, or null if it passes the category's type/size.\n */\nexport function rejectReason(cat: DocumentCategory, file: { type: string; sizeMb: number }): 'type' | 'size' | null {\n if (cat.acceptedTypes.length > 0 && !cat.acceptedTypes.includes(file.type)) return 'type';\n if (cat.maxSizeMb > 0 && file.sizeMb > cat.maxSizeMb) return 'size';\n return null;\n}\n\n/** Map one upload's status, leaving the rest of the list untouched. */\nfunction mapUpload(s: UploadState, localId: string, f: (u: Upload) => Upload): UploadState {\n return { ...s, uploads: s.uploads.map((u) => (u.localId === localId ? f(u) : u)) };\n}\n\nconst find = (s: UploadState, localId: string) => s.uploads.find((u) => u.localId === localId);\nconst categoryOf = (s: UploadState, categoryId: string) => s.categories.find((c) => c.categoryId === categoryId);\n\nexport function reduceUpload(s: UploadState, m: UploadMsg): UploadState {\n switch (m.type) {\n case 'CategoriesLoaded': {\n const deliveryChannel = { ...s.deliveryChannel };\n for (const c of m.categories) deliveryChannel[c.categoryId] ??= 'digital';\n return { ...s, categories: m.categories, deliveryChannel, categoriesError: undefined };\n }\n case 'CategoriesLoadFailed':\n return { ...s, categoriesError: m.reason };\n case 'BackgroundSyncAvailability':\n return { ...s, backgroundSyncAvailable: m.available };\n\n case 'FileSelected': {\n // Reject at dispatch: unknown category, or a category set to post-delivery.\n if (!categoryOf(s, m.categoryId) || s.deliveryChannel[m.categoryId] === 'post') return s;\n const cat = categoryOf(s, m.categoryId)!;\n // Single-file categories: a new selection replaces any existing upload.\n const uploads = cat.multiple ? s.uploads : s.uploads.filter((u) => u.categoryId !== m.categoryId);\n const next: Upload = {\n localId: m.localId,\n categoryId: m.categoryId,\n fileName: m.fileName,\n fileSizeMb: m.fileSizeMb,\n status: { type: 'queued' },\n backgroundSync: false,\n };\n const { [m.categoryId]: _cleared, ...rejections } = s.rejections;\n return { ...s, uploads: [...uploads, next], rejections };\n }\n case 'FileRejected':\n return { ...s, rejections: { ...s.rejections, [m.categoryId]: REJECTION_MESSAGES[m.reason] } };\n\n case 'UploadQueued':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'queued' }, backgroundSync: m.backgroundSync }));\n case 'UploadProgress':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'uploading', progressPct: m.progressPct } }));\n case 'UploadComplete':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'complete', documentId: m.documentId } }));\n case 'UploadFailed':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'failed', reason: m.reason } }));\n case 'UploadRetried':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'queued' } }));\n\n case 'UploadRemoved':\n return { ...s, uploads: s.uploads.filter((u) => u.localId !== m.localId) };\n\n case 'UploadDeleteRequested':\n case 'UploadDeleting':\n // Both mark the in-flight delete; keep the documentId so a failure can revert.\n return mapUpload(s, m.localId, (u) => {\n const documentId = u.status.type === 'complete' ? u.status.documentId\n : u.status.type === 'deleting' ? u.status.documentId : '';\n return { ...u, status: { type: 'deleting', documentId } };\n });\n case 'UploadDeleteComplete':\n return { ...s, uploads: s.uploads.filter((u) => u.localId !== m.localId) };\n case 'UploadDeleteFailed':\n return mapUpload(s, m.localId, (u) =>\n u.status.type === 'deleting' ? { ...u, status: { type: 'complete', documentId: u.status.documentId } } : u);\n\n case 'DeliveryChannelChanged': {\n const cat = categoryOf(s, m.categoryId);\n // Reject post for a category that doesn't permit it.\n if (m.channel === 'post' && (!cat || !cat.allowPostDelivery)) return s;\n const deliveryChannel = { ...s.deliveryChannel, [m.categoryId]: m.channel };\n // Switching to post removes that category's uploads; switching to digital starts clean.\n const uploads = s.uploads.filter((u) => u.categoryId !== m.categoryId);\n return { ...s, deliveryChannel, uploads };\n }\n\n case 'BackgroundUploadsReturned': {\n let next = s;\n for (const r of m.results) {\n next = mapUpload(next, r.localId, (u) => ({\n ...u,\n status: r.success ? { type: 'complete', documentId: r.documentId } : { type: 'failed', reason: r.reason },\n }));\n }\n return next;\n }\n\n default:\n return assertNever(m);\n }\n}\n\n/** The submit payload fragment: digital docs carry their documentId, post categories the channel. */\nexport function deliveryRefs(s: UploadState): Array<{ categoryId: string; channel: DeliveryChannel; documentId?: string }> {\n const refs: Array<{ categoryId: string; channel: DeliveryChannel; documentId?: string }> = [];\n for (const c of s.categories) {\n if (s.deliveryChannel[c.categoryId] === 'post') {\n refs.push({ categoryId: c.categoryId, channel: 'post' });\n } else {\n for (const u of s.uploads) {\n if (u.categoryId === c.categoryId && u.status.type === 'complete') {\n refs.push({ categoryId: c.categoryId, channel: 'digital', documentId: u.status.documentId });\n }\n }\n }\n }\n return refs;\n}\n\n/** Used by the shell to find what to poll on return: still-in-flight uploads. */\nexport const inFlight = (s: UploadState): Upload[] =>\n s.uploads.filter((u) => u.status.type === 'queued' || u.status.type === 'uploading');\n", + "properties": [ + { + "name": "backgroundSync", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "indexKey": "", + "optional": false, + "description": "", + "line": 26 + }, + { + "name": "categoryId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 22 + }, + { + "name": "fileName", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 23 + }, + { + "name": "fileSizeMb", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": false, + "description": "", + "line": 24 + }, + { + "name": "localId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 21 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "UploadStatus", + "indexKey": "", + "optional": false, + "description": "", + "line": 25 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "UploadCategoriesDto", + "id": "interface-UploadCategoriesDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "categories", + "deprecated": false, + "deprecationMessage": "", + "type": "DocumentCategoryDto[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1108 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "UploadControllerDeps", + "id": "interface-UploadControllerDeps-81b65fb5f3fbf3b67a7e8c0d4d69b877c0ff7fff7d3fcc875f55833131e04d33b23a00311586c67570ad69f3c7d89b115460c746d5968dd6302281cb04c8a371", + "file": "src/app/shared/upload/upload-controller.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { DestroyRef, effect, inject } from '@angular/core';\nimport { UploadAdapter } from './upload.adapter';\nimport { UploadShellService } from './upload-shell.service';\nimport { problemDetail } from '@shared/infrastructure/api-error';\nimport { SUBMIT_FAILED } from '@shared/application/submit';\nimport { DeliveryChannel, UploadMsg, UploadState, inFlight, rejectReason } from './upload.machine';\n\nexport interface UploadControllerDeps {\n wizardId: string;\n getUpload: () => UploadState;\n dispatch: (m: UploadMsg) => void;\n}\n\n/**\n * The effectful glue between the `` organism's events and the\n * pure upload reducer + transport. Both wizards instantiate one (in a field\n * initializer, like `createStore`). Holds the only state a reducer can't: the live\n * `File` blobs keyed by localId (needed to retry an upload). Loads categories,\n * reports background-sync availability, and polls on tab refocus.\n */\nexport function createUploadController(deps: UploadControllerDeps) {\n const adapter = inject(UploadAdapter);\n const shell = inject(UploadShellService);\n const files = new Map();\n const categoriesRes = adapter.categoriesResource(deps.wizardId);\n\n // Runs after the host's `Seed`/restore microtask (effects fire in CD, not field\n // init), so these dispatches aren't wiped by a state reseed.\n effect(() => {\n deps.dispatch({ type: 'BackgroundSyncAvailability', available: shell.backgroundSyncAvailable });\n const status = categoriesRes.status();\n if (status === 'resolved' || status === 'local') {\n deps.dispatch({ type: 'CategoriesLoaded', categories: categoriesRes.value() ?? [] });\n } else if (status === 'error') {\n deps.dispatch({ type: 'CategoriesLoadFailed', reason: problemDetail(categoriesRes.error(), SUBMIT_FAILED) });\n }\n });\n\n const onFocus = () => void shell.pollReturning(inFlight(deps.getUpload()), deps.dispatch);\n window.addEventListener('focus', onFocus);\n inject(DestroyRef).onDestroy(() => window.removeEventListener('focus', onFocus));\n\n function start(categoryId: string, file: File) {\n const localId = crypto.randomUUID();\n files.set(localId, file);\n deps.dispatch({ type: 'FileSelected', categoryId, localId, fileName: file.name, fileSizeMb: file.size / 1e6 });\n shell.upload({ localId, categoryId, wizardId: deps.wizardId, file }, deps.dispatch);\n }\n\n return {\n onFileSelected(categoryId: string, selected: File[]) {\n const cat = deps.getUpload().categories.find((c) => c.categoryId === categoryId);\n if (!cat) return;\n if (!cat.multiple && selected.length > 1) {\n deps.dispatch({ type: 'FileRejected', categoryId, reason: 'multiple' });\n return;\n }\n for (const file of selected) {\n const reason = rejectReason(cat, { type: file.type, sizeMb: file.size / 1e6 });\n if (reason) deps.dispatch({ type: 'FileRejected', categoryId, reason });\n else start(categoryId, file);\n }\n },\n onRemove(localId: string) {\n shell.cancel([localId]);\n files.delete(localId);\n deps.dispatch({ type: 'UploadRemoved', localId });\n },\n onRetry(localId: string) {\n const file = files.get(localId);\n const up = deps.getUpload().uploads.find((u) => u.localId === localId);\n if (!file || !up) return;\n deps.dispatch({ type: 'UploadRetried', localId });\n shell.upload({ localId, categoryId: up.categoryId, wizardId: deps.wizardId, file }, deps.dispatch);\n },\n onDelete(e: { localId: string; documentId: string }) {\n shell.delete(e.localId, e.documentId, deps.dispatch);\n },\n onChannelChange(categoryId: string, channel: DeliveryChannel) {\n const ids = deps\n .getUpload()\n .uploads.filter((u) => u.categoryId === categoryId)\n .map((u) => u.localId);\n shell.cancel(ids);\n deps.dispatch({ type: 'DeliveryChannelChanged', categoryId, channel });\n },\n };\n}\n", + "properties": [ + { + "name": "dispatch", + "deprecated": false, + "deprecationMessage": "", + "type": "function", + "indexKey": "", + "optional": false, + "description": "", + "line": 11 + }, + { + "name": "getUpload", + "deprecated": false, + "deprecationMessage": "", + "type": "function", + "indexKey": "", + "optional": false, + "description": "", + "line": 10 + }, + { + "name": "wizardId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 9 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "UploadState", + "id": "interface-UploadState-cd384c135d0cf4c44c9dd96f8fcafc852f27015dbdd1ed429e118bb2db250d6e0782800ab04ef957e392a5bb408ce5a9a8c8184a696dc2130d513426479e88c7", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { assertNever } from '@shared/kernel/fp';\n\n/**\n * Pure upload domain (no Angular). Reusable across wizards: the host wizard folds\n * `UploadState` into its Model and delegates upload `Msg`s to `reduceUpload`.\n * Illegal states are unrepresentable by construction; the few transitions a union\n * can't express (channel↔upload exclusivity, single-file categories) are enforced\n * here in the reducer. Effects live in the shell (upload-shell.service.ts).\n */\n\nexport type UploadStatus =\n | { type: 'idle' }\n | { type: 'queued' }\n | { type: 'uploading'; progressPct: number }\n | { type: 'complete'; documentId: string }\n | { type: 'failed'; reason: string }\n | { type: 'deleting'; documentId: string } // carries the id so a failed delete can revert\n | { type: 'deleted' };\n\nexport interface Upload {\n localId: string; // client-generated UUID; the sync tag / status key\n categoryId: string;\n fileName: string;\n fileSizeMb: number;\n status: UploadStatus;\n backgroundSync: boolean;\n}\n\nexport type DeliveryChannel = 'digital' | 'post';\n\nexport interface DocumentCategory {\n categoryId: string;\n label: string;\n description: string;\n required: boolean;\n acceptedTypes: string[];\n maxSizeMb: number;\n multiple: boolean;\n allowPostDelivery: boolean;\n}\n\nexport interface UploadState {\n categories: DocumentCategory[];\n uploads: Upload[];\n deliveryChannel: Record; // categoryId → channel; default 'digital'\n rejections: Record; // categoryId → client-side validation message (transient)\n backgroundSyncAvailable: boolean;\n categoriesError?: string;\n}\n\nexport const initialUpload: UploadState = {\n categories: [],\n uploads: [],\n deliveryChannel: {},\n rejections: {},\n backgroundSyncAvailable: false,\n};\n\nexport type UploadMsg =\n | { type: 'CategoriesLoaded'; categories: DocumentCategory[] }\n | { type: 'CategoriesLoadFailed'; reason: string }\n | { type: 'BackgroundSyncAvailability'; available: boolean }\n | { type: 'FileSelected'; categoryId: string; localId: string; fileName: string; fileSizeMb: number }\n | { type: 'FileRejected'; categoryId: string; reason: 'type' | 'size' | 'multiple' }\n | { type: 'UploadQueued'; localId: string; backgroundSync: boolean }\n | { type: 'UploadProgress'; localId: string; progressPct: number }\n | { type: 'UploadComplete'; localId: string; documentId: string }\n | { type: 'UploadFailed'; localId: string; reason: string }\n | { type: 'UploadRetried'; localId: string }\n | { type: 'UploadRemoved'; localId: string }\n | { type: 'UploadDeleteRequested'; localId: string; documentId: string }\n | { type: 'UploadDeleting'; localId: string }\n | { type: 'UploadDeleteComplete'; localId: string }\n | { type: 'UploadDeleteFailed'; localId: string; reason: string }\n | { type: 'DeliveryChannelChanged'; categoryId: string; channel: DeliveryChannel }\n | {\n type: 'BackgroundUploadsReturned';\n results: Array<{ localId: string } & ({ success: true; documentId: string } | { success: false; reason: string })>;\n };\n\nconst REJECTION_MESSAGES: Record<'type' | 'size' | 'multiple', string> = {\n type: $localize`:@@upload.reject.type:Dit bestandstype is niet toegestaan voor deze categorie.`,\n size: $localize`:@@upload.reject.size:Dit bestand is te groot.`,\n multiple: $localize`:@@upload.reject.multiple:U kunt voor deze categorie maar één bestand uploaden.`,\n};\n\nconst ACTIVE: ReadonlyArray = ['queued', 'uploading', 'complete'];\n\n/** A required category is satisfied by an initiated upload OR a post-delivery choice. */\nexport function categorySatisfied(s: UploadState, categoryId: string): boolean {\n if (s.deliveryChannel[categoryId] === 'post') return true;\n return s.uploads.some((u) => u.categoryId === categoryId && ACTIVE.includes(u.status.type));\n}\n\nexport function requiredCategoriesSatisfied(s: UploadState): boolean {\n return s.categories.filter((c) => c.required).every((c) => categorySatisfied(s, c.categoryId));\n}\n\n/**\n * FE format-validation (never authority — the server re-validates). Returns the\n * rejection reason for one file, or null if it passes the category's type/size.\n */\nexport function rejectReason(cat: DocumentCategory, file: { type: string; sizeMb: number }): 'type' | 'size' | null {\n if (cat.acceptedTypes.length > 0 && !cat.acceptedTypes.includes(file.type)) return 'type';\n if (cat.maxSizeMb > 0 && file.sizeMb > cat.maxSizeMb) return 'size';\n return null;\n}\n\n/** Map one upload's status, leaving the rest of the list untouched. */\nfunction mapUpload(s: UploadState, localId: string, f: (u: Upload) => Upload): UploadState {\n return { ...s, uploads: s.uploads.map((u) => (u.localId === localId ? f(u) : u)) };\n}\n\nconst find = (s: UploadState, localId: string) => s.uploads.find((u) => u.localId === localId);\nconst categoryOf = (s: UploadState, categoryId: string) => s.categories.find((c) => c.categoryId === categoryId);\n\nexport function reduceUpload(s: UploadState, m: UploadMsg): UploadState {\n switch (m.type) {\n case 'CategoriesLoaded': {\n const deliveryChannel = { ...s.deliveryChannel };\n for (const c of m.categories) deliveryChannel[c.categoryId] ??= 'digital';\n return { ...s, categories: m.categories, deliveryChannel, categoriesError: undefined };\n }\n case 'CategoriesLoadFailed':\n return { ...s, categoriesError: m.reason };\n case 'BackgroundSyncAvailability':\n return { ...s, backgroundSyncAvailable: m.available };\n\n case 'FileSelected': {\n // Reject at dispatch: unknown category, or a category set to post-delivery.\n if (!categoryOf(s, m.categoryId) || s.deliveryChannel[m.categoryId] === 'post') return s;\n const cat = categoryOf(s, m.categoryId)!;\n // Single-file categories: a new selection replaces any existing upload.\n const uploads = cat.multiple ? s.uploads : s.uploads.filter((u) => u.categoryId !== m.categoryId);\n const next: Upload = {\n localId: m.localId,\n categoryId: m.categoryId,\n fileName: m.fileName,\n fileSizeMb: m.fileSizeMb,\n status: { type: 'queued' },\n backgroundSync: false,\n };\n const { [m.categoryId]: _cleared, ...rejections } = s.rejections;\n return { ...s, uploads: [...uploads, next], rejections };\n }\n case 'FileRejected':\n return { ...s, rejections: { ...s.rejections, [m.categoryId]: REJECTION_MESSAGES[m.reason] } };\n\n case 'UploadQueued':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'queued' }, backgroundSync: m.backgroundSync }));\n case 'UploadProgress':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'uploading', progressPct: m.progressPct } }));\n case 'UploadComplete':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'complete', documentId: m.documentId } }));\n case 'UploadFailed':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'failed', reason: m.reason } }));\n case 'UploadRetried':\n return mapUpload(s, m.localId, (u) => ({ ...u, status: { type: 'queued' } }));\n\n case 'UploadRemoved':\n return { ...s, uploads: s.uploads.filter((u) => u.localId !== m.localId) };\n\n case 'UploadDeleteRequested':\n case 'UploadDeleting':\n // Both mark the in-flight delete; keep the documentId so a failure can revert.\n return mapUpload(s, m.localId, (u) => {\n const documentId = u.status.type === 'complete' ? u.status.documentId\n : u.status.type === 'deleting' ? u.status.documentId : '';\n return { ...u, status: { type: 'deleting', documentId } };\n });\n case 'UploadDeleteComplete':\n return { ...s, uploads: s.uploads.filter((u) => u.localId !== m.localId) };\n case 'UploadDeleteFailed':\n return mapUpload(s, m.localId, (u) =>\n u.status.type === 'deleting' ? { ...u, status: { type: 'complete', documentId: u.status.documentId } } : u);\n\n case 'DeliveryChannelChanged': {\n const cat = categoryOf(s, m.categoryId);\n // Reject post for a category that doesn't permit it.\n if (m.channel === 'post' && (!cat || !cat.allowPostDelivery)) return s;\n const deliveryChannel = { ...s.deliveryChannel, [m.categoryId]: m.channel };\n // Switching to post removes that category's uploads; switching to digital starts clean.\n const uploads = s.uploads.filter((u) => u.categoryId !== m.categoryId);\n return { ...s, deliveryChannel, uploads };\n }\n\n case 'BackgroundUploadsReturned': {\n let next = s;\n for (const r of m.results) {\n next = mapUpload(next, r.localId, (u) => ({\n ...u,\n status: r.success ? { type: 'complete', documentId: r.documentId } : { type: 'failed', reason: r.reason },\n }));\n }\n return next;\n }\n\n default:\n return assertNever(m);\n }\n}\n\n/** The submit payload fragment: digital docs carry their documentId, post categories the channel. */\nexport function deliveryRefs(s: UploadState): Array<{ categoryId: string; channel: DeliveryChannel; documentId?: string }> {\n const refs: Array<{ categoryId: string; channel: DeliveryChannel; documentId?: string }> = [];\n for (const c of s.categories) {\n if (s.deliveryChannel[c.categoryId] === 'post') {\n refs.push({ categoryId: c.categoryId, channel: 'post' });\n } else {\n for (const u of s.uploads) {\n if (u.categoryId === c.categoryId && u.status.type === 'complete') {\n refs.push({ categoryId: c.categoryId, channel: 'digital', documentId: u.status.documentId });\n }\n }\n }\n }\n return refs;\n}\n\n/** Used by the shell to find what to poll on return: still-in-flight uploads. */\nexport const inFlight = (s: UploadState): Upload[] =>\n s.uploads.filter((u) => u.status.type === 'queued' || u.status.type === 'uploading');\n", + "properties": [ + { + "name": "backgroundSyncAvailable", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "indexKey": "", + "optional": false, + "description": "", + "line": 47 + }, + { + "name": "categories", + "deprecated": false, + "deprecationMessage": "", + "type": "DocumentCategory[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 43 + }, + { + "name": "categoriesError", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": true, + "description": "", + "line": 48 + }, + { + "name": "deliveryChannel", + "deprecated": false, + "deprecationMessage": "", + "type": "Record", + "indexKey": "", + "optional": false, + "description": "", + "line": 45 + }, + { + "name": "rejections", + "deprecated": false, + "deprecationMessage": "", + "type": "Record", + "indexKey": "", + "optional": false, + "description": "", + "line": 46 + }, + { + "name": "uploads", + "deprecated": false, + "deprecationMessage": "", + "type": "Upload[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 44 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "UploadStatusDto", + "id": "interface-UploadStatusDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "results", + "deprecated": false, + "deprecationMessage": "", + "type": "UploadStatusItemDto[] | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1112 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "UploadStatusItemDto", + "id": "interface-UploadStatusItemDto-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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": "documentId", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1118 + }, + { + "name": "localId", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1116 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "string | undefined", + "indexKey": "", + "optional": true, + "description": "", + "line": 1117 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] + }, + { + "name": "UploadTransport", + "id": "interface-UploadTransport-ec4f738d45fc556f5419cef06bad97f2f12a90de63211f79059088a2827ea9ee851b1544ec2110033a7797b65eaeb7caf0d4508fd122384394eaf9a145ffa7f6", + "file": "src/app/shared/upload/upload-shell.service.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Injectable, inject } from '@angular/core';\nimport { UploadAdapter, XhrUploadRequest, XhrUploadHandle, UPLOAD_ABORTED } from './upload.adapter';\nimport { problemDetail } from '@shared/infrastructure/api-error';\nimport { UploadMsg, Upload } from './upload.machine';\n\n/**\n * Transport seam (PRD §6): how upload bytes leave the browser. The shipped impl is\n * KeepaliveTransport (XHR for progress; poll-on-return covers the background gap).\n * A ServiceWorkerTransport would set `backgroundSyncAvailable = true` and survive a\n * closed tab — swapping it in touches only this interface.\n */\nexport interface UploadTransport {\n readonly backgroundSyncAvailable: boolean;\n send(req: XhrUploadRequest, onProgress: (pct: number) => void): XhrUploadHandle;\n}\n\n@Injectable({ providedIn: 'root' })\nclass KeepaliveTransport implements UploadTransport {\n private adapter = inject(UploadAdapter);\n readonly backgroundSyncAvailable = false; // no Service Worker registered in this POC\n send(req: XhrUploadRequest, onProgress: (pct: number) => void) {\n return this.adapter.xhrUpload(req, onProgress);\n }\n}\n\ntype Dispatch = (m: UploadMsg) => void;\n\n/**\n * Orchestrates upload effects: drives the transport and translates outcomes into\n * domain messages. Holds no UI state itself — the host wizard's reducer owns it.\n * Effects only; the reducer stays pure.\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadShellService {\n private transport: UploadTransport = inject(KeepaliveTransport);\n private adapter = inject(UploadAdapter);\n private inflight = new Map void>(); // localId → cancel\n\n get backgroundSyncAvailable(): boolean {\n return this.transport.backgroundSyncAvailable;\n }\n\n /** Start (or retry) an upload: queue → progress → complete/failed. */\n upload(req: XhrUploadRequest, dispatch: Dispatch): void {\n dispatch({ type: 'UploadQueued', localId: req.localId, backgroundSync: this.backgroundSyncAvailable });\n const { done, cancel } = this.transport.send(req, (pct) =>\n dispatch({ type: 'UploadProgress', localId: req.localId, progressPct: pct }),\n );\n this.inflight.set(req.localId, cancel);\n done\n .then(({ documentId }) => dispatch({ type: 'UploadComplete', localId: req.localId, documentId }))\n .catch((e) => {\n if (e !== UPLOAD_ABORTED) {\n dispatch({ type: 'UploadFailed', localId: req.localId, reason: typeof e === 'string' ? e : '' });\n }\n })\n .finally(() => this.inflight.delete(req.localId));\n }\n\n /** Optimistic delete: mark deleting → complete (removed) / failed (reverted). */\n delete(localId: string, documentId: string, dispatch: Dispatch): void {\n dispatch({ type: 'UploadDeleting', localId });\n this.adapter\n .deleteDocument(documentId)\n .then(() => dispatch({ type: 'UploadDeleteComplete', localId }))\n .catch((e) => dispatch({ type: 'UploadDeleteFailed', localId, reason: problemDetail(e, '') }));\n }\n\n /** Cancel any in-flight XHRs (e.g. when a category switches to post-delivery). */\n cancel(localIds: string[]): void {\n for (const id of localIds) {\n this.inflight.get(id)?.();\n this.inflight.delete(id);\n }\n }\n\n /** Poll-on-return: ask the BFF which still-in-flight uploads have arrived. */\n async pollReturning(uploads: Upload[], dispatch: Dispatch): Promise {\n const ids = uploads.map((u) => u.localId);\n if (ids.length === 0) return;\n const items = await this.adapter.status(ids);\n const results = items\n .filter((i) => i.status === 'complete' && i.documentId)\n .map((i) => ({ localId: i.localId, success: true as const, documentId: i.documentId! }));\n if (results.length > 0) dispatch({ type: 'BackgroundUploadsReturned', results });\n }\n}\n", + "properties": [ + { + "name": "backgroundSyncAvailable", + "deprecated": false, + "deprecationMessage": "", + "type": "boolean", + "indexKey": "", + "optional": false, + "description": "", + "line": 13, + "modifierKind": [ + 148 + ] + } + ], + "indexSignatures": [], + "kind": 174, + "description": "

Transport seam (PRD §6): how upload bytes leave the browser. The shipped impl is\nKeepaliveTransport (XHR for progress; poll-on-return covers the background gap).\nA ServiceWorkerTransport would set backgroundSyncAvailable = true and survive a\nclosed tab — swapping it in touches only this interface.

\n", + "rawdescription": "\n\nTransport seam (PRD §6): how upload bytes leave the browser. The shipped impl is\nKeepaliveTransport (XHR for progress; poll-on-return covers the background gap).\nA ServiceWorkerTransport would set `backgroundSyncAvailable = true` and survive a\nclosed tab — swapping it in touches only this interface.\n", + "methods": [ + { + "name": "send", + "args": [ + { + "name": "req", + "type": "XhrUploadRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "onProgress", + "type": "function", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "function": [ + { + "name": "pct", + "type": "number", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ] + } + ], + "optional": false, + "returnType": "XhrUploadHandle", + "typeParameters": [], + "line": 14, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "req", + "type": "XhrUploadRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "onProgress", + "type": "function", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "function": [ + { + "name": "pct", + "type": "number", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "tagName": { + "text": "param" + } + } + ] + } + ], + "extends": [] + }, { "name": "Valid", - "id": "interface-Valid-097a742aa05bc7bbfee387dd3ea5b2ac382815db8ca18107e699d11e6da110cdeae2eb377bcea284f415cfd263937c3b0f6e7ed2ee9090d660d898dddefe3a4f", + "id": "interface-Valid-d3a799f0e07d1170099acce3acff423674ca7f22594847e870e6e02647d914a5263109f13f637ef9de59ab53bd41d63d7e8b60d6d14428a693efa5576b933439", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n uren: string;\n jaren: string;\n punten: string;\n}\n\n/** What we have AFTER parsing — branded/typed, guaranteed valid. */\nexport interface Valid {\n uren: Uren;\n jaren: number;\n punten: number;\n}\n\n/**\n * The whole wizard as one tagged union. `step` and `errors` exist ONLY while\n * Editing; Submitting/Submitted/Failed carry a `Valid` payload and nothing else.\n * So \"submitting while a field is invalid\" or \"showing the success screen with\n * errors set\" are unrepresentable — the bug class is gone by construction.\n */\nexport type WizardState =\n | { tag: 'Editing'; step: 1 | 2; draft: Draft; errors: Partial> }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: WizardState = { tag: 'Editing', step: 1, draft: { uren: '', jaren: '', punten: '' }, errors: {} };\n\n/** Parse every field; on success hand back a Valid, else the per-field errors. */\nfunction validate(draft: Draft): Result>, Valid> {\n const uren = parseUren(draft.uren);\n const jaren = parseUren(draft.jaren);\n const punten = parseUren(draft.punten);\n const errors: Partial> = {};\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n if (!punten.ok) errors.punten = punten.error;\n if (uren.ok && jaren.ok && punten.ok) {\n return { ok: true, value: { uren: uren.value, jaren: jaren.value, punten: punten.value } };\n }\n return { ok: false, error: errors };\n}\n\n/** Step 1 → 2: advance only when BOTH step-1 fields parse. Illegal elsewhere = no-op. */\nexport function next(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 1) return s;\n const uren = parseUren(s.draft.uren);\n const jaren = parseUren(s.draft.jaren);\n const errors: Partial> = {};\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n return Object.keys(errors).length === 0 ? { ...s, step: 2, errors: {} } : { ...s, errors };\n}\n\nexport function back(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 2) return s;\n return { ...s, step: 1, errors: {} };\n}\n\n/** Step 2 submit: parse everything; move to Submitting only with Valid data. */\nexport function submit(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 2) return s;\n const result = validate(s.draft);\n return result.ok ? { tag: 'Submitting', data: result.value } : { ...s, errors: result.error };\n}\n\n/** Resolve the async submit. Only meaningful while Submitting. */\nexport function resolve(s: WizardState, r: Result): WizardState {\n if (s.tag !== 'Submitting') return s;\n return r.ok ? { tag: 'Submitted', data: s.data } : { tag: 'Failed', data: s.data, error: r.error };\n}\n\n/** Update one draft field while editing; ignored in any other state. */\nexport function setField(s: WizardState, key: keyof Draft, value: string): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, draft: { ...s.draft, [key]: value } };\n}\n\n/**\n * Every event that can happen to the wizard, as one message type. The component\n * sends a WizardMsg; `reduce` decides the next state. This is the Elm\n * Model+Msg+update pattern: ONE pure function describes all state changes.\n */\nexport type WizardMsg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Seed'; state: WizardState }; // mount a specific state (stories/showcase)\n\nexport function reduce(s: WizardState, m: WizardMsg): WizardState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\nimport {\n UploadState,\n UploadMsg,\n initialUpload,\n reduceUpload,\n requiredCategoriesSatisfied,\n deliveryRefs,\n} from '@shared/upload/upload.machine';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n uren: string;\n jaren: string;\n punten: string;\n}\n\nexport type StepErrors = Partial>;\n\n/** What we have AFTER parsing — branded/typed, guaranteed valid. */\nexport interface Valid {\n uren: Uren;\n jaren: number;\n punten: number;\n documents: Array<{ categoryId: string; channel: 'digital' | 'post'; documentId?: string }>;\n}\n\n/**\n * The whole wizard as one tagged union. `step` and `errors` exist ONLY while\n * Editing; Submitting/Submitted/Failed carry a `Valid` payload and nothing else.\n * So \"submitting while a field is invalid\" or \"showing the success screen with\n * errors set\" are unrepresentable — the bug class is gone by construction.\n */\nexport type WizardState =\n | { tag: 'Editing'; step: 1 | 2 | 3; draft: Draft; errors: StepErrors; upload: UploadState }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: WizardState = { tag: 'Editing', step: 1, draft: { uren: '', jaren: '', punten: '' }, errors: {}, upload: initialUpload };\n\n/** Has the user meaningfully started, so it's worth persisting as a Concept? */\nexport function hasProgress(s: Extract): boolean {\n return s.step > 1 || !!s.draft.uren || !!s.draft.jaren || !!s.draft.punten || deliveryRefs(s.upload).some((r) => r.channel === 'digital' && !!r.documentId);\n}\n\n/** Parse every field; on success hand back a Valid, else the per-field errors. */\nfunction validate(draft: Draft, upload: UploadState): Result {\n const uren = parseUren(draft.uren);\n const jaren = parseUren(draft.jaren);\n const punten = parseUren(draft.punten);\n const errors: StepErrors = {};\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n if (!punten.ok) errors.punten = punten.error;\n if (!requiredCategoriesSatisfied(upload)) {\n errors.documenten = $localize`:@@validation.documenten:Lever de verplichte documenten aan (upload of kies \"per post nasturen\").`;\n }\n if (uren.ok && jaren.ok && punten.ok && !errors.documenten) {\n return { ok: true, value: { uren: uren.value, jaren: jaren.value, punten: punten.value, documents: deliveryRefs(upload) } };\n }\n return { ok: false, error: errors };\n}\n\n/** Advance one step, gating on that step's fields. Illegal elsewhere = no-op. */\nexport function next(s: WizardState): WizardState {\n if (s.tag !== 'Editing') return s;\n const errors: StepErrors = {};\n if (s.step === 1) {\n const uren = parseUren(s.draft.uren);\n const jaren = parseUren(s.draft.jaren);\n if (!uren.ok) errors.uren = uren.error;\n if (!jaren.ok) errors.jaren = jaren.error;\n return Object.keys(errors).length === 0 ? { ...s, step: 2, errors: {} } : { ...s, errors };\n }\n if (s.step === 2) {\n const punten = parseUren(s.draft.punten);\n if (!punten.ok) errors.punten = punten.error;\n return punten.ok ? { ...s, step: 3, errors: {} } : { ...s, errors };\n }\n return s;\n}\n\nexport function back(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step === 1) return s;\n return { ...s, step: (s.step - 1) as 1 | 2, errors: {} };\n}\n\n/** Step 3 submit: parse everything + require documents; Submitting only with Valid. */\nexport function submit(s: WizardState): WizardState {\n if (s.tag !== 'Editing' || s.step !== 3) return s;\n const result = validate(s.draft, s.upload);\n return result.ok ? { tag: 'Submitting', data: result.value } : { ...s, errors: result.error };\n}\n\n/** Route an upload sub-message through the pure upload reducer (Editing only). */\nexport function upload(s: WizardState, msg: UploadMsg): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, upload: reduceUpload(s.upload, msg) };\n}\n\n/** Resolve the async submit. Only meaningful while Submitting. */\nexport function resolve(s: WizardState, r: Result): WizardState {\n if (s.tag !== 'Submitting') return s;\n return r.ok ? { tag: 'Submitted', data: s.data } : { tag: 'Failed', data: s.data, error: r.error };\n}\n\n/** Update one draft field while editing; ignored in any other state. */\nexport function setField(s: WizardState, key: keyof Draft, value: string): WizardState {\n if (s.tag !== 'Editing') return s;\n return { ...s, draft: { ...s.draft, [key]: value } };\n}\n\n/**\n * Every event that can happen to the wizard, as one message type. The component\n * sends a WizardMsg; `reduce` decides the next state. This is the Elm\n * Model+Msg+update pattern: ONE pure function describes all state changes.\n */\nexport type WizardMsg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Upload'; msg: UploadMsg }\n | { tag: 'Seed'; state: WizardState }; // mount a specific state (stories/showcase)\n\nexport function reduce(s: WizardState, m: WizardMsg): WizardState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Upload':\n return upload(s, m.msg);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", "properties": [ + { + "name": "documents", + "deprecated": false, + "deprecationMessage": "", + "type": "Array", + "indexKey": "", + "optional": false, + "description": "", + "line": 26 + }, { "name": "jaren", "deprecated": false, @@ -1257,7 +3731,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 14 + "line": 24 }, { "name": "punten", @@ -1267,7 +3741,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 15 + "line": 25 }, { "name": "uren", @@ -1277,7 +3751,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 13 + "line": 23 } ], "indexSignatures": [], @@ -1287,14 +3761,64 @@ "methods": [], "extends": [] }, + { + "name": "Valid", + "id": "interface-Valid-69e87ea9a6c36bd372087191f1524450d62f799934711812731fbbd8f034a9e92b7928082471c429b82990c34c47b84b6493735cb994ec6fdfb81b200e990467-1", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Result, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\n\n/** What the user is typing (raw, possibly invalid). */\nexport interface Draft {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\n\n/** After parsing — postcode is the branded type, so downstream can't get a raw one. */\nexport interface Valid {\n straat: string;\n postcode: Postcode;\n woonplaats: string;\n}\n\nexport type Errors = Partial>;\n\n/**\n * The change-request (adreswijziging) form as one tagged union — the SAME idiom\n * as the wizards, just single-step. `draft`/`errors` exist only while Editing;\n * Submitting/Submitted/Failed carry the parsed `Valid`. Illegal states (submitting\n * an invalid draft, a success screen with errors) are unrepresentable.\n */\nexport type State =\n | { tag: 'Editing'; draft: Draft; errors: Errors }\n | { tag: 'Submitting'; data: Valid }\n | { tag: 'Submitted'; data: Valid; referentie: string }\n | { tag: 'Failed'; data: Valid; error: string };\n\nexport const initial: State = {\n tag: 'Editing',\n draft: { straat: '', postcode: '', woonplaats: '' },\n errors: {},\n};\n\n/** Parse via the value objects; on success hand back a Valid, else per-field errors. */\nfunction validate(draft: Draft): Result {\n const straat = draft.straat.trim();\n const postcode = parsePostcode(draft.postcode);\n const errors: Errors = {};\n if (!straat) errors.straat = $localize`:@@validation.straat:Vul straat en huisnummer in.`;\n if (!postcode.ok) errors.postcode = postcode.error;\n if (straat && postcode.ok) {\n return { ok: true, value: { straat, postcode: postcode.value, woonplaats: draft.woonplaats.trim() } };\n }\n return { ok: false, error: errors };\n}\n\nexport type Msg =\n | { tag: 'SetField'; key: keyof Draft; value: string }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Reset' }\n | { tag: 'Seed'; state: State }; // mount a specific state (stories/tests)\n\nexport function reduce(s: State, m: Msg): State {\n switch (m.tag) {\n case 'SetField':\n return s.tag === 'Editing' ? { ...s, draft: { ...s.draft, [m.key]: m.value } } : s;\n case 'Submit': {\n if (s.tag !== 'Editing') return s;\n const r = validate(s.draft);\n return r.ok ? { tag: 'Submitting', data: r.value } : { ...s, errors: r.error };\n }\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data, referentie: m.referentie } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'Reset':\n return initial;\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "properties": [ + { + "name": "postcode", + "deprecated": false, + "deprecationMessage": "", + "type": "Postcode", + "indexKey": "", + "optional": false, + "description": "", + "line": 14 + }, + { + "name": "straat", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 13 + }, + { + "name": "woonplaats", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 15 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

After parsing — postcode is the branded type, so downstream can't get a raw one.

\n", + "rawdescription": "\nAfter parsing — postcode is the branded type, so downstream can't get a raw one.", + "methods": [], + "extends": [], + "isDuplicate": true, + "duplicateId": 1, + "duplicateName": "Valid-1" + }, { "name": "ValidIntake", - "id": "interface-ValidIntake-13704a2a04ab3cffa46cbc109ee84699b236928e1c2649f459e18e4daf323047e8b21cdd5a21440c5fd696a605a09feb673b4020394ba7954ae35162f1bd2732", + "id": "interface-ValidIntake-609d18870aac1c3c8425f67e97c964d0503c535eea13c6c7e39c96904be318eb571893c8dc545b7005f66f09f7e19bcf73b4f880459bdb63fce0aa7291c838a5", "file": "src/app/herregistratie/domain/intake.machine.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\n\n/**\n * A FIXED 3-step wizard with progressive disclosure. The steps never change in\n * number (always `STEPS`); instead, follow-up questions appear *inline within a\n * step* depending on earlier answers — answer \"buiten Nederland gewerkt? → ja\"\n * and the country/hours questions reveal in the same step; report few hours and\n * the scholing-question reveals inside the 'werk' step. \"Is this field required\n * right now\" is a pure function (`validateStep`/`lageUren`), so it's trivial to\n * test and impossible to get out of sync with the data.\n */\n\nexport type JaNee = 'ja' | 'nee';\n\n/** The three fixed steps. Each step groups one or more questions. */\nexport type StepId = 'buitenland' | 'werk' | 'review';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually, and branches may never ask some fields. */\nexport interface Answers {\n buitenlandGewerkt?: JaNee; // Q1\n land?: string; // Q1a — only when buitenlandGewerkt === 'ja'\n buitenlandseUren?: string; // Q1b — only when buitenlandGewerkt === 'ja'\n uren?: string; // Q2 — uren in NL\n scholingGevolgd?: JaNee; // Q3 — only when total hours are below the threshold\n punten?: string; // Q4\n}\n\n/** What we have after the review step parses — guaranteed valid/typed. */\nexport interface ValidIntake {\n werktBuitenland: boolean;\n land?: string;\n buitenlandseUren?: Uren;\n uren: Uren;\n aanvullendeScholing?: boolean;\n punten?: Uren; // only collected when aanvullende scholing is gevolgd (scholingGevolgd === 'ja')\n}\n\n/** Demo fallback only — the real threshold is a SERVER-OWNED policy value fetched\n at runtime (see IntakePolicyDto / SetPolicy). ponytail: default is the offline\n fallback; the server value wins. */\nexport const SCHOLING_THRESHOLD_DEFAULT = 1000;\n\n/** True when NL-hours are low enough that the scholing question must be answered.\n The threshold is passed in (server-owned), not hardcoded. */\nexport function lageUren(a: Answers, scholingThreshold = SCHOLING_THRESHOLD_DEFAULT): boolean {\n const r = parseUren(a.uren ?? '');\n return r.ok && r.value < scholingThreshold;\n}\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['buitenland', 'werk', 'review'];\n\n/** Per-field error map: one message per question, since a step holds several. */\ntype Errors = Partial>;\n\nexport type IntakeState =\n | { tag: 'Answering'; answers: Answers; cursor: number; errors: Errors; scholingThreshold: number }\n | { tag: 'Submitting'; data: ValidIntake }\n | { tag: 'Submitted'; data: ValidIntake }\n | { tag: 'Failed'; data: ValidIntake; error: string };\n\nexport const initial: IntakeState = { tag: 'Answering', answers: {}, cursor: 0, errors: {}, scholingThreshold: SCHOLING_THRESHOLD_DEFAULT };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, a: Answers, scholingThreshold: number): Result {\n const errors: Errors = {};\n switch (step) {\n case 'buitenland':\n if (!a.buitenlandGewerkt) errors.buitenlandGewerkt = 'Maak een keuze.';\n else if (a.buitenlandGewerkt === 'ja') {\n if (!a.land || a.land.trim() === '') errors.land = 'Vul een land in.';\n const u = parseUren(a.buitenlandseUren ?? '');\n if (!u.ok) errors.buitenlandseUren = u.error;\n }\n break;\n case 'werk': {\n const u = parseUren(a.uren ?? '');\n if (!u.ok) errors.uren = u.error;\n if (lageUren(a, scholingThreshold) && !a.scholingGevolgd) errors.scholingGevolgd = 'Maak een keuze.';\n // Nascholingspunten are only asked (and required) when scholing was followed.\n if (a.scholingGevolgd === 'ja') {\n const p = parseUren(a.punten ?? '');\n if (!p.ok) errors.punten = p.error;\n }\n break;\n }\n case 'review':\n break; // review shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole questionnaire into a ValidIntake (called on submit). */\nfunction validateAll(a: Answers, scholingThreshold: number): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, a, scholingThreshold);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const uren = parseUren(a.uren ?? '');\n // validateStep guaranteed uren parses, but keep the compiler happy.\n if (!uren.ok) return err(errors);\n\n const werktBuitenland = a.buitenlandGewerkt === 'ja';\n const buitenland = parseUren(a.buitenlandseUren ?? '');\n // Punten are only collected when aanvullende scholing was gevolgd.\n const punten = a.scholingGevolgd === 'ja' ? parseUren(a.punten ?? '') : undefined;\n return ok({\n werktBuitenland,\n land: werktBuitenland ? a.land : undefined,\n buitenlandseUren: werktBuitenland && buitenland.ok ? buitenland.value : undefined,\n uren: uren.value,\n aanvullendeScholing: lageUren(a, scholingThreshold) ? a.scholingGevolgd === 'ja' : undefined,\n punten: punten?.ok ? punten.value : undefined,\n });\n}\n\nexport function setAnswer(s: IntakeState, key: keyof Answers, value: string): IntakeState {\n if (s.tag !== 'Answering') return s;\n // Steps are fixed, so editing an answer never moves the cursor — it only\n // reveals/hides inline questions within the current step.\n return { ...s, answers: { ...s.answers, [key]: value } };\n}\n\nexport function next(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering') return s;\n const r = validateStep(currentStep(s), s.answers, s.scholingThreshold);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\n/** Apply a server-owned policy value (e.g. the scholing threshold). */\nexport function setPolicy(s: IntakeState, scholingThreshold: number): IntakeState {\n return s.tag === 'Answering' ? { ...s, scholingThreshold } : s;\n}\n\nexport function back(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\nexport function submit(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering') return s;\n const r = validateAll(s.answers, s.scholingThreshold);\n return r.ok ? { tag: 'Submitting', data: r.value } : { ...s, errors: r.error };\n}\n\nexport function resolve(s: IntakeState, r: Result): IntakeState {\n if (s.tag !== 'Submitting') return s;\n return r.ok ? { tag: 'Submitted', data: s.data } : { tag: 'Failed', data: s.data, error: r.error };\n}\n\nexport type IntakeMsg =\n | { tag: 'SetAnswer'; key: keyof Answers; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'SetPolicy'; scholingThreshold: number }\n | { tag: 'Seed'; state: IntakeState };\n\nexport function reduce(s: IntakeState, m: IntakeMsg): IntakeState {\n switch (m.tag) {\n case 'SetAnswer':\n return setAnswer(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'SetPolicy':\n return setPolicy(s, m.scholingThreshold);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Uren, parseUren } from '@registratie/domain/value-objects/uren';\n\n/**\n * A FIXED 3-step wizard with progressive disclosure. The steps never change in\n * number (always `STEPS`); instead, follow-up questions appear *inline within a\n * step* depending on earlier answers — answer \"buiten Nederland gewerkt? → ja\"\n * and the country/hours questions reveal in the same step; report few hours and\n * the scholing-question reveals inside the 'werk' step. \"Is this field required\n * right now\" is a pure function (`validateStep`/`lageUren`), so it's trivial to\n * test and impossible to get out of sync with the data.\n */\n\nexport type JaNee = 'ja' | 'nee';\n\n/** The three fixed steps. Each step groups one or more questions. */\nexport type StepId = 'buitenland' | 'werk' | 'review';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually, and branches may never ask some fields. */\nexport interface Answers {\n buitenlandGewerkt?: JaNee; // Q1\n land?: string; // Q1a — only when buitenlandGewerkt === 'ja'\n buitenlandseUren?: string; // Q1b — only when buitenlandGewerkt === 'ja'\n uren?: string; // Q2 — uren in NL\n scholingGevolgd?: JaNee; // Q3 — only when total hours are below the threshold\n punten?: string; // Q4\n}\n\n/** What we have after the review step parses — guaranteed valid/typed. */\nexport interface ValidIntake {\n werktBuitenland: boolean;\n land?: string;\n buitenlandseUren?: Uren;\n uren: Uren;\n aanvullendeScholing?: boolean;\n punten?: Uren; // only collected when aanvullende scholing is gevolgd (scholingGevolgd === 'ja')\n}\n\n/** Demo fallback only — the real threshold is a SERVER-OWNED policy value fetched\n at runtime (see IntakePolicyDto / SetPolicy). ponytail: default is the offline\n fallback; the server value wins. */\nexport const SCHOLING_THRESHOLD_DEFAULT = 1000;\n\n/** True when NL-hours are low enough that the scholing question must be answered.\n The threshold is passed in (server-owned), not hardcoded. */\nexport function lageUren(a: Answers, scholingThreshold = SCHOLING_THRESHOLD_DEFAULT): boolean {\n const r = parseUren(a.uren ?? '');\n return r.ok && r.value < scholingThreshold;\n}\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['buitenland', 'werk', 'review'];\n\n/** Per-field error map: one message per question, since a step holds several. */\ntype Errors = Partial>;\n\nexport type IntakeState =\n | { tag: 'Answering'; answers: Answers; cursor: number; errors: Errors; scholingThreshold: number }\n | { tag: 'Submitting'; data: ValidIntake }\n | { tag: 'Submitted'; data: ValidIntake }\n | { tag: 'Failed'; data: ValidIntake; error: string };\n\nexport const initial: IntakeState = { tag: 'Answering', answers: {}, cursor: 0, errors: {}, scholingThreshold: SCHOLING_THRESHOLD_DEFAULT };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Has the user meaningfully started, so it's worth persisting as a Concept?\n (No auto-prefill here — pristine means truly untouched.) */\nexport function hasProgress(s: Extract): boolean {\n return s.cursor > 0 || Object.keys(s.answers).length > 0;\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, a: Answers, scholingThreshold: number): Result {\n const errors: Errors = {};\n switch (step) {\n case 'buitenland':\n if (!a.buitenlandGewerkt) errors.buitenlandGewerkt = $localize`:@@validation.maakKeuze:Maak een keuze.`;\n else if (a.buitenlandGewerkt === 'ja') {\n if (!a.land || a.land.trim() === '') errors.land = $localize`:@@validation.land:Vul een land in.`;\n const u = parseUren(a.buitenlandseUren ?? '');\n if (!u.ok) errors.buitenlandseUren = u.error;\n }\n break;\n case 'werk': {\n const u = parseUren(a.uren ?? '');\n if (!u.ok) errors.uren = u.error;\n if (lageUren(a, scholingThreshold) && !a.scholingGevolgd) errors.scholingGevolgd = $localize`:@@validation.maakKeuze:Maak een keuze.`;\n // Nascholingspunten are only asked (and required) when scholing was followed.\n if (a.scholingGevolgd === 'ja') {\n const p = parseUren(a.punten ?? '');\n if (!p.ok) errors.punten = p.error;\n }\n break;\n }\n case 'review':\n break; // review shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole questionnaire into a ValidIntake (called on submit). */\nfunction validateAll(a: Answers, scholingThreshold: number): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, a, scholingThreshold);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const uren = parseUren(a.uren ?? '');\n // validateStep guaranteed uren parses, but keep the compiler happy.\n if (!uren.ok) return err(errors);\n\n const werktBuitenland = a.buitenlandGewerkt === 'ja';\n const buitenland = parseUren(a.buitenlandseUren ?? '');\n // Punten are only collected when aanvullende scholing was gevolgd.\n const punten = a.scholingGevolgd === 'ja' ? parseUren(a.punten ?? '') : undefined;\n return ok({\n werktBuitenland,\n land: werktBuitenland ? a.land : undefined,\n buitenlandseUren: werktBuitenland && buitenland.ok ? buitenland.value : undefined,\n uren: uren.value,\n aanvullendeScholing: lageUren(a, scholingThreshold) ? a.scholingGevolgd === 'ja' : undefined,\n punten: punten?.ok ? punten.value : undefined,\n });\n}\n\nexport function setAnswer(s: IntakeState, key: keyof Answers, value: string): IntakeState {\n if (s.tag !== 'Answering') return s;\n // Steps are fixed, so editing an answer never moves the cursor — it only\n // reveals/hides inline questions within the current step.\n return { ...s, answers: { ...s.answers, [key]: value } };\n}\n\nexport function next(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering') return s;\n const r = validateStep(currentStep(s), s.answers, s.scholingThreshold);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\n/** Apply a server-owned policy value (e.g. the scholing threshold). */\nexport function setPolicy(s: IntakeState, scholingThreshold: number): IntakeState {\n return s.tag === 'Answering' ? { ...s, scholingThreshold } : s;\n}\n\nexport function back(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\nexport function submit(s: IntakeState): IntakeState {\n if (s.tag !== 'Answering') return s;\n const r = validateAll(s.answers, s.scholingThreshold);\n return r.ok ? { tag: 'Submitting', data: r.value } : { ...s, errors: r.error };\n}\n\nexport function resolve(s: IntakeState, r: Result): IntakeState {\n if (s.tag !== 'Submitting') return s;\n return r.ok ? { tag: 'Submitted', data: s.data } : { tag: 'Failed', data: s.data, error: r.error };\n}\n\nexport type IntakeMsg =\n | { tag: 'SetAnswer'; key: keyof Answers; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed' }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'SetPolicy'; scholingThreshold: number }\n | { tag: 'Seed'; state: IntakeState };\n\nexport function reduce(s: IntakeState, m: IntakeMsg): IntakeState {\n switch (m.tag) {\n case 'SetAnswer':\n return setAnswer(s, m.key, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Failed' ? { tag: 'Submitting', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Submitting' ? { tag: 'Submitted', data: s.data } : s;\n case 'SubmitFailed':\n return s.tag === 'Submitting' ? { tag: 'Failed', data: s.data, error: m.error } : s;\n case 'SetPolicy':\n return setPolicy(s, m.scholingThreshold);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", "properties": [ { "name": "aanvullendeScholing", @@ -1366,12 +3890,12 @@ }, { "name": "ValidRegistratie", - "id": "interface-ValidRegistratie-6ed41f6a28b6c00dc907f54219be9c1d7955aa11bc22f128620d2206b1ea12e6730533ac33f5f5df7b8d7c8d7f977584b3a0a3e98a6c2c3b91d1afe6411278e2", + "id": "interface-ValidRegistratie-b7c3c5d493aa141ca68cb964e63408db7152b07336b239864d3c430b84d8eb3e650d1a3abaf3fda253444af942c45f86138a5d8229832d49bda94eec35c33546", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\nimport { Email, parseEmail } from '@registratie/domain/value-objects/email';\n\n/**\n * A FIXED 3-step registration wizard. The steps never change in number (always\n * `STEPS`): (1) adres + correspondentievoorkeur, (2) beroep o.b.v. diploma,\n * (3) controle & indienen. Follow-up questions appear *inline within a step*\n * (e.g. choosing 'email' reveals the e-mail field). \"Is this field required\n * right now\" is a pure function (`validateStep`), so it is trivial to test and\n * impossible to get out of sync with the data. Invariants live here, not in the\n * UI: the wizard reaches `Indienen` only when a complete `ValidRegistratie` parses.\n */\n\nexport type StepId = 'adres' | 'beroep' | 'controle';\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['adres', 'beroep', 'controle'];\n\n/** Where a piece of data came from — recorded on the aggregate (PRD §5). */\nexport type AdresHerkomst = 'brp' | 'handmatig';\nexport type DiplomaHerkomst = 'duo' | 'handmatig';\nexport type Correspondentie = 'email' | 'post';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually. Adres fields are kept flat so one `SetField` message\n serves them all (mirrors the intake machine). */\nexport interface Draft {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n adresHerkomst?: AdresHerkomst;\n correspondentie?: Correspondentie;\n email?: string;\n diplomaId?: string;\n diplomaHerkomst?: DiplomaHerkomst;\n beroep?: string; // DERIVED from the chosen DUO diploma (or declared for a manual one)\n vraagIds?: string[]; // ids of the policy questions that apply to the chosen diploma\n antwoorden: Record; // geldigheidsantwoorden, keyed by question id\n}\n\n/** What we have after the controle step parses — guaranteed valid/typed. */\nexport interface ValidRegistratie {\n adres: { straat: string; postcode: Postcode; woonplaats: string };\n adresHerkomst: AdresHerkomst;\n correspondentie: Correspondentie;\n email?: Email; // only when correspondentie === 'email'\n diplomaId: string;\n diplomaHerkomst: DiplomaHerkomst;\n beroep: string;\n antwoorden: Record;\n}\n\n/** Text fields settable via SetField. */\nexport type DraftField = 'straat' | 'postcode' | 'woonplaats' | 'email';\n\n/** Per-field error map. `antwoorden` holds per-policy-question errors, keyed by\n question id (a step can show several questions). */\nexport interface Errors {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n email?: string;\n correspondentie?: string;\n diploma?: string;\n antwoorden?: Record;\n}\n\nexport type RegistratieState =\n | { tag: 'Invullen'; draft: Draft; cursor: number; errors: Errors }\n | { tag: 'Indienen'; data: ValidRegistratie }\n | { tag: 'Ingediend'; data: ValidRegistratie; referentie: string }\n | { tag: 'Mislukt'; data: ValidRegistratie; error: string };\n\nconst emptyDraft: Draft = { antwoorden: {} };\nexport const initial: RegistratieState = { tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {} };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, d: Draft): Result {\n const errors: Errors = {};\n switch (step) {\n case 'adres': {\n if (!d.straat || d.straat.trim() === '') errors.straat = 'Vul een straat en huisnummer in.';\n const pc = parsePostcode(d.postcode ?? '');\n if (!pc.ok) errors.postcode = pc.error;\n if (!d.woonplaats || d.woonplaats.trim() === '') errors.woonplaats = 'Vul een woonplaats in.';\n if (!d.correspondentie) errors.correspondentie = 'Maak een keuze.';\n // E-mail is only required when 'email' is the chosen channel.\n if (d.correspondentie === 'email') {\n const e = parseEmail(d.email ?? '');\n if (!e.ok) errors.email = e.error;\n }\n break;\n }\n case 'beroep': {\n // A diploma must be chosen (or declared manually); its beroep is then known.\n if (!d.diplomaId || !d.beroep) {\n errors.diploma = 'Kies het diploma waarmee u zich wilt registreren, of voer het handmatig in.';\n break;\n }\n // Every policy question the chosen diploma raised must be answered. Which\n // questions apply is server-decided (carried in `vraagIds`); we only check\n // they're answered.\n const open: Record = {};\n for (const id of d.vraagIds ?? []) {\n if (!(d.antwoorden[id] ?? '').trim()) open[id] = 'Beantwoord deze vraag.';\n }\n if (Object.keys(open).length > 0) errors.antwoorden = open;\n break;\n }\n case 'controle':\n break; // controle shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole wizard into a ValidRegistratie (called on submit). */\nfunction validateAll(d: Draft): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, d);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const pc = parsePostcode(d.postcode ?? '');\n // validateStep guaranteed these parse, but keep the compiler happy.\n if (!pc.ok || !d.diplomaId || !d.beroep || !d.correspondentie) return err(errors);\n const email = d.correspondentie === 'email' ? parseEmail(d.email ?? '') : undefined;\n // Keep only the answers to the questions that actually applied.\n const vraagIds = d.vraagIds ?? [];\n const antwoorden = Object.fromEntries(vraagIds.map((id) => [id, d.antwoorden[id] ?? '']));\n\n return ok({\n adres: { straat: d.straat!, postcode: pc.value, woonplaats: d.woonplaats! },\n adresHerkomst: d.adresHerkomst ?? 'handmatig',\n correspondentie: d.correspondentie,\n email: email?.ok ? email.value : undefined,\n diplomaId: d.diplomaId,\n diplomaHerkomst: d.diplomaHerkomst ?? 'handmatig',\n beroep: d.beroep,\n antwoorden,\n });\n}\n\nexport function setField(s: RegistratieState, key: DraftField, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const draft: Draft = { ...s.draft, [key]: value };\n // Editing an address field means the user owns it now — not the BRP copy.\n if (key === 'straat' || key === 'postcode' || key === 'woonplaats') draft.adresHerkomst = 'handmatig';\n return { ...s, draft };\n}\n\nexport function setCorrespondentie(s: RegistratieState, value: Correspondentie): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, correspondentie: value } };\n}\n\n/** Prefill the address from a BRP lookup and flag its origin (PRD §7). */\nexport function prefillAdres(s: RegistratieState, straat: string, postcode: string, woonplaats: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, straat, postcode, woonplaats, adresHerkomst: 'brp' } };\n}\n\n/** Pick a DUO diploma; the beroep is derived from it and the applicable policy\n questions (`vraagIds`) come with it (both server-computed, passed in). */\nexport function kiesDiploma(s: RegistratieState, diplomaId: string, beroep: string, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId, beroep, vraagIds, diplomaHerkomst: 'duo' }, errors: {} };\n}\n\n/** Switch to manual diploma entry: the diploma isn't in DUO, so the MAXIMAL\n policy-question set applies and the entry is flagged handmatig/unverified. The\n beroep is declared separately (declareerBeroep). */\nexport function kiesHandmatig(s: RegistratieState, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId: 'handmatig', beroep: undefined, vraagIds, diplomaHerkomst: 'handmatig' }, errors: {} };\n}\n\n/** Declare the beroep for a manually-entered diploma (chosen from a fixed list). */\nexport function declareerBeroep(s: RegistratieState, beroep: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, beroep } };\n}\n\nexport function setAntwoord(s: RegistratieState, vraagId: string, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, antwoorden: { ...s.draft.antwoorden, [vraagId]: value } } };\n}\n\nexport function next(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateStep(currentStep(s), s.draft);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\nexport function back(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\n/** Jump back to an earlier step to correct data (controle → step N). Forward\n jumps are not allowed (would skip validation). Preserves the draft. */\nexport function gaNaarStap(s: RegistratieState, cursor: number): RegistratieState {\n if (s.tag !== 'Invullen' || cursor < 0 || cursor >= s.cursor) return s;\n return { ...s, cursor, errors: {} };\n}\n\nexport function submit(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateAll(s.draft);\n return r.ok ? { tag: 'Indienen', data: r.value } : { ...s, errors: r.error };\n}\n\nexport function resolve(s: RegistratieState, r: Result): RegistratieState {\n if (s.tag !== 'Indienen') return s;\n return r.ok ? { tag: 'Ingediend', data: s.data, referentie: r.value } : { tag: 'Mislukt', data: s.data, error: r.error };\n}\n\nexport type RegistratieMsg =\n | { tag: 'SetField'; key: DraftField; value: string }\n | { tag: 'SetCorrespondentie'; value: Correspondentie }\n | { tag: 'PrefillAdres'; straat: string; postcode: string; woonplaats: string }\n | { tag: 'KiesDiploma'; diplomaId: string; beroep: string; vraagIds: string[] }\n | { tag: 'KiesHandmatig'; vraagIds: string[] }\n | { tag: 'DeclareerBeroep'; beroep: string }\n | { tag: 'SetAntwoord'; vraagId: string; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'GaNaarStap'; cursor: number }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Seed'; state: RegistratieState };\n\nexport function reduce(s: RegistratieState, m: RegistratieMsg): RegistratieState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'SetCorrespondentie':\n return setCorrespondentie(s, m.value);\n case 'PrefillAdres':\n return prefillAdres(s, m.straat, m.postcode, m.woonplaats);\n case 'KiesDiploma':\n return kiesDiploma(s, m.diplomaId, m.beroep, m.vraagIds);\n case 'KiesHandmatig':\n return kiesHandmatig(s, m.vraagIds);\n case 'DeclareerBeroep':\n return declareerBeroep(s, m.beroep);\n case 'SetAntwoord':\n return setAntwoord(s, m.vraagId, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'GaNaarStap':\n return gaNaarStap(s, m.cursor);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Mislukt' ? { tag: 'Indienen', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Indienen' ? { tag: 'Ingediend', data: s.data, referentie: m.referentie } : s;\n case 'SubmitFailed':\n return s.tag === 'Indienen' ? { tag: 'Mislukt', data: s.data, error: m.error } : s;\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", + "sourceCode": "import { Result, ok, err, assertNever } from '@shared/kernel/fp';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\nimport { Email, parseEmail } from '@registratie/domain/value-objects/email';\nimport {\n UploadState,\n UploadMsg,\n DeliveryChannel,\n initialUpload,\n reduceUpload,\n requiredCategoriesSatisfied,\n deliveryRefs,\n} from '@shared/upload/upload.machine';\n\n/**\n * A FIXED 3-step registration wizard. The steps never change in number (always\n * `STEPS`): (1) adres + correspondentievoorkeur, (2) beroep o.b.v. diploma,\n * (3) controle & indienen. Follow-up questions appear *inline within a step*\n * (e.g. choosing 'email' reveals the e-mail field). \"Is this field required\n * right now\" is a pure function (`validateStep`), so it is trivial to test and\n * impossible to get out of sync with the data. Invariants live here, not in the\n * UI: the wizard reaches `Indienen` only when a complete `ValidRegistratie` parses.\n */\n\nexport type StepId = 'adres' | 'beroep' | 'controle';\n\n/** The fixed step list. Number of steps never changes; questions reveal inline. */\nexport const STEPS: StepId[] = ['adres', 'beroep', 'controle'];\n\n/** Where a piece of data came from — recorded on the aggregate (PRD §5). */\nexport type AdresHerkomst = 'brp' | 'handmatig';\nexport type DiplomaHerkomst = 'duo' | 'handmatig';\nexport type Correspondentie = 'email' | 'post';\n\n/** One record carried across every step (and persisted). All optional: the user\n fills it in gradually. Adres fields are kept flat so one `SetField` message\n serves them all (mirrors the intake machine). */\nexport interface Draft {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n adresHerkomst?: AdresHerkomst;\n correspondentie?: Correspondentie;\n email?: string;\n diplomaId?: string;\n diplomaHerkomst?: DiplomaHerkomst;\n beroep?: string; // DERIVED from the chosen DUO diploma (or declared for a manual one)\n vraagIds?: string[]; // ids of the policy questions that apply to the chosen diploma\n antwoorden: Record; // geldigheidsantwoorden, keyed by question id\n}\n\n/** What we have after the controle step parses — guaranteed valid/typed. */\nexport interface ValidRegistratie {\n adres: { straat: string; postcode: Postcode; woonplaats: string };\n adresHerkomst: AdresHerkomst;\n correspondentie: Correspondentie;\n email?: Email; // only when correspondentie === 'email'\n diplomaId: string;\n diplomaHerkomst: DiplomaHerkomst;\n beroep: string;\n antwoorden: Record;\n documents: Array<{ categoryId: string; channel: DeliveryChannel; documentId?: string }>;\n}\n\n/** Text fields settable via SetField. */\nexport type DraftField = 'straat' | 'postcode' | 'woonplaats' | 'email';\n\n/** Per-field error map. `antwoorden` holds per-policy-question errors, keyed by\n question id (a step can show several questions). */\nexport interface Errors {\n straat?: string;\n postcode?: string;\n woonplaats?: string;\n email?: string;\n correspondentie?: string;\n diploma?: string;\n documenten?: string;\n antwoorden?: Record;\n}\n\nexport type RegistratieState =\n | { tag: 'Invullen'; draft: Draft; cursor: number; errors: Errors; upload: UploadState }\n | { tag: 'Indienen'; data: ValidRegistratie }\n | { tag: 'Ingediend'; data: ValidRegistratie; referentie: string }\n | { tag: 'Mislukt'; data: ValidRegistratie; error: string };\n\nconst emptyDraft: Draft = { antwoorden: {} };\nexport const initial: RegistratieState = { tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {}, upload: initialUpload };\n\n/** Which step the cursor currently points at (clamped to the fixed list). */\nexport function currentStep(s: Extract): StepId {\n return STEPS[Math.min(s.cursor, STEPS.length - 1)];\n}\n\n/** Has the user meaningfully started, so it's worth persisting as a Concept? Excludes\n the automatic BRP address prefill on step 0 — a bare page visit creates nothing.\n ponytail: an address typed at step 0 without any of these signals is not yet\n persisted (created once they advance/choose); accepted regression vs. sessionStorage. */\nexport function hasProgress(s: Extract): boolean {\n const d = s.draft;\n return (\n s.cursor > 0 ||\n !!d.correspondentie ||\n !!d.email ||\n !!d.diplomaId ||\n !!d.beroep ||\n deliveryRefs(s.upload).some((r) => r.channel === 'digital' && !!r.documentId)\n );\n}\n\n/** Validate every question currently visible in ONE step. Errors keyed per field. */\nfunction validateStep(step: StepId, d: Draft, upload: UploadState): Result {\n const errors: Errors = {};\n switch (step) {\n case 'adres': {\n if (!d.straat || d.straat.trim() === '') errors.straat = $localize`:@@validation.straat2:Vul een straat en huisnummer in.`;\n const pc = parsePostcode(d.postcode ?? '');\n if (!pc.ok) errors.postcode = pc.error;\n if (!d.woonplaats || d.woonplaats.trim() === '') errors.woonplaats = $localize`:@@validation.woonplaats:Vul een woonplaats in.`;\n if (!d.correspondentie) errors.correspondentie = $localize`:@@validation.maakKeuze:Maak een keuze.`;\n // E-mail is only required when 'email' is the chosen channel.\n if (d.correspondentie === 'email') {\n const e = parseEmail(d.email ?? '');\n if (!e.ok) errors.email = e.error;\n }\n break;\n }\n case 'beroep': {\n // A diploma must be chosen (or declared manually); its beroep is then known.\n if (!d.diplomaId || !d.beroep) {\n errors.diploma = $localize`:@@validation.diploma:Kies het diploma waarmee u zich wilt registreren, of voer het handmatig in.`;\n break;\n }\n // Every policy question the chosen diploma raised must be answered. Which\n // questions apply is server-decided (carried in `vraagIds`); we only check\n // they're answered.\n const open: Record = {};\n for (const id of d.vraagIds ?? []) {\n if (!(d.antwoorden[id] ?? '').trim()) open[id] = $localize`:@@validation.beantwoordVraag:Beantwoord deze vraag.`;\n }\n if (Object.keys(open).length > 0) errors.antwoorden = open;\n // Required documents for this wizard attach to the beroep step (inline upload).\n if (!requiredCategoriesSatisfied(upload)) {\n errors.documenten = $localize`:@@validation.documenten:Lever de verplichte documenten aan (upload of kies \"per post nasturen\").`;\n }\n break;\n }\n case 'controle':\n break; // controle shows a summary; no own fields\n default:\n return assertNever(step);\n }\n return Object.keys(errors).length > 0 ? err(errors) : ok(undefined);\n}\n\n/** Parse the whole wizard into a ValidRegistratie (called on submit). */\nfunction validateAll(d: Draft, upload: UploadState): Result {\n const errors: Errors = {};\n for (const step of STEPS) {\n const r = validateStep(step, d, upload);\n if (!r.ok) Object.assign(errors, r.error);\n }\n if (Object.keys(errors).length > 0) return err(errors);\n\n const pc = parsePostcode(d.postcode ?? '');\n // validateStep guaranteed these parse, but keep the compiler happy.\n if (!pc.ok || !d.diplomaId || !d.beroep || !d.correspondentie) return err(errors);\n const email = d.correspondentie === 'email' ? parseEmail(d.email ?? '') : undefined;\n // Keep only the answers to the questions that actually applied.\n const vraagIds = d.vraagIds ?? [];\n const antwoorden = Object.fromEntries(vraagIds.map((id) => [id, d.antwoorden[id] ?? '']));\n\n return ok({\n adres: { straat: d.straat!, postcode: pc.value, woonplaats: d.woonplaats! },\n adresHerkomst: d.adresHerkomst ?? 'handmatig',\n correspondentie: d.correspondentie,\n email: email?.ok ? email.value : undefined,\n diplomaId: d.diplomaId,\n diplomaHerkomst: d.diplomaHerkomst ?? 'handmatig',\n beroep: d.beroep,\n antwoorden,\n documents: deliveryRefs(upload),\n });\n}\n\nexport function setField(s: RegistratieState, key: DraftField, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const draft: Draft = { ...s.draft, [key]: value };\n // Editing an address field means the user owns it now — not the BRP copy.\n if (key === 'straat' || key === 'postcode' || key === 'woonplaats') draft.adresHerkomst = 'handmatig';\n return { ...s, draft };\n}\n\nexport function setCorrespondentie(s: RegistratieState, value: Correspondentie): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, correspondentie: value } };\n}\n\n/** Prefill the address from a BRP lookup and flag its origin (PRD §7). */\nexport function prefillAdres(s: RegistratieState, straat: string, postcode: string, woonplaats: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, straat, postcode, woonplaats, adresHerkomst: 'brp' } };\n}\n\n/** Pick a DUO diploma; the beroep is derived from it and the applicable policy\n questions (`vraagIds`) come with it (both server-computed, passed in). */\nexport function kiesDiploma(s: RegistratieState, diplomaId: string, beroep: string, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId, beroep, vraagIds, diplomaHerkomst: 'duo' }, errors: {} };\n}\n\n/** Switch to manual diploma entry: the diploma isn't in DUO, so the MAXIMAL\n policy-question set applies and the entry is flagged handmatig/unverified. The\n beroep is declared separately (declareerBeroep). */\nexport function kiesHandmatig(s: RegistratieState, vraagIds: string[]): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, diplomaId: 'handmatig', beroep: undefined, vraagIds, diplomaHerkomst: 'handmatig' }, errors: {} };\n}\n\n/** Declare the beroep for a manually-entered diploma (chosen from a fixed list). */\nexport function declareerBeroep(s: RegistratieState, beroep: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, beroep } };\n}\n\nexport function setAntwoord(s: RegistratieState, vraagId: string, value: string): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, draft: { ...s.draft, antwoorden: { ...s.draft.antwoorden, [vraagId]: value } } };\n}\n\nexport function next(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateStep(currentStep(s), s.draft, s.upload);\n if (!r.ok) return { ...s, errors: r.error };\n return { ...s, cursor: Math.min(s.cursor + 1, STEPS.length - 1), errors: {} };\n}\n\nexport function back(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen' || s.cursor === 0) return s;\n return { ...s, cursor: s.cursor - 1, errors: {} };\n}\n\n/** Jump back to an earlier step to correct data (controle → step N). Forward\n jumps are not allowed (would skip validation). Preserves the draft. */\nexport function gaNaarStap(s: RegistratieState, cursor: number): RegistratieState {\n if (s.tag !== 'Invullen' || cursor < 0 || cursor >= s.cursor) return s;\n return { ...s, cursor, errors: {} };\n}\n\nexport function submit(s: RegistratieState): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n const r = validateAll(s.draft, s.upload);\n return r.ok ? { tag: 'Indienen', data: r.value } : { ...s, errors: r.error };\n}\n\n/** Route an upload sub-message through the pure upload reducer (Invullen only). */\nexport function upload(s: RegistratieState, msg: UploadMsg): RegistratieState {\n if (s.tag !== 'Invullen') return s;\n return { ...s, upload: reduceUpload(s.upload, msg) };\n}\n\nexport function resolve(s: RegistratieState, r: Result): RegistratieState {\n if (s.tag !== 'Indienen') return s;\n return r.ok ? { tag: 'Ingediend', data: s.data, referentie: r.value } : { tag: 'Mislukt', data: s.data, error: r.error };\n}\n\nexport type RegistratieMsg =\n | { tag: 'SetField'; key: DraftField; value: string }\n | { tag: 'SetCorrespondentie'; value: Correspondentie }\n | { tag: 'PrefillAdres'; straat: string; postcode: string; woonplaats: string }\n | { tag: 'KiesDiploma'; diplomaId: string; beroep: string; vraagIds: string[] }\n | { tag: 'KiesHandmatig'; vraagIds: string[] }\n | { tag: 'DeclareerBeroep'; beroep: string }\n | { tag: 'SetAntwoord'; vraagId: string; value: string }\n | { tag: 'Next' }\n | { tag: 'Back' }\n | { tag: 'GaNaarStap'; cursor: number }\n | { tag: 'Submit' }\n | { tag: 'Retry' }\n | { tag: 'SubmitConfirmed'; referentie: string }\n | { tag: 'SubmitFailed'; error: string }\n | { tag: 'Upload'; msg: UploadMsg }\n | { tag: 'Seed'; state: RegistratieState };\n\nexport function reduce(s: RegistratieState, m: RegistratieMsg): RegistratieState {\n switch (m.tag) {\n case 'SetField':\n return setField(s, m.key, m.value);\n case 'SetCorrespondentie':\n return setCorrespondentie(s, m.value);\n case 'PrefillAdres':\n return prefillAdres(s, m.straat, m.postcode, m.woonplaats);\n case 'KiesDiploma':\n return kiesDiploma(s, m.diplomaId, m.beroep, m.vraagIds);\n case 'KiesHandmatig':\n return kiesHandmatig(s, m.vraagIds);\n case 'DeclareerBeroep':\n return declareerBeroep(s, m.beroep);\n case 'SetAntwoord':\n return setAntwoord(s, m.vraagId, m.value);\n case 'Next':\n return next(s);\n case 'Back':\n return back(s);\n case 'GaNaarStap':\n return gaNaarStap(s, m.cursor);\n case 'Submit':\n return submit(s);\n case 'Retry':\n return s.tag === 'Mislukt' ? { tag: 'Indienen', data: s.data } : s;\n case 'SubmitConfirmed':\n return s.tag === 'Indienen' ? { tag: 'Ingediend', data: s.data, referentie: m.referentie } : s;\n case 'SubmitFailed':\n return s.tag === 'Indienen' ? { tag: 'Mislukt', data: s.data, error: m.error } : s;\n case 'Upload':\n return upload(s, m.msg);\n case 'Seed':\n return m.state;\n default:\n return assertNever(m);\n }\n}\n", "properties": [ { "name": "adres", @@ -1381,7 +3905,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 44 + "line": 53 }, { "name": "adresHerkomst", @@ -1391,7 +3915,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 45 + "line": 54 }, { "name": "antwoorden", @@ -1401,7 +3925,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 51 + "line": 60 }, { "name": "beroep", @@ -1411,7 +3935,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 50 + "line": 59 }, { "name": "correspondentie", @@ -1421,7 +3945,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 46 + "line": 55 }, { "name": "diplomaHerkomst", @@ -1431,7 +3955,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 49 + "line": 58 }, { "name": "diplomaId", @@ -1441,7 +3965,17 @@ "indexKey": "", "optional": false, "description": "", - "line": 48 + "line": 57 + }, + { + "name": "documents", + "deprecated": false, + "deprecationMessage": "", + "type": "Array", + "indexKey": "", + "optional": false, + "description": "", + "line": 61 }, { "name": "email", @@ -1451,7 +3985,7 @@ "indexKey": "", "optional": true, "description": "", - "line": 47 + "line": 56 } ], "indexSignatures": [], @@ -1460,17 +3994,520 @@ "rawdescription": "\nWhat we have after the controle step parses — guaranteed valid/typed.", "methods": [], "extends": [] + }, + { + "name": "WizardError", + "id": "interface-WizardError-83776d36ee9e352e1f6e9d6be8422e18099e626c0cd999197ad35df7d5ce1e58ef6639ab1973e1840b2a727eb9cd7ccf71626ca7f6e31a4c887969ad9d9d435f", + "file": "src/app/shared/layout/wizard-shell/wizard-shell.component.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Component, ElementRef, effect, input, output, untracked, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { StepperComponent } from '@shared/ui/stepper/stepper.component';\n\n/** A flat validation error pointing at a field: `id` matches the field's anchor. */\nexport interface WizardError {\n readonly id: string;\n readonly message: string;\n}\n\nexport type WizardStatus = 'editing' | 'submitting' | 'submitted' | 'failed';\n\n/**\n * Template: the canonical shell every wizard renders into, so they cannot drift.\n * It owns the consistent outline — stepper + focusable step heading + error\n * summary + the
+ the Back/Next/Cancel action bar + the submitting/\n * submitted/failed states — and the a11y focus management.\n *\n * Presentational and unidirectional: all state stays in the wizard container\n * (the Elm-style store). Inputs flow down; the container reacts to the outputs\n * and dispatches messages. The step's own fields are projected as the default\n * slot; the success screen is projected via [wizardSuccess].\n */\n@Component({\n selector: 'app-wizard-shell',\n imports: [FormsModule, ButtonComponent, AlertComponent, SpinnerComponent, StepperComponent],\n styles: [`\n .es-title{margin:0 0 var(--rhc-space-max-sm)}\n .es-list{margin:0;padding-inline-start:var(--rhc-space-max-xl)}\n `],\n template: `\n @switch (status()) {\n @case ('editing') {\n \n

{{ stepTitle() }}

\n @if (errors().length) {\n
\n }\n \n \n
\n @if (canGoBack()) {\n Vorige\n }\n {{ primaryLabel() }}\n Annuleren\n
\n \n }\n @case ('submitting') {\n {{ submittingLabel() }}\n }\n @case ('submitted') {\n \n }\n @case ('failed') {\n {{ errorMessage() }}\n
\n Opnieuw proberen\n
\n }\n }\n `,\n})\nexport class WizardShellComponent {\n steps = input.required();\n current = input.required();\n stepTitle = input.required();\n status = input.required();\n primaryLabel = input.required();\n canGoBack = input(false);\n errors = input([]);\n errorMessage = input('');\n submittingLabel = input($localize`:@@wizard.submitting:Aanvraag wordt verwerkt…`);\n\n primary = output();\n back = output();\n cancel = output();\n retry = output();\n\n /** Error-summary link: focus the field instead of letting the browser navigate.\n A fragment href resolves against , not the current route, so\n a real navigation would reload to \"/\" and bounce to login. */\n protected goToField(ev: Event, id: string) {\n ev.preventDefault();\n document.getElementById(id)?.focus(); // focus() scrolls the input into view\n }\n\n private stepHeading = viewChild>('stepHeading');\n private errorSummary = viewChild>('errorSummary');\n\n constructor() {\n // A11y: move focus to the step heading when the step changes (skip first run\n // so we don't grab focus on initial load). Tracks current(), which is value-\n // stable across keystrokes, so typing never steals focus.\n let firstStep = true;\n effect(() => {\n this.current();\n if (firstStep) { firstStep = false; return; }\n untracked(() => queueMicrotask(() => this.stepHeading()?.nativeElement.focus()));\n });\n // A11y: when validation errors first appear (after a failed submit), move\n // focus to the error summary so it's announced. Only on the rising edge\n // (none → some): typing rebuilds the errors array each keystroke, and\n // re-focusing then would scroll the page up mid-edit. The summary keeps\n // role=\"alert\", so content changes are still announced without the jump.\n let firstErr = true;\n let hadErrors = false;\n effect(() => {\n const has = this.errors().length > 0;\n if (firstErr) { firstErr = false; hadErrors = has; return; }\n if (has && !hadErrors) untracked(() => queueMicrotask(() => this.errorSummary()?.nativeElement.focus()));\n hadErrors = has;\n });\n }\n}\n", + "properties": [ + { + "name": "id", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 10, + "modifierKind": [ + 148 + ] + }, + { + "name": "message", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 11, + "modifierKind": [ + 148 + ] + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

A flat validation error pointing at a field: id matches the field's anchor.

\n", + "rawdescription": "\nA flat validation error pointing at a field: `id` matches the field's anchor.", + "methods": [], + "extends": [] + }, + { + "name": "XhrUploadHandle", + "id": "interface-XhrUploadHandle-bb80b81784601579976fed392f1c4e638f6945087adb775183c617fc8b015821f1a9ce89762fe24adcdab49c8761256a98fd3e6fe0251d3a6f250ef0aed7b62b", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport {\n ApiClient,\n DocumentCategoryDto,\n UploadStatusItemDto,\n} from '@shared/infrastructure/api-client';\nimport { problemDetail } from '@shared/infrastructure/api-error';\nimport { currentScenario } from '@shared/infrastructure/scenario';\nimport { environment } from '../../../environments/environment';\nimport { DocumentCategory } from './upload.machine';\n\n/** One arrived/known status item from poll-on-return. */\nexport interface StatusItem {\n localId: string;\n status: string; // 'complete' | 'unknown'\n documentId?: string;\n}\n\nexport interface XhrUploadRequest {\n localId: string;\n categoryId: string;\n wizardId: string;\n file: File;\n}\n\n/** A live upload: progress is reported via the callback; cancel aborts the XHR. */\nexport interface XhrUploadHandle {\n done: Promise<{ documentId: string }>;\n cancel: () => void;\n}\n\n/** Sentinel rejection so the caller can tell a user-cancel from a real failure. */\nexport const UPLOAD_ABORTED = Symbol('upload-aborted');\n\n/**\n * Infrastructure: the only place upload HTTP lives. Reads (categories, status,\n * delete) go through the NSwag client; the multipart POST is hand-written XHR\n * because the generated client is JSON-only (the endpoint is ExcludeFromDescription)\n * and we need upload-progress events + cancellation, which fetch can't give us.\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadAdapter {\n private client = inject(ApiClient);\n\n categoriesResource(wizardId: string) {\n return resource({ loader: () => this.client.categories(wizardId).then((r) => (r.categories ?? []).map(toCategory)) });\n }\n\n /** Poll-on-return: which client localIds have arrived at the BFF. */\n status(localIds: string[]): Promise {\n if (localIds.length === 0) return Promise.resolve([]);\n return this.client.status(localIds.join(',')).then((r) => (r.results ?? []).map(toStatusItem));\n }\n\n /** User delete; throws a ProblemDetails (e.g. 409 once linked) the caller maps. */\n deleteDocument(documentId: string): Promise {\n return this.client.uploads(documentId);\n }\n\n /**\n * Direct URL to the stored bytes, for a preview/download link (``) — the\n * server serves it inline for pdf/image, attachment otherwise. Not a fetch: the\n * browser opens it. demo-* ids (dev simulation) have no bytes and 404 here.\n */\n contentUrl(documentId: string): string {\n return `${environment.apiBaseUrl}/api/v1/uploads/${documentId}/content`;\n }\n\n /**\n * Multipart upload with progress + cancel. ponytail: XHR (not fetch keepalive) —\n * progress events need XHR; the keepalive/background gap is covered by\n * poll-on-return (UploadShellService.pollReturning). Swap in a Service Worker\n * transport behind UploadTransport for true background sync.\n */\n xhrUpload(req: XhrUploadRequest, onProgress: (pct: number) => void): XhrUploadHandle {\n const scenario = currentScenario();\n if (scenario === 'upload-slow' || scenario === 'upload-fail') return simulateUpload(scenario, onProgress);\n\n const xhr = new XMLHttpRequest();\n const form = new FormData();\n form.append('file', req.file);\n form.append('categoryId', req.categoryId);\n form.append('localId', req.localId);\n form.append('wizardId', req.wizardId);\n\n let aborted = false;\n const done = new Promise<{ documentId: string }>((resolve, reject) => {\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) onProgress(Math.round((e.loaded / e.total) * 100));\n });\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve({ documentId: JSON.parse(xhr.responseText).documentId });\n } catch {\n reject(genericError());\n }\n } else {\n reject(parseError(xhr.responseText));\n }\n });\n xhr.addEventListener('error', () => reject(genericError()));\n xhr.addEventListener('abort', () => (aborted ? reject(UPLOAD_ABORTED) : reject(genericError())));\n });\n\n xhr.open('POST', `${environment.apiBaseUrl}/api/v1/uploads`);\n xhr.send(form);\n return { done, cancel: () => ((aborted = true), xhr.abort()) };\n }\n}\n\nconst UPLOAD_FAILED = $localize`:@@upload.failed:Uploaden is niet gelukt. Probeer het opnieuw.`;\nconst genericError = (): string => UPLOAD_FAILED;\n\n/**\n * Demo-only (dev): the real XHR POST finishes instantly for metadata, so progress\n * and failure can't otherwise be shown. Drives the progress bar over ~2.5s, then\n * succeeds (`upload-slow`) or fails (`upload-fail`). ponytail: timer-based, cancel\n * via the returned handle; no network.\n */\nfunction simulateUpload(scenario: 'upload-slow' | 'upload-fail', onProgress: (pct: number) => void): XhrUploadHandle {\n let pct = 0;\n let cancelled = false;\n const done = new Promise<{ documentId: string }>((resolve, reject) => {\n const tick = () => {\n if (cancelled) {\n reject(UPLOAD_ABORTED);\n } else if (pct < 100) {\n pct += 10;\n onProgress(Math.min(pct, 100));\n setTimeout(tick, 250);\n } else if (scenario === 'upload-fail') {\n reject(UPLOAD_FAILED);\n } else {\n resolve({ documentId: `demo-${crypto.randomUUID()}` });\n }\n };\n setTimeout(tick, 250);\n });\n return { done, cancel: () => void (cancelled = true) };\n}\nconst parseError = (body: string): string => {\n try {\n return problemDetail(JSON.parse(body), UPLOAD_FAILED);\n } catch {\n return genericError();\n }\n};\n\n/** Wire DTO (all fields optional) → domain. */\nfunction toCategory(c: DocumentCategoryDto): DocumentCategory {\n return {\n categoryId: c.categoryId ?? '',\n label: c.label ?? '',\n description: c.description ?? '',\n required: c.required ?? false,\n acceptedTypes: c.acceptedTypes ?? [],\n maxSizeMb: c.maxSizeMb ?? 0,\n multiple: c.multiple ?? false,\n allowPostDelivery: c.allowPostDelivery ?? false,\n };\n}\n\nfunction toStatusItem(s: UploadStatusItemDto): StatusItem {\n return { localId: s.localId ?? '', status: s.status ?? 'unknown', documentId: s.documentId ?? undefined };\n}\n", + "properties": [ + { + "name": "cancel", + "deprecated": false, + "deprecationMessage": "", + "type": "function", + "indexKey": "", + "optional": false, + "description": "", + "line": 29 + }, + { + "name": "done", + "deprecated": false, + "deprecationMessage": "", + "type": "Promise", + "indexKey": "", + "optional": false, + "description": "", + "line": 28 + } + ], + "indexSignatures": [], + "kind": 172, + "description": "

A live upload: progress is reported via the callback; cancel aborts the XHR.

\n", + "rawdescription": "\nA live upload: progress is reported via the callback; cancel aborts the XHR.", + "methods": [], + "extends": [] + }, + { + "name": "XhrUploadRequest", + "id": "interface-XhrUploadRequest-bb80b81784601579976fed392f1c4e638f6945087adb775183c617fc8b015821f1a9ce89762fe24adcdab49c8761256a98fd3e6fe0251d3a6f250ef0aed7b62b", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "interface", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport {\n ApiClient,\n DocumentCategoryDto,\n UploadStatusItemDto,\n} from '@shared/infrastructure/api-client';\nimport { problemDetail } from '@shared/infrastructure/api-error';\nimport { currentScenario } from '@shared/infrastructure/scenario';\nimport { environment } from '../../../environments/environment';\nimport { DocumentCategory } from './upload.machine';\n\n/** One arrived/known status item from poll-on-return. */\nexport interface StatusItem {\n localId: string;\n status: string; // 'complete' | 'unknown'\n documentId?: string;\n}\n\nexport interface XhrUploadRequest {\n localId: string;\n categoryId: string;\n wizardId: string;\n file: File;\n}\n\n/** A live upload: progress is reported via the callback; cancel aborts the XHR. */\nexport interface XhrUploadHandle {\n done: Promise<{ documentId: string }>;\n cancel: () => void;\n}\n\n/** Sentinel rejection so the caller can tell a user-cancel from a real failure. */\nexport const UPLOAD_ABORTED = Symbol('upload-aborted');\n\n/**\n * Infrastructure: the only place upload HTTP lives. Reads (categories, status,\n * delete) go through the NSwag client; the multipart POST is hand-written XHR\n * because the generated client is JSON-only (the endpoint is ExcludeFromDescription)\n * and we need upload-progress events + cancellation, which fetch can't give us.\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadAdapter {\n private client = inject(ApiClient);\n\n categoriesResource(wizardId: string) {\n return resource({ loader: () => this.client.categories(wizardId).then((r) => (r.categories ?? []).map(toCategory)) });\n }\n\n /** Poll-on-return: which client localIds have arrived at the BFF. */\n status(localIds: string[]): Promise {\n if (localIds.length === 0) return Promise.resolve([]);\n return this.client.status(localIds.join(',')).then((r) => (r.results ?? []).map(toStatusItem));\n }\n\n /** User delete; throws a ProblemDetails (e.g. 409 once linked) the caller maps. */\n deleteDocument(documentId: string): Promise {\n return this.client.uploads(documentId);\n }\n\n /**\n * Direct URL to the stored bytes, for a preview/download link (`
`) — the\n * server serves it inline for pdf/image, attachment otherwise. Not a fetch: the\n * browser opens it. demo-* ids (dev simulation) have no bytes and 404 here.\n */\n contentUrl(documentId: string): string {\n return `${environment.apiBaseUrl}/api/v1/uploads/${documentId}/content`;\n }\n\n /**\n * Multipart upload with progress + cancel. ponytail: XHR (not fetch keepalive) —\n * progress events need XHR; the keepalive/background gap is covered by\n * poll-on-return (UploadShellService.pollReturning). Swap in a Service Worker\n * transport behind UploadTransport for true background sync.\n */\n xhrUpload(req: XhrUploadRequest, onProgress: (pct: number) => void): XhrUploadHandle {\n const scenario = currentScenario();\n if (scenario === 'upload-slow' || scenario === 'upload-fail') return simulateUpload(scenario, onProgress);\n\n const xhr = new XMLHttpRequest();\n const form = new FormData();\n form.append('file', req.file);\n form.append('categoryId', req.categoryId);\n form.append('localId', req.localId);\n form.append('wizardId', req.wizardId);\n\n let aborted = false;\n const done = new Promise<{ documentId: string }>((resolve, reject) => {\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) onProgress(Math.round((e.loaded / e.total) * 100));\n });\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve({ documentId: JSON.parse(xhr.responseText).documentId });\n } catch {\n reject(genericError());\n }\n } else {\n reject(parseError(xhr.responseText));\n }\n });\n xhr.addEventListener('error', () => reject(genericError()));\n xhr.addEventListener('abort', () => (aborted ? reject(UPLOAD_ABORTED) : reject(genericError())));\n });\n\n xhr.open('POST', `${environment.apiBaseUrl}/api/v1/uploads`);\n xhr.send(form);\n return { done, cancel: () => ((aborted = true), xhr.abort()) };\n }\n}\n\nconst UPLOAD_FAILED = $localize`:@@upload.failed:Uploaden is niet gelukt. Probeer het opnieuw.`;\nconst genericError = (): string => UPLOAD_FAILED;\n\n/**\n * Demo-only (dev): the real XHR POST finishes instantly for metadata, so progress\n * and failure can't otherwise be shown. Drives the progress bar over ~2.5s, then\n * succeeds (`upload-slow`) or fails (`upload-fail`). ponytail: timer-based, cancel\n * via the returned handle; no network.\n */\nfunction simulateUpload(scenario: 'upload-slow' | 'upload-fail', onProgress: (pct: number) => void): XhrUploadHandle {\n let pct = 0;\n let cancelled = false;\n const done = new Promise<{ documentId: string }>((resolve, reject) => {\n const tick = () => {\n if (cancelled) {\n reject(UPLOAD_ABORTED);\n } else if (pct < 100) {\n pct += 10;\n onProgress(Math.min(pct, 100));\n setTimeout(tick, 250);\n } else if (scenario === 'upload-fail') {\n reject(UPLOAD_FAILED);\n } else {\n resolve({ documentId: `demo-${crypto.randomUUID()}` });\n }\n };\n setTimeout(tick, 250);\n });\n return { done, cancel: () => void (cancelled = true) };\n}\nconst parseError = (body: string): string => {\n try {\n return problemDetail(JSON.parse(body), UPLOAD_FAILED);\n } catch {\n return genericError();\n }\n};\n\n/** Wire DTO (all fields optional) → domain. */\nfunction toCategory(c: DocumentCategoryDto): DocumentCategory {\n return {\n categoryId: c.categoryId ?? '',\n label: c.label ?? '',\n description: c.description ?? '',\n required: c.required ?? false,\n acceptedTypes: c.acceptedTypes ?? [],\n maxSizeMb: c.maxSizeMb ?? 0,\n multiple: c.multiple ?? false,\n allowPostDelivery: c.allowPostDelivery ?? false,\n };\n}\n\nfunction toStatusItem(s: UploadStatusItemDto): StatusItem {\n return { localId: s.localId ?? '', status: s.status ?? 'unknown', documentId: s.documentId ?? undefined };\n}\n", + "properties": [ + { + "name": "categoryId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 21 + }, + { + "name": "file", + "deprecated": false, + "deprecationMessage": "", + "type": "File", + "indexKey": "", + "optional": false, + "description": "", + "line": 23 + }, + { + "name": "localId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 20 + }, + { + "name": "wizardId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 22 + } + ], + "indexSignatures": [], + "kind": 172, + "methods": [], + "extends": [] } ], "injectables": [ + { + "name": "ApplicationsAdapter", + "id": "injectable-ApplicationsAdapter-624e2fb5221f3d13360cb59d28bb973a460a9d5ce6cce8d88012d8e6bb936fe2391f4f0554ea8aea92f298816762c4ec453cbb56e822c611fb854af168557073", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "properties": [ + { + "name": "client", + "defaultValue": "inject(ApiClient)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 23, + "modifierKind": [ + 123 + ] + } + ], + "methods": [ + { + "name": "applicationsResource", + "args": [], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 26, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nThe dashboard's application list (raw DTOs; the store parses at the boundary).", + "description": "

The dashboard's application list (raw DTOs; the store parses at the boundary).

\n" + }, + { + "name": "cancel", + "args": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 45, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nCancel a Concept (cascades to its unlinked documents server-side).", + "description": "

Cancel a Concept (cascades to its unlinked documents server-side).

\n", + "jsdoctags": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "create", + "args": [ + { + "name": "type", + "type": "AanvraagType", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 35, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nCreate a Concept for a wizard type; resolves to the new aanvraag id.", + "description": "

Create a Concept for a wizard type; resolves to the new aanvraag id.

\n", + "jsdoctags": [ + { + "name": "type", + "type": "AanvraagType", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "detail", + "args": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 30, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "submit", + "args": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "body", + "type": "SubmitApplicationRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 49, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "body", + "type": "SubmitApplicationRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "syncDraft", + "args": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "body", + "type": "DraftSyncRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 40, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nDraft sync per step (idempotent). Keep it debounced at the call site — it is chatty.", + "description": "

Draft sync per step (idempotent). Keep it debounced at the call site — it is chatty.

\n", + "jsdoctags": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "body", + "type": "DraftSyncRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "description": "

Infrastructure adapter for the backend-owned Aanvraag aggregate — the only place\nits HTTP lives (ADR-0001 anti-corruption boundary). The list is a resource; the\nmutations (create/sync/cancel/submit) are thin commands the ApplicationsStore\norchestrates optimistically. The untrusted response is validated + mapped to\ndomain by the hand-written parse* boundary below.

\n", + "rawdescription": "\n\nInfrastructure adapter for the backend-owned Aanvraag aggregate — the only place\nits HTTP lives (ADR-0001 anti-corruption boundary). The list is a resource; the\nmutations (create/sync/cancel/submit) are thin commands the ApplicationsStore\norchestrates optimistically. The untrusted response is validated + mapped to\ndomain by the hand-written parse* boundary below.\n", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport { Result, ok, err } from '@shared/kernel/fp';\nimport {\n ApiClient,\n AanvraagStatusDto,\n ApplicationSummaryDto,\n ApplicationDetailDto,\n DraftSyncRequest,\n SubmitApplicationRequest,\n SubmitApplicationResponse,\n} from '@shared/infrastructure/api-client';\nimport { Aanvraag, AanvraagDetail, AanvraagStatus, AanvraagType } from '@registratie/domain/aanvraag';\n\n/**\n * Infrastructure adapter for the backend-owned Aanvraag aggregate — the only place\n * its HTTP lives (ADR-0001 anti-corruption boundary). The list is a resource; the\n * mutations (create/sync/cancel/submit) are thin commands the ApplicationsStore\n * orchestrates optimistically. The untrusted response is validated + mapped to\n * domain by the hand-written parse* boundary below.\n */\n@Injectable({ providedIn: 'root' })\nexport class ApplicationsAdapter {\n private client = inject(ApiClient);\n\n /** The dashboard's application list (raw DTOs; the store parses at the boundary). */\n applicationsResource() {\n return resource({ loader: () => this.client.applicationsAll() });\n }\n\n detail(id: string): Promise {\n return this.client.applicationsGET(id);\n }\n\n /** Create a Concept for a wizard type; resolves to the new aanvraag id. */\n create(type: AanvraagType): Promise {\n return this.client.applicationsPOST({ type }).then((d) => d.id ?? '');\n }\n\n /** Draft sync per step (idempotent). Keep it debounced at the call site — it is chatty. */\n syncDraft(id: string, body: DraftSyncRequest): Promise {\n return this.client.applicationsPUT(id, body);\n }\n\n /** Cancel a Concept (cascades to its unlinked documents server-side). */\n cancel(id: string): Promise {\n return this.client.applicationsDELETE(id);\n }\n\n submit(id: string, body: SubmitApplicationRequest): Promise {\n return this.client.submit(id, body);\n }\n}\n\nconst AANVRAAG_TYPES: readonly string[] = ['registratie', 'herregistratie', 'intake'];\n\n/** Trust-boundary parse of the status union — the tag drives which fields must exist. */\nexport function parseAanvraagStatus(s: AanvraagStatusDto | undefined): Result {\n if (!s || typeof s.tag !== 'string') return err('aanvraag: missing status');\n switch (s.tag) {\n case 'Concept':\n if (typeof s.stepIndex !== 'number' || typeof s.stepCount !== 'number') return err('aanvraag: bad Concept status');\n return ok({ tag: 'Concept', stepIndex: s.stepIndex, stepCount: s.stepCount });\n case 'InBehandeling':\n if (typeof s.referentie !== 'string' || typeof s.manual !== 'boolean') return err('aanvraag: bad InBehandeling status');\n return ok({ tag: 'InBehandeling', referentie: s.referentie, manual: s.manual });\n case 'Goedgekeurd':\n if (typeof s.referentie !== 'string') return err('aanvraag: bad Goedgekeurd status');\n return ok({ tag: 'Goedgekeurd', referentie: s.referentie });\n case 'Afgewezen':\n if (typeof s.referentie !== 'string' || typeof s.reden !== 'string') return err('aanvraag: bad Afgewezen status');\n return ok({ tag: 'Afgewezen', referentie: s.referentie, reden: s.reden });\n default:\n return err(`aanvraag: unknown status tag ${s.tag}`);\n }\n}\n\nfunction parseCommon(dto: ApplicationSummaryDto): Result {\n if (typeof dto.id !== 'string') return err('aanvraag: missing id');\n if (typeof dto.type !== 'string' || !AANVRAAG_TYPES.includes(dto.type)) return err(`aanvraag: bad type ${dto.type}`);\n if (typeof dto.createdAt !== 'string' || typeof dto.updatedAt !== 'string') return err('aanvraag: missing timestamps');\n const status = parseAanvraagStatus(dto.status);\n if (!status.ok) return status;\n return ok({\n id: dto.id,\n type: dto.type as AanvraagType,\n status: status.value,\n documentIds: dto.documentIds ?? [],\n createdAt: dto.createdAt,\n updatedAt: dto.updatedAt,\n submittedAt: dto.submittedAt,\n });\n}\n\nexport function parseApplicationSummary(json: unknown): Result {\n if (typeof json !== 'object' || json === null) return err('aanvraag: not an object');\n return parseCommon(json as ApplicationSummaryDto);\n}\n\nexport function parseApplications(json: unknown): Result {\n if (!Array.isArray(json)) return err('aanvragen: not an array');\n const out: Aanvraag[] = [];\n for (const item of json) {\n const parsed = parseApplicationSummary(item);\n if (!parsed.ok) return parsed;\n out.push(parsed.value);\n }\n return ok(out);\n}\n\nexport function parseApplicationDetail(json: unknown): Result {\n if (typeof json !== 'object' || json === null) return err('aanvraag: not an object');\n const base = parseCommon(json as ApplicationDetailDto);\n if (!base.ok) return base;\n return ok({ ...base.value, draft: (json as ApplicationDetailDto).draft ?? null });\n}\n", + "extends": [], + "type": "injectable" + }, + { + "name": "ApplicationsStore", + "id": "injectable-ApplicationsStore-2830909f2096c797eaad39b4c558e2d537c5c120fac9986523b921c776c59c24f0b99667e22b4ba6b10bafbe629890bb849415f052ea6a3a871393aecf54b839", + "file": "src/app/registratie/application/applications.store.ts", + "properties": [ + { + "name": "adapter", + "defaultValue": "inject(ApplicationsAdapter)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 18, + "modifierKind": [ + 123 + ] + }, + { + "name": "applications", + "defaultValue": "computed>(() => {\n const rd = fromResource(this.res);\n if (rd.tag !== 'Success') return rd;\n const parsed = parseApplications(rd.value ?? []);\n if (!parsed.ok) return { tag: 'Failure', error: new Error(parsed.error) };\n const hidden = this.cancelling();\n return { tag: 'Success', value: parsed.value.filter((a) => !hidden.has(a.id)) };\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 23, + "modifierKind": [ + 148 + ] + }, + { + "name": "cancelling", + "defaultValue": "signal>(new Set())", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

Ids optimistically hidden while their cancel is in flight (or done).

\n", + "line": 21, + "rawdescription": "\nIds optimistically hidden while their cancel is in flight (or done).", + "modifierKind": [ + 123 + ] + }, + { + "name": "res", + "defaultValue": "this.adapter.applicationsResource()", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 19, + "modifierKind": [ + 123 + ] + } + ], + "methods": [ + { + "name": "cancel", + "args": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 38, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nCancel a Concept: hide it optimistically, then confirm (reload) or roll back.", + "description": "

Cancel a Concept: hide it optimistically, then confirm (reload) or roll back.

\n", + "modifierKind": [ + 134 + ], + "jsdoctags": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reload", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 33, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nRe-fetch (e.g. on dashboard revisit) so auto-approval transitions show up.", + "description": "

Re-fetch (e.g. on dashboard revisit) so auto-approval transitions show up.

\n" + } + ], + "deprecated": false, + "deprecationMessage": "", + "description": "

The dashboard's view of the user's applications (aanvragen) — the backend is the\nsystem of record (PRD 0001). One root singleton owns the list resource and exposes\nit as a RemoteData signal, validated at the trust boundary (DTO → domain). Cancel\nis optimistic (hide immediately, reload to confirm, un-hide on failure); reload\nre-fetches so a page revisit reflects auto-approval (Concept → In behandeling →\nGoedgekeurd is computed server-side on read).

\n", + "rawdescription": "\n\nThe dashboard's view of the user's applications (aanvragen) — the backend is the\nsystem of record (PRD 0001). One root singleton owns the list resource and exposes\nit as a RemoteData signal, validated at the trust boundary (DTO → domain). Cancel\nis optimistic (hide immediately, reload to confirm, un-hide on failure); `reload`\nre-fetches so a page revisit reflects auto-approval (Concept → In behandeling →\nGoedgekeurd is computed server-side on read).\n", + "sourceCode": "import { Injectable, computed, inject, signal } from '@angular/core';\nimport { RemoteData, fromResource } from '@shared/application/remote-data';\nimport { Aanvraag } from '@registratie/domain/aanvraag';\nimport { ApplicationsAdapter, parseApplications } from '@registratie/infrastructure/applications.adapter';\n\ntype Err = Error | undefined;\n\n/**\n * The dashboard's view of the user's applications (aanvragen) — the backend is the\n * system of record (PRD 0001). One root singleton owns the list resource and exposes\n * it as a RemoteData signal, validated at the trust boundary (DTO → domain). Cancel\n * is optimistic (hide immediately, reload to confirm, un-hide on failure); `reload`\n * re-fetches so a page revisit reflects auto-approval (Concept → In behandeling →\n * Goedgekeurd is computed server-side on read).\n */\n@Injectable({ providedIn: 'root' })\nexport class ApplicationsStore {\n private adapter = inject(ApplicationsAdapter);\n private res = this.adapter.applicationsResource();\n /** Ids optimistically hidden while their cancel is in flight (or done). */\n private cancelling = signal>(new Set());\n\n readonly applications = computed>(() => {\n const rd = fromResource(this.res);\n if (rd.tag !== 'Success') return rd;\n const parsed = parseApplications(rd.value ?? []);\n if (!parsed.ok) return { tag: 'Failure', error: new Error(parsed.error) };\n const hidden = this.cancelling();\n return { tag: 'Success', value: parsed.value.filter((a) => !hidden.has(a.id)) };\n });\n\n /** Re-fetch (e.g. on dashboard revisit) so auto-approval transitions show up. */\n reload() {\n this.res.reload();\n }\n\n /** Cancel a Concept: hide it optimistically, then confirm (reload) or roll back. */\n async cancel(id: string) {\n this.cancelling.update((s) => new Set(s).add(id));\n try {\n await this.adapter.cancel(id);\n this.res.reload(); // the reloaded list no longer contains it; the hide is now a no-op\n } catch {\n this.cancelling.update((s) => {\n const next = new Set(s);\n next.delete(id);\n return next; // roll back: the block reappears\n });\n }\n }\n}\n", + "extends": [], + "type": "injectable" + }, { "name": "BigProfileStore", - "id": "injectable-BigProfileStore-69aed5b05b57a19cafee014d2f45ac87468f795733cf7c00ad07d0283d30edd836e2d4b8a45cad42641fa5c84cad96f314aa4d287ca1c55d3fdd8feceefcd642", + "id": "injectable-BigProfileStore-5439ec3a52b1d508e83c45fca30dd27ccb365828f5bc64eb2baf1206382e9a3dd3f45e1593fc52341541b73bafe13e20afb852c974b59d9083594e3a65ea0cff", "file": "src/app/registratie/application/big-profile.store.ts", "properties": [ { "name": "aantekeningen", - "defaultValue": "computed>(() =>\n fromResource(this.aantekeningenRes, (v) => v.length === 0),\n )", + "defaultValue": "computed>(() => {\n const rd = fromResource(this.aantekeningenRes, (v) => !v || v.length === 0);\n return rd.tag === 'Success' ? { tag: 'Success', value: rd.value ?? [] } : rd;\n })", "deprecated": false, "deprecationMessage": "", "type": "unknown", @@ -1535,7 +4572,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 50, + "line": 51, "modifierKind": [ 123 ] @@ -1549,7 +4586,7 @@ "indexKey": "", "optional": false, "description": "

True while a herregistratie submission is in flight or just submitted.

\n", - "line": 52, + "line": 53, "rawdescription": "\nTrue while a herregistratie submission is in flight or just submitted.", "modifierKind": [ 148 @@ -1621,7 +4658,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 54, + "line": 55, "deprecated": false, "deprecationMessage": "" }, @@ -1631,7 +4668,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 57, + "line": 58, "deprecated": false, "deprecationMessage": "" }, @@ -1641,7 +4678,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 61, + "line": 62, "deprecated": false, "deprecationMessage": "" } @@ -1650,15 +4687,30 @@ "deprecationMessage": "", "description": "

The single source of truth for the logged-in professional's profile, shared\nacross pages (providedIn:'root' = one instance). It owns the httpResources\n(created here, in the required injection context) and exposes them as\nRemoteData signals.

\n

The dashboard data now comes from ONE screen-shaped ("BFF-lite") call that\nreturns registration + person + server-computed decisions. One request → one\nconsistent snapshot, instead of stitching three independently loading/erroring\nresources together client-side. See docs/architecture/0001-bff-lite-decision-dtos.md.

\n", "rawdescription": "\n\nThe single source of truth for the logged-in professional's profile, shared\nacross pages (providedIn:'root' = one instance). It owns the httpResources\n(created here, in the required injection context) and exposes them as\nRemoteData signals.\n\nThe dashboard data now comes from ONE screen-shaped (\"BFF-lite\") call that\nreturns registration + person + server-computed `decisions`. One request → one\nconsistent snapshot, instead of stitching three independently loading/erroring\nresources together client-side. See docs/architecture/0001-bff-lite-decision-dtos.md.\n", - "sourceCode": "import { Injectable, computed, inject, signal } from '@angular/core';\nimport { RemoteData, fromResource, map } from '@shared/application/remote-data';\nimport { Aantekening } from '../domain/registration';\nimport { BigProfile } from '../domain/big-profile';\nimport { HerregistratieDecisions, DashboardView } from '../contracts/dashboard-view.dto';\nimport { BigRegisterAdapter } from '../infrastructure/big-register.adapter';\nimport { DashboardViewAdapter, parseDashboardView } from '../infrastructure/dashboard-view.adapter';\n\ntype Err = Error | undefined;\n\n/**\n * The single source of truth for the logged-in professional's profile, shared\n * across pages (providedIn:'root' = one instance). It owns the httpResources\n * (created here, in the required injection context) and exposes them as\n * RemoteData signals.\n *\n * The dashboard data now comes from ONE screen-shaped (\"BFF-lite\") call that\n * returns registration + person + server-computed `decisions`. One request → one\n * consistent snapshot, instead of stitching three independently loading/erroring\n * resources together client-side. See docs/architecture/0001-bff-lite-decision-dtos.md.\n */\n@Injectable({ providedIn: 'root' })\nexport class BigProfileStore {\n private big = inject(BigRegisterAdapter);\n private viewAdapter = inject(DashboardViewAdapter);\n\n private viewRes = this.viewAdapter.dashboardViewResource();\n private aantekeningenRes = this.big.aantekeningenResource();\n\n /** The aggregated view, validated at the trust boundary (DTO → domain). */\n private view = computed>(() => {\n const rd = fromResource(this.viewRes);\n if (rd.tag !== 'Success') return rd;\n const parsed = parseDashboardView(rd.value);\n return parsed.ok ? { tag: 'Success', value: parsed.value } : { tag: 'Failure', error: new Error(parsed.error) };\n });\n\n /** Registration + person, from the single aggregated call. */\n readonly profile = computed>(() => map(this.view(), (v) => v.profile));\n\n /** Server-computed decisions (e.g. herregistratie eligibility) — rendered, not recomputed. */\n readonly decisions = computed>(() => map(this.view(), (v) => v.decisions));\n\n /** Specialisms/notes stay a separate stream (they have their own empty state). */\n readonly aantekeningen = computed>(() =>\n fromResource(this.aantekeningenRes, (v) => v.length === 0),\n );\n\n // --- Optimistic herregistratie state, shared with the dashboard -----------\n private pending = signal(false);\n /** True while a herregistratie submission is in flight or just submitted. */\n readonly pendingHerregistratie = this.pending.asReadonly();\n\n beginHerregistratie() {\n this.pending.set(true); // optimistic: show it immediately on the dashboard\n }\n confirmHerregistratie() {\n this.pending.set(false);\n this.viewRes.reload(); // invalidate: re-fetch the now-updated view (registration + decisions)\n }\n rollbackHerregistratie() {\n this.pending.set(false); // submission failed — undo the optimistic flag\n }\n}\n", + "sourceCode": "import { Injectable, computed, inject, signal } from '@angular/core';\nimport { RemoteData, fromResource, map } from '@shared/application/remote-data';\nimport { Aantekening } from '../domain/registration';\nimport { BigProfile } from '../domain/big-profile';\nimport { HerregistratieDecisions, DashboardView } from '../contracts/dashboard-view.dto';\nimport { BigRegisterAdapter } from '../infrastructure/big-register.adapter';\nimport { DashboardViewAdapter, parseDashboardView } from '../infrastructure/dashboard-view.adapter';\n\ntype Err = Error | undefined;\n\n/**\n * The single source of truth for the logged-in professional's profile, shared\n * across pages (providedIn:'root' = one instance). It owns the httpResources\n * (created here, in the required injection context) and exposes them as\n * RemoteData signals.\n *\n * The dashboard data now comes from ONE screen-shaped (\"BFF-lite\") call that\n * returns registration + person + server-computed `decisions`. One request → one\n * consistent snapshot, instead of stitching three independently loading/erroring\n * resources together client-side. See docs/architecture/0001-bff-lite-decision-dtos.md.\n */\n@Injectable({ providedIn: 'root' })\nexport class BigProfileStore {\n private big = inject(BigRegisterAdapter);\n private viewAdapter = inject(DashboardViewAdapter);\n\n private viewRes = this.viewAdapter.dashboardViewResource();\n private aantekeningenRes = this.big.aantekeningenResource();\n\n /** The aggregated view, validated at the trust boundary (DTO → domain). */\n private view = computed>(() => {\n const rd = fromResource(this.viewRes);\n if (rd.tag !== 'Success') return rd;\n const parsed = parseDashboardView(rd.value);\n return parsed.ok ? { tag: 'Success', value: parsed.value } : { tag: 'Failure', error: new Error(parsed.error) };\n });\n\n /** Registration + person, from the single aggregated call. */\n readonly profile = computed>(() => map(this.view(), (v) => v.profile));\n\n /** Server-computed decisions (e.g. herregistratie eligibility) — rendered, not recomputed. */\n readonly decisions = computed>(() => map(this.view(), (v) => v.decisions));\n\n /** Specialisms/notes stay a separate stream (they have their own empty state). */\n readonly aantekeningen = computed>(() => {\n const rd = fromResource(this.aantekeningenRes, (v) => !v || v.length === 0);\n return rd.tag === 'Success' ? { tag: 'Success', value: rd.value ?? [] } : rd;\n });\n\n // --- Optimistic herregistratie state, shared with the dashboard -----------\n private pending = signal(false);\n /** True while a herregistratie submission is in flight or just submitted. */\n readonly pendingHerregistratie = this.pending.asReadonly();\n\n beginHerregistratie() {\n this.pending.set(true); // optimistic: show it immediately on the dashboard\n }\n confirmHerregistratie() {\n this.pending.set(false);\n this.viewRes.reload(); // invalidate: re-fetch the now-updated view (registration + decisions)\n }\n rollbackHerregistratie() {\n this.pending.set(false); // submission failed — undo the optimistic flag\n }\n}\n", "extends": [], "type": "injectable" }, { "name": "BigRegisterAdapter", - "id": "injectable-BigRegisterAdapter-a97ebf3c62a06bc0fe10b80bf7c03978bd380fe2f177627c268298d8cb92c8ac99f4977a95602bc5b4038f0d32aef28a0075d314b56d6c3b1edeeb66327cf358", + "id": "injectable-BigRegisterAdapter-9dd4351ca55ec4a8e4afc1c6d4458880888844780163e7d72b0c9011509444a74e9f0364d9942d2b83e48e24a30fb2cb96d9e6ea7a5c5782916802c95d7c527d", "file": "src/app/registratie/infrastructure/big-register.adapter.ts", - "properties": [], + "properties": [ + { + "name": "client", + "defaultValue": "inject(ApiClient)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 16, + "modifierKind": [ + 123 + ] + } + ], "methods": [ { "name": "aantekeningenResource", @@ -1666,24 +4718,39 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 16, + "line": 18, "deprecated": false, "deprecationMessage": "" } ], "deprecated": false, "deprecationMessage": "", - "description": "

Infrastructure adapter for the BIG-register source. Exposes signal-based\nresources (Angular's httpResource); each returns a Resource with\nstatus()/value()/error()/reload(). Call from an injection context\n(a field initializer in the store).

\n

Note: registration + person are now served via the aggregated dashboard-view\nendpoint (see DashboardViewAdapter). Only the notes stream remains separate.

\n", - "rawdescription": "\n\nInfrastructure adapter for the BIG-register source. Exposes signal-based\nresources (Angular's httpResource); each returns a Resource with\nstatus()/value()/error()/reload(). Call from an injection context\n(a field initializer in the store).\n\nNote: registration + person are now served via the aggregated dashboard-view\nendpoint (see DashboardViewAdapter). Only the notes stream remains separate.\n", - "sourceCode": "import { Injectable } from '@angular/core';\nimport { httpResource } from '@angular/common/http';\nimport { Aantekening } from '../domain/registration';\n\n/**\n * Infrastructure adapter for the BIG-register source. Exposes signal-based\n * resources (Angular's httpResource); each returns a Resource with\n * status()/value()/error()/reload(). Call from an injection context\n * (a field initializer in the store).\n *\n * Note: registration + person are now served via the aggregated dashboard-view\n * endpoint (see DashboardViewAdapter). Only the notes stream remains separate.\n */\n@Injectable({ providedIn: 'root' })\nexport class BigRegisterAdapter {\n aantekeningenResource() {\n return httpResource(() => 'mock/notes.json', { defaultValue: [] });\n }\n}\n", + "description": "

Infrastructure adapter for the BIG-register source. Exposes signal-based\nresources (Angular's resource over the generated typed client); each returns\na Resource with status()/value()/error()/reload(). Call from an injection\ncontext (a field initializer in the store).

\n

Note: registration + person are now served via the aggregated dashboard-view\nendpoint (see DashboardViewAdapter). Only the notes stream remains separate.

\n", + "rawdescription": "\n\nInfrastructure adapter for the BIG-register source. Exposes signal-based\nresources (Angular's `resource` over the generated typed client); each returns\na Resource with status()/value()/error()/reload(). Call from an injection\ncontext (a field initializer in the store).\n\nNote: registration + person are now served via the aggregated dashboard-view\nendpoint (see DashboardViewAdapter). Only the notes stream remains separate.\n", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport { Aantekening, AantekeningType } from '../domain/registration';\nimport { ApiClient, AantekeningDto } from '@shared/infrastructure/api-client';\n\n/**\n * Infrastructure adapter for the BIG-register source. Exposes signal-based\n * resources (Angular's `resource` over the generated typed client); each returns\n * a Resource with status()/value()/error()/reload(). Call from an injection\n * context (a field initializer in the store).\n *\n * Note: registration + person are now served via the aggregated dashboard-view\n * endpoint (see DashboardViewAdapter). Only the notes stream remains separate.\n */\n@Injectable({ providedIn: 'root' })\nexport class BigRegisterAdapter {\n private client = inject(ApiClient);\n\n aantekeningenResource() {\n return resource({ loader: () => this.client.notes().then((ns) => ns.map(toAantekening)) });\n }\n}\n\n/** Map the wire DTO (all fields optional) onto our domain type. */\nfunction toAantekening(n: AantekeningDto): Aantekening {\n return { type: n.type as AantekeningType, omschrijving: n.omschrijving ?? '', datum: n.datum ?? '' };\n}\n", "extends": [], "type": "injectable" }, { "name": "BrpAdapter", - "id": "injectable-BrpAdapter-a344bff4ee9ecd8353a0f1cac582f6ade0f15a250cd704bceb4f884101b9063dcba26b6db8242dbcd28fc6a7b8c259b0ed02732215fe9fec1dbd5dbba6b6c336", + "id": "injectable-BrpAdapter-10d450d8edce038e9b8dbda5c24d2ed28c074fb1ba249426d783365cd8811ed52349efba6e7d50aaefda59b247af7bf65f6ee70ccc6f10d31b014e453c8c284a", "file": "src/app/registratie/infrastructure/brp.adapter.ts", - "properties": [], + "properties": [ + { + "name": "client", + "defaultValue": "inject(ApiClient)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 13, + "modifierKind": [ + 123 + ] + } + ], "methods": [ { "name": "adresResource", @@ -1691,31 +4758,6 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 15, - "deprecated": false, - "deprecationMessage": "" - } - ], - "deprecated": false, - "deprecationMessage": "", - "description": "

Infrastructure adapter for the BRP address lookup, reached only through our own\n("BFF-lite") endpoint — the anti-corruption boundary. In this POC the endpoint\nis a static mock; pointing at a real backend touches only this file + the DTO.

\n", - "rawdescription": "\n\nInfrastructure adapter for the BRP address lookup, reached only through our own\n(\"BFF-lite\") endpoint — the anti-corruption boundary. In this POC the endpoint\nis a static mock; pointing at a real backend touches only this file + the DTO.\n", - "sourceCode": "import { Injectable } from '@angular/core';\nimport { httpResource } from '@angular/common/http';\nimport { Result, ok, err } from '@shared/kernel/fp';\nimport { BrpAddressDto } from '@registratie/contracts/brp-address.dto';\n\n/**\n * Infrastructure adapter for the BRP address lookup, reached only through our own\n * (\"BFF-lite\") endpoint — the anti-corruption boundary. In this POC the endpoint\n * is a static mock; pointing at a real backend touches only this file + the DTO.\n */\n@Injectable({ providedIn: 'root' })\nexport class BrpAdapter {\n // Typed as the DTO for ergonomics, but the value is untrusted JSON until\n // parseBrpAddress validates it.\n adresResource() {\n return httpResource(() => 'mock/brp-address.json');\n }\n}\n\n/** Trust-boundary parse: validate the untrusted response shape. \"Geen adres\" is a\n valid outcome (gevonden: false), not a malformed response. ponytail: hand-written;\n reach for a schema lib once the contract count grows. */\nexport function parseBrpAddress(json: unknown): Result {\n if (typeof json !== 'object' || json === null) return err('brp-address: not an object');\n const dto = json as Partial;\n if (typeof dto.gevonden !== 'boolean') return err('brp-address: missing/invalid gevonden');\n if (dto.gevonden) {\n const a = dto.adres;\n if (!a || typeof a.straat !== 'string' || typeof a.postcode !== 'string' || typeof a.woonplaats !== 'string') {\n return err('brp-address: missing/invalid adres');\n }\n }\n return ok({ gevonden: dto.gevonden, adres: dto.adres });\n}\n", - "extends": [], - "type": "injectable" - }, - { - "name": "DashboardViewAdapter", - "id": "injectable-DashboardViewAdapter-f9f802caa4aa1f8e0892c550edb337b98c92f6fc1b268ed0f6c5f4e28416042eab089262dcfac88d0d16f9bbbec112731a09f9329be75c7030133e8827a8eb47", - "file": "src/app/registratie/infrastructure/dashboard-view.adapter.ts", - "properties": [], - "methods": [ - { - "name": "dashboardViewResource", - "args": [], - "optional": false, - "returnType": "any", - "typeParameters": [], "line": 16, "deprecated": false, "deprecationMessage": "" @@ -1723,15 +4765,55 @@ ], "deprecated": false, "deprecationMessage": "", - "description": "

Infrastructure adapter for the screen-shaped ("BFF-lite") dashboard endpoint.\nONE call returns registration + person + server-computed decisions.\n(In this POC the endpoint is a static mock; the decisions are precomputed to\nstand in for what the backend would compute.)

\n", - "rawdescription": "\n\nInfrastructure adapter for the screen-shaped (\"BFF-lite\") dashboard endpoint.\nONE call returns registration + person + server-computed decisions.\n(In this POC the endpoint is a static mock; the decisions are precomputed to\nstand in for what the backend would compute.)\n", - "sourceCode": "import { Injectable } from '@angular/core';\nimport { httpResource } from '@angular/common/http';\nimport { Result, ok, err } from '@shared/kernel/fp';\nimport { DashboardViewDto, DashboardView } from '@registratie/contracts/dashboard-view.dto';\n\n/**\n * Infrastructure adapter for the screen-shaped (\"BFF-lite\") dashboard endpoint.\n * ONE call returns registration + person + server-computed decisions.\n * (In this POC the endpoint is a static mock; the decisions are precomputed to\n * stand in for what the backend would compute.)\n */\n@Injectable({ providedIn: 'root' })\nexport class DashboardViewAdapter {\n // Typed as the DTO for ergonomics, but the value is still untrusted JSON —\n // parseDashboardView validates it at the boundary before the app uses it.\n dashboardViewResource() {\n return httpResource(() => 'mock/dashboard-view.json');\n }\n}\n\n/**\n * Trust-boundary parse: validate the untrusted response shape and map the DTO\n * onto our own domain model. Hand-written on purpose — no Zod for a single\n * contract. ponytail: reach for a schema lib once the contract count grows.\n */\nexport function parseDashboardView(json: unknown): Result {\n if (typeof json !== 'object' || json === null) return err('dashboard-view: not an object');\n const dto = json as Partial;\n\n const reg = dto.registration;\n if (!reg || typeof reg.bigNummer !== 'string' || !reg.status || typeof reg.status.tag !== 'string') {\n return err('dashboard-view: missing/invalid registration');\n }\n const person = dto.person;\n if (!person || !person.adres || typeof person.adres.postcode !== 'string') {\n return err('dashboard-view: missing/invalid person');\n }\n const d = dto.decisions;\n if (!d || typeof d.eligibleForHerregistratie !== 'boolean') {\n return err('dashboard-view: missing/invalid decisions');\n }\n\n return ok({\n profile: { registration: reg, person },\n decisions: { eligibleForHerregistratie: d.eligibleForHerregistratie, herregistratieReason: d.herregistratieReason },\n });\n}\n", + "description": "

Infrastructure adapter for the BRP address lookup, reached only through our own\n("BFF-lite") endpoint — the anti-corruption boundary. Data comes from the .NET\nbackend (GET /api/brp/address) via the generated typed client.

\n", + "rawdescription": "\n\nInfrastructure adapter for the BRP address lookup, reached only through our own\n(\"BFF-lite\") endpoint — the anti-corruption boundary. Data comes from the .NET\nbackend (`GET /api/brp/address`) via the generated typed client.\n", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport { Result, ok, err } from '@shared/kernel/fp';\nimport { BrpAddressDto } from '@registratie/contracts/brp-address.dto';\nimport { ApiClient } from '@shared/infrastructure/api-client';\n\n/**\n * Infrastructure adapter for the BRP address lookup, reached only through our own\n * (\"BFF-lite\") endpoint — the anti-corruption boundary. Data comes from the .NET\n * backend (`GET /api/brp/address`) via the generated typed client.\n */\n@Injectable({ providedIn: 'root' })\nexport class BrpAdapter {\n private client = inject(ApiClient);\n\n // The value is untrusted JSON until parseBrpAddress validates it.\n adresResource() {\n return resource({ loader: () => this.client.address() });\n }\n}\n\n/** Trust-boundary parse: validate the untrusted response shape. \"Geen adres\" is a\n valid outcome (gevonden: false), not a malformed response. ponytail: hand-written;\n reach for a schema lib once the contract count grows. */\nexport function parseBrpAddress(json: unknown): Result {\n if (typeof json !== 'object' || json === null) return err('brp-address: not an object');\n const dto = json as Partial;\n if (typeof dto.gevonden !== 'boolean') return err('brp-address: missing/invalid gevonden');\n if (dto.gevonden) {\n const a = dto.adres;\n if (!a || typeof a.straat !== 'string' || typeof a.postcode !== 'string' || typeof a.woonplaats !== 'string') {\n return err('brp-address: missing/invalid adres');\n }\n }\n return ok({ gevonden: dto.gevonden, adres: dto.adres });\n}\n", + "extends": [], + "type": "injectable" + }, + { + "name": "DashboardViewAdapter", + "id": "injectable-DashboardViewAdapter-6de764741d263caeed749d480aa0aee15bb4d5df7e4a9c6732aed0c31dacda4fcc9189e3f5d2002e15c0cecd06fca1e68dd12c02c650a85631887b4b3411e3a6", + "file": "src/app/registratie/infrastructure/dashboard-view.adapter.ts", + "properties": [ + { + "name": "client", + "defaultValue": "inject(ApiClient)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 14, + "modifierKind": [ + 123 + ] + } + ], + "methods": [ + { + "name": "dashboardViewResource", + "args": [], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 24, + "deprecated": false, + "deprecationMessage": "" + } + ], + "deprecated": false, + "deprecationMessage": "", + "description": "

Infrastructure adapter for the screen-shaped ("BFF-lite") dashboard endpoint.\nONE call returns registration + person + server-computed decisions. The data\ncomes from the .NET backend (GET /api/dashboard-view) via the generated typed\nclient; the decisions (e.g. herregistratie eligibility) are computed there.

\n", + "rawdescription": "\n\nInfrastructure adapter for the screen-shaped (\"BFF-lite\") dashboard endpoint.\nONE call returns registration + person + server-computed decisions. The data\ncomes from the .NET backend (`GET /api/dashboard-view`) via the generated typed\nclient; the decisions (e.g. herregistratie eligibility) are computed there.\n", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport { Result, ok, err } from '@shared/kernel/fp';\nimport { DashboardViewDto, DashboardView } from '@registratie/contracts/dashboard-view.dto';\nimport { ApiClient } from '@shared/infrastructure/api-client';\n\n/**\n * Infrastructure adapter for the screen-shaped (\"BFF-lite\") dashboard endpoint.\n * ONE call returns registration + person + server-computed decisions. The data\n * comes from the .NET backend (`GET /api/dashboard-view`) via the generated typed\n * client; the decisions (e.g. herregistratie eligibility) are computed there.\n */\n@Injectable({ providedIn: 'root' })\nexport class DashboardViewAdapter {\n private client = inject(ApiClient);\n\n // The value is still untrusted JSON — parseDashboardView validates it at the\n // boundary and maps DTO → domain before the app uses it.\n //\n // SEAM (G5): retry-with-backoff for non-mutating reads wraps the loader here —\n // e.g. `loader: () => withBackoff(() => this.client.dashboardView())` — since the\n // adapter is the single place HTTP lives. Reads are safe to retry; MUTATING calls\n // (the submit-* commands) must NEVER auto-retry — and don't. Manual retry\n // (resource.reload via ) covers the UX today, so backoff stays unbuilt.\n dashboardViewResource() {\n return resource({ loader: () => this.client.dashboardView() });\n }\n}\n\n/**\n * Trust-boundary parse: validate the untrusted response shape and map the DTO\n * onto our own domain model. Hand-written on purpose — no Zod for a single\n * contract. ponytail: reach for a schema lib once the contract count grows.\n */\nexport function parseDashboardView(json: unknown): Result {\n if (typeof json !== 'object' || json === null) return err('dashboard-view: not an object');\n const dto = json as Partial;\n\n const reg = dto.registration;\n if (!reg || typeof reg.bigNummer !== 'string' || !reg.status || typeof reg.status.tag !== 'string') {\n return err('dashboard-view: missing/invalid registration');\n }\n const person = dto.person;\n if (!person || !person.adres || typeof person.adres.postcode !== 'string') {\n return err('dashboard-view: missing/invalid person');\n }\n const d = dto.decisions;\n if (!d || typeof d.eligibleForHerregistratie !== 'boolean') {\n return err('dashboard-view: missing/invalid decisions');\n }\n\n return ok({\n profile: { registration: reg, person },\n decisions: { eligibleForHerregistratie: d.eligibleForHerregistratie, herregistratieReason: d.herregistratieReason },\n });\n}\n", "extends": [], "type": "injectable" }, { "name": "DigidAdapter", - "id": "injectable-DigidAdapter-6b0a6d77a6f7411602d1c257ac45d4d45631556b1a468f7f38abfbbe375a3ac5e566fa6024ba56cb59f8418174ed2dbc6ea937b7b7999e58655acf01c7d7ecc9", + "id": "injectable-DigidAdapter-f046ea1531b0250c6367c33d4aad4e90b492ee19f28479d45f7142018c7f20bda7860e9c3695fa4d559223cf053bbfcf16b905073d3167633568d8e2120b212f", "file": "src/app/auth/infrastructure/digid.adapter.ts", "properties": [], "methods": [ @@ -1775,15 +4857,30 @@ "deprecationMessage": "", "description": "

Infrastructure: talks to the (mock) DigiD identity provider.

\n", "rawdescription": "\nInfrastructure: talks to the (mock) DigiD identity provider.", - "sourceCode": "import { Injectable } from '@angular/core';\nimport { Result, ok, err } from '@shared/kernel/fp';\nimport { Session } from '../domain/session';\n\n/** Infrastructure: talks to the (mock) DigiD identity provider. */\n@Injectable({ providedIn: 'root' })\nexport class DigidAdapter {\n // ponytail: fake DigiD — any 9-digit BSN authenticates to a fixed identity.\n // Swap for a real OIDC redirect flow when there's a backend.\n async authenticate(bsn: string): Promise> {\n const t = bsn.trim();\n if (!/^\\d{9}$/.test(t)) return err('Voer een geldig BSN van 9 cijfers in.');\n return ok({ bsn: t, naam: 'Dr. A. (Anna) de Vries' });\n }\n}\n", + "sourceCode": "import { Injectable } from '@angular/core';\nimport { Result, ok, err } from '@shared/kernel/fp';\nimport { Session } from '../domain/session';\n\n/** Infrastructure: talks to the (mock) DigiD identity provider. */\n@Injectable({ providedIn: 'root' })\nexport class DigidAdapter {\n // ponytail: fake DigiD — any 9-digit BSN authenticates to a fixed identity.\n // Swap for a real OIDC redirect flow when there's a backend.\n async authenticate(bsn: string): Promise> {\n const t = bsn.trim();\n if (!/^\\d{9}$/.test(t)) return err($localize`:@@validation.bsn:Voer een geldig BSN van 9 cijfers in.`);\n return ok({ bsn: t, naam: 'Dr. A. (Anna) de Vries' });\n }\n}\n", "extends": [], "type": "injectable" }, { "name": "DuoAdapter", - "id": "injectable-DuoAdapter-616feea0d64b7da051ee732696d22103481dabb2238ec6ec39b7fdba3b8d67af05b0d4eaf45c3d1c0bddfbadd70cb5b603a56d5a231bd35be56366357866cdb3", + "id": "injectable-DuoAdapter-65cb84e352c9ce89498053dd35ac9a31e5e68642f2bab7f84a601a045c8c8403449d1eaea5d3c85169d793b7bd09f5cd0dee324540328bb73e16fd2649514fed", "file": "src/app/registratie/infrastructure/duo.adapter.ts", - "properties": [], + "properties": [ + { + "name": "client", + "defaultValue": "inject(ApiClient)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 15, + "modifierKind": [ + 123 + ] + } + ], "methods": [ { "name": "diplomasResource", @@ -1798,15 +4895,170 @@ ], "deprecated": false, "deprecationMessage": "", - "description": "

Infrastructure adapter for the DUO diploma lookup, reached only through our own\n("BFF-lite") endpoint — the anti-corruption boundary. The response carries the\nuser's diplomas (each with its server-computed beroep + policy questions) and\nthe manual-entry fallback policy. The frontend renders; it does not derive. In\nthis POC the endpoint is a static mock.

\n", - "rawdescription": "\n\nInfrastructure adapter for the DUO diploma lookup, reached only through our own\n(\"BFF-lite\") endpoint — the anti-corruption boundary. The response carries the\nuser's diplomas (each with its server-computed beroep + policy questions) and\nthe manual-entry fallback policy. The frontend renders; it does not derive. In\nthis POC the endpoint is a static mock.\n", - "sourceCode": "import { Injectable } from '@angular/core';\nimport { httpResource } from '@angular/common/http';\nimport { Result, ok, err } from '@shared/kernel/fp';\nimport { DuoLookupDto, DuoDiplomaDto, PolicyQuestionDto, ManualDiplomaPolicyDto } from '@registratie/contracts/duo-diplomas.dto';\n\nconst EMPTY: DuoLookupDto = { diplomas: [], handmatig: { beroepen: [], policyQuestions: [] } };\n\n/**\n * Infrastructure adapter for the DUO diploma lookup, reached only through our own\n * (\"BFF-lite\") endpoint — the anti-corruption boundary. The response carries the\n * user's diplomas (each with its server-computed beroep + policy questions) and\n * the manual-entry fallback policy. The frontend renders; it does not derive. In\n * this POC the endpoint is a static mock.\n */\n@Injectable({ providedIn: 'root' })\nexport class DuoAdapter {\n diplomasResource() {\n return httpResource(() => 'mock/duo-diplomas.json', { defaultValue: EMPTY });\n }\n}\n\nfunction parseQuestions(json: unknown): PolicyQuestionDto[] | null {\n if (!Array.isArray(json)) return null;\n const out: PolicyQuestionDto[] = [];\n for (const q of json) {\n if (typeof q !== 'object' || q === null) return null;\n const p = q as Partial;\n if (typeof p.id !== 'string' || typeof p.vraag !== 'string' || (p.type !== 'ja-nee' && p.type !== 'tekst')) return null;\n out.push({ id: p.id, vraag: p.vraag, type: p.type });\n }\n return out;\n}\n\n/** Trust-boundary parse: validate the untrusted response shape (diplomas, each\n with derived beroep + policy questions, plus the manual-entry fallback). */\nexport function parseDuoLookup(json: unknown): Result {\n if (typeof json !== 'object' || json === null) return err('duo-lookup: not an object');\n const dto = json as Partial;\n if (!Array.isArray(dto.diplomas)) return err('duo-lookup: missing diplomas');\n\n const diplomas: DuoDiplomaDto[] = [];\n for (const item of dto.diplomas) {\n if (typeof item !== 'object' || item === null) return err('duo-lookup: invalid diploma');\n const d = item as Partial;\n const vragen = parseQuestions(d.policyQuestions);\n if (typeof d.id !== 'string' || typeof d.naam !== 'string' || typeof d.beroep !== 'string' || vragen === null) {\n return err('duo-lookup: missing/invalid diploma fields');\n }\n diplomas.push({ id: d.id, naam: d.naam, instelling: d.instelling ?? '', jaar: typeof d.jaar === 'number' ? d.jaar : 0, beroep: d.beroep, policyQuestions: vragen });\n }\n\n const hm = dto.handmatig;\n const hmVragen = hm ? parseQuestions(hm.policyQuestions) : null;\n if (!hm || !Array.isArray(hm.beroepen) || hmVragen === null) {\n return err('duo-lookup: missing/invalid handmatig fallback');\n }\n const handmatig: ManualDiplomaPolicyDto = { beroepen: hm.beroepen, policyQuestions: hmVragen };\n\n return ok({ diplomas, handmatig });\n}\n", + "description": "

Infrastructure adapter for the DUO diploma lookup, reached only through our own\n("BFF-lite") endpoint — the anti-corruption boundary. The response carries the\nuser's diplomas (each with its server-computed beroep + policy questions) and\nthe manual-entry fallback policy. The frontend renders; it does not derive.\nData comes from the .NET backend (GET /api/duo/diplomas) via the typed client.

\n", + "rawdescription": "\n\nInfrastructure adapter for the DUO diploma lookup, reached only through our own\n(\"BFF-lite\") endpoint — the anti-corruption boundary. The response carries the\nuser's diplomas (each with its server-computed beroep + policy questions) and\nthe manual-entry fallback policy. The frontend renders; it does not derive.\nData comes from the .NET backend (`GET /api/duo/diplomas`) via the typed client.\n", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport { Result, ok, err } from '@shared/kernel/fp';\nimport { DuoLookupDto, DuoDiplomaDto, PolicyQuestionDto, ManualDiplomaPolicyDto } from '@registratie/contracts/duo-diplomas.dto';\nimport { ApiClient } from '@shared/infrastructure/api-client';\n\n/**\n * Infrastructure adapter for the DUO diploma lookup, reached only through our own\n * (\"BFF-lite\") endpoint — the anti-corruption boundary. The response carries the\n * user's diplomas (each with its server-computed beroep + policy questions) and\n * the manual-entry fallback policy. The frontend renders; it does not derive.\n * Data comes from the .NET backend (`GET /api/duo/diplomas`) via the typed client.\n */\n@Injectable({ providedIn: 'root' })\nexport class DuoAdapter {\n private client = inject(ApiClient);\n\n diplomasResource() {\n return resource({ loader: () => this.client.diplomas() });\n }\n}\n\nfunction parseQuestions(json: unknown): PolicyQuestionDto[] | null {\n if (!Array.isArray(json)) return null;\n const out: PolicyQuestionDto[] = [];\n for (const q of json) {\n if (typeof q !== 'object' || q === null) return null;\n const p = q as Partial;\n if (typeof p.id !== 'string' || typeof p.vraag !== 'string' || (p.type !== 'ja-nee' && p.type !== 'tekst')) return null;\n out.push({ id: p.id, vraag: p.vraag, type: p.type });\n }\n return out;\n}\n\n/** Trust-boundary parse: validate the untrusted response shape (diplomas, each\n with derived beroep + policy questions, plus the manual-entry fallback). */\nexport function parseDuoLookup(json: unknown): Result {\n if (typeof json !== 'object' || json === null) return err('duo-lookup: not an object');\n const dto = json as Partial;\n if (!Array.isArray(dto.diplomas)) return err('duo-lookup: missing diplomas');\n\n const diplomas: DuoDiplomaDto[] = [];\n for (const item of dto.diplomas) {\n if (typeof item !== 'object' || item === null) return err('duo-lookup: invalid diploma');\n const d = item as Partial;\n const vragen = parseQuestions(d.policyQuestions);\n if (typeof d.id !== 'string' || typeof d.naam !== 'string' || typeof d.beroep !== 'string' || vragen === null) {\n return err('duo-lookup: missing/invalid diploma fields');\n }\n diplomas.push({ id: d.id, naam: d.naam, instelling: d.instelling ?? '', jaar: typeof d.jaar === 'number' ? d.jaar : 0, beroep: d.beroep, policyQuestions: vragen });\n }\n\n const hm = dto.handmatig;\n const hmVragen = hm ? parseQuestions(hm.policyQuestions) : null;\n if (!hm || !Array.isArray(hm.beroepen) || hmVragen === null) {\n return err('duo-lookup: missing/invalid handmatig fallback');\n }\n const handmatig: ManualDiplomaPolicyDto = { beroepen: hm.beroepen, policyQuestions: hmVragen };\n\n return ok({ diplomas, handmatig });\n}\n", + "extends": [], + "type": "injectable" + }, + { + "name": "IntakePolicyAdapter", + "id": "injectable-IntakePolicyAdapter-c48f30f2f16d4eeef7433634888e1d998bd653f31d0d43084eae3dd1b51257ebdff63f5aa7f3986b7978729fca6d1fc48dbd59d3821a8eb1f50a9e6ad0501783", + "file": "src/app/herregistratie/infrastructure/intake-policy.adapter.ts", + "properties": [ + { + "name": "client", + "defaultValue": "inject(ApiClient)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 11, + "modifierKind": [ + 123 + ] + } + ], + "methods": [ + { + "name": "policyResource", + "args": [], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 13, + "deprecated": false, + "deprecationMessage": "" + } + ], + "deprecated": false, + "deprecationMessage": "", + "description": "

Infrastructure adapter for the intake policy (the scholing threshold config\nvalue). Same shape as every other adapter — a signal resource over the\ngenerated typed client — so HTTP lives in exactly one place per concern.

\n", + "rawdescription": "\n\nInfrastructure adapter for the intake policy (the scholing threshold config\nvalue). Same shape as every other adapter — a signal `resource` over the\ngenerated typed client — so HTTP lives in exactly one place per concern.\n", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport { ApiClient } from '@shared/infrastructure/api-client';\n\n/**\n * Infrastructure adapter for the intake policy (the scholing threshold config\n * value). Same shape as every other adapter — a signal `resource` over the\n * generated typed client — so HTTP lives in exactly one place per concern.\n */\n@Injectable({ providedIn: 'root' })\nexport class IntakePolicyAdapter {\n private client = inject(ApiClient);\n\n policyResource() {\n return resource({ loader: () => this.client.policy() });\n }\n}\n", + "extends": [], + "type": "injectable" + }, + { + "name": "KeepaliveTransport", + "id": "injectable-KeepaliveTransport-ec4f738d45fc556f5419cef06bad97f2f12a90de63211f79059088a2827ea9ee851b1544ec2110033a7797b65eaeb7caf0d4508fd122384394eaf9a145ffa7f6", + "file": "src/app/shared/upload/upload-shell.service.ts", + "properties": [ + { + "name": "adapter", + "defaultValue": "inject(UploadAdapter)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 19, + "modifierKind": [ + 123 + ] + }, + { + "name": "backgroundSyncAvailable", + "defaultValue": "false", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 20, + "modifierKind": [ + 148 + ] + } + ], + "methods": [ + { + "name": "send", + "args": [ + { + "name": "req", + "type": "XhrUploadRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "onProgress", + "type": "function", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "function": [ + { + "name": "pct", + "type": "number", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ] + } + ], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 21, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "req", + "type": "XhrUploadRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "onProgress", + "type": "function", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "function": [ + { + "name": "pct", + "type": "number", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "description": "", + "rawdescription": "\n", + "sourceCode": "import { Injectable, inject } from '@angular/core';\nimport { UploadAdapter, XhrUploadRequest, XhrUploadHandle, UPLOAD_ABORTED } from './upload.adapter';\nimport { problemDetail } from '@shared/infrastructure/api-error';\nimport { UploadMsg, Upload } from './upload.machine';\n\n/**\n * Transport seam (PRD §6): how upload bytes leave the browser. The shipped impl is\n * KeepaliveTransport (XHR for progress; poll-on-return covers the background gap).\n * A ServiceWorkerTransport would set `backgroundSyncAvailable = true` and survive a\n * closed tab — swapping it in touches only this interface.\n */\nexport interface UploadTransport {\n readonly backgroundSyncAvailable: boolean;\n send(req: XhrUploadRequest, onProgress: (pct: number) => void): XhrUploadHandle;\n}\n\n@Injectable({ providedIn: 'root' })\nclass KeepaliveTransport implements UploadTransport {\n private adapter = inject(UploadAdapter);\n readonly backgroundSyncAvailable = false; // no Service Worker registered in this POC\n send(req: XhrUploadRequest, onProgress: (pct: number) => void) {\n return this.adapter.xhrUpload(req, onProgress);\n }\n}\n\ntype Dispatch = (m: UploadMsg) => void;\n\n/**\n * Orchestrates upload effects: drives the transport and translates outcomes into\n * domain messages. Holds no UI state itself — the host wizard's reducer owns it.\n * Effects only; the reducer stays pure.\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadShellService {\n private transport: UploadTransport = inject(KeepaliveTransport);\n private adapter = inject(UploadAdapter);\n private inflight = new Map void>(); // localId → cancel\n\n get backgroundSyncAvailable(): boolean {\n return this.transport.backgroundSyncAvailable;\n }\n\n /** Start (or retry) an upload: queue → progress → complete/failed. */\n upload(req: XhrUploadRequest, dispatch: Dispatch): void {\n dispatch({ type: 'UploadQueued', localId: req.localId, backgroundSync: this.backgroundSyncAvailable });\n const { done, cancel } = this.transport.send(req, (pct) =>\n dispatch({ type: 'UploadProgress', localId: req.localId, progressPct: pct }),\n );\n this.inflight.set(req.localId, cancel);\n done\n .then(({ documentId }) => dispatch({ type: 'UploadComplete', localId: req.localId, documentId }))\n .catch((e) => {\n if (e !== UPLOAD_ABORTED) {\n dispatch({ type: 'UploadFailed', localId: req.localId, reason: typeof e === 'string' ? e : '' });\n }\n })\n .finally(() => this.inflight.delete(req.localId));\n }\n\n /** Optimistic delete: mark deleting → complete (removed) / failed (reverted). */\n delete(localId: string, documentId: string, dispatch: Dispatch): void {\n dispatch({ type: 'UploadDeleting', localId });\n this.adapter\n .deleteDocument(documentId)\n .then(() => dispatch({ type: 'UploadDeleteComplete', localId }))\n .catch((e) => dispatch({ type: 'UploadDeleteFailed', localId, reason: problemDetail(e, '') }));\n }\n\n /** Cancel any in-flight XHRs (e.g. when a category switches to post-delivery). */\n cancel(localIds: string[]): void {\n for (const id of localIds) {\n this.inflight.get(id)?.();\n this.inflight.delete(id);\n }\n }\n\n /** Poll-on-return: ask the BFF which still-in-flight uploads have arrived. */\n async pollReturning(uploads: Upload[], dispatch: Dispatch): Promise {\n const ids = uploads.map((u) => u.localId);\n if (ids.length === 0) return;\n const items = await this.adapter.status(ids);\n const results = items\n .filter((i) => i.status === 'complete' && i.documentId)\n .map((i) => ({ localId: i.localId, success: true as const, documentId: i.documentId! }));\n if (results.length > 0) dispatch({ type: 'BackgroundUploadsReturned', results });\n }\n}\n", "extends": [], "type": "injectable" }, { "name": "SessionStore", - "id": "injectable-SessionStore-9e6ea772dc35cac2224969c550dc4edbeabbc2782278eaab988c670b860fd6232fe010ab80c4cfe06d81e3acf2ed437c648bed3e6e60d5c18f2a8c9ba3a83201", + "id": "injectable-SessionStore-0baea49d81a56d8083840504ebe739dda3b087e42874387498a8367e5a497df3048237969f26e8d3dbe3f105be04f2eb80171579db11fc757f896c02bf386f49", "file": "src/app/auth/application/session.store.ts", "properties": [ { @@ -1818,7 +5070,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 30, + "line": 35, "modifierKind": [ 123 ] @@ -1832,7 +5084,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 29, + "line": 34, "modifierKind": [ 123 ] @@ -1846,7 +5098,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 33, + "line": 38, "modifierKind": [ 148 ] @@ -1860,7 +5112,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 32, + "line": 37, "modifierKind": [ 148 ] @@ -1882,7 +5134,7 @@ "optional": false, "returnType": "Promise>", "typeParameters": [], - "line": 44, + "line": 50, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nEffectful command: authenticate, then store the session on success.", @@ -1910,7 +5162,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 50, + "line": 56, "deprecated": false, "deprecationMessage": "" } @@ -1919,14 +5171,535 @@ "deprecationMessage": "", "description": "

Holds the current session for the whole app. Because it is providedIn:'root'\nthere is exactly one instance — every component that injects it sees the same\nsession signal, so logging in is instantly visible everywhere (the guard, the\nheader, etc.). The session is mirrored to sessionStorage so a refresh or a\ndeep-link to a protected route keeps you logged in; it clears when the tab\ncloses. ponytail: sessionStorage, not localStorage — no cross-tab sync, which\nmatches a single-session portal.

\n", "rawdescription": "\n\nHolds the current session for the whole app. Because it is providedIn:'root'\nthere is exactly one instance — every component that injects it sees the same\nsession signal, so logging in is instantly visible everywhere (the guard, the\nheader, etc.). The session is mirrored to sessionStorage so a refresh or a\ndeep-link to a protected route keeps you logged in; it clears when the tab\ncloses. ponytail: sessionStorage, not localStorage — no cross-tab sync, which\nmatches a single-session portal.\n", - "sourceCode": "import { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { Result } from '@shared/kernel/fp';\nimport { Session } from '../domain/session';\nimport { DigidAdapter } from '../infrastructure/digid.adapter';\n\nconst STORAGE_KEY = 'session-v1';\n\n/** Restore a persisted session (best-effort; corrupt entry → logged out). */\nfunction restore(): Session | null {\n try {\n const raw = sessionStorage.getItem(STORAGE_KEY);\n return raw ? (JSON.parse(raw) as Session) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Holds the current session for the whole app. Because it is providedIn:'root'\n * there is exactly one instance — every component that injects it sees the same\n * session signal, so logging in is instantly visible everywhere (the guard, the\n * header, etc.). The session is mirrored to sessionStorage so a refresh or a\n * deep-link to a protected route keeps you logged in; it clears when the tab\n * closes. ponytail: sessionStorage, not localStorage — no cross-tab sync, which\n * matches a single-session portal.\n */\n@Injectable({ providedIn: 'root' })\nexport class SessionStore {\n private digid = inject(DigidAdapter);\n private _session = signal(restore());\n\n readonly session = this._session.asReadonly();\n readonly isAuthenticated = computed(() => this._session() !== null);\n\n constructor() {\n effect(() => {\n const s = this._session();\n if (s) sessionStorage.setItem(STORAGE_KEY, JSON.stringify(s));\n else sessionStorage.removeItem(STORAGE_KEY);\n });\n }\n\n /** Effectful command: authenticate, then store the session on success. */\n async login(bsn: string): Promise> {\n const r = await this.digid.authenticate(bsn);\n if (r.ok) this._session.set(r.value);\n return r;\n }\n\n logout() {\n this._session.set(null);\n }\n}\n", + "sourceCode": "import { Injectable, computed, effect, inject, signal } from '@angular/core';\nimport { Result } from '@shared/kernel/fp';\nimport { Session } from '../domain/session';\nimport { DigidAdapter } from '../infrastructure/digid.adapter';\n\nconst STORAGE_KEY = 'session-v1';\n\n/** Restore a persisted session (best-effort; corrupt entry → logged out).\n G2: validate the shape before trusting it. G1: the BSN is never persisted\n (see the effect below), so a restored session carries an empty one — it is\n unused after login; only `naam` is shown in the chrome. */\nfunction restore(): Session | null {\n try {\n const raw = sessionStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial;\n return typeof parsed?.naam === 'string' ? { bsn: '', naam: parsed.naam } : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Holds the current session for the whole app. Because it is providedIn:'root'\n * there is exactly one instance — every component that injects it sees the same\n * session signal, so logging in is instantly visible everywhere (the guard, the\n * header, etc.). The session is mirrored to sessionStorage so a refresh or a\n * deep-link to a protected route keeps you logged in; it clears when the tab\n * closes. ponytail: sessionStorage, not localStorage — no cross-tab sync, which\n * matches a single-session portal.\n */\n@Injectable({ providedIn: 'root' })\nexport class SessionStore {\n private digid = inject(DigidAdapter);\n private _session = signal(restore());\n\n readonly session = this._session.asReadonly();\n readonly isAuthenticated = computed(() => this._session() !== null);\n\n constructor() {\n effect(() => {\n const s = this._session();\n // G1: persist only `naam` — never write the BSN (national ID) to storage.\n if (s) sessionStorage.setItem(STORAGE_KEY, JSON.stringify({ naam: s.naam }));\n else sessionStorage.removeItem(STORAGE_KEY);\n });\n }\n\n /** Effectful command: authenticate, then store the session on success. */\n async login(bsn: string): Promise> {\n const r = await this.digid.authenticate(bsn);\n if (r.ok) this._session.set(r.value);\n return r;\n }\n\n logout() {\n this._session.set(null);\n }\n}\n", "constructorObj": { "name": "constructor", "description": "", "deprecated": false, "deprecationMessage": "", "args": [], - "line": 33 + "line": 38 + }, + "extends": [], + "type": "injectable" + }, + { + "name": "UploadAdapter", + "id": "injectable-UploadAdapter-bb80b81784601579976fed392f1c4e638f6945087adb775183c617fc8b015821f1a9ce89762fe24adcdab49c8761256a98fd3e6fe0251d3a6f250ef0aed7b62b", + "file": "src/app/shared/upload/upload.adapter.ts", + "properties": [ + { + "name": "client", + "defaultValue": "inject(ApiClient)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 43, + "modifierKind": [ + 123 + ] + } + ], + "methods": [ + { + "name": "categoriesResource", + "args": [ + { + "name": "wizardId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 45, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "wizardId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "contentUrl", + "args": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "string", + "typeParameters": [], + "line": 65, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDirect URL to the stored bytes, for a preview/download link (`
`) — the\nserver serves it inline for pdf/image, attachment otherwise. Not a fetch: the\nbrowser opens it. demo-* ids (dev simulation) have no bytes and 404 here.\n", + "description": "

Direct URL to the stored bytes, for a preview/download link (<a href>) — the\nserver serves it inline for pdf/image, attachment otherwise. Not a fetch: the\nbrowser opens it. demo-* ids (dev simulation) have no bytes and 404 here.

\n", + "jsdoctags": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "deleteDocument", + "args": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 56, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nUser delete; throws a ProblemDetails (e.g. 409 once linked) the caller maps.", + "description": "

User delete; throws a ProblemDetails (e.g. 409 once linked) the caller maps.

\n", + "jsdoctags": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "status", + "args": [ + { + "name": "localIds", + "type": "string[]", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 50, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nPoll-on-return: which client localIds have arrived at the BFF.", + "description": "

Poll-on-return: which client localIds have arrived at the BFF.

\n", + "jsdoctags": [ + { + "name": "localIds", + "type": "string[]", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "xhrUpload", + "args": [ + { + "name": "req", + "type": "XhrUploadRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "onProgress", + "type": "function", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "function": [ + { + "name": "pct", + "type": "number", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ] + } + ], + "optional": false, + "returnType": "XhrUploadHandle", + "typeParameters": [], + "line": 75, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nMultipart upload with progress + cancel. ponytail: XHR (not fetch keepalive) —\nprogress events need XHR; the keepalive/background gap is covered by\npoll-on-return (UploadShellService.pollReturning). Swap in a Service Worker\ntransport behind UploadTransport for true background sync.\n", + "description": "

Multipart upload with progress + cancel. ponytail: XHR (not fetch keepalive) —\nprogress events need XHR; the keepalive/background gap is covered by\npoll-on-return (UploadShellService.pollReturning). Swap in a Service Worker\ntransport behind UploadTransport for true background sync.

\n", + "jsdoctags": [ + { + "name": "req", + "type": "XhrUploadRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "onProgress", + "type": "function", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "function": [ + { + "name": "pct", + "type": "number", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "description": "

Infrastructure: the only place upload HTTP lives. Reads (categories, status,\ndelete) go through the NSwag client; the multipart POST is hand-written XHR\nbecause the generated client is JSON-only (the endpoint is ExcludeFromDescription)\nand we need upload-progress events + cancellation, which fetch can't give us.

\n", + "rawdescription": "\n\nInfrastructure: the only place upload HTTP lives. Reads (categories, status,\ndelete) go through the NSwag client; the multipart POST is hand-written XHR\nbecause the generated client is JSON-only (the endpoint is ExcludeFromDescription)\nand we need upload-progress events + cancellation, which fetch can't give us.\n", + "sourceCode": "import { Injectable, inject, resource } from '@angular/core';\nimport {\n ApiClient,\n DocumentCategoryDto,\n UploadStatusItemDto,\n} from '@shared/infrastructure/api-client';\nimport { problemDetail } from '@shared/infrastructure/api-error';\nimport { currentScenario } from '@shared/infrastructure/scenario';\nimport { environment } from '../../../environments/environment';\nimport { DocumentCategory } from './upload.machine';\n\n/** One arrived/known status item from poll-on-return. */\nexport interface StatusItem {\n localId: string;\n status: string; // 'complete' | 'unknown'\n documentId?: string;\n}\n\nexport interface XhrUploadRequest {\n localId: string;\n categoryId: string;\n wizardId: string;\n file: File;\n}\n\n/** A live upload: progress is reported via the callback; cancel aborts the XHR. */\nexport interface XhrUploadHandle {\n done: Promise<{ documentId: string }>;\n cancel: () => void;\n}\n\n/** Sentinel rejection so the caller can tell a user-cancel from a real failure. */\nexport const UPLOAD_ABORTED = Symbol('upload-aborted');\n\n/**\n * Infrastructure: the only place upload HTTP lives. Reads (categories, status,\n * delete) go through the NSwag client; the multipart POST is hand-written XHR\n * because the generated client is JSON-only (the endpoint is ExcludeFromDescription)\n * and we need upload-progress events + cancellation, which fetch can't give us.\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadAdapter {\n private client = inject(ApiClient);\n\n categoriesResource(wizardId: string) {\n return resource({ loader: () => this.client.categories(wizardId).then((r) => (r.categories ?? []).map(toCategory)) });\n }\n\n /** Poll-on-return: which client localIds have arrived at the BFF. */\n status(localIds: string[]): Promise {\n if (localIds.length === 0) return Promise.resolve([]);\n return this.client.status(localIds.join(',')).then((r) => (r.results ?? []).map(toStatusItem));\n }\n\n /** User delete; throws a ProblemDetails (e.g. 409 once linked) the caller maps. */\n deleteDocument(documentId: string): Promise {\n return this.client.uploads(documentId);\n }\n\n /**\n * Direct URL to the stored bytes, for a preview/download link (`
`) — the\n * server serves it inline for pdf/image, attachment otherwise. Not a fetch: the\n * browser opens it. demo-* ids (dev simulation) have no bytes and 404 here.\n */\n contentUrl(documentId: string): string {\n return `${environment.apiBaseUrl}/api/v1/uploads/${documentId}/content`;\n }\n\n /**\n * Multipart upload with progress + cancel. ponytail: XHR (not fetch keepalive) —\n * progress events need XHR; the keepalive/background gap is covered by\n * poll-on-return (UploadShellService.pollReturning). Swap in a Service Worker\n * transport behind UploadTransport for true background sync.\n */\n xhrUpload(req: XhrUploadRequest, onProgress: (pct: number) => void): XhrUploadHandle {\n const scenario = currentScenario();\n if (scenario === 'upload-slow' || scenario === 'upload-fail') return simulateUpload(scenario, onProgress);\n\n const xhr = new XMLHttpRequest();\n const form = new FormData();\n form.append('file', req.file);\n form.append('categoryId', req.categoryId);\n form.append('localId', req.localId);\n form.append('wizardId', req.wizardId);\n\n let aborted = false;\n const done = new Promise<{ documentId: string }>((resolve, reject) => {\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) onProgress(Math.round((e.loaded / e.total) * 100));\n });\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n resolve({ documentId: JSON.parse(xhr.responseText).documentId });\n } catch {\n reject(genericError());\n }\n } else {\n reject(parseError(xhr.responseText));\n }\n });\n xhr.addEventListener('error', () => reject(genericError()));\n xhr.addEventListener('abort', () => (aborted ? reject(UPLOAD_ABORTED) : reject(genericError())));\n });\n\n xhr.open('POST', `${environment.apiBaseUrl}/api/v1/uploads`);\n xhr.send(form);\n return { done, cancel: () => ((aborted = true), xhr.abort()) };\n }\n}\n\nconst UPLOAD_FAILED = $localize`:@@upload.failed:Uploaden is niet gelukt. Probeer het opnieuw.`;\nconst genericError = (): string => UPLOAD_FAILED;\n\n/**\n * Demo-only (dev): the real XHR POST finishes instantly for metadata, so progress\n * and failure can't otherwise be shown. Drives the progress bar over ~2.5s, then\n * succeeds (`upload-slow`) or fails (`upload-fail`). ponytail: timer-based, cancel\n * via the returned handle; no network.\n */\nfunction simulateUpload(scenario: 'upload-slow' | 'upload-fail', onProgress: (pct: number) => void): XhrUploadHandle {\n let pct = 0;\n let cancelled = false;\n const done = new Promise<{ documentId: string }>((resolve, reject) => {\n const tick = () => {\n if (cancelled) {\n reject(UPLOAD_ABORTED);\n } else if (pct < 100) {\n pct += 10;\n onProgress(Math.min(pct, 100));\n setTimeout(tick, 250);\n } else if (scenario === 'upload-fail') {\n reject(UPLOAD_FAILED);\n } else {\n resolve({ documentId: `demo-${crypto.randomUUID()}` });\n }\n };\n setTimeout(tick, 250);\n });\n return { done, cancel: () => void (cancelled = true) };\n}\nconst parseError = (body: string): string => {\n try {\n return problemDetail(JSON.parse(body), UPLOAD_FAILED);\n } catch {\n return genericError();\n }\n};\n\n/** Wire DTO (all fields optional) → domain. */\nfunction toCategory(c: DocumentCategoryDto): DocumentCategory {\n return {\n categoryId: c.categoryId ?? '',\n label: c.label ?? '',\n description: c.description ?? '',\n required: c.required ?? false,\n acceptedTypes: c.acceptedTypes ?? [],\n maxSizeMb: c.maxSizeMb ?? 0,\n multiple: c.multiple ?? false,\n allowPostDelivery: c.allowPostDelivery ?? false,\n };\n}\n\nfunction toStatusItem(s: UploadStatusItemDto): StatusItem {\n return { localId: s.localId ?? '', status: s.status ?? 'unknown', documentId: s.documentId ?? undefined };\n}\n", + "extends": [], + "type": "injectable" + }, + { + "name": "UploadShellService", + "id": "injectable-UploadShellService-ec4f738d45fc556f5419cef06bad97f2f12a90de63211f79059088a2827ea9ee851b1544ec2110033a7797b65eaeb7caf0d4508fd122384394eaf9a145ffa7f6", + "file": "src/app/shared/upload/upload-shell.service.ts", + "properties": [ + { + "name": "adapter", + "defaultValue": "inject(UploadAdapter)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 36, + "modifierKind": [ + 123 + ] + }, + { + "name": "inflight", + "defaultValue": "new Map void>()", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 37, + "modifierKind": [ + 123 + ] + }, + { + "name": "transport", + "defaultValue": "inject(KeepaliveTransport)", + "deprecated": false, + "deprecationMessage": "", + "type": "UploadTransport", + "indexKey": "", + "optional": false, + "description": "", + "line": 35, + "modifierKind": [ + 123 + ] + } + ], + "methods": [ + { + "name": "cancel", + "args": [ + { + "name": "localIds", + "type": "string[]", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 70, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nCancel any in-flight XHRs (e.g. when a category switches to post-delivery).", + "description": "

Cancel any in-flight XHRs (e.g. when a category switches to post-delivery).

\n", + "jsdoctags": [ + { + "name": "localIds", + "type": "string[]", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "delete", + "args": [ + { + "name": "localId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "dispatch", + "type": "Dispatch", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 61, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nOptimistic delete: mark deleting → complete (removed) / failed (reverted).", + "description": "

Optimistic delete: mark deleting → complete (removed) / failed (reverted).

\n", + "jsdoctags": [ + { + "name": "localId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "dispatch", + "type": "Dispatch", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "pollReturning", + "args": [ + { + "name": "uploads", + "type": "Upload[]", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "dispatch", + "type": "Dispatch", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 78, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nPoll-on-return: ask the BFF which still-in-flight uploads have arrived.", + "description": "

Poll-on-return: ask the BFF which still-in-flight uploads have arrived.

\n", + "modifierKind": [ + 134 + ], + "jsdoctags": [ + { + "name": "uploads", + "type": "Upload[]", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "dispatch", + "type": "Dispatch", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "upload", + "args": [ + { + "name": "req", + "type": "XhrUploadRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "dispatch", + "type": "Dispatch", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 44, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nStart (or retry) an upload: queue → progress → complete/failed.", + "description": "

Start (or retry) an upload: queue → progress → complete/failed.

\n", + "jsdoctags": [ + { + "name": "req", + "type": "XhrUploadRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "dispatch", + "type": "Dispatch", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "description": "

Orchestrates upload effects: drives the transport and translates outcomes into\ndomain messages. Holds no UI state itself — the host wizard's reducer owns it.\nEffects only; the reducer stays pure.

\n", + "rawdescription": "\n\nOrchestrates upload effects: drives the transport and translates outcomes into\ndomain messages. Holds no UI state itself — the host wizard's reducer owns it.\nEffects only; the reducer stays pure.\n", + "sourceCode": "import { Injectable, inject } from '@angular/core';\nimport { UploadAdapter, XhrUploadRequest, XhrUploadHandle, UPLOAD_ABORTED } from './upload.adapter';\nimport { problemDetail } from '@shared/infrastructure/api-error';\nimport { UploadMsg, Upload } from './upload.machine';\n\n/**\n * Transport seam (PRD §6): how upload bytes leave the browser. The shipped impl is\n * KeepaliveTransport (XHR for progress; poll-on-return covers the background gap).\n * A ServiceWorkerTransport would set `backgroundSyncAvailable = true` and survive a\n * closed tab — swapping it in touches only this interface.\n */\nexport interface UploadTransport {\n readonly backgroundSyncAvailable: boolean;\n send(req: XhrUploadRequest, onProgress: (pct: number) => void): XhrUploadHandle;\n}\n\n@Injectable({ providedIn: 'root' })\nclass KeepaliveTransport implements UploadTransport {\n private adapter = inject(UploadAdapter);\n readonly backgroundSyncAvailable = false; // no Service Worker registered in this POC\n send(req: XhrUploadRequest, onProgress: (pct: number) => void) {\n return this.adapter.xhrUpload(req, onProgress);\n }\n}\n\ntype Dispatch = (m: UploadMsg) => void;\n\n/**\n * Orchestrates upload effects: drives the transport and translates outcomes into\n * domain messages. Holds no UI state itself — the host wizard's reducer owns it.\n * Effects only; the reducer stays pure.\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadShellService {\n private transport: UploadTransport = inject(KeepaliveTransport);\n private adapter = inject(UploadAdapter);\n private inflight = new Map void>(); // localId → cancel\n\n get backgroundSyncAvailable(): boolean {\n return this.transport.backgroundSyncAvailable;\n }\n\n /** Start (or retry) an upload: queue → progress → complete/failed. */\n upload(req: XhrUploadRequest, dispatch: Dispatch): void {\n dispatch({ type: 'UploadQueued', localId: req.localId, backgroundSync: this.backgroundSyncAvailable });\n const { done, cancel } = this.transport.send(req, (pct) =>\n dispatch({ type: 'UploadProgress', localId: req.localId, progressPct: pct }),\n );\n this.inflight.set(req.localId, cancel);\n done\n .then(({ documentId }) => dispatch({ type: 'UploadComplete', localId: req.localId, documentId }))\n .catch((e) => {\n if (e !== UPLOAD_ABORTED) {\n dispatch({ type: 'UploadFailed', localId: req.localId, reason: typeof e === 'string' ? e : '' });\n }\n })\n .finally(() => this.inflight.delete(req.localId));\n }\n\n /** Optimistic delete: mark deleting → complete (removed) / failed (reverted). */\n delete(localId: string, documentId: string, dispatch: Dispatch): void {\n dispatch({ type: 'UploadDeleting', localId });\n this.adapter\n .deleteDocument(documentId)\n .then(() => dispatch({ type: 'UploadDeleteComplete', localId }))\n .catch((e) => dispatch({ type: 'UploadDeleteFailed', localId, reason: problemDetail(e, '') }));\n }\n\n /** Cancel any in-flight XHRs (e.g. when a category switches to post-delivery). */\n cancel(localIds: string[]): void {\n for (const id of localIds) {\n this.inflight.get(id)?.();\n this.inflight.delete(id);\n }\n }\n\n /** Poll-on-return: ask the BFF which still-in-flight uploads have arrived. */\n async pollReturning(uploads: Upload[], dispatch: Dispatch): Promise {\n const ids = uploads.map((u) => u.localId);\n if (ids.length === 0) return;\n const items = await this.adapter.status(ids);\n const results = items\n .filter((i) => i.status === 'complete' && i.documentId)\n .map((i) => ({ localId: i.localId, success: true as const, documentId: i.documentId! }));\n if (results.length > 0) dispatch({ type: 'BackgroundUploadsReturned', results });\n }\n}\n", + "accessors": { + "backgroundSyncAvailable": { + "name": "backgroundSyncAvailable", + "getSignature": { + "name": "backgroundSyncAvailable", + "type": "boolean", + "returnType": "boolean", + "line": 39 + } + } }, "extends": [], "type": "injectable" @@ -1934,16 +5707,2029 @@ ], "guards": [], "interceptors": [], - "classes": [], + "classes": [ + { + "name": "ApiClient", + "id": "class-ApiClient-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "file": "src/app/shared/infrastructure/api-client.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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}", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "baseUrl", + "type": "string", + "optional": true, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "http", + "type": "literal type", + "optional": true, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 13, + "jsdoctags": [ + { + "name": "baseUrl", + "type": "string", + "optional": true, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "http", + "type": "literal type", + "optional": true, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "inputsClass": [], + "outputsClass": [], + "properties": [ + { + "name": "baseUrl", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 12, + "modifierKind": [ + 123 + ] + }, + { + "name": "http", + "deprecated": false, + "deprecationMessage": "", + "type": "literal type", + "indexKey": "", + "optional": false, + "description": "", + "line": 11, + "modifierKind": [ + 123 + ] + }, + { + "name": "jsonParseReviver", + "defaultValue": "undefined", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown | undefined", + "indexKey": "", + "optional": false, + "description": "", + "line": 13, + "modifierKind": [ + 124 + ] + } + ], + "methods": [ + { + "name": "address", + "args": [], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 161, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "tagName": { + "pos": 5698, + "end": 5704, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "applicationsAll", + "args": [], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 664, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "tagName": { + "pos": 26154, + "end": 26160, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "applicationsDELETE", + "args": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 827, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 32679, + "end": 32685, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

No Content

\n" + } + ] + }, + { + "name": "applicationsGET", + "args": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 740, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 29161, + "end": 29167, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "applicationsPOST", + "args": [ + { + "name": "body", + "type": "CreateApplicationRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 700, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "body", + "type": "CreateApplicationRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 27580, + "end": 27586, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

Created

\n" + } + ] + }, + { + "name": "applicationsPUT", + "args": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "body", + "type": "DraftSyncRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 783, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "body", + "type": "DraftSyncRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 30975, + "end": 30981, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

No Content

\n" + } + ] + }, + { + "name": "categories", + "args": [ + { + "name": "wizardId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 453, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "wizardId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 17509, + "end": 17515, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "changeRequests", + "args": [ + { + "name": "body", + "type": "ChangeRequestRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 407, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "body", + "type": "ChangeRequestRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 15569, + "end": 15575, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "content", + "args": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 493, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 19176, + "end": 19182, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "dashboardView", + "args": [], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 89, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "tagName": { + "pos": 2943, + "end": 2949, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "diplomas", + "args": [], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 197, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "tagName": { + "pos": 7059, + "end": 7065, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "health", + "args": [], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 23, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "tagName": { + "pos": 732, + "end": 738, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "herregistraties", + "args": [ + { + "name": "body", + "type": "HerregistratieRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 315, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "body", + "type": "HerregistratieRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 11721, + "end": 11727, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "intakes", + "args": [ + { + "name": "body", + "type": "IntakeRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 361, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "body", + "type": "IntakeRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 13665, + "end": 13671, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "notes", + "args": [], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 125, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "tagName": { + "pos": 4337, + "end": 4343, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "policy", + "args": [], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 233, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "tagName": { + "pos": 8420, + "end": 8426, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "processAddress", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 177, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processApplicationsAll", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 680, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processApplicationsDELETE", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 845, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processApplicationsGET", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 759, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processApplicationsPOST", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 720, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processApplicationsPUT", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 805, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processCategories", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 473, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processChangeRequests", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 427, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processContent", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 511, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processDashboardView", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 105, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processDiplomas", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 213, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processHealth", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 38, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processHerregistraties", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 335, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processIntakes", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 381, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processNotes", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 141, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processPolicy", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 249, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processReady", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 71, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processRegistrations", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 289, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processStatus", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 554, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processSubmit", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 896, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processUploads", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 592, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "processUploads2", + "args": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 638, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "response", + "type": "Response", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "ready", + "args": [], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 56, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "tagName": { + "pos": 1836, + "end": 1842, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "registrations", + "args": [ + { + "name": "body", + "type": "RegistratieRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 269, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "body", + "type": "RegistratieRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 9788, + "end": 9794, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "status", + "args": [ + { + "name": "localIds", + "type": "string | undefined", + "optional": true, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 534, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": { + "pos": 20761, + "end": 20769, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "localIds" + }, + "type": "string | undefined", + "optional": true, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "pos": 20755, + "end": 20760, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "param" + }, + "comment": "

(optional)

\n" + }, + { + "tagName": { + "pos": 20790, + "end": 20796, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "submit", + "args": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "body", + "type": "SubmitApplicationRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 873, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "body", + "type": "SubmitApplicationRequest", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 34609, + "end": 34615, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

OK

\n" + } + ] + }, + { + "name": "uploads", + "args": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 574, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 22420, + "end": 22426, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

No Content

\n" + } + ] + }, + { + "name": "uploads2", + "args": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "Promise", + "typeParameters": [], + "line": 620, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\n", + "description": "", + "jsdoctags": [ + { + "name": "documentId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "tagName": { + "pos": 24368, + "end": 24374, + "kind": 80, + "id": 0, + "flags": 16842752, + "transformFlags": 0, + "escapedText": "return" + }, + "comment": "

No Content

\n" + } + ] + } + ], + "indexSignatures": [], + "extends": [], + "hostBindings": [], + "hostListeners": [] + }, + { + "name": "SwaggerException", + "id": "class-SwaggerException-a1ad498742b78fe14a737f5279a8cb20085df1accd308e96e7390969ebddcbf385370aec212ae4e055b4125612916c8f18e66b0c6730a1afbaf49a9d46345a00", + "file": "src/app/shared/infrastructure/api-client.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "class", + "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 * @return OK\n */\n categories(wizardId: string): 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 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\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 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 ManualDiplomaPolicyDto {\n beroepen?: string[] | undefined;\n policyQuestions?: PolicyQuestionDto[] | undefined;\n}\n\nexport interface PersonDto {\n naam?: string | undefined;\n geboortedatum?: string | undefined;\n adres?: AdresDto;\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 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}", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "message", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "status", + "type": "number", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "response", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "headers", + "type": "literal type", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "result", + "type": "any", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 1126, + "jsdoctags": [ + { + "name": "message", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "status", + "type": "number", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "response", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "headers", + "type": "literal type", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "result", + "type": "any", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "inputsClass": [], + "outputsClass": [], + "properties": [ + { + "name": "headers", + "deprecated": false, + "deprecationMessage": "", + "type": "literal type", + "indexKey": "", + "optional": false, + "description": "", + "line": 1125 + }, + { + "name": "isSwaggerException", + "defaultValue": "true", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 1138, + "modifierKind": [ + 124 + ] + }, + { + "name": "message", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 1122, + "modifierKind": [ + 164 + ] + }, + { + "name": "response", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 1124 + }, + { + "name": "result", + "deprecated": false, + "deprecationMessage": "", + "type": "any", + "indexKey": "", + "optional": false, + "description": "", + "line": 1126 + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": false, + "description": "", + "line": 1123 + } + ], + "methods": [ + { + "name": "isSwaggerException", + "args": [ + { + "name": "obj", + "type": "any", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "SwaggerException", + "typeParameters": [], + "line": 1140, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 126 + ], + "jsdoctags": [ + { + "name": "obj", + "type": "any", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "indexSignatures": [], + "extends": [ + "Error" + ], + "hostBindings": [], + "hostListeners": [] + } + ], "directives": [ { "name": "AsyncEmptyDirective", - "id": "directive-AsyncEmptyDirective-0d66d917cda6e95349b21544c6fed09ee792cd86cf353cab9a71395a29342dfc9115ba1a9c915bb1851c09330826035b08479c514c9e47f9a464e03c3f71675c", + "id": "directive-AsyncEmptyDirective-236661e71859f5c0454a4e4738eb6f243025e121cb717699fb57fbe6f0fe3315b80c592d97ce7b250dfcb2ff7650ee1b8fd93c0a007b57706734fb99b2d0ab8d", "file": "src/app/shared/ui/async/async.component.ts", "type": "directive", "description": "", "rawdescription": "\n", - "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n Er ging iets mis bij het laden van de gegevens.\n
\n Opnieuw proberen\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

Geen gegevens gevonden.

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", + "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n {{ errorText() }}\n
\n {{ retryText() }}\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

{{ emptyText() }}

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n // Shared/English component: copy lives behind language-agnostic inputs. Defaults are\n // localizable via $localize (source = default locale, currently nl); callers may override.\n errorText = input($localize`:@@async.error:Er ging iets mis bij het laden van de gegevens.`);\n retryText = input($localize`:@@async.retry:Opnieuw proberen`);\n emptyText = input($localize`:@@async.empty:Geen gegevens gevonden.`);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", "selector": "[appAsyncEmpty]", "providers": [], "hostDirectives": [], @@ -2004,12 +7790,12 @@ }, { "name": "AsyncErrorDirective", - "id": "directive-AsyncErrorDirective-0d66d917cda6e95349b21544c6fed09ee792cd86cf353cab9a71395a29342dfc9115ba1a9c915bb1851c09330826035b08479c514c9e47f9a464e03c3f71675c", + "id": "directive-AsyncErrorDirective-236661e71859f5c0454a4e4738eb6f243025e121cb717699fb57fbe6f0fe3315b80c592d97ce7b250dfcb2ff7650ee1b8fd93c0a007b57706734fb99b2d0ab8d", "file": "src/app/shared/ui/async/async.component.ts", "type": "directive", "description": "", "rawdescription": "\n", - "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n Er ging iets mis bij het laden van de gegevens.\n
\n Opnieuw proberen\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

Geen gegevens gevonden.

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", + "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n {{ errorText() }}\n
\n {{ retryText() }}\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

{{ emptyText() }}

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n // Shared/English component: copy lives behind language-agnostic inputs. Defaults are\n // localizable via $localize (source = default locale, currently nl); callers may override.\n errorText = input($localize`:@@async.error:Er ging iets mis bij het laden van de gegevens.`);\n retryText = input($localize`:@@async.retry:Opnieuw proberen`);\n emptyText = input($localize`:@@async.empty:Geen gegevens gevonden.`);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", "selector": "[appAsyncError]", "providers": [], "hostDirectives": [], @@ -2070,12 +7856,12 @@ }, { "name": "AsyncLoadedDirective", - "id": "directive-AsyncLoadedDirective-0d66d917cda6e95349b21544c6fed09ee792cd86cf353cab9a71395a29342dfc9115ba1a9c915bb1851c09330826035b08479c514c9e47f9a464e03c3f71675c", + "id": "directive-AsyncLoadedDirective-236661e71859f5c0454a4e4738eb6f243025e121cb717699fb57fbe6f0fe3315b80c592d97ce7b250dfcb2ff7650ee1b8fd93c0a007b57706734fb99b2d0ab8d", "file": "src/app/shared/ui/async/async.component.ts", "type": "directive", "description": "", "rawdescription": "\n", - "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n Er ging iets mis bij het laden van de gegevens.\n
\n Opnieuw proberen\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

Geen gegevens gevonden.

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", + "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n {{ errorText() }}\n
\n {{ retryText() }}\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

{{ emptyText() }}

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n // Shared/English component: copy lives behind language-agnostic inputs. Defaults are\n // localizable via $localize (source = default locale, currently nl); callers may override.\n errorText = input($localize`:@@async.error:Er ging iets mis bij het laden van de gegevens.`);\n retryText = input($localize`:@@async.retry:Opnieuw proberen`);\n emptyText = input($localize`:@@async.empty:Geen gegevens gevonden.`);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", "selector": "[appAsyncLoaded]", "providers": [], "hostDirectives": [], @@ -2136,12 +7922,12 @@ }, { "name": "AsyncLoadingDirective", - "id": "directive-AsyncLoadingDirective-0d66d917cda6e95349b21544c6fed09ee792cd86cf353cab9a71395a29342dfc9115ba1a9c915bb1851c09330826035b08479c514c9e47f9a464e03c3f71675c", + "id": "directive-AsyncLoadingDirective-236661e71859f5c0454a4e4738eb6f243025e121cb717699fb57fbe6f0fe3315b80c592d97ce7b250dfcb2ff7650ee1b8fd93c0a007b57706734fb99b2d0ab8d", "file": "src/app/shared/ui/async/async.component.ts", "type": "directive", "description": "", "rawdescription": "\n", - "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n Er ging iets mis bij het laden van de gegevens.\n
\n Opnieuw proberen\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

Geen gegevens gevonden.

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", + "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n {{ errorText() }}\n
\n {{ retryText() }}\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

{{ emptyText() }}

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n // Shared/English component: copy lives behind language-agnostic inputs. Defaults are\n // localizable via $localize (source = default locale, currently nl); callers may override.\n errorText = input($localize`:@@async.error:Er ging iets mis bij het laden van de gegevens.`);\n retryText = input($localize`:@@async.retry:Opnieuw proberen`);\n emptyText = input($localize`:@@async.empty:Geen gegevens gevonden.`);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", "selector": "[appAsyncLoading]", "providers": [], "hostDirectives": [], @@ -2202,9 +7988,215 @@ } ], "components": [ + { + "name": "AanvraagBlockComponent", + "id": "component-AanvraagBlockComponent-0b13f0dc60cb675b8ac4c2139da3d7985139d7fe224ef455aee35aff262a93b65c27245d6dfb5a8d121270894710d1e918512b3150de7a9ee57e498192131f68", + "file": "src/app/registratie/ui/aanvraag-block/aanvraag-block.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-aanvraag-block", + "styleUrls": [], + "styles": [ + "\n .head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--rhc-space-max-md); flex-wrap: wrap; }\n .actions { display: flex; gap: var(--rhc-space-max-md); margin-block-start: var(--rhc-space-max-md); }\n " + ], + "template": "\n
\n {{ typeLabel() }}\n \n
\n\n @switch (aanvraag().status.tag) {\n @case ('Concept') {\n

Stap {{ stap().index }} van {{ stap().count }}

\n }\n @case ('InBehandeling') {\n

Referentie {{ ref() }} · ingediend op {{ aanvraag().submittedAt | date: 'longDate' }}

\n @if (manual()) {\n

Uw aanvraag wordt handmatig beoordeeld in de backoffice.

\n }\n }\n @case ('Goedgekeurd') {\n

Referentie {{ ref() }}

\n }\n @case ('Afgewezen') {\n

Referentie {{ ref() }}

\n

{{ reden() }}

\n }\n }\n\n @if (actions().length) {\n
\n @if (actions().includes('resume')) {\n Verder gaan\n }\n @if (actions().includes('cancel')) {\n Annuleren\n }\n
\n }\n
\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "aanvraag", + "deprecated": false, + "deprecationMessage": "", + "type": "Aanvraag", + "indexKey": "", + "optional": false, + "description": "", + "line": 66, + "required": true + } + ], + "outputsClass": [ + { + "name": "cancel", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 69, + "required": false + }, + { + "name": "resume", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 68, + "required": false + } + ], + "propertiesClass": [ + { + "name": "actions", + "defaultValue": "computed(() => blockActions(this.aanvraag().status))", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 72, + "modifierKind": [ + 124 + ] + }, + { + "name": "badgeColor", + "defaultValue": "computed(() => {\n switch (this.aanvraag().status.tag) {\n case 'Concept': return 'var(--rhc-color-cool-grey-300)';\n case 'InBehandeling': return 'var(--rhc-color-oranje-500)';\n case 'Goedgekeurd': return 'var(--rhc-color-groen-500)';\n case 'Afgewezen': return 'var(--rhc-color-rood-500)';\n }\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 83, + "modifierKind": [ + 124 + ] + }, + { + "name": "badgeLabel", + "defaultValue": "computed(() => {\n switch (this.aanvraag().status.tag) {\n case 'Concept': return $localize`:@@aanvraagBlock.badge.concept:Concept`;\n case 'InBehandeling': return $localize`:@@aanvraagBlock.badge.inBehandeling:In behandeling`;\n case 'Goedgekeurd': return $localize`:@@aanvraagBlock.badge.goedgekeurd:Goedgekeurd`;\n case 'Afgewezen': return $localize`:@@aanvraagBlock.badge.afgewezen:Afgewezen`;\n }\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 75, + "modifierKind": [ + 124 + ] + }, + { + "name": "manual", + "defaultValue": "computed(() => {\n const s = this.aanvraag().status;\n return s.tag === 'InBehandeling' && s.manual;\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 101, + "modifierKind": [ + 124 + ] + }, + { + "name": "reden", + "defaultValue": "computed(() => {\n const s = this.aanvraag().status;\n return s.tag === 'Afgewezen' ? s.reden : '';\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 105, + "modifierKind": [ + 124 + ] + }, + { + "name": "ref", + "defaultValue": "computed(() => {\n const s = this.aanvraag().status;\n return s.tag !== 'Concept' ? s.referentie : '';\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 97, + "modifierKind": [ + 124 + ] + }, + { + "name": "stap", + "defaultValue": "computed(() => {\n const s = this.aanvraag().status;\n return s.tag === 'Concept' ? { index: s.stepIndex + 1, count: s.stepCount } : { index: 0, count: 0 };\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 93, + "modifierKind": [ + 124 + ] + }, + { + "name": "typeLabel", + "defaultValue": "computed(() => TYPE_LABELS[this.aanvraag().type])", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 71, + "modifierKind": [ + 124 + ] + } + ], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "DatePipe", + "type": "pipe" + }, + { + "name": "HeadingComponent", + "type": "component" + }, + { + "name": "StatusBadgeComponent", + "type": "component" + }, + { + "name": "ButtonComponent", + "type": "component" + }, + { + "name": "CardComponent", + "type": "component" + } + ], + "description": "

Organism: one application on the dashboard's "Mijn aanvragen" list. Which badge

\n
    \n
  • actions it shows is driven by the pure blockActions(status) and the status\ntag; the block only renders. Composes card + status-badge + button.
  • \n
\n", + "rawdescription": "\nOrganism: one application on the dashboard's \"Mijn aanvragen\" list. Which badge\n+ actions it shows is driven by the pure `blockActions(status)` and the status\ntag; the block only renders. Composes card + status-badge + button.", + "type": "component", + "sourceCode": "import { Component, computed, input, output } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\nimport { StatusBadgeComponent } from '@shared/ui/status-badge/status-badge.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { CardComponent } from '@shared/ui/card/card.component';\nimport { Aanvraag, AanvraagType } from '@registratie/domain/aanvraag';\nimport { blockActions } from '@registratie/domain/block-actions';\n\nconst TYPE_LABELS: Record = {\n registratie: $localize`:@@aanvraagBlock.type.registratie:Inschrijving`,\n herregistratie: $localize`:@@aanvraagBlock.type.herregistratie:Herregistratie`,\n intake: $localize`:@@aanvraagBlock.type.intake:Herregistratie-intake`,\n};\n\n/** Organism: one application on the dashboard's \"Mijn aanvragen\" list. Which badge\n + actions it shows is driven by the pure `blockActions(status)` and the status\n tag; the block only renders. Composes card + status-badge + button. */\n@Component({\n selector: 'app-aanvraag-block',\n imports: [DatePipe, HeadingComponent, StatusBadgeComponent, ButtonComponent, CardComponent],\n styles: [`\n .head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--rhc-space-max-md); flex-wrap: wrap; }\n .actions { display: flex; gap: var(--rhc-space-max-md); margin-block-start: var(--rhc-space-max-md); }\n `],\n template: `\n \n
\n {{ typeLabel() }}\n \n
\n\n @switch (aanvraag().status.tag) {\n @case ('Concept') {\n

Stap {{ stap().index }} van {{ stap().count }}

\n }\n @case ('InBehandeling') {\n

Referentie {{ ref() }} · ingediend op {{ aanvraag().submittedAt | date: 'longDate' }}

\n @if (manual()) {\n

Uw aanvraag wordt handmatig beoordeeld in de backoffice.

\n }\n }\n @case ('Goedgekeurd') {\n

Referentie {{ ref() }}

\n }\n @case ('Afgewezen') {\n

Referentie {{ ref() }}

\n

{{ reden() }}

\n }\n }\n\n @if (actions().length) {\n
\n @if (actions().includes('resume')) {\n Verder gaan\n }\n @if (actions().includes('cancel')) {\n Annuleren\n }\n
\n }\n
\n `,\n})\nexport class AanvraagBlockComponent {\n aanvraag = input.required();\n\n resume = output();\n cancel = output();\n\n protected typeLabel = computed(() => TYPE_LABELS[this.aanvraag().type]);\n protected actions = computed(() => blockActions(this.aanvraag().status));\n\n // Status-tag → badge presentation (the UI's mapping, not a domain rule).\n protected badgeLabel = computed(() => {\n switch (this.aanvraag().status.tag) {\n case 'Concept': return $localize`:@@aanvraagBlock.badge.concept:Concept`;\n case 'InBehandeling': return $localize`:@@aanvraagBlock.badge.inBehandeling:In behandeling`;\n case 'Goedgekeurd': return $localize`:@@aanvraagBlock.badge.goedgekeurd:Goedgekeurd`;\n case 'Afgewezen': return $localize`:@@aanvraagBlock.badge.afgewezen:Afgewezen`;\n }\n });\n protected badgeColor = computed(() => {\n switch (this.aanvraag().status.tag) {\n case 'Concept': return 'var(--rhc-color-cool-grey-300)';\n case 'InBehandeling': return 'var(--rhc-color-oranje-500)';\n case 'Goedgekeurd': return 'var(--rhc-color-groen-500)';\n case 'Afgewezen': return 'var(--rhc-color-rood-500)';\n }\n });\n\n // Field accessors per tag (the template @switch guarantees the right shape).\n protected stap = computed(() => {\n const s = this.aanvraag().status;\n return s.tag === 'Concept' ? { index: s.stepIndex + 1, count: s.stepCount } : { index: 0, count: 0 };\n });\n protected ref = computed(() => {\n const s = this.aanvraag().status;\n return s.tag !== 'Concept' ? s.referentie : '';\n });\n protected manual = computed(() => {\n const s = this.aanvraag().status;\n return s.tag === 'InBehandeling' && s.manual;\n });\n protected reden = computed(() => {\n const s = this.aanvraag().status;\n return s.tag === 'Afgewezen' ? s.reden : '';\n });\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n .head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--rhc-space-max-md); flex-wrap: wrap; }\n .actions { display: flex; gap: var(--rhc-space-max-md); margin-block-start: var(--rhc-space-max-md); }\n \n", + "extends": [] + }, { "name": "AddressFieldsComponent", - "id": "component-AddressFieldsComponent-1e0b1a46198e647fedabf1bd8f892a2cc7444c7741a9a2454ce1ba38bb7d7b7787621fd7c35778bb545b72b34d355ed53f3a644b2eab266a4a981469c6ea70ba", + "id": "component-AddressFieldsComponent-d490884516bc8cb66cff8f7590026db7300f61f6d03a910f4ad9e35b8967f4d0a64c253d42298b5da3747313c5c44e27cf983756b915eec75ced3508b6e3c6d6", "file": "src/app/registratie/ui/address-fields/address-fields.component.ts", "encapsulation": [], "entryComponents": [], @@ -2213,8 +8205,10 @@ "providers": [], "selector": "app-address-fields", "styleUrls": [], - "styles": [], - "template": "
\n {{ legend() }}\n \n \n \n \n \n \n \n \n \n
\n", + "styles": [ + "\n fieldset{border:0;margin:0;padding:0;min-inline-size:0}\n legend{padding:0;font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-end:var(--rhc-space-max-md)}\n app-form-field + app-form-field{display:block;margin-block-start:var(--rhc-space-max-lg)}\n " + ], + "template": "
\n {{ legend() }}\n \n \n \n \n \n \n \n \n \n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -2228,7 +8222,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 45, + "line": 50, "required": false }, { @@ -2239,19 +8233,19 @@ "indexKey": "", "optional": false, "description": "

Prefix for field ids/labels — keeps them unique if two blocks ever co-exist.

\n", - "line": 47, + "line": 52, "rawdescription": "\nPrefix for field ids/labels — keeps them unique if two blocks ever co-exist.", "required": false }, { "name": "legend", - "defaultValue": "'Adres'", + "defaultValue": "$localize`:@@address.legend:Adres`", "deprecated": false, "deprecationMessage": "", "indexKey": "", "optional": false, "description": "", - "line": 48, + "line": 53, "required": false }, { @@ -2262,7 +8256,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 44, + "line": 49, "required": true } ], @@ -2275,7 +8269,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 49, + "line": 54, "required": false } ], @@ -2303,10 +8297,10 @@ "description": "

Organism: the editable address block (straat / postcode / woonplaats), grouped\nin a fieldset/legend. Pure & presentational — values in via value, errors in\nvia errors, every keystroke out via fieldChange. No store, no services, no\ninternal state; the container owns the Model and decides what a change means\n(registratie-wizard dispatches SetField; change-request-form sets its props).\nComposes the form-field molecule (×3) so labels/error wiring stay consistent.

\n", "rawdescription": "\nOrganism: the editable address block (straat / postcode / woonplaats), grouped\nin a fieldset/legend. Pure & presentational — values in via `value`, errors in\nvia `errors`, every keystroke out via `fieldChange`. No store, no services, no\ninternal state; the container owns the Model and decides what a change means\n(registratie-wizard dispatches SetField; change-request-form sets its props).\nComposes the form-field molecule (×3) so labels/error wiring stay consistent.", "type": "component", - "sourceCode": "import { Component, input, output } 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';\n\nexport interface AdresValue {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\nexport type AdresErrors = Partial>;\n\n/** Organism: the editable address block (straat / postcode / woonplaats), grouped\n in a fieldset/legend. Pure & presentational — values in via `value`, errors in\n via `errors`, every keystroke out via `fieldChange`. No store, no services, no\n internal state; the container owns the Model and decides what a change means\n (registratie-wizard dispatches SetField; change-request-form sets its props).\n Composes the form-field molecule (×3) so labels/error wiring stay consistent. */\n@Component({\n selector: 'app-address-fields',\n imports: [FormsModule, FormFieldComponent, TextInputComponent],\n template: `\n
\n {{ legend() }}\n \n \n \n \n \n \n \n \n \n
\n `,\n})\nexport class AddressFieldsComponent {\n value = input.required();\n errors = input({});\n /** Prefix for field ids/labels — keeps them unique if two blocks ever co-exist. */\n idPrefix = input('adres');\n legend = input('Adres');\n fieldChange = output<{ key: keyof AdresValue; value: string }>();\n}\n", + "sourceCode": "import { Component, input, output } 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';\n\nexport interface AdresValue {\n straat: string;\n postcode: string;\n woonplaats: string;\n}\nexport type AdresErrors = Partial>;\n\n/** Organism: the editable address block (straat / postcode / woonplaats), grouped\n in a fieldset/legend. Pure & presentational — values in via `value`, errors in\n via `errors`, every keystroke out via `fieldChange`. No store, no services, no\n internal state; the container owns the Model and decides what a change means\n (registratie-wizard dispatches SetField; change-request-form sets its props).\n Composes the form-field molecule (×3) so labels/error wiring stay consistent. */\n@Component({\n selector: 'app-address-fields',\n imports: [FormsModule, FormFieldComponent, TextInputComponent],\n styles: [`\n fieldset{border:0;margin:0;padding:0;min-inline-size:0}\n legend{padding:0;font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-end:var(--rhc-space-max-md)}\n app-form-field + app-form-field{display:block;margin-block-start:var(--rhc-space-max-lg)}\n `],\n template: `\n
\n {{ legend() }}\n \n \n \n \n \n \n \n \n \n
\n `,\n})\nexport class AddressFieldsComponent {\n value = input.required();\n errors = input({});\n /** Prefix for field ids/labels — keeps them unique if two blocks ever co-exist. */\n idPrefix = input('adres');\n legend = input($localize`:@@address.legend:Adres`);\n fieldChange = output<{ key: keyof AdresValue; value: string }>();\n}\n", "assetsDirs": [], "styleUrlsData": "", - "stylesData": "", + "stylesData": "\n fieldset{border:0;margin:0;padding:0;min-inline-size:0}\n legend{padding:0;font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-end:var(--rhc-space-max-md)}\n app-form-field + app-form-field{display:block;margin-block-start:var(--rhc-space-max-lg)}\n \n", "extends": [] }, { @@ -2398,7 +8392,7 @@ }, { "name": "AsyncComponent", - "id": "component-AsyncComponent-0d66d917cda6e95349b21544c6fed09ee792cd86cf353cab9a71395a29342dfc9115ba1a9c915bb1851c09330826035b08479c514c9e47f9a464e03c3f71675c", + "id": "component-AsyncComponent-236661e71859f5c0454a4e4738eb6f243025e121cb717699fb57fbe6f0fe3315b80c592d97ce7b250dfcb2ff7650ee1b8fd93c0a007b57706734fb99b2d0ab8d", "file": "src/app/shared/ui/async/async.component.ts", "encapsulation": [], "entryComponents": [], @@ -2408,7 +8402,7 @@ "selector": "app-async", "styleUrls": [], "styles": [], - "template": "
\n@switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n Er ging iets mis bij het laden van de gegevens.\n
\n Opnieuw proberen\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

Geen gegevens gevonden.

}\n }\n @case ('Success') {\n \n }\n}\n
\n", + "template": "
\n@switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n {{ errorText() }}\n
\n {{ retryText() }}\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

{{ emptyText() }}

}\n }\n @case ('Success') {\n \n }\n}\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -2424,6 +8418,28 @@ "line": 72, "required": false }, + { + "name": "emptyText", + "defaultValue": "$localize`:@@async.empty:Geen gegevens gevonden.`", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 79, + "required": false + }, + { + "name": "errorText", + "defaultValue": "$localize`:@@async.error:Er ging iets mis bij het laden van de gegevens.`", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 77, + "required": false + }, { "name": "isEmpty", "defaultValue": "() => false", @@ -2446,6 +8462,17 @@ "description": "", "line": 71, "required": false + }, + { + "name": "retryText", + "defaultValue": "$localize`:@@async.retry:Opnieuw proberen`", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 78, + "required": false } ], "outputsClass": [], @@ -2459,7 +8486,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 77 + "line": 83 }, { "name": "error", @@ -2470,7 +8497,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 93, + "line": 99, "modifierKind": [ 124 ] @@ -2484,7 +8511,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 78 + "line": 84 }, { "name": "loadedTpl", @@ -2495,7 +8522,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 75 + "line": 81 }, { "name": "loadingTpl", @@ -2506,7 +8533,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 76 + "line": 82 }, { "name": "rd", @@ -2517,7 +8544,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 81, + "line": 87, "modifierKind": [ 124 ] @@ -2531,7 +8558,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 97 + "line": 103 }, { "name": "value", @@ -2542,7 +8569,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 90, + "line": 96, "modifierKind": [ 124 ] @@ -2574,7 +8601,7 @@ "description": "

Renders exactly ONE of loading / empty / error / loaded for a signal-based\nresource (e.g. httpResource). Built on a RemoteData tagged union (see\ncore/remote-data.ts), so the states are mutually exclusive by construction —\nthe UI can never show two at once ("impossible states"). Unprovided slots\nfall back to sensible defaults.

\n", "rawdescription": "\n\nRenders exactly ONE of loading / empty / error / loaded for a signal-based\nresource (e.g. httpResource). Built on a RemoteData tagged union (see\ncore/remote-data.ts), so the states are mutually exclusive by construction —\nthe UI can never show two at once (\"impossible states\"). Unprovided slots\nfall back to sensible defaults.\n", "type": "component", - "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n Er ging iets mis bij het laden van de gegevens.\n
\n Opnieuw proberen\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

Geen gegevens gevonden.

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", + "sourceCode": "import { Component, Directive, TemplateRef, computed, contentChild, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport type { Resource } from '@angular/core';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { RemoteData, fromResource, foldRemote } from '@shared/application/remote-data';\n\n/* Slot markers. Put on children of . */\n@Directive({ selector: '[appAsyncLoaded]' })\nexport class AsyncLoadedDirective {\n constructor(public tpl: TemplateRef<{ $implicit: unknown }>) {}\n}\n@Directive({ selector: '[appAsyncLoading]' })\nexport class AsyncLoadingDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncEmpty]' })\nexport class AsyncEmptyDirective {\n constructor(public tpl: TemplateRef) {}\n}\n@Directive({ selector: '[appAsyncError]' })\nexport class AsyncErrorDirective {\n constructor(public tpl: TemplateRef<{ $implicit: Error | undefined; retry: () => void }>) {}\n}\n\n/**\n * Renders exactly ONE of loading / empty / error / loaded for a signal-based\n * resource (e.g. httpResource). Built on a RemoteData tagged union (see\n * core/remote-data.ts), so the states are mutually exclusive by construction —\n * the UI can never show two at once (\"impossible states\"). Unprovided slots\n * fall back to sensible defaults.\n */\n@Component({\n selector: 'app-async',\n imports: [NgTemplateOutlet, SpinnerComponent, AlertComponent, ButtonComponent],\n template: `\n
\n @switch (rd().tag) {\n @case ('Loading') {\n @if (loadingTpl()) { }\n @else { }\n }\n @case ('Failure') {\n @if (errorTpl()) {\n \n } @else {\n {{ errorText() }}\n
\n {{ retryText() }}\n
\n }\n }\n @case ('Empty') {\n @if (emptyTpl()) { }\n @else {

{{ emptyText() }}

}\n }\n @case ('Success') {\n \n }\n }\n
\n `,\n})\nexport class AsyncComponent {\n // Two ways to feed this component:\n // [resource] — a raw httpResource (the common case), or\n // [data] — an already-combined RemoteData (e.g. from a store via map2).\n resource = input>();\n data = input>();\n isEmpty = input<(v: T) => boolean>(() => false);\n\n // Shared/English component: copy lives behind language-agnostic inputs. Defaults are\n // localizable via $localize (source = default locale, currently nl); callers may override.\n errorText = input($localize`:@@async.error:Er ging iets mis bij het laden van de gegevens.`);\n retryText = input($localize`:@@async.retry:Opnieuw proberen`);\n emptyText = input($localize`:@@async.empty:Geen gegevens gevonden.`);\n\n loadedTpl = contentChild.required(AsyncLoadedDirective);\n loadingTpl = contentChild(AsyncLoadingDirective);\n emptyTpl = contentChild(AsyncEmptyDirective);\n errorTpl = contentChild(AsyncErrorDirective);\n\n // Single source of truth: the supplied RemoteData, or the resource projected into one.\n protected rd = computed>(() => {\n const data = this.data();\n if (data) return data;\n const r = this.resource();\n return r ? fromResource(r, this.isEmpty()) : { tag: 'Loading' };\n });\n\n // value/error are pulled out via the exhaustive fold — only Success carries a\n // value, only Failure carries an error, so these can't lie.\n protected value = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: () => undefined, success: (v) => v }),\n );\n protected error = computed(() =>\n foldRemote(this.rd(), { loading: () => undefined, empty: () => undefined, failure: (e) => e, success: () => undefined }),\n );\n\n retry = () => {\n const r = this.resource();\n if (r && 'reload' in r && typeof (r as { reload?: unknown }).reload === 'function') {\n (r as { reload: () => void }).reload();\n }\n };\n}\n\n/** Convenience: import this array to get the wrapper + all slot directives. */\nexport const ASYNC = [\n AsyncComponent, AsyncLoadedDirective, AsyncLoadingDirective,\n AsyncEmptyDirective, AsyncErrorDirective,\n] as const;\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -2582,7 +8609,7 @@ }, { "name": "BreadcrumbComponent", - "id": "component-BreadcrumbComponent-4dedba5c509fabd51900b3062e33290365b01e1fdc64a11c5ce7fe12f20201b340d7fcfbe61254b0d0b7a386ab40a29795bd467542fb1a353f4d9bda46e65688", + "id": "component-BreadcrumbComponent-7a679e70f2a541a876a02dd5999150ec5793ddf654bc902768c5252ea53b8996450966dfd31873d31e9d849880b3d6358b90711564a19f4c228576bc2214e19c", "file": "src/app/shared/layout/breadcrumb/breadcrumb.component.ts", "encapsulation": [], "entryComponents": [], @@ -2592,9 +8619,9 @@ "selector": "app-breadcrumb", "styleUrls": [], "styles": [ - "\n :host{display:block}\n .list{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md);align-items:center;list-style:none;margin:0;padding:0}\n .sep{color:var(--rhc-color-foreground-subtle)}\n " + "\n :host{display:block}\n .list{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md);align-items:center;list-style:none;margin:0;padding:0;font-size:var(--rhc-text-font-size-sm)}\n .crumb{display:inline-flex;align-items:center;gap:var(--rhc-space-max-md)}\n a{color:var(--rhc-color-foreground-link);text-decoration:underline}\n a:hover{color:var(--rhc-color-foreground-link-hover)}\n .current{color:var(--rhc-color-foreground-subtle)}\n .sep{color:var(--rhc-color-foreground-subtle)}\n /* Inverse: on the blue header bar, everything is white. */\n :host(.inverse) a,\n :host(.inverse) .current,\n :host(.inverse) .sep { color: var(--rhc-color-foreground-on-primary); }\n " ], - "template": "
\n", + "template": "\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -2607,7 +8634,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 38, + "line": 46, "required": true } ], @@ -2627,10 +8654,10 @@ "description": "

Chrome: breadcrumb navigation. Renders the RHC/Utrecht breadcrumb pattern; the\nlast item is the current page (no link, aria-current). Domain-free — the caller\nsupplies the trail.

\n", "rawdescription": "\nChrome: breadcrumb navigation. Renders the RHC/Utrecht breadcrumb pattern; the\nlast item is the current page (no link, aria-current). Domain-free — the caller\nsupplies the trail.", "type": "component", - "sourceCode": "import { Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nexport interface BreadcrumbItem {\n label: string;\n link?: string; // omit on the current (last) page\n}\n\n/** Chrome: breadcrumb navigation. Renders the RHC/Utrecht breadcrumb pattern; the\n last item is the current page (no link, aria-current). Domain-free — the caller\n supplies the trail. */\n@Component({\n selector: 'app-breadcrumb',\n imports: [RouterLink],\n styles: [`\n :host{display:block}\n .list{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md);align-items:center;list-style:none;margin:0;padding:0}\n .sep{color:var(--rhc-color-foreground-subtle)}\n `],\n template: `\n \n `,\n})\nexport class BreadcrumbComponent {\n items = input.required();\n}\n", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\nexport interface BreadcrumbItem {\n label: string;\n link?: string; // omit on the current (last) page\n}\n\n/** Chrome: breadcrumb navigation. Renders the RHC/Utrecht breadcrumb pattern; the\n last item is the current page (no link, aria-current). Domain-free — the caller\n supplies the trail. */\n@Component({\n selector: 'app-breadcrumb',\n imports: [RouterLink],\n styles: [`\n :host{display:block}\n .list{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md);align-items:center;list-style:none;margin:0;padding:0;font-size:var(--rhc-text-font-size-sm)}\n .crumb{display:inline-flex;align-items:center;gap:var(--rhc-space-max-md)}\n a{color:var(--rhc-color-foreground-link);text-decoration:underline}\n a:hover{color:var(--rhc-color-foreground-link-hover)}\n .current{color:var(--rhc-color-foreground-subtle)}\n .sep{color:var(--rhc-color-foreground-subtle)}\n /* Inverse: on the blue header bar, everything is white. */\n :host(.inverse) a,\n :host(.inverse) .current,\n :host(.inverse) .sep { color: var(--rhc-color-foreground-on-primary); }\n `],\n template: `\n \n `,\n})\nexport class BreadcrumbComponent {\n items = input.required();\n}\n", "assetsDirs": [], "styleUrlsData": "", - "stylesData": "\n :host{display:block}\n .list{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md);align-items:center;list-style:none;margin:0;padding:0}\n .sep{color:var(--rhc-color-foreground-subtle)}\n \n", + "stylesData": "\n :host{display:block}\n .list{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md);align-items:center;list-style:none;margin:0;padding:0;font-size:var(--rhc-text-font-size-sm)}\n .crumb{display:inline-flex;align-items:center;gap:var(--rhc-space-max-md)}\n a{color:var(--rhc-color-foreground-link);text-decoration:underline}\n a:hover{color:var(--rhc-color-foreground-link-hover)}\n .current{color:var(--rhc-color-foreground-subtle)}\n .sep{color:var(--rhc-color-foreground-subtle)}\n /* Inverse: on the blue header bar, everything is white. */\n :host(.inverse) a,\n :host(.inverse) .current,\n :host(.inverse) .sep { color: var(--rhc-color-foreground-on-primary); }\n \n", "extends": [] }, { @@ -2704,9 +8731,75 @@ "stylesData": "", "extends": [] }, + { + "name": "CardComponent", + "id": "component-CardComponent-28ba094b40cae577b35a24e807be0900ed350103bdb95ec0c4c527492fa1574546b2cfce715df5e95cc91eda72c1823d01aadf7643c486f64bcc137ad5a6442d", + "file": "src/app/shared/ui/card/card.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-card", + "styleUrls": [], + "styles": [ + "\n :host{display:block;block-size:100%}\n .card{\n background:var(--rhc-color-wit);\n border:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-radius:var(--rhc-border-radius-md);\n padding:var(--rhc-space-max-xl);\n block-size:100%;\n box-sizing:border-box;\n }\n .card > * + *{margin-block-start:var(--rhc-space-max-md)}\n " + ], + "template": "
\n @if (heading()) { {{ heading() }} }\n \n
\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "heading", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 30, + "required": false + }, + { + "name": "level", + "defaultValue": "3", + "deprecated": false, + "deprecationMessage": "", + "type": "1 | 2 | 3 | 4 | 5", + "indexKey": "", + "optional": false, + "description": "", + "line": 31, + "required": false + } + ], + "outputsClass": [], + "propertiesClass": [], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "HeadingComponent", + "type": "component" + } + ], + "description": "

Molecule: a content card. Standardises the repeated card surface (white,\nsubtle border, rounded, padded) so pages compose cards instead of hand-rolling\n<div class="rhc-card">. Optional heading; the rest is projected.

\n", + "rawdescription": "\nMolecule: a content card. Standardises the repeated card surface (white,\nsubtle border, rounded, padded) so pages compose cards instead of hand-rolling\n`
`. Optional heading; the rest is projected.", + "type": "component", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\n\n/** Molecule: a content card. Standardises the repeated card surface (white,\n subtle border, rounded, padded) so pages compose cards instead of hand-rolling\n `
`. Optional heading; the rest is projected. */\n@Component({\n selector: 'app-card',\n imports: [HeadingComponent],\n styles: [`\n :host{display:block;block-size:100%}\n .card{\n background:var(--rhc-color-wit);\n border:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-radius:var(--rhc-border-radius-md);\n padding:var(--rhc-space-max-xl);\n block-size:100%;\n box-sizing:border-box;\n }\n .card > * + *{margin-block-start:var(--rhc-space-max-md)}\n `],\n template: `\n
\n @if (heading()) { {{ heading() }} }\n \n
\n `,\n})\nexport class CardComponent {\n heading = input();\n level = input<1 | 2 | 3 | 4 | 5>(3);\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host{display:block;block-size:100%}\n .card{\n background:var(--rhc-color-wit);\n border:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-radius:var(--rhc-border-radius-md);\n padding:var(--rhc-space-max-xl);\n block-size:100%;\n box-sizing:border-box;\n }\n .card > * + *{margin-block-start:var(--rhc-space-max-md)}\n \n", + "extends": [] + }, { "name": "ChangeRequestFormComponent", - "id": "component-ChangeRequestFormComponent-38a13207972e7e101ba989ca2fe390d3a6f353165e03bc0434fe9785b321fba0e953ae0b969ca459acee20e21173dcb190fb46590517af703b89243b5dd45aba", + "id": "component-ChangeRequestFormComponent-2b189f2319722ef528b9be6c195261fdc0ca66c3ca95b06e336b69025fdad9101f4f7f3ee871670f8d43e6d7ab58f08aa36341035b0594af54875d0eca921fc1", "file": "src/app/registratie/ui/change-request-form/change-request-form.component.ts", "encapsulation": [], "entryComponents": [], @@ -2716,123 +8809,211 @@ "selector": "app-change-request-form", "styleUrls": [], "styles": [], - "template": "Adreswijziging doorgeven\n
\n \n
\n Wijziging indienen\n
\n\n", + "template": "@if (state().tag === 'Submitted') {\n \n Uw adreswijziging is ontvangen (referentie {{ referentie() }}). U ontvangt binnen 5 werkdagen bericht.\n \n
\n Nieuwe wijziging doorgeven\n
\n} @else {\n Adreswijziging doorgeven\n
\n \n\n @if (failedError()) {\n Het indienen is niet gelukt: {{ failedError() }}\n }\n\n \n {{ state().tag === 'Submitting' ? submitBezigLabel : submitLabel }}\n \n \n}\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], - "inputsClass": [], - "outputsClass": [ + "inputsClass": [ { - "name": "submitted", + "name": "seed", + "defaultValue": "initial", "deprecated": false, "deprecationMessage": "", - "type": "ChangeRequest", + "type": "State", "indexKey": "", "optional": false, - "description": "", - "line": 42, + "description": "

Optional seed so Storybook / tests can mount any state directly.

\n", + "line": 54, + "rawdescription": "\nOptional seed so Storybook / tests can mount any state directly.", "required": false } ], + "outputsClass": [], "propertiesClass": [ { - "name": "city", - "defaultValue": "''", + "name": "adres", + "defaultValue": "computed(() => {\n const s = this.state();\n if (s.tag === 'Editing') return s.draft;\n if (s.tag === 'Submitting' || s.tag === 'Failed') {\n return { straat: s.data.straat, postcode: s.data.postcode, woonplaats: s.data.woonplaats };\n }\n return { straat: '', postcode: '', woonplaats: '' }; // Submitted shows the success alert, not the fields\n })", "deprecated": false, "deprecationMessage": "", - "type": "string", + "type": "unknown", "indexKey": "", "optional": false, - "description": "", - "line": 39 + "description": "

The address shown in the fields — the live draft while editing, the parsed\ndata while submitting/failed (so the user sees what they sent).

\n", + "line": 69, + "rawdescription": "\nThe address shown in the fields — the live draft while editing, the parsed\ndata while submitting/failed (so the user sees what they sent).", + "modifierKind": [ + 124 + ] }, { - "name": "street", - "defaultValue": "''", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 37 - }, - { - "name": "streetError", - "defaultValue": "signal('')", + "name": "apiClient", + "defaultValue": "inject(ApiClient)", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 40 + "line": 50, + "modifierKind": [ + 123 + ] }, { - "name": "zip", - "defaultValue": "''", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "indexKey": "", - "optional": false, - "description": "", - "line": 38 - }, - { - "name": "zipError", - "defaultValue": "signal('')", + "name": "dispatch", + "defaultValue": "this.store.dispatch", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 41 + "line": 57, + "modifierKind": [ + 124 + ] + }, + { + "name": "editing", + "defaultValue": "computed(() => whenTag(this.state(), 'Editing'))", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 62, + "modifierKind": [ + 123 + ] + }, + { + "name": "errors", + "defaultValue": "computed(() => this.editing()?.errors ?? {})", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 63, + "modifierKind": [ + 124 + ] + }, + { + "name": "failedError", + "defaultValue": "computed(() => whenTag(this.state(), 'Failed')?.error ?? '')", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 64, + "modifierKind": [ + 124 + ] + }, + { + "name": "referentie", + "defaultValue": "computed(() => whenTag(this.state(), 'Submitted')?.referentie ?? '')", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 65, + "modifierKind": [ + 124 + ] + }, + { + "name": "state", + "defaultValue": "this.store.model", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 56, + "modifierKind": [ + 148 + ] + }, + { + "name": "store", + "defaultValue": "createStore(initial, reduce)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 51, + "modifierKind": [ + 123 + ] + }, + { + "name": "submitBezigLabel", + "defaultValue": "$localize`:@@changeRequest.submitBezig:Bezig met indienen…`", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 60, + "modifierKind": [ + 124, + 148 + ] + }, + { + "name": "submitLabel", + "defaultValue": "$localize`:@@changeRequest.submit:Wijziging indienen`", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 59, + "modifierKind": [ + 124, + 148 + ] } ], "methodsClass": [ - { - "name": "onAdres", - "args": [ - { - "name": "e", - "type": "literal type", - "optional": false, - "dotDotDotToken": false, - "deprecated": false, - "deprecationMessage": "" - } - ], - "optional": false, - "returnType": "void", - "typeParameters": [], - "line": 44, - "deprecated": false, - "deprecationMessage": "", - "jsdoctags": [ - { - "name": "e", - "type": "literal type", - "optional": false, - "dotDotDotToken": false, - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "onSubmit", "args": [], "optional": false, "returnType": "void", "typeParameters": [], - "line": 50, + "line": 82, "deprecated": false, "deprecationMessage": "" + }, + { + "name": "runIfSubmitting", + "args": [], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 88, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nEffect: when we entered Submitting, call the command, then dispatch the outcome.", + "description": "

Effect: when we entered Submitting, call the command, then dispatch the outcome.

\n", + "modifierKind": [ + 123, + 134 + ] } ], "deprecated": false, @@ -2841,10 +9022,6 @@ "hostListeners": [], "standalone": false, "imports": [ - { - "name": "FormsModule", - "type": "module" - }, { "name": "ButtonComponent", "type": "component" @@ -2853,18 +9030,30 @@ "name": "HeadingComponent", "type": "component" }, + { + "name": "AlertComponent", + "type": "component" + }, { "name": "AddressFieldsComponent", "type": "component" } ], - "description": "

Organism: change-request (adreswijziging) form. Reuses the same form-field\nmolecule + text-input/button atoms as the login form. Field errors come\nstraight from the parser's Result — no parallel "is it valid" flag to drift.

\n", - "rawdescription": "\nOrganism: change-request (adreswijziging) form. Reuses the same form-field\nmolecule + text-input/button atoms as the login form. Field errors come\nstraight from the parser's Result — no parallel \"is it valid\" flag to drift.", + "description": "

Organism: change-request (adreswijziging) form. Uses the SAME idiom as the\nwizards — all state in one signal driven by the pure reduce\n(change-request.machine.ts), submitted via a submit-* command returning\nResult. Renders the shared <app-address-fields>; the server re-validates.

\n", + "rawdescription": "\n\nOrganism: change-request (adreswijziging) form. Uses the SAME idiom as the\nwizards — all state in one signal driven by the pure `reduce`\n(change-request.machine.ts), submitted via a `submit-*` command returning\n`Result`. Renders the shared ``; the server re-validates.\n", "type": "component", - "sourceCode": "import { Component, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\nimport { AddressFieldsComponent, AdresValue } from '@registratie/ui/address-fields/address-fields.component';\nimport { Postcode, parsePostcode } from '@registratie/domain/value-objects/postcode';\n\n/** A submitted change request carries a *parsed* postcode (branded Postcode),\n not a raw string — downstream code can't receive an unvalidated one. */\nexport interface ChangeRequest {\n street: string;\n zip: Postcode;\n city: string;\n}\n\n/** Organism: change-request (adreswijziging) form. Reuses the same form-field\n molecule + text-input/button atoms as the login form. Field errors come\n straight from the parser's Result — no parallel \"is it valid\" flag to drift. */\n@Component({\n selector: 'app-change-request-form',\n imports: [FormsModule, ButtonComponent, HeadingComponent, AddressFieldsComponent],\n template: `\n Adreswijziging doorgeven\n
\n \n
\n Wijziging indienen\n
\n \n `,\n})\nexport class ChangeRequestFormComponent {\n street = '';\n zip = '';\n city = '';\n streetError = signal('');\n zipError = signal('');\n submitted = output();\n\n onAdres(e: { key: keyof AdresValue; value: string }) {\n if (e.key === 'straat') this.street = e.value;\n else if (e.key === 'postcode') this.zip = e.value;\n else this.city = e.value;\n }\n\n onSubmit() {\n const street = this.street.trim();\n this.streetError.set(street ? '' : 'Vul straat en huisnummer in.');\n\n const postcode = parsePostcode(this.zip);\n this.zipError.set(postcode.ok ? '' : postcode.error);\n\n if (!street || !postcode.ok) return;\n this.submitted.emit({ street, zip: postcode.value, city: this.city.trim() });\n }\n}\n", + "sourceCode": "import { Component, computed, inject, input } from '@angular/core';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { AddressFieldsComponent, AdresValue, AdresErrors } from '@registratie/ui/address-fields/address-fields.component';\nimport { createStore } from '@shared/application/store';\nimport { whenTag } from '@shared/kernel/fp';\nimport { State, Msg, initial, reduce } from '@registratie/domain/change-request.machine';\nimport { submitChangeRequest } from '@registratie/application/submit-change-request';\nimport { ApiClient } from '@shared/infrastructure/api-client';\n\n/**\n * Organism: change-request (adreswijziging) form. Uses the SAME idiom as the\n * wizards — all state in one signal driven by the pure `reduce`\n * (change-request.machine.ts), submitted via a `submit-*` command returning\n * `Result`. Renders the shared ``; the server re-validates.\n */\n@Component({\n selector: 'app-change-request-form',\n imports: [ButtonComponent, HeadingComponent, AlertComponent, AddressFieldsComponent],\n template: `\n @if (state().tag === 'Submitted') {\n \n Uw adreswijziging is ontvangen (referentie {{ referentie() }}). U ontvangt binnen 5 werkdagen bericht.\n \n
\n Nieuwe wijziging doorgeven\n
\n } @else {\n Adreswijziging doorgeven\n
\n \n\n @if (failedError()) {\n Het indienen is niet gelukt: {{ failedError() }}\n }\n\n \n {{ state().tag === 'Submitting' ? submitBezigLabel : submitLabel }}\n \n \n }\n `,\n})\nexport class ChangeRequestFormComponent {\n private apiClient = inject(ApiClient);\n private store = createStore(initial, reduce);\n\n /** Optional seed so Storybook / tests can mount any state directly. */\n seed = input(initial);\n\n readonly state = this.store.model;\n protected dispatch = this.store.dispatch;\n\n protected readonly submitLabel = $localize`:@@changeRequest.submit:Wijziging indienen`;\n protected readonly submitBezigLabel = $localize`:@@changeRequest.submitBezig:Bezig met indienen…`;\n\n private editing = computed(() => whenTag(this.state(), 'Editing'));\n protected errors = computed(() => this.editing()?.errors ?? {});\n protected failedError = computed(() => whenTag(this.state(), 'Failed')?.error ?? '');\n protected referentie = computed(() => whenTag(this.state(), 'Submitted')?.referentie ?? '');\n\n /** The address shown in the fields — the live draft while editing, the parsed\n data while submitting/failed (so the user sees what they sent). */\n protected adres = computed(() => {\n const s = this.state();\n if (s.tag === 'Editing') return s.draft;\n if (s.tag === 'Submitting' || s.tag === 'Failed') {\n return { straat: s.data.straat, postcode: s.data.postcode, woonplaats: s.data.woonplaats };\n }\n return { straat: '', postcode: '', woonplaats: '' }; // Submitted shows the success alert, not the fields\n });\n\n constructor() {\n queueMicrotask(() => this.dispatch({ tag: 'Seed', state: this.seed() }));\n }\n\n onSubmit() {\n this.dispatch({ tag: 'Submit' });\n this.runIfSubmitting();\n }\n\n /** Effect: when we entered Submitting, call the command, then dispatch the outcome. */\n private async runIfSubmitting() {\n const s = this.state();\n if (s.tag !== 'Submitting') return;\n const r = await submitChangeRequest(this.apiClient, s.data);\n if (r.ok) this.dispatch({ tag: 'SubmitConfirmed', referentie: r.value });\n else this.dispatch({ tag: 'SubmitFailed', error: r.error });\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [], + "line": 76 + }, "extends": [] }, { @@ -3064,7 +9253,7 @@ }, { "name": "DashboardPage", - "id": "component-DashboardPage-ddf78634bc64a1bb22179e940266e3f66193d863c79e6dd2b9322cbbbcaf1ace61e0c99e90ffc2f87633af10da911231bf12249e484ed1a834c2d6e13a643a75", + "id": "component-DashboardPage-a356f8cd540e446b51f9be57102ba39ddf786b0ddc383152e85b6cc8cf1751c97b59748075b208523843aab83bc5993d002c63f92a73ec331732414ccb71ea99", "file": "src/app/registratie/ui/dashboard.page.ts", "encapsulation": [], "entryComponents": [], @@ -3074,13 +9263,119 @@ "selector": "app-dashboard-page", "styleUrls": [], "styles": [], - "template": "\n @if (store.pendingHerregistratie()) {\n Uw herregistratie-aanvraag is in behandeling.\n }\n\n \n \n \n \n
\n Persoonsgegevens (BRP)\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

U heeft nog geen specialismen of aantekeningen.

\n
\n
\n
\n\n

\n Inschrijven in het BIG-register (registratiewizard) →\n

\n

\n Gegevens bekijken of een wijziging doorgeven →\n

\n

\n Herregistratie aanvragen →\n

\n

\n Herregistratie-intake (vragenlijst met vertakkingen) →\n

\n

\n Functionele patronen (impossible states) →\n

\n
\n", + "template": "\n
\n \n\n
\n @if (aanvragen().length) {\n
\n Mijn aanvragen\n
\n @for (a of aanvragen(); track a.id) {\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 Wat moet ik regelen\n @if (tasks.length) {\n \n } @else {\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

    {{ a.tekst }}

    \n {{ a.actie }} →\n
    \n
  • \n }\n
\n
\n
\n
\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], "inputsClass": [], "outputsClass": [], "propertiesClass": [ + { + "name": "aanvragen", + "defaultValue": "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 })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

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

\n", + "line": 132, + "rawdescription": "\nThe user's applications, sorted Concept → In behandeling → resolved. Empty →\nthe \"Mijn aanvragen\" section is hidden (see template).", + "modifierKind": [ + 124 + ] + }, + { + "name": "acties", + "defaultValue": "[\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 ]", + "deprecated": false, + "deprecationMessage": "", + "type": "[]", + "indexKey": "", + "optional": false, + "description": "

Primary transactional actions, as a card grid.

\n", + "line": 171, + "rawdescription": "\nPrimary transactional actions, as a card grid.", + "modifierKind": [ + 124, + 148 + ] + }, + { + "name": "apps", + "defaultValue": "inject(ApplicationsStore)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 121, + "modifierKind": [ + 123 + ] + }, + { + "name": "eligible", + "defaultValue": "computed(() => {\n const d = this.store.decisions();\n return d.tag === 'Success' && d.value.eligibleForHerregistratie;\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

Server-computed eligibility (rendered, not recomputed).

\n", + "line": 152, + "rawdescription": "\nServer-computed eligibility (rendered, not recomputed).", + "modifierKind": [ + 123, + 148 + ] + }, + { + "name": "nav", + "defaultValue": "[\n { label: $localize`:@@dashboard.nav.overzicht:Overzicht`, to: '/dashboard' },\n { label: $localize`:@@dashboard.nav.gegevens:Mijn gegevens`, to: '/registratie' },\n { label: $localize`:@@dashboard.nav.herregistratie:Herregistratie`, to: '/herregistratie' },\n { label: $localize`:@@dashboard.nav.inschrijven:Inschrijven`, to: '/registreren' },\n { label: $localize`:@@dashboard.nav.concepten:Functionele patronen`, to: '/concepts' },\n ]", + "deprecated": false, + "deprecationMessage": "", + "type": "NavItem[]", + "indexKey": "", + "optional": false, + "description": "

Portal sections (navigation, not actions).

\n", + "line": 162, + "rawdescription": "\nPortal sections (navigation, not actions).", + "modifierKind": [ + 124, + 148 + ] + }, + { + "name": "resumeRoutes", + "defaultValue": "{\n registratie: '/registreren',\n herregistratie: '/herregistratie',\n intake: '/intake',\n }", + "deprecated": false, + "deprecationMessage": "", + "type": "Record", + "indexKey": "", + "optional": false, + "description": "", + "line": 139, + "modifierKind": [ + 123, + 148 + ] + }, + { + "name": "router", + "defaultValue": "inject(Router)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 122, + "modifierKind": [ + 123 + ] + }, { "name": "store", "defaultValue": "inject(BigProfileStore)", @@ -3090,13 +9385,119 @@ "indexKey": "", "optional": false, "description": "", - "line": 77, + "line": 120, "modifierKind": [ 124 ] } ], - "methodsClass": [], + "methodsClass": [ + { + "name": "cancelAanvraag", + "args": [ + { + "name": "a", + "type": "Aanvraag", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 147, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "a", + "type": "Aanvraag", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "resume", + "args": [ + { + "name": "a", + "type": "Aanvraag", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 144, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "a", + "type": "Aanvraag", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "tasksFor", + "args": [ + { + "name": "reg", + "type": "Registration", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 157, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "reg", + "type": "Registration", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], "deprecated": false, "deprecationMessage": "", "hostBindings": [], @@ -3127,6 +9528,18 @@ "name": "DataRowComponent", "type": "component" }, + { + "name": "CardComponent", + "type": "component" + }, + { + "name": "TaskListComponent", + "type": "component" + }, + { + "name": "SideNavComponent", + "type": "component" + }, { "name": "ASYNC" }, @@ -3137,15 +9550,27 @@ { "name": "RegistrationTableComponent", "type": "component" + }, + { + "name": "AanvraagBlockComponent", + "type": "component" } ], - "description": "", - "rawdescription": "\n", + "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, inject } from '@angular/core';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\nimport { LinkComponent } from '@shared/ui/link/link.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 { 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 { BigProfileStore } from '@registratie/application/big-profile.store';\n\n@Component({\n selector: 'app-dashboard-page',\n imports: [\n PageShellComponent, HeadingComponent, LinkComponent, AlertComponent, SkeletonComponent,\n DataRowComponent, ...ASYNC, RegistrationSummaryComponent, RegistrationTableComponent,\n ],\n template: `\n \n @if (store.pendingHerregistratie()) {\n Uw herregistratie-aanvraag is in behandeling.\n }\n\n \n \n \n \n
\n Persoonsgegevens (BRP)\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

U heeft nog geen specialismen of aantekeningen.

\n
\n
\n
\n\n

\n Inschrijven in het BIG-register (registratiewizard) →\n

\n

\n Gegevens bekijken of een wijziging doorgeven →\n

\n

\n Herregistratie aanvragen →\n

\n

\n Herregistratie-intake (vragenlijst met vertakkingen) →\n

\n

\n Functionele patronen (impossible states) →\n

\n
\n `,\n})\nexport class DashboardPage {\n protected store = inject(BigProfileStore);\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 { LinkComponent } from '@shared/ui/link/link.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 { SideNavComponent, NavItem } from '@shared/layout/side-nav/side-nav.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, LinkComponent, AlertComponent, SkeletonComponent,\n DataRowComponent, CardComponent, TaskListComponent, SideNavComponent, ...ASYNC,\n RegistrationSummaryComponent, RegistrationTableComponent, AanvraagBlockComponent,\n ],\n template: `\n \n
\n \n\n
\n @if (aanvragen().length) {\n
\n Mijn aanvragen\n
\n @for (a of aanvragen(); track a.id) {\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 Wat moet ik regelen\n @if (tasks.length) {\n \n } @else {\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

    {{ a.tekst }}

    \n {{ a.actie }} →\n
    \n
  • \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\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 /** Portal sections (navigation, not actions). */\n protected readonly nav: NavItem[] = [\n { label: $localize`:@@dashboard.nav.overzicht:Overzicht`, to: '/dashboard' },\n { label: $localize`:@@dashboard.nav.gegevens:Mijn gegevens`, to: '/registratie' },\n { label: $localize`:@@dashboard.nav.herregistratie:Herregistratie`, to: '/herregistratie' },\n { label: $localize`:@@dashboard.nav.inschrijven:Inschrijven`, to: '/registreren' },\n { label: $localize`:@@dashboard.nav.concepten:Functionele patronen`, to: '/concepts' },\n ];\n\n /** Primary transactional actions, as a card grid. */\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 ];\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [], + "line": 122 + }, "extends": [] }, { @@ -3209,9 +9634,956 @@ "stylesData": ":host:last-child .rhc-data-summary__item { border-block-end-style: none; }\n", "extends": [] }, + { + "name": "DebugStateComponent", + "id": "component-DebugStateComponent-7e7765f613931e7b5eb6286e7e41437a0322d9ae61ccfabc084ff438baf46272b7120c2ba038f55b6cd77912ddf434bf4ff352a5d70b67f3e9e7bdb48c0f8c02", + "file": "src/app/shared/ui/debug-state/debug-state.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-debug-state", + "styleUrls": [], + "styles": [ + "\n .fab{position:fixed;bottom:1rem;right:1rem;z-index:9999;font:600 12px/1 monospace;\n background:#1e1e1e;color:#9cdcfe;border:1px solid #444;border-radius:4px;\n padding:.5rem .75rem;cursor:pointer}\n .panel{position:fixed;bottom:3.25rem;right:1rem;z-index:9999;width:min(90vw,28rem);\n max-height:70vh;overflow:auto;background:#1e1e1e;color:#d4d4d4;border:1px solid #444;\n border-radius:6px;box-shadow:0 6px 24px rgba(0,0,0,.4)}\n .panel pre{margin:0;padding:.75rem;font:12px/1.5 monospace;white-space:pre-wrap;\n word-break:break-word}\n " + ], + "template": "@if (isDev) {\n \n @if (visible()) {\n
{{ snapshot() | json }}
\n }\n}\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [], + "outputsClass": [], + "propertiesClass": [ + { + "name": "injector", + "defaultValue": "inject(Injector)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 47, + "modifierKind": [ + 123 + ] + }, + { + "name": "isDev", + "defaultValue": "isDevMode()", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 43, + "modifierKind": [ + 124, + 148 + ] + }, + { + "name": "profileStore", + "deprecated": false, + "deprecationMessage": "", + "type": "BigProfileStore", + "indexKey": "", + "optional": true, + "description": "", + "line": 50, + "modifierKind": [ + 123 + ] + }, + { + "name": "session", + "defaultValue": "inject(SessionStore)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 46, + "modifierKind": [ + 123 + ] + }, + { + "name": "snapshot", + "defaultValue": "computed(() => ({\n session: maskSession(this.session.session()),\n profile: this.profileStore ? map(this.profileStore.profile(), redactProfile) : undefined,\n decisions: this.profileStore?.decisions(),\n aantekeningen: this.profileStore?.aantekeningen(),\n pendingHerregistratie: this.profileStore?.pendingHerregistratie(),\n }))", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 54, + "modifierKind": [ + 124, + 148 + ] + }, + { + "name": "visible", + "defaultValue": "signal(false)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 44, + "modifierKind": [ + 124, + 148 + ] + } + ], + "methodsClass": [ + { + "name": "toggle", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 62, + "deprecated": false, + "deprecationMessage": "" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "JsonPipe", + "type": "pipe" + } + ], + "description": "

Dev-only "show the current Model" panel (Elm-debugger style, read-only).\nObserves the root singletons and renders them via the json pipe. Never a\nproduct feature: the whole template is gated by isDevMode(), so it does not\nrender and is unreachable in a production build.

\n

ponytail: dev tool — intentionally off-theme (not Rijkshuisstijl) and exempt\nfrom the design-token convention; plain values keep it visually distinct.

\n", + "rawdescription": "\n\nDev-only \"show the current Model\" panel (Elm-debugger style, read-only).\nObserves the root singletons and renders them via the json pipe. Never a\nproduct feature: the whole template is gated by isDevMode(), so it does not\nrender and is unreachable in a production build.\n\nponytail: dev tool — intentionally off-theme (not Rijkshuisstijl) and exempt\nfrom the design-token convention; plain values keep it visually distinct.\n", + "type": "component", + "sourceCode": "import { Component, Injector, computed, inject, isDevMode, signal } from '@angular/core';\nimport { JsonPipe } from '@angular/common';\nimport { SessionStore } from '@auth/application/session.store';\nimport { Session } from '@auth/domain/session';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\nimport { map } from '@shared/application/remote-data';\nimport { maskBsn, redactProfile } from './mask';\n\n/**\n * Dev-only \"show the current Model\" panel (Elm-debugger style, read-only).\n * Observes the root singletons and renders them via the json pipe. Never a\n * product feature: the whole template is gated by isDevMode(), so it does not\n * render and is unreachable in a production build.\n *\n * ponytail: dev tool — intentionally off-theme (not Rijkshuisstijl) and exempt\n * from the design-token convention; plain values keep it visually distinct.\n */\n@Component({\n selector: 'app-debug-state',\n imports: [JsonPipe],\n styles: [`\n .fab{position:fixed;bottom:1rem;right:1rem;z-index:9999;font:600 12px/1 monospace;\n background:#1e1e1e;color:#9cdcfe;border:1px solid #444;border-radius:4px;\n padding:.5rem .75rem;cursor:pointer}\n .panel{position:fixed;bottom:3.25rem;right:1rem;z-index:9999;width:min(90vw,28rem);\n max-height:70vh;overflow:auto;background:#1e1e1e;color:#d4d4d4;border:1px solid #444;\n border-radius:6px;box-shadow:0 6px 24px rgba(0,0,0,.4)}\n .panel pre{margin:0;padding:.75rem;font:12px/1.5 monospace;white-space:pre-wrap;\n word-break:break-word}\n `],\n template: `\n @if (isDev) {\n \n @if (visible()) {\n
{{ snapshot() | json }}
\n }\n }\n `,\n})\nexport class DebugStateComponent {\n protected readonly isDev = isDevMode();\n protected readonly visible = signal(false);\n\n private session = inject(SessionStore);\n private injector = inject(Injector);\n // Resolved on first open only — BigProfileStore's httpResources fetch eagerly\n // on construction, so we must not instantiate it until the dev asks to look.\n private profileStore?: BigProfileStore;\n\n // PII is redacted/masked here (see mask.ts): the panel inspects state SHAPE,\n // never personal data — a deliberate habit for a PII-handling app.\n protected readonly snapshot = computed(() => ({\n session: maskSession(this.session.session()),\n profile: this.profileStore ? map(this.profileStore.profile(), redactProfile) : undefined,\n decisions: this.profileStore?.decisions(),\n aantekeningen: this.profileStore?.aantekeningen(),\n pendingHerregistratie: this.profileStore?.pendingHerregistratie(),\n }));\n\n toggle(): void {\n if (!this.visible()) this.profileStore ??= this.injector.get(BigProfileStore);\n this.visible.update((v) => !v);\n }\n}\n\nfunction maskSession(s: Session | null): Session | null {\n return s ? { ...s, bsn: maskBsn(s.bsn) } : null;\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n .fab{position:fixed;bottom:1rem;right:1rem;z-index:9999;font:600 12px/1 monospace;\n background:#1e1e1e;color:#9cdcfe;border:1px solid #444;border-radius:4px;\n padding:.5rem .75rem;cursor:pointer}\n .panel{position:fixed;bottom:3.25rem;right:1rem;z-index:9999;width:min(90vw,28rem);\n max-height:70vh;overflow:auto;background:#1e1e1e;color:#d4d4d4;border:1px solid #444;\n border-radius:6px;box-shadow:0 6px 24px rgba(0,0,0,.4)}\n .panel pre{margin:0;padding:.75rem;font:12px/1.5 monospace;white-space:pre-wrap;\n word-break:break-word}\n \n", + "extends": [] + }, + { + "name": "DeliveryChannelToggleComponent", + "id": "component-DeliveryChannelToggleComponent-4dae07e32e18a4f448c24821beb9cc611b5ed3dbd2b658e9e841db450d3ab53d508eb1e0f1b656b0c65a1104dd7adda8e706b7d9bb1f677d66900091d07727af", + "file": "src/app/shared/ui/upload/delivery-channel-toggle/delivery-channel-toggle.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-delivery-channel-toggle", + "styleUrls": [], + "styles": [ + "\n .rhc-radio-option {\n display: flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n }\n " + ], + "template": "
\n @for (opt of options; track opt.value) {\n \n }\n
\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "channel", + "deprecated": false, + "deprecationMessage": "", + "type": "DeliveryChannel", + "indexKey": "", + "optional": false, + "description": "", + "line": 36, + "required": true + }, + { + "name": "disabled", + "defaultValue": "false", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 38, + "required": false + }, + { + "name": "name", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 37, + "required": true + } + ], + "outputsClass": [ + { + "name": "channelChange", + "deprecated": false, + "deprecationMessage": "", + "type": "DeliveryChannel", + "indexKey": "", + "optional": false, + "description": "", + "line": 40, + "required": false + } + ], + "propertiesClass": [ + { + "name": "options", + "defaultValue": "[\n { value: 'digital', label: $localize`:@@upload.channel.digital:Digitaal uploaden` },\n { value: 'post', label: $localize`:@@upload.channel.post:Per post nasturen` },\n ]", + "deprecated": false, + "deprecationMessage": "", + "type": "ReadonlyArray", + "indexKey": "", + "optional": false, + "description": "", + "line": 42, + "modifierKind": [ + 124, + 148 + ] + } + ], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [], + "description": "

Atom: choose how a document is delivered — uploaded digitally or sent by post.\nThin wrapper over the Utrecht/RHC radio CSS. Pure UI: emits the chosen channel.

\n", + "rawdescription": "\nAtom: choose how a document is delivered — uploaded digitally or sent by post.\nThin wrapper over the Utrecht/RHC radio CSS. Pure UI: emits the chosen channel.", + "type": "component", + "sourceCode": "import { Component, input, output } from '@angular/core';\nimport type { DeliveryChannel } from '@shared/upload/upload.machine';\n\n/** Atom: choose how a document is delivered — uploaded digitally or sent by post.\n Thin wrapper over the Utrecht/RHC radio CSS. Pure UI: emits the chosen channel. */\n@Component({\n selector: 'app-delivery-channel-toggle',\n styles: [`\n .rhc-radio-option {\n display: flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n }\n `],\n template: `\n
\n @for (opt of options; track opt.value) {\n \n }\n
\n `,\n})\nexport class DeliveryChannelToggleComponent {\n channel = input.required();\n name = input.required();\n disabled = input(false);\n\n channelChange = output();\n\n protected readonly options: ReadonlyArray<{ value: DeliveryChannel; label: string }> = [\n { value: 'digital', label: $localize`:@@upload.channel.digital:Digitaal uploaden` },\n { value: 'post', label: $localize`:@@upload.channel.post:Per post nasturen` },\n ];\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n .rhc-radio-option {\n display: flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n }\n \n", + "extends": [] + }, + { + "name": "DocumentCategoryComponent", + "id": "component-DocumentCategoryComponent-9f57528e2cc1ec31e9914b23ceef3b70a46e5291aca9e9cc6f482cb5cc707129addf2c0959426798c1a3ed82a6965c6fc52fa86b8b46e36dca7f0814c70ad162", + "file": "src/app/shared/ui/upload/document-category/document-category.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-document-category", + "styleUrls": [], + "styles": [ + "\n :host { display: block; }\n .label { font-weight: var(--rhc-text-font-weight-semi-bold); margin-block-end: var(--rhc-space-max-sm); }\n .req { font-weight: var(--rhc-text-font-weight-regular); color: var(--rhc-color-foreground-subtle); }\n .desc { color: var(--rhc-color-foreground-subtle); font-size: var(--rhc-text-font-size-sm); margin-block-end: var(--rhc-space-max-md); }\n .uploads { display: flex; flex-direction: column; gap: var(--rhc-space-max-md); margin-block-start: var(--rhc-space-max-md); }\n .rejection {\n color: var(--rhc-color-foreground-default);\n font-weight: var(--rhc-text-font-weight-semi-bold);\n margin-block-start: var(--rhc-space-max-sm);\n border-inline-start: var(--rhc-border-width-md) solid var(--rhc-color-rood-500);\n padding-inline-start: var(--rhc-space-max-md);\n }\n " + ], + "template": "
\n {{ category().label }}@if (category().required) { (verplicht) }\n
\n@if (category().description) {\n
{{ category().description }}
\n}\n\n@if (category().allowPostDelivery) {\n \n}\n\n@if (channel() === 'digital') {\n \n\n
\n @for (u of uploads(); track u.localId) {\n \n }\n
\n\n @if (rejection()) {\n
{{ rejection() }}
\n }\n}\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "category", + "deprecated": false, + "deprecationMessage": "", + "type": "DocumentCategory", + "indexKey": "", + "optional": false, + "description": "", + "line": 67, + "required": true + }, + { + "name": "channel", + "deprecated": false, + "deprecationMessage": "", + "type": "DeliveryChannel", + "indexKey": "", + "optional": false, + "description": "", + "line": 69, + "required": true + }, + { + "name": "previewUrlFor", + "deprecated": false, + "deprecationMessage": "", + "type": "(documentId: string) => string | undefined", + "indexKey": "", + "optional": false, + "description": "", + "line": 71, + "required": false + }, + { + "name": "rejection", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 70, + "required": false + }, + { + "name": "uploads", + "deprecated": false, + "deprecationMessage": "", + "type": "Upload[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 68, + "required": true + } + ], + "outputsClass": [ + { + "name": "channelChange", + "deprecated": false, + "deprecationMessage": "", + "type": "DeliveryChannel", + "indexKey": "", + "optional": false, + "description": "", + "line": 80, + "required": false + }, + { + "name": "deleteUpload", + "deprecated": false, + "deprecationMessage": "", + "type": "{ localId: string; documentId: string }", + "indexKey": "", + "optional": false, + "description": "", + "line": 79, + "required": false + }, + { + "name": "fileSelected", + "deprecated": false, + "deprecationMessage": "", + "type": "File[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 76, + "required": false + }, + { + "name": "removeUpload", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 77, + "required": false + }, + { + "name": "retryUpload", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 78, + "required": false + } + ], + "propertiesClass": [ + { + "name": "fileInputLabel", + "defaultValue": "computed(() => $localize`:@@upload.fileInput.labelFor:Bestand kiezen voor ${this.category().label}:category:`)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

Accessible name for the file picker, e.g. "Bestand kiezen voor Diploma".

\n", + "line": 74, + "rawdescription": "\nAccessible name for the file picker, e.g. \"Bestand kiezen voor Diploma\".", + "modifierKind": [ + 124 + ] + } + ], + "methodsClass": [ + { + "name": "onRemove", + "args": [ + { + "name": "u", + "type": "Upload", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 82, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "u", + "type": "Upload", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "DeliveryChannelToggleComponent", + "type": "component" + }, + { + "name": "FileInputComponent", + "type": "component" + }, + { + "name": "SingleUploadComponent", + "type": "component" + } + ], + "description": "

Organism: one document category — its label/description, an optional delivery\nchannel toggle, and (when digital) a file picker plus the list of uploads. Pure\nUI: emits selection/removal/retry/delete and channel changes; no HTTP or rules.

\n", + "rawdescription": "\nOrganism: one document category — its label/description, an optional delivery\nchannel toggle, and (when digital) a file picker plus the list of uploads. Pure\nUI: emits selection/removal/retry/delete and channel changes; no HTTP or rules.", + "type": "component", + "sourceCode": "import { Component, computed, input, output } from '@angular/core';\nimport type { DeliveryChannel, DocumentCategory, Upload } from '@shared/upload/upload.machine';\nimport { DeliveryChannelToggleComponent } from '../delivery-channel-toggle/delivery-channel-toggle.component';\nimport { FileInputComponent } from '../file-input/file-input.component';\nimport { SingleUploadComponent } from '../single-upload/single-upload.component';\n\n/** Organism: one document category — its label/description, an optional delivery\n channel toggle, and (when digital) a file picker plus the list of uploads. Pure\n UI: emits selection/removal/retry/delete and channel changes; no HTTP or rules. */\n@Component({\n selector: 'app-document-category',\n imports: [DeliveryChannelToggleComponent, FileInputComponent, SingleUploadComponent],\n styles: [`\n :host { display: block; }\n .label { font-weight: var(--rhc-text-font-weight-semi-bold); margin-block-end: var(--rhc-space-max-sm); }\n .req { font-weight: var(--rhc-text-font-weight-regular); color: var(--rhc-color-foreground-subtle); }\n .desc { color: var(--rhc-color-foreground-subtle); font-size: var(--rhc-text-font-size-sm); margin-block-end: var(--rhc-space-max-md); }\n .uploads { display: flex; flex-direction: column; gap: var(--rhc-space-max-md); margin-block-start: var(--rhc-space-max-md); }\n .rejection {\n color: var(--rhc-color-foreground-default);\n font-weight: var(--rhc-text-font-weight-semi-bold);\n margin-block-start: var(--rhc-space-max-sm);\n border-inline-start: var(--rhc-border-width-md) solid var(--rhc-color-rood-500);\n padding-inline-start: var(--rhc-space-max-md);\n }\n `],\n template: `\n
\n {{ category().label }}@if (category().required) { (verplicht) }\n
\n @if (category().description) {\n
{{ category().description }}
\n }\n\n @if (category().allowPostDelivery) {\n \n }\n\n @if (channel() === 'digital') {\n \n\n
\n @for (u of uploads(); track u.localId) {\n \n }\n
\n\n @if (rejection()) {\n
{{ rejection() }}
\n }\n }\n `,\n})\nexport class DocumentCategoryComponent {\n category = input.required();\n uploads = input.required();\n channel = input.required();\n rejection = input();\n previewUrlFor = input<(documentId: string) => string | undefined>();\n\n /** Accessible name for the file picker, e.g. \"Bestand kiezen voor Diploma\". */\n protected fileInputLabel = computed(() => $localize`:@@upload.fileInput.labelFor:Bestand kiezen voor ${this.category().label}:category:`);\n\n fileSelected = output();\n removeUpload = output();\n retryUpload = output();\n deleteUpload = output<{ localId: string; documentId: string }>();\n channelChange = output();\n\n onRemove(u: Upload) {\n if (u.status.type === 'complete') {\n this.deleteUpload.emit({ localId: u.localId, documentId: u.status.documentId });\n } else {\n this.removeUpload.emit(u.localId);\n }\n }\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host { display: block; }\n .label { font-weight: var(--rhc-text-font-weight-semi-bold); margin-block-end: var(--rhc-space-max-sm); }\n .req { font-weight: var(--rhc-text-font-weight-regular); color: var(--rhc-color-foreground-subtle); }\n .desc { color: var(--rhc-color-foreground-subtle); font-size: var(--rhc-text-font-size-sm); margin-block-end: var(--rhc-space-max-md); }\n .uploads { display: flex; flex-direction: column; gap: var(--rhc-space-max-md); margin-block-start: var(--rhc-space-max-md); }\n .rejection {\n color: var(--rhc-color-foreground-default);\n font-weight: var(--rhc-text-font-weight-semi-bold);\n margin-block-start: var(--rhc-space-max-sm);\n border-inline-start: var(--rhc-border-width-md) solid var(--rhc-color-rood-500);\n padding-inline-start: var(--rhc-space-max-md);\n }\n \n", + "extends": [] + }, + { + "name": "DocumentChipComponent", + "id": "component-DocumentChipComponent-bc28ccedea3cee5cc5a9fece88e4c6407ba8421f036d0f82b04406bd427ca89613e4dc81a01fddd0b0154ebd17eb7b59e01d5b5765707c7e32e0f8c2f89ae304", + "file": "src/app/shared/ui/upload/document-chip/document-chip.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-document-chip", + "styleUrls": [], + "styles": [ + "\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n padding-inline: var(--rhc-space-max-md);\n border: var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-radius: var(--rhc-border-radius-md);\n background: var(--rhc-color-cool-grey-100);\n }\n .name { flex: 1; }\n .action {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n color: var(--rhc-color-foreground-link);\n font: inherit;\n text-decoration: underline;\n }\n .action:hover { color: var(--rhc-color-foreground-link-hover); }\n a.action { display: inline-block; }\n " + ], + "template": "\n{{ fileName() }}\n@if (previewUrl()) {\n \n Voorbeeld / Download\n \n}\n@if (status().type === 'failed') {\n \n}\n@if (status().type !== 'deleting') {\n \n}\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "fileName", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 55, + "required": true + }, + { + "name": "previewUrl", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "

When set, show a preview/download link (opens the stored bytes).

\n", + "line": 58, + "rawdescription": "\nWhen set, show a preview/download link (opens the stored bytes).", + "required": false + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "UploadStatus", + "indexKey": "", + "optional": false, + "description": "", + "line": 56, + "required": true + } + ], + "outputsClass": [ + { + "name": "remove", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 60, + "required": false + }, + { + "name": "retry", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 61, + "required": false + } + ], + "propertiesClass": [], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "UploadStatusIconComponent", + "type": "component" + } + ], + "description": "

Atom: a single uploaded-file chip — filename + status glyph + actions. Pure UI:\nemits remove/retry; the container decides what they mean.

\n", + "rawdescription": "\nAtom: a single uploaded-file chip — filename + status glyph + actions. Pure UI:\nemits `remove`/`retry`; the container decides what they mean.", + "type": "component", + "sourceCode": "import { Component, input, output } from '@angular/core';\nimport type { UploadStatus } from '@shared/upload/upload.machine';\nimport { UploadStatusIconComponent } from '../upload-status-icon/upload-status-icon.component';\n\n/** Atom: a single uploaded-file chip — filename + status glyph + actions. Pure UI:\n emits `remove`/`retry`; the container decides what they mean. */\n@Component({\n selector: 'app-document-chip',\n imports: [UploadStatusIconComponent],\n styles: [`\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n padding-inline: var(--rhc-space-max-md);\n border: var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-radius: var(--rhc-border-radius-md);\n background: var(--rhc-color-cool-grey-100);\n }\n .name { flex: 1; }\n .action {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n color: var(--rhc-color-foreground-link);\n font: inherit;\n text-decoration: underline;\n }\n .action:hover { color: var(--rhc-color-foreground-link-hover); }\n a.action { display: inline-block; }\n `],\n template: `\n \n {{ fileName() }}\n @if (previewUrl()) {\n \n Voorbeeld / Download\n \n }\n @if (status().type === 'failed') {\n \n }\n @if (status().type !== 'deleting') {\n \n }\n `,\n})\nexport class DocumentChipComponent {\n fileName = input.required();\n status = input.required();\n /** When set, show a preview/download link (opens the stored bytes). */\n previewUrl = input();\n\n remove = output();\n retry = output();\n\n protected get removeLabel(): string {\n return $localize`:@@upload.chip.removeAria:${this.fileName()}:fileName: verwijderen`;\n }\n protected get previewLabel(): string {\n return $localize`:@@upload.chip.previewAria:${this.fileName()}:fileName: bekijken of downloaden`;\n }\n protected get retryLabel(): string {\n return $localize`:@@upload.chip.retryAria:${this.fileName()}:fileName: opnieuw uploaden`;\n }\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host {\n display: inline-flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n padding-inline: var(--rhc-space-max-md);\n border: var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-radius: var(--rhc-border-radius-md);\n background: var(--rhc-color-cool-grey-100);\n }\n .name { flex: 1; }\n .action {\n background: none;\n border: none;\n cursor: pointer;\n padding: 0;\n color: var(--rhc-color-foreground-link);\n font: inherit;\n text-decoration: underline;\n }\n .action:hover { color: var(--rhc-color-foreground-link-hover); }\n a.action { display: inline-block; }\n \n", + "extends": [], + "accessors": { + "removeLabel": { + "name": "removeLabel", + "getSignature": { + "name": "removeLabel", + "type": "string", + "returnType": "string", + "line": 63 + } + }, + "previewLabel": { + "name": "previewLabel", + "getSignature": { + "name": "previewLabel", + "type": "string", + "returnType": "string", + "line": 66 + } + }, + "retryLabel": { + "name": "retryLabel", + "getSignature": { + "name": "retryLabel", + "type": "string", + "returnType": "string", + "line": 69 + } + } + } + }, + { + "name": "DocumentUploadComponent", + "id": "component-DocumentUploadComponent-b3a031d7ba5a4f3ce841d19a770a80845b035ed2754ed8545bb96c4c670eba6ade8ba11b410aff26fcfdc5e69a401ad0d6273ded30db8673a2f2d5221c000880", + "file": "src/app/shared/ui/upload/document-upload/document-upload.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-document-upload", + "styleUrls": [], + "styles": [ + "\n :host { display: flex; flex-direction: column; gap: var(--rhc-space-max-xl); }\n " + ], + "template": "@if (state().categoriesError) {\n \n} @else {\n @if (state().backgroundSyncAvailable === false) {\n \n }\n @for (c of state().categories; track c.categoryId) {\n \n }\n}\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "previewUrlFor", + "deprecated": false, + "deprecationMessage": "", + "type": "(documentId: string) => string | undefined", + "indexKey": "", + "optional": false, + "description": "

Optional: builds a preview/download URL for a completed upload's documentId.

\n", + "line": 41, + "rawdescription": "\nOptional: builds a preview/download URL for a completed upload's documentId.", + "required": false + }, + { + "name": "state", + "deprecated": false, + "deprecationMessage": "", + "type": "UploadState", + "indexKey": "", + "optional": false, + "description": "", + "line": 39, + "required": true + } + ], + "outputsClass": [ + { + "name": "channelChange", + "deprecated": false, + "deprecationMessage": "", + "type": "{ categoryId: string; channel: DeliveryChannel }", + "indexKey": "", + "optional": false, + "description": "", + "line": 47, + "required": false + }, + { + "name": "deleteUpload", + "deprecated": false, + "deprecationMessage": "", + "type": "{ localId: string; documentId: string }", + "indexKey": "", + "optional": false, + "description": "", + "line": 46, + "required": false + }, + { + "name": "fileSelected", + "deprecated": false, + "deprecationMessage": "", + "type": "{ categoryId: string; files: File[] }", + "indexKey": "", + "optional": false, + "description": "", + "line": 43, + "required": false + }, + { + "name": "removeUpload", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 44, + "required": false + }, + { + "name": "retryUpload", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 45, + "required": false + } + ], + "propertiesClass": [ + { + "name": "foregroundOnlyMessage", + "defaultValue": "$localize`:@@upload.foregroundOnly:Uploads gaan alleen door zolang deze pagina open blijft.`", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 49, + "modifierKind": [ + 124, + 148 + ] + } + ], + "methodsClass": [ + { + "name": "channelFor", + "args": [ + { + "name": "categoryId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "DeliveryChannel", + "typeParameters": [], + "line": 54, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "categoryId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "uploadsFor", + "args": [ + { + "name": "categoryId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "any", + "typeParameters": [], + "line": 51, + "deprecated": false, + "deprecationMessage": "", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "categoryId", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "DocumentCategoryComponent", + "type": "component" + }, + { + "name": "UploadStatusBannerComponent", + "type": "component" + } + ], + "description": "

Organism: the full document-upload step — the category list, or a load-error\nbanner. Pure UI: re-exposes the category events, tagging each with its category\nwhere the parent needs it. The container wires these to the upload reducer.

\n", + "rawdescription": "\nOrganism: the full document-upload step — the category list, or a load-error\nbanner. Pure UI: re-exposes the category events, tagging each with its category\nwhere the parent needs it. The container wires these to the upload reducer.", + "type": "component", + "sourceCode": "import { Component, input, output } from '@angular/core';\nimport type { DeliveryChannel, UploadState } from '@shared/upload/upload.machine';\nimport { DocumentCategoryComponent } from '../document-category/document-category.component';\nimport { UploadStatusBannerComponent } from '../upload-status-banner/upload-status-banner.component';\n\n/** Organism: the full document-upload step — the category list, or a load-error\n banner. Pure UI: re-exposes the category events, tagging each with its category\n where the parent needs it. The container wires these to the upload reducer. */\n@Component({\n selector: 'app-document-upload',\n imports: [DocumentCategoryComponent, UploadStatusBannerComponent],\n styles: [`\n :host { display: flex; flex-direction: column; gap: var(--rhc-space-max-xl); }\n `],\n template: `\n @if (state().categoriesError) {\n \n } @else {\n @if (state().backgroundSyncAvailable === false) {\n \n }\n @for (c of state().categories; track c.categoryId) {\n \n }\n }\n `,\n})\nexport class DocumentUploadComponent {\n state = input.required();\n /** Optional: builds a preview/download URL for a completed upload's documentId. */\n previewUrlFor = input<(documentId: string) => string | undefined>();\n\n fileSelected = output<{ categoryId: string; files: File[] }>();\n removeUpload = output();\n retryUpload = output();\n deleteUpload = output<{ localId: string; documentId: string }>();\n channelChange = output<{ categoryId: string; channel: DeliveryChannel }>();\n\n protected readonly foregroundOnlyMessage = $localize`:@@upload.foregroundOnly:Uploads gaan alleen door zolang deze pagina open blijft.`;\n\n protected uploadsFor(categoryId: string) {\n return this.state().uploads.filter((u) => u.categoryId === categoryId);\n }\n protected channelFor(categoryId: string): DeliveryChannel {\n return this.state().deliveryChannel[categoryId] ?? 'digital';\n }\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host { display: flex; flex-direction: column; gap: var(--rhc-space-max-xl); }\n \n", + "extends": [] + }, + { + "name": "FileInputComponent", + "id": "component-FileInputComponent-92b1ede7856887c52081a7046df080753952cec4430e039277285f00c6fade6270dc0ff8abf940274e28f26b324e1ffbea9fa796cea25f888327ee065a1b8d18", + "file": "src/app/shared/ui/upload/file-input/file-input.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-file-input", + "styleUrls": [], + "styles": [ + "\n :host { display: inline-block; }\n .field { position: relative; display: inline-flex; }\n input[type='file'] {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n }\n input[type='file']:disabled { cursor: not-allowed; }\n .label {\n pointer-events: none;\n display: inline-flex;\n align-items: center;\n gap: var(--rhc-space-max-sm);\n }\n " + ], + "template": "\n \n \n \n {{ label() }}\n \n\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "accept", + "defaultValue": "[]", + "deprecated": false, + "deprecationMessage": "", + "type": "string[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 48, + "required": false + }, + { + "name": "disabled", + "defaultValue": "false", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 50, + "required": false + }, + { + "name": "inputId", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 51, + "required": true + }, + { + "name": "label", + "defaultValue": "$localize`:@@upload.fileInput.label:Bestand kiezen`", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "

Accessible name + button text; the domain caller supplies a per-category label.

\n", + "line": 53, + "rawdescription": "\nAccessible name + button text; the domain caller supplies a per-category label.", + "required": false + }, + { + "name": "multiple", + "defaultValue": "false", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 49, + "required": false + } + ], + "outputsClass": [ + { + "name": "filesSelected", + "deprecated": false, + "deprecationMessage": "", + "type": "File[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 55, + "required": false + } + ], + "propertiesClass": [ + { + "name": "fileInput", + "defaultValue": "viewChild.required>('fileInput')", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 57, + "modifierKind": [ + 123 + ] + } + ], + "methodsClass": [ + { + "name": "onChange", + "args": [ + { + "name": "event", + "type": "Event", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 59, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "event", + "type": "Event", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [], + "description": "

Atom: a styled file picker. Wraps a native <input type="file"> and emits the\nselected files; resets its value after each change so re-picking the same file\nre-fires. Pure UI — no validation, no upload.

\n", + "rawdescription": "\nAtom: a styled file picker. Wraps a native `` and emits the\nselected files; resets its value after each change so re-picking the same file\nre-fires. Pure UI — no validation, no upload.", + "type": "component", + "sourceCode": "import { Component, ElementRef, input, output, viewChild } from '@angular/core';\n\n/** Atom: a styled file picker. Wraps a native `` and emits the\n selected files; resets its value after each change so re-picking the same file\n re-fires. Pure UI — no validation, no upload. */\n@Component({\n selector: 'app-file-input',\n styles: [`\n :host { display: inline-block; }\n .field { position: relative; display: inline-flex; }\n input[type='file'] {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n }\n input[type='file']:disabled { cursor: not-allowed; }\n .label {\n pointer-events: none;\n display: inline-flex;\n align-items: center;\n gap: var(--rhc-space-max-sm);\n }\n `],\n template: `\n \n \n \n \n {{ label() }}\n \n \n `,\n})\nexport class FileInputComponent {\n accept = input([]);\n multiple = input(false);\n disabled = input(false);\n inputId = input.required();\n /** Accessible name + button text; the domain caller supplies a per-category label. */\n label = input($localize`:@@upload.fileInput.label:Bestand kiezen`);\n\n filesSelected = output();\n\n private fileInput = viewChild.required>('fileInput');\n\n onChange(event: Event) {\n const input = event.target as HTMLInputElement;\n this.filesSelected.emit(Array.from(input.files ?? []));\n this.fileInput().nativeElement.value = '';\n }\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host { display: inline-block; }\n .field { position: relative; display: inline-flex; }\n input[type='file'] {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n opacity: 0;\n cursor: pointer;\n }\n input[type='file']:disabled { cursor: not-allowed; }\n .label {\n pointer-events: none;\n display: inline-flex;\n align-items: center;\n gap: var(--rhc-space-max-sm);\n }\n \n", + "extends": [] + }, { "name": "FormFieldComponent", - "id": "component-FormFieldComponent-116bcd8039c2d08b60a7dee8bdc465c6a0a04fa3e03d4b371c12d759113e2b369673acd0d7928b9ea47966065d618ed483fc316fdcdb2c740c3891a732f377e9", + "id": "component-FormFieldComponent-04221c4dcd81abadd6cc00b00f537477e513615e81c5a60d97d2ecfab8c1259527e52af6a78217fd233d50fce3b3ed6b5a079fb00ac188e7db8d9b1cb3ee50d2", "file": "src/app/shared/ui/form-field/form-field.component.ts", "encapsulation": [], "entryComponents": [], @@ -3220,8 +10592,10 @@ "providers": [], "selector": "app-form-field", "styleUrls": [], - "styles": [], - "template": "
\n \n @if (description()) {\n
{{ description() }}
\n }\n \n @if (error()) {\n
{{ error() }}
\n }\n
\n", + "styles": [ + "\n :host{display:block}\n .label{display:block;font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-end:var(--rhc-space-max-sm)}\n .req{font-weight:var(--rhc-text-font-weight-regular);color:var(--rhc-color-foreground-subtle)}\n .desc{color:var(--rhc-color-foreground-subtle);font-size:var(--rhc-text-font-size-sm);margin-block-end:var(--rhc-space-max-sm)}\n .error{color:var(--rhc-color-foreground-default);font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-start:var(--rhc-space-max-sm);border-inline-start:var(--rhc-border-width-md) solid var(--rhc-color-rood-500);padding-inline-start:var(--rhc-space-max-md)}\n " + ], + "template": "
\n \n @if (description()) {\n
{{ description() }}
\n }\n \n @if (error()) {\n
{{ error() }}
\n }\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -3234,7 +10608,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 23, + "line": 32, "required": false }, { @@ -3245,7 +10619,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 24, + "line": 33, "required": false }, { @@ -3256,7 +10630,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 22, + "line": 31, "required": true }, { @@ -3267,8 +10641,19 @@ "indexKey": "", "optional": false, "description": "", - "line": 21, + "line": 30, "required": true + }, + { + "name": "required", + "defaultValue": "false, { transform: booleanAttribute }", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 34, + "required": false } ], "outputsClass": [], @@ -3283,10 +10668,10 @@ "description": "

Molecule: form field = label + projected control + optional error/description.\nReused by both the login form and the change-request form.

\n", "rawdescription": "\nMolecule: form field = label + projected control + optional error/description.\nReused by both the login form and the change-request form.", "type": "component", - "sourceCode": "import { Component, input } from '@angular/core';\n\n/** Molecule: form field = label + projected control + optional error/description.\n Reused by both the login form and the change-request form. */\n@Component({\n selector: 'app-form-field',\n template: `\n
\n \n @if (description()) {\n
{{ description() }}
\n }\n \n @if (error()) {\n
{{ error() }}
\n }\n
\n `,\n})\nexport class FormFieldComponent {\n label = input.required();\n fieldId = input.required();\n description = input();\n error = input();\n}\n", + "sourceCode": "import { Component, booleanAttribute, input } from '@angular/core';\n\n/** Molecule: form field = label + projected control + optional error/description.\n Reused by both the login form and the change-request form. */\n@Component({\n selector: 'app-form-field',\n styles: [`\n :host{display:block}\n .label{display:block;font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-end:var(--rhc-space-max-sm)}\n .req{font-weight:var(--rhc-text-font-weight-regular);color:var(--rhc-color-foreground-subtle)}\n .desc{color:var(--rhc-color-foreground-subtle);font-size:var(--rhc-text-font-size-sm);margin-block-end:var(--rhc-space-max-sm)}\n .error{color:var(--rhc-color-foreground-default);font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-start:var(--rhc-space-max-sm);border-inline-start:var(--rhc-border-width-md) solid var(--rhc-color-rood-500);padding-inline-start:var(--rhc-space-max-md)}\n `],\n template: `\n
\n \n @if (description()) {\n
{{ description() }}
\n }\n \n @if (error()) {\n
{{ error() }}
\n }\n
\n `,\n})\nexport class FormFieldComponent {\n label = input.required();\n fieldId = input.required();\n description = input();\n error = input();\n required = input(false, { transform: booleanAttribute });\n}\n", "assetsDirs": [], "styleUrlsData": "", - "stylesData": "", + "stylesData": "\n :host{display:block}\n .label{display:block;font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-end:var(--rhc-space-max-sm)}\n .req{font-weight:var(--rhc-text-font-weight-regular);color:var(--rhc-color-foreground-subtle)}\n .desc{color:var(--rhc-color-foreground-subtle);font-size:var(--rhc-text-font-size-sm);margin-block-end:var(--rhc-space-max-sm)}\n .error{color:var(--rhc-color-foreground-default);font-weight:var(--rhc-text-font-weight-semi-bold);margin-block-start:var(--rhc-space-max-sm);border-inline-start:var(--rhc-border-width-md) solid var(--rhc-color-rood-500);padding-inline-start:var(--rhc-space-max-md)}\n \n", "extends": [] }, { @@ -3343,7 +10728,7 @@ }, { "name": "HerregistratiePage", - "id": "component-HerregistratiePage-b279a94020bfc4f5742e1214bdcfcf8c1725f0ceb12f42e4483a0194cf1b392e4f277e0661b62eb7a52b156b13806bd12a8732248d37f5bfcc5a68f0e1c61341", + "id": "component-HerregistratiePage-23bf19b0f7fd99695a5e0dbe2f95356aac393a1fbedc30ac3a1721a676b89abbb43935d9d0889dde5bf8d3ac1db668ba45c80e94f08b9fc650717b1bc295bd87", "file": "src/app/herregistratie/ui/herregistratie.page.ts", "encapsulation": [], "entryComponents": [], @@ -3353,7 +10738,7 @@ "selector": "app-herregistratie-page", "styleUrls": [], "styles": [], - "template": "\n \n \n @if (eligible) {\n \n Uw huidige registratie verloopt binnenkort. Vraag tijdig herregistratie aan.\n \n
\n \n
\n } @else {\n \n Voor uw huidige registratiestatus is herregistratie niet mogelijk.\n \n }\n
\n
\n
\n", + "template": "\n \n \n @if (eligible) {\n \n Uw huidige registratie verloopt binnenkort. Vraag tijdig herregistratie aan.\n \n
\n \n
\n } @else {\n \n Voor uw huidige registratiestatus is herregistratie niet mogelijk.\n \n }\n
\n
\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -3415,7 +10800,7 @@ "description": "

A whole new page built from existing building blocks. Eligibility is a\nSERVER-computed decision read from the aggregated view — the frontend renders\nit, it does not recompute the rule.

\n", "rawdescription": "\nA whole new page built from existing building blocks. Eligibility is a\nSERVER-computed decision read from the aggregated view — the frontend renders\nit, it does not recompute the rule.", "type": "component", - "sourceCode": "import { Component, computed, inject } from '@angular/core';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ASYNC } from '@shared/ui/async/async.component';\nimport { map } from '@shared/application/remote-data';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\nimport { HerregistratieWizardComponent } from '@herregistratie/ui/herregistratie-wizard/herregistratie-wizard.component';\n\n/** A whole new page built from existing building blocks. Eligibility is a\n SERVER-computed decision read from the aggregated view — the frontend renders\n it, it does not recompute the rule. */\n@Component({\n selector: 'app-herregistratie-page',\n imports: [PageShellComponent, AlertComponent, ...ASYNC, HerregistratieWizardComponent],\n template: `\n \n \n \n @if (eligible) {\n \n Uw huidige registratie verloopt binnenkort. Vraag tijdig herregistratie aan.\n \n
\n \n
\n } @else {\n \n Voor uw huidige registratiestatus is herregistratie niet mogelijk.\n \n }\n
\n
\n
\n `,\n})\nexport class HerregistratiePage {\n private store = inject(BigProfileStore);\n // The eligibility decision comes from the server (decisions block), not a\n // client-side rule. The UI just reads the boolean.\n protected eligibility = computed(() =>\n map(this.store.decisions(), (d) => d.eligibleForHerregistratie),\n );\n}\n", + "sourceCode": "import { Component, computed, inject } from '@angular/core';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { ASYNC } from '@shared/ui/async/async.component';\nimport { map } from '@shared/application/remote-data';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\nimport { HerregistratieWizardComponent } from '@herregistratie/ui/herregistratie-wizard/herregistratie-wizard.component';\n\n/** A whole new page built from existing building blocks. Eligibility is a\n SERVER-computed decision read from the aggregated view — the frontend renders\n it, it does not recompute the rule. */\n@Component({\n selector: 'app-herregistratie-page',\n imports: [PageShellComponent, AlertComponent, ...ASYNC, HerregistratieWizardComponent],\n template: `\n \n \n \n @if (eligible) {\n \n Uw huidige registratie verloopt binnenkort. Vraag tijdig herregistratie aan.\n \n
\n \n
\n } @else {\n \n Voor uw huidige registratiestatus is herregistratie niet mogelijk.\n \n }\n
\n
\n
\n `,\n})\nexport class HerregistratiePage {\n private store = inject(BigProfileStore);\n // The eligibility decision comes from the server (decisions block), not a\n // client-side rule. The UI just reads the boolean.\n protected eligibility = computed(() =>\n map(this.store.decisions(), (d) => d.eligibleForHerregistratie),\n );\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -3423,7 +10808,7 @@ }, { "name": "HerregistratieWizardComponent", - "id": "component-HerregistratieWizardComponent-7f88cdc3fbae79e0e373e2178954406f5236da9c11f6ac2ee9504a64055abe457d7e3b259572c6d0a75229acbf08cd404efab0fbcac07510ff5bf34523a2b3e7", + "id": "component-HerregistratieWizardComponent-3cba7756d175155533a8745298192c123627c0c20937a60226e715f3459f5fea5dfde4be4ecb96a109c73c280ff86d0027167834734999f6a1c76954f38e0bc9", "file": "src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.component.ts", "encapsulation": [], "entryComponents": [], @@ -3433,7 +10818,7 @@ "selector": "app-herregistratie-wizard", "styleUrls": [], "styles": [], - "template": "@switch (state().tag) {\n @case ('Editing') {\n

Stap {{ step() }} van 2

\n
\n @if (step() === 1) {\n \n \n \n \n \n \n
\n Volgende\n Annuleren\n
\n } @else {\n \n \n \n
\n Vorige\n Herregistratie aanvragen\n Annuleren\n
\n }\n
\n }\n @case ('Submitting') {\n Aanvraag wordt verwerkt…\n }\n @case ('Submitted') {\n Uw aanvraag tot herregistratie is ontvangen.\n }\n @case ('Failed') {\n Indienen mislukt: {{ failedError() }}\n
\n Opnieuw proberen\n
\n }\n}\n", + "template": " 1\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\">\n\n @switch (step()) {\n @case (1) {\n \n \n \n \n \n \n }\n @case (2) {\n \n \n \n }\n @case (3) {\n \n @if (errDocumenten()) {\n {{ errDocumenten() }}\n }\n }\n }\n\n
\n Uw aanvraag tot herregistratie is ontvangen.\n
\n\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -3447,7 +10832,7 @@ "indexKey": "", "optional": false, "description": "

Optional seed so Storybook / the showcase can mount any state directly.

\n", - "line": 73, + "line": 90, "rawdescription": "\nOptional seed so Storybook / the showcase can mount any state directly.", "required": false } @@ -3463,7 +10848,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 76, + "line": 93, "modifierKind": [ 124 ] @@ -3477,25 +10862,53 @@ "indexKey": "", "optional": false, "description": "", - "line": 80, + "line": 115, "modifierKind": [ 124 ] }, { - "name": "editing", - "defaultValue": "computed(() => (this.state().tag === 'Editing' ? (this.state() as Extract) : null))", + "name": "draftSync", + "defaultValue": "createDraftSync({\n type: 'herregistratie',\n snapshot: () => {\n const s = this.state();\n if (s.tag !== 'Editing' || !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.step - 1, stepCount: this.stepLabels.length, documentIds };\n },\n onResume: (draft) => this.dispatch({ tag: 'Seed', state: (draft as WizardState | null) ?? initial }),\n enabled: () => this.seed() === initial,\n })", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 78, + "line": 97, "modifierKind": [ 123 ] }, + { + "name": "editing", + "defaultValue": "computed(() => whenTag(this.state(), 'Editing'))", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 113, + "modifierKind": [ + 123 + ] + }, + { + "name": "errDocumenten", + "defaultValue": "computed(() => this.editing()?.errors.documenten ?? '')", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 120, + "modifierKind": [ + 124 + ] + }, { "name": "errJaren", "defaultValue": "computed(() => this.editing()?.errors.jaren ?? '')", @@ -3505,7 +10918,36 @@ "indexKey": "", "optional": false, "description": "", - "line": 82, + "line": 118, + "modifierKind": [ + 124 + ] + }, + { + "name": "errorList", + "defaultValue": "computed(() => {\n const e = this.editing()?.errors ?? {};\n return (Object.keys(e) as (keyof typeof e)[])\n .filter((k) => e[k])\n .map((k) => ({ id: k, message: e[k]! }));\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

Current step's field errors, flattened for the shell's error summary.

\n", + "line": 141, + "rawdescription": "\nCurrent step's field errors, flattened for the shell's error summary.", + "modifierKind": [ + 124 + ] + }, + { + "name": "errorMessage", + "defaultValue": "computed(() => $localize`:@@wizard.indienenMislukt:Indienen mislukt:` + ` ${this.failedError()}`)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 131, "modifierKind": [ 124 ] @@ -3519,7 +10961,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 83, + "line": 119, "modifierKind": [ 124 ] @@ -3533,21 +10975,50 @@ "indexKey": "", "optional": false, "description": "", - "line": 81, + "line": 117, "modifierKind": [ 124 ] }, { "name": "failedError", - "defaultValue": "computed(() => (this.state().tag === 'Failed' ? (this.state() as Extract).error : ''))", + "defaultValue": "computed(() => whenTag(this.state(), 'Failed')?.error ?? '')", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 84, + "line": 121, + "modifierKind": [ + 124 + ] + }, + { + "name": "previewUrlFor", + "defaultValue": "() => {...}", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

Preview/download link for a completed upload; dev-simulation demo-* ids have\nno stored bytes, so they get no link.

\n", + "line": 86, + "rawdescription": "\nPreview/download link for a completed upload; dev-simulation `demo-*` ids have\nno stored bytes, so they get no link.", + "modifierKind": [ + 124 + ] + }, + { + "name": "primaryLabel", + "defaultValue": "computed(() => (this.step() < 3 ? $localize`:@@wizard.volgende:Volgende` : $localize`:@@herregWizard.indienen:Herregistratie aanvragen`))", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 130, "modifierKind": [ 124 ] @@ -3561,11 +11032,25 @@ "indexKey": "", "optional": false, "description": "", - "line": 69, + "line": 80, "modifierKind": [ 123 ] }, + { + "name": "shellStatus", + "defaultValue": "computed(() => {\n switch (this.state().tag) {\n case 'Editing': return 'editing';\n case 'Submitting': return 'submitting';\n case 'Submitted': return 'submitted';\n case 'Failed': return 'failed';\n }\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 132, + "modifierKind": [ + 124 + ] + }, { "name": "state", "defaultValue": "this.store.model", @@ -3575,7 +11060,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 75, + "line": 92, "modifierKind": [ 148 ] @@ -3589,11 +11074,53 @@ "indexKey": "", "optional": false, "description": "", - "line": 79, + "line": 114, "modifierKind": [ 124 ] }, + { + "name": "stepLabels", + "defaultValue": "[$localize`:@@herregWizard.step.werkervaring:Werkervaring`, $localize`:@@herregWizard.step.nascholing:Nascholing`, $localize`:@@herregWizard.step.documenten:Documenten`]", + "deprecated": false, + "deprecationMessage": "", + "type": "[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 110, + "modifierKind": [ + 148 + ] + }, + { + "name": "stepTitle", + "defaultValue": "computed(() => this.stepTitles[this.step() - 1])", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 129, + "modifierKind": [ + 124 + ] + }, + { + "name": "stepTitles", + "defaultValue": "[$localize`:@@herregWizard.title.werkervaring:Werkervaring (afgelopen 5 jaar)`, $localize`:@@herregWizard.title.nascholing:Nascholing`, $localize`:@@herregWizard.title.documenten:Documenten aanleveren`]", + "deprecated": false, + "deprecationMessage": "", + "type": "[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 111, + "modifierKind": [ + 123 + ] + }, { "name": "store", "defaultValue": "createStore(initial, reduce)", @@ -3603,10 +11130,52 @@ "indexKey": "", "optional": false, "description": "", - "line": 70, + "line": 82, "modifierKind": [ 123 ] + }, + { + "name": "upload", + "defaultValue": "computed(() => this.editing()?.upload ?? initialUpload)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 116, + "modifierKind": [ + 124 + ] + }, + { + "name": "uploadAdapter", + "defaultValue": "inject(UploadAdapter)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 81, + "modifierKind": [ + 123 + ] + }, + { + "name": "uploadCtl", + "defaultValue": "createUploadController({\n wizardId: 'herregistratie',\n getUpload: () => this.upload(),\n dispatch: (msg) => this.dispatch({ tag: 'Upload', msg }),\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 122, + "modifierKind": [ + 124 + ] } ], "methodsClass": [ @@ -3616,7 +11185,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 90, + "line": 155, "deprecated": false, "deprecationMessage": "" }, @@ -3626,7 +11195,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 97, + "line": 162, "deprecated": false, "deprecationMessage": "" }, @@ -3636,7 +11205,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 103, + "line": 168, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReset the wizard to a fresh, empty start.", @@ -3648,11 +11217,11 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 109, + "line": 175, "deprecated": false, "deprecationMessage": "", - "rawdescription": "\nThe effect: when we entered Submitting, call the backend command, flip the\noptimistic cross-page flag, then dispatch the result (and commit/rollback).", - "description": "

The effect: when we entered Submitting, call the backend command, flip the\noptimistic cross-page flag, then dispatch the result (and commit/rollback).

\n", + "rawdescription": "\nThe effect: when we entered Submitting, submit through the aanvraag lifecycle,\nflip the optimistic cross-page flag, then dispatch the result (commit/rollback).", + "description": "

The effect: when we entered Submitting, submit through the aanvraag lifecycle,\nflip the optimistic cross-page flag, then dispatch the result (commit/rollback).

\n", "modifierKind": [ 123, 134 @@ -3677,23 +11246,23 @@ "name": "TextInputComponent", "type": "component" }, - { - "name": "ButtonComponent", - "type": "component" - }, { "name": "AlertComponent", "type": "component" }, { - "name": "SpinnerComponent", + "name": "WizardShellComponent", + "type": "component" + }, + { + "name": "DocumentUploadComponent", "type": "component" } ], "description": "

Organism: multi-step herregistratie wizard. ALL state lives in one signal\ndriven by the pure reduce function (see herregistratie.machine.ts) via an\nElm-style store. The UI just sends messages and folds over the state's tag —\nno booleans like submitting/submitted that could contradict each other.\nSubmitting also flips an optimistic flag on the shared BigProfileStore, so\nthe dashboard shows "in behandeling" immediately.

\n", "rawdescription": "\nOrganism: multi-step herregistratie wizard. ALL state lives in one signal\ndriven by the pure `reduce` function (see herregistratie.machine.ts) via an\nElm-style store. The UI just sends messages and folds over the state's tag —\nno booleans like `submitting`/`submitted` that could contradict each other.\nSubmitting also flips an optimistic flag on the shared BigProfileStore, so\nthe dashboard shows \"in behandeling\" immediately.", "type": "component", - "sourceCode": "import { Component, computed, inject, input } 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 { ButtonComponent } from '@shared/ui/button/button.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { createStore } from '@shared/application/store';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\nimport { WizardState, WizardMsg, Draft, initial, reduce } from '@herregistratie/domain/herregistratie.machine';\nimport { submitHerregistratie } from '@herregistratie/application/submit-herregistratie';\n\n/** Organism: multi-step herregistratie wizard. ALL state lives in one signal\n driven by the pure `reduce` function (see herregistratie.machine.ts) via an\n Elm-style store. The UI just sends messages and folds over the state's tag —\n no booleans like `submitting`/`submitted` that could contradict each other.\n Submitting also flips an optimistic flag on the shared BigProfileStore, so\n the dashboard shows \"in behandeling\" immediately. */\n@Component({\n selector: 'app-herregistratie-wizard',\n imports: [FormsModule, FormFieldComponent, TextInputComponent, ButtonComponent, AlertComponent, SpinnerComponent],\n template: `\n @switch (state().tag) {\n @case ('Editing') {\n

Stap {{ step() }} van 2

\n
\n @if (step() === 1) {\n \n \n \n \n \n \n
\n Volgende\n Annuleren\n
\n } @else {\n \n \n \n
\n Vorige\n Herregistratie aanvragen\n Annuleren\n
\n }\n
\n }\n @case ('Submitting') {\n Aanvraag wordt verwerkt…\n }\n @case ('Submitted') {\n Uw aanvraag tot herregistratie is ontvangen.\n }\n @case ('Failed') {\n Indienen mislukt: {{ failedError() }}\n
\n Opnieuw proberen\n
\n }\n }\n `,\n})\nexport class HerregistratieWizardComponent {\n private profile = inject(BigProfileStore);\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 state = this.store.model; // public so the showcase can highlight the live state\n protected dispatch = this.store.dispatch;\n\n private editing = computed(() => (this.state().tag === 'Editing' ? (this.state() as Extract) : null));\n protected step = computed(() => this.editing()?.step ?? 1);\n protected draft = computed(() => this.editing()?.draft ?? { uren: '', jaren: '', punten: '' });\n protected errUren = computed(() => this.editing()?.errors.uren ?? '');\n protected errJaren = computed(() => this.editing()?.errors.jaren ?? '');\n protected errPunten = computed(() => this.editing()?.errors.punten ?? '');\n protected failedError = computed(() => (this.state().tag === 'Failed' ? (this.state() as Extract).error : ''));\n\n constructor() {\n queueMicrotask(() => this.dispatch({ tag: 'Seed', state: this.seed() }));\n }\n\n onPrimary() {\n const s = this.state();\n if (s.tag !== 'Editing') return;\n this.dispatch(s.step === 1 ? { tag: 'Next' } : { tag: 'Submit' });\n this.runIfSubmitting();\n }\n\n onRetry() {\n this.dispatch({ tag: 'Retry' });\n this.runIfSubmitting();\n }\n\n /** Reset the wizard to a fresh, empty start. */\n restart() {\n this.dispatch({ tag: 'Seed', state: initial });\n }\n\n /** The effect: when we entered Submitting, call the backend command, flip the\n optimistic cross-page flag, then dispatch the result (and 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 submitHerregistratie(s.data);\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, inject, input } 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 { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { WizardShellComponent, WizardError, WizardStatus } 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 { WizardState, WizardMsg, Draft, initial, reduce, hasProgress } from '@herregistratie/domain/herregistratie.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\n/** Organism: multi-step herregistratie wizard. ALL state lives in one signal\n driven by the pure `reduce` function (see herregistratie.machine.ts) via an\n Elm-style store. The UI just sends messages and folds over the state's tag —\n no booleans like `submitting`/`submitted` that could contradict each other.\n Submitting also flips an optimistic flag on the shared BigProfileStore, so\n the dashboard shows \"in behandeling\" immediately. */\n@Component({\n selector: 'app-herregistratie-wizard',\n imports: [FormsModule, FormFieldComponent, TextInputComponent, AlertComponent, WizardShellComponent, DocumentUploadComponent],\n template: `\n 1\"\n [errors]=\"errorList()\"\n [errorMessage]=\"errorMessage()\"\n (primary)=\"onPrimary()\"\n (back)=\"dispatch({ tag: 'Back' })\"\n (cancel)=\"restart()\"\n (retry)=\"onRetry()\">\n\n @switch (step()) {\n @case (1) {\n \n \n \n \n \n \n }\n @case (2) {\n \n \n \n }\n @case (3) {\n \n @if (errDocumenten()) {\n {{ errDocumenten() }}\n }\n }\n }\n\n
\n Uw aanvraag tot herregistratie is ontvangen.\n
\n \n `,\n})\nexport class HerregistratieWizardComponent {\n private profile = inject(BigProfileStore);\n private uploadAdapter = inject(UploadAdapter);\n private store = createStore(initial, reduce);\n\n /** Preview/download link for a completed upload; dev-simulation `demo-*` ids have\n 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 / the showcase can mount any state directly. */\n seed = input(initial);\n\n readonly state = this.store.model; // public so the showcase can highlight the live state\n protected dispatch = this.store.dispatch;\n\n // Backend draft-sync (new persistence for this wizard): create a Concept on first\n // progress, debounced-sync the snapshot, resume by `?aanvraag=`.\n private draftSync = createDraftSync({\n type: 'herregistratie',\n snapshot: () => {\n const s = this.state();\n if (s.tag !== 'Editing' || !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.step - 1, stepCount: this.stepLabels.length, documentIds };\n },\n onResume: (draft) => this.dispatch({ tag: 'Seed', state: (draft as WizardState | null) ?? initial }),\n enabled: () => this.seed() === initial,\n });\n\n // Stepper labels + per-step heading titles (presentational only).\n readonly stepLabels = [$localize`:@@herregWizard.step.werkervaring:Werkervaring`, $localize`:@@herregWizard.step.nascholing:Nascholing`, $localize`:@@herregWizard.step.documenten:Documenten`];\n private stepTitles = [$localize`:@@herregWizard.title.werkervaring:Werkervaring (afgelopen 5 jaar)`, $localize`:@@herregWizard.title.nascholing:Nascholing`, $localize`:@@herregWizard.title.documenten:Documenten aanleveren`];\n\n private editing = computed(() => whenTag(this.state(), 'Editing'));\n protected step = computed(() => this.editing()?.step ?? 1);\n protected draft = computed(() => this.editing()?.draft ?? { uren: '', jaren: '', punten: '' });\n protected upload = computed(() => this.editing()?.upload ?? initialUpload);\n protected errUren = computed(() => this.editing()?.errors.uren ?? '');\n protected errJaren = computed(() => this.editing()?.errors.jaren ?? '');\n protected errPunten = computed(() => this.editing()?.errors.punten ?? '');\n protected errDocumenten = computed(() => this.editing()?.errors.documenten ?? '');\n protected failedError = computed(() => whenTag(this.state(), 'Failed')?.error ?? '');\n protected uploadCtl = createUploadController({\n wizardId: 'herregistratie',\n getUpload: () => this.upload(),\n dispatch: (msg) => this.dispatch({ tag: 'Upload', msg }),\n });\n\n // --- Presentational wiring for the shared wizard shell ---------------------\n protected stepTitle = computed(() => this.stepTitles[this.step() - 1]);\n protected primaryLabel = computed(() => (this.step() < 3 ? $localize`:@@wizard.volgende:Volgende` : $localize`:@@herregWizard.indienen:Herregistratie aanvragen`));\n protected errorMessage = computed(() => $localize`:@@wizard.indienenMislukt:Indienen mislukt:` + ` ${this.failedError()}`);\n protected shellStatus = computed(() => {\n switch (this.state().tag) {\n case 'Editing': 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. */\n protected errorList = computed(() => {\n const e = this.editing()?.errors ?? {};\n return (Object.keys(e) as (keyof typeof e)[])\n .filter((k) => e[k])\n .map((k) => ({ id: k, message: e[k]! }));\n });\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 }\n\n onPrimary() {\n const s = this.state();\n if (s.tag !== 'Editing') return;\n this.dispatch(s.step < 3 ? { tag: 'Next' } : { tag: 'Submit' });\n this.runIfSubmitting();\n }\n\n onRetry() {\n this.dispatch({ tag: 'Retry' });\n this.runIfSubmitting();\n }\n\n /** Reset the wizard to a fresh, empty start. */\n restart() {\n this.draftSync.reset();\n this.dispatch({ tag: 'Seed', state: initial });\n }\n\n /** The effect: when we entered Submitting, submit through the aanvraag lifecycle,\n flip the optimistic cross-page flag, then dispatch the result (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, documents: s.data.documents });\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": "", @@ -3703,13 +11272,13 @@ "deprecated": false, "deprecationMessage": "", "args": [], - "line": 84 + "line": 146 }, "extends": [] }, { "name": "IntakePage", - "id": "component-IntakePage-12d65756545a1c065f64a50a3dacfa1708ad3d1d40663c41306c4c15727ecde5b547f243cda5ec5201137f0a376e7807986a45f89fd717c7e30fac41fc22a6b3", + "id": "component-IntakePage-0e1d34cb0e699276f13fa0f1017015cc2acfde47fdcb7e2c7e84b79784bbb59d46c690227744aa51d0e5e7c62ba8921cc2697e22992878d92a02106c69be5381", "file": "src/app/herregistratie/ui/intake.page.ts", "encapsulation": [], "entryComponents": [], @@ -3719,7 +11288,7 @@ "selector": "app-intake-page", "styleUrls": [], "styles": [], - "template": "\n \n Een paar vragen bepalen welke gegevens we nodig hebben. Afhankelijk van uw\n antwoorden verschijnen er extra vragen. Uw antwoorden blijven bewaard als u\n de pagina herlaadt.\n \n
\n \n
\n
\n", + "template": "\n \n Een paar vragen bepalen welke gegevens we nodig hebben. Afhankelijk van uw\n antwoorden verschijnen er extra vragen. Uw antwoorden blijven bewaard als u\n de pagina herlaadt.\n \n
\n \n
\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -3749,7 +11318,7 @@ "description": "

Page: the branching intake questionnaire. Built entirely from existing\nbuilding blocks (page shell + alert + the intake-wizard organism).

\n", "rawdescription": "\nPage: the branching intake questionnaire. Built entirely from existing\nbuilding blocks (page shell + alert + the intake-wizard organism).", "type": "component", - "sourceCode": "import { Component } from '@angular/core';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { IntakeWizardComponent } from '@herregistratie/ui/intake-wizard/intake-wizard.component';\n\n/** Page: the branching intake questionnaire. Built entirely from existing\n building blocks (page shell + alert + the intake-wizard organism). */\n@Component({\n selector: 'app-intake-page',\n imports: [PageShellComponent, AlertComponent, IntakeWizardComponent],\n template: `\n \n \n Een paar vragen bepalen welke gegevens we nodig hebben. Afhankelijk van uw\n antwoorden verschijnen er extra vragen. Uw antwoorden blijven bewaard als u\n de pagina herlaadt.\n \n
\n \n
\n
\n `,\n})\nexport class IntakePage {}\n", + "sourceCode": "import { Component } from '@angular/core';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { IntakeWizardComponent } from '@herregistratie/ui/intake-wizard/intake-wizard.component';\n\n/** Page: the branching intake questionnaire. Built entirely from existing\n building blocks (page shell + alert + the intake-wizard organism). */\n@Component({\n selector: 'app-intake-page',\n imports: [PageShellComponent, AlertComponent, IntakeWizardComponent],\n template: `\n \n \n Een paar vragen bepalen welke gegevens we nodig hebben. Afhankelijk van uw\n antwoorden verschijnen er extra vragen. Uw antwoorden blijven bewaard als u\n de pagina herlaadt.\n \n
\n \n
\n
\n `,\n})\nexport class IntakePage {}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -3757,7 +11326,7 @@ }, { "name": "IntakeWizardComponent", - "id": "component-IntakeWizardComponent-52bade37a06698f6b30c6175d4d62aa13679d7470643ea97895ebd96115ee352d9bc64cd17cc3fff68cc12fbbb65770febc3224779d3088980aaf1435efaa2ac", + "id": "component-IntakeWizardComponent-73418b26ac5b24a22ca67ae89a7a7a861fc7bd76999c6b55906268d1e52133db126bcd19bcda8702a3c89a29857732caea69435c05ec3e0b259cf59d08b0df1d", "file": "src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts", "encapsulation": [], "entryComponents": [], @@ -3767,7 +11336,7 @@ "selector": "app-intake-wizard", "styleUrls": [], "styles": [], - "template": "@switch (state().tag) {\n @case ('Answering') {\n

Stap {{ cursor() + 1 }} van {{ steps.length }}

\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
Buiten NL gewerkt
{{ answers().buitenlandGewerkt ?? '—' }}
\n @if (answers().buitenlandGewerkt === 'ja') {\n
Land
{{ answers().land }}
\n
Buitenlandse uren
{{ answers().buitenlandseUren }}
\n }\n
Uren NL
{{ answers().uren }}
\n @if (scholingZichtbaar()) {\n
Aanvullende scholing
{{ answers().scholingGevolgd }}
\n }\n @if (answers().scholingGevolgd === 'ja') {\n
Nascholingspunten
{{ answers().punten }}
\n }\n
\n }\n }\n
\n @if (cursor() > 0) {\n Vorige\n }\n {{ step() === 'review' ? 'Aanvraag indienen' : 'Volgende' }}\n Annuleren\n
\n
\n }\n @case ('Submitting') {\n Aanvraag wordt verwerkt…\n }\n @case ('Submitted') {\n Uw aanvraag tot herregistratie is ontvangen.\n
\n Opnieuw beginnen\n
\n }\n @case ('Failed') {\n Indienen mislukt: {{ failedError() }}\n
\n Opnieuw proberen\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\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 @if (scholingZichtbaar()) {\n \n }\n @if (answers().scholingGevolgd === 'ja') {\n \n }\n
\n }\n }\n\n
\n Uw aanvraag tot herregistratie is ontvangen.\n
\n Opnieuw beginnen\n
\n
\n\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -3781,7 +11350,7 @@ "indexKey": "", "optional": false, "description": "

Optional seed so Storybook / the showcase can mount any state directly.

\n", - "line": 129, + "line": 120, "rawdescription": "\nOptional seed so Storybook / the showcase can mount any state directly.", "required": false } @@ -3790,14 +11359,14 @@ "propertiesClass": [ { "name": "answering", - "defaultValue": "computed(() => (this.state().tag === 'Answering' ? (this.state() as Extract) : null))", + "defaultValue": "computed(() => whenTag(this.state(), 'Answering'))", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 135, + "line": 138, "modifierKind": [ 123 ] @@ -3811,7 +11380,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 139, + "line": 142, "modifierKind": [ 124 ] @@ -3825,7 +11394,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 138, + "line": 141, "modifierKind": [ 124 ] @@ -3839,11 +11408,25 @@ "indexKey": "", "optional": false, "description": "", - "line": 133, + "line": 124, "modifierKind": [ 148 ] }, + { + "name": "draftSync", + "defaultValue": "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 | null) ?? initial }),\n enabled: () => this.seed() === initial,\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 127, + "modifierKind": [ + 123 + ] + }, { "name": "err", "defaultValue": "() => {...}", @@ -3853,21 +11436,50 @@ "indexKey": "", "optional": false, "description": "", - "line": 147, + "line": 177, "modifierKind": [ 124 ] }, { - "name": "failedError", - "defaultValue": "computed(() => (this.state().tag === 'Failed' ? (this.state() as Extract).error : ''))", + "name": "errorList", + "defaultValue": "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 })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

Current step's field errors, flattened for the shell's error summary. The\nfield ids match the answer keys, so the summary anchors jump to the field.

\n", + "line": 170, + "rawdescription": "\nCurrent step's field errors, flattened for the shell's error summary. The\nfield ids match the answer keys, so the summary anchors jump to the field.", + "modifierKind": [ + 124 + ] + }, + { + "name": "errorMessage", + "defaultValue": "computed(() => $localize`:@@wizard.indienenMislukt:Indienen mislukt:` + ` ${this.failedError()}`)", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 145, + "line": 159, + "modifierKind": [ + 124 + ] + }, + { + "name": "failedError", + "defaultValue": "computed(() => whenTag(this.state(), 'Failed')?.error ?? '')", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 148, "modifierKind": [ 124 ] @@ -3881,25 +11493,53 @@ "indexKey": "", "optional": false, "description": "", - "line": 131, + "line": 122, "modifierKind": [ 148 ] }, { - "name": "policyRes", - "defaultValue": "httpResource(() => 'mock/intake-policy.json', {\n defaultValue: { scholingThreshold: SCHOLING_THRESHOLD_DEFAULT },\n })", + "name": "policy", + "defaultValue": "inject(IntakePolicyAdapter)", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 124, + "line": 112, "modifierKind": [ 123 ] }, + { + "name": "policyRes", + "defaultValue": "this.policy.policyResource()", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 117, + "modifierKind": [ + 123 + ] + }, + { + "name": "primaryLabel", + "defaultValue": "computed(() => (this.step() === 'review' ? $localize`:@@intake.indienen:Aanvraag indienen` : $localize`:@@wizard.volgende:Volgende`))", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 158, + "modifierKind": [ + 124 + ] + }, { "name": "profile", "defaultValue": "inject(BigProfileStore)", @@ -3909,7 +11549,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 119, + "line": 111, "modifierKind": [ 123 ] @@ -3923,7 +11563,7 @@ "indexKey": "", "optional": false, "description": "

Server-owned threshold from the policy endpoint (mirrored into machine state).

\n", - "line": 142, + "line": 145, "rawdescription": "\nServer-owned threshold from the policy endpoint (mirrored into machine state).", "modifierKind": [ 124 @@ -3938,7 +11578,7 @@ "indexKey": "", "optional": false, "description": "

Whether the inline scholing question is shown (and required) in the 'werk' step.

\n", - "line": 144, + "line": 147, "rawdescription": "\nWhether the inline scholing question is shown (and required) in the 'werk' step.", "modifierKind": [ 124 @@ -3953,7 +11593,21 @@ "indexKey": "", "optional": false, "description": "", - "line": 148, + "line": 178, + "modifierKind": [ + 124 + ] + }, + { + "name": "shellStatus", + "defaultValue": "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 })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 160, "modifierKind": [ 124 ] @@ -3967,7 +11621,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 132, + "line": 123, "modifierKind": [ 148 ] @@ -3981,11 +11635,25 @@ "indexKey": "", "optional": false, "description": "", - "line": 140, + "line": 143, "modifierKind": [ 124 ] }, + { + "name": "stepLabels", + "defaultValue": "[$localize`:@@intake.step.buitenland:Buitenland`, $localize`:@@intake.step.werk:Werk`, $localize`:@@intake.step.controle:Controle`]", + "deprecated": false, + "deprecationMessage": "", + "type": "[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 151, + "modifierKind": [ + 148 + ] + }, { "name": "steps", "defaultValue": "STEPS", @@ -3995,12 +11663,40 @@ "indexKey": "", "optional": false, "description": "

Public so the showcase can render the (fixed) step list next to the wizard.

\n", - "line": 137, + "line": 140, "rawdescription": "\nPublic so the showcase can render the (fixed) step list next to the wizard.", "modifierKind": [ 148 ] }, + { + "name": "stepTitle", + "defaultValue": "computed(() => this.stepTitles[this.step()])", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 157, + "modifierKind": [ + 124 + ] + }, + { + "name": "stepTitles", + "defaultValue": "{\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 }", + "deprecated": false, + "deprecationMessage": "", + "type": "Record", + "indexKey": "", + "optional": false, + "description": "", + "line": 152, + "modifierKind": [ + 123 + ] + }, { "name": "store", "defaultValue": "createStore(initial, reduce)", @@ -4010,7 +11706,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 120, + "line": 113, "modifierKind": [ 123 ] @@ -4023,7 +11719,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 179, + "line": 194, "deprecated": false, "deprecationMessage": "" }, @@ -4033,7 +11729,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 186, + "line": 201, "deprecated": false, "deprecationMessage": "" }, @@ -4043,34 +11739,21 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 191, + "line": 206, "deprecated": false, "deprecationMessage": "" }, - { - "name": "restore", - "args": [], - "optional": false, - "returnType": "IntakeState | null", - "typeParameters": [], - "line": 169, - "deprecated": false, - "deprecationMessage": "", - "modifierKind": [ - 123 - ] - }, { "name": "runIfSubmitting", "args": [], "optional": false, "returnType": "any", "typeParameters": [], - "line": 197, + "line": 213, "deprecated": false, "deprecationMessage": "", - "rawdescription": "\nThe effect: when we enter Submitting, call the backend, flip the optimistic\ncross-page flag, then dispatch the outcome (and commit/rollback).", - "description": "

The effect: when we enter Submitting, call the backend, flip the optimistic\ncross-page flag, then dispatch the outcome (and commit/rollback).

\n", + "rawdescription": "\nThe effect: when we enter Submitting, submit through the aanvraag lifecycle,\nflip the optimistic cross-page flag, then dispatch the outcome (commit/rollback).", + "description": "

The effect: when we enter Submitting, submit through the aanvraag lifecycle,\nflip the optimistic cross-page flag, then dispatch the outcome (commit/rollback).

\n", "modifierKind": [ 123, 134 @@ -4108,14 +11791,18 @@ "type": "component" }, { - "name": "SpinnerComponent", + "name": "DataRowComponent", + "type": "component" + }, + { + "name": "WizardShellComponent", "type": "component" } ], - "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\nlocalStorage so a page reload keeps the user's progress.

\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\nlocalStorage so a page reload keeps the user's progress.", + "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 { httpResource } from '@angular/common/http';\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 } 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 { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { createStore } from '@shared/application/store';\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 SCHOLING_THRESHOLD_DEFAULT,\n} from '@herregistratie/domain/intake.machine';\nimport { IntakePolicyDto } from '@herregistratie/contracts/intake-policy.dto';\nimport { submitIntake } from '@herregistratie/application/submit-intake';\n\nconst STORAGE_KEY = 'intake-v3'; // ponytail: bump the suffix if the persisted state shape changes; no migration.\nconst JA_NEE = [{ value: 'ja', label: 'Ja' }, { value: 'nee', label: 'Nee' }];\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 localStorage so a page reload keeps the user's progress. */\n@Component({\n selector: 'app-intake-wizard',\n imports: [FormsModule, FormFieldComponent, TextInputComponent, RadioGroupComponent, ButtonComponent, AlertComponent, SpinnerComponent],\n template: `\n @switch (state().tag) {\n @case ('Answering') {\n

Stap {{ cursor() + 1 }} van {{ steps.length }}

\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
Buiten NL gewerkt
{{ answers().buitenlandGewerkt ?? '—' }}
\n @if (answers().buitenlandGewerkt === 'ja') {\n
Land
{{ answers().land }}
\n
Buitenlandse uren
{{ answers().buitenlandseUren }}
\n }\n
Uren NL
{{ answers().uren }}
\n @if (scholingZichtbaar()) {\n
Aanvullende scholing
{{ answers().scholingGevolgd }}
\n }\n @if (answers().scholingGevolgd === 'ja') {\n
Nascholingspunten
{{ answers().punten }}
\n }\n
\n }\n }\n
\n @if (cursor() > 0) {\n Vorige\n }\n {{ step() === 'review' ? 'Aanvraag indienen' : 'Volgende' }}\n Annuleren\n
\n
\n }\n @case ('Submitting') {\n Aanvraag wordt verwerkt…\n }\n @case ('Submitted') {\n Uw aanvraag tot herregistratie is ontvangen.\n
\n Opnieuw beginnen\n
\n }\n @case ('Failed') {\n Indienen mislukt: {{ failedError() }}\n
\n Opnieuw proberen\n
\n }\n }\n `,\n})\nexport class IntakeWizardComponent {\n private profile = inject(BigProfileStore);\n private store = createStore(initial, reduce);\n\n // Server-owned policy: the scholing threshold is fetched, not hardcoded. The\n // backend stays the authority and re-validates on submit.\n private policyRes = httpResource(() => 'mock/intake-policy.json', {\n defaultValue: { scholingThreshold: SCHOLING_THRESHOLD_DEFAULT },\n });\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 private answering = computed(() => (this.state().tag === 'Answering' ? (this.state() as Extract) : null));\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(() => (this.state().tag === 'Failed' ? (this.state() as Extract).error : ''));\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) wins; otherwise resume from localStorage.\n const seeded = this.seed();\n queueMicrotask(() => this.dispatch({ tag: 'Seed', state: seeded !== initial ? seeded : (this.restore() ?? initial) }));\n // Persist only while answering; clear once the flow is done.\n effect(() => {\n const s = this.state();\n if (s.tag === 'Answering') localStorage.setItem(STORAGE_KEY, JSON.stringify(s));\n else localStorage.removeItem(STORAGE_KEY);\n });\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.policyRes.value().scholingThreshold;\n untracked(() => this.dispatch({ tag: 'SetPolicy', scholingThreshold }));\n });\n }\n\n private restore(): IntakeState | null {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n try {\n return JSON.parse(raw) as IntakeState;\n } catch {\n return null; // ponytail: corrupt entry -> start fresh, no migration.\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.dispatch({ tag: 'Seed', state: initial });\n }\n\n /** The effect: when we enter Submitting, call the backend, flip the optimistic\n cross-page flag, then dispatch the outcome (and 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 submitIntake(s.data);\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 { WizardShellComponent, WizardError, WizardStatus } 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 { IntakePolicyAdapter } from '@herregistratie/infrastructure/intake-policy.adapter';\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, 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\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 @if (scholingZichtbaar()) {\n \n }\n @if (answers().scholingGevolgd === 'ja') {\n \n }\n
\n }\n }\n\n
\n Uw aanvraag tot herregistratie is ontvangen.\n
\n Opnieuw beginnen\n
\n
\n \n `,\n})\nexport class IntakeWizardComponent {\n private profile = inject(BigProfileStore);\n private policy = inject(IntakePolicyAdapter);\n private store = createStore(initial, reduce);\n\n // Server-owned policy: the scholing threshold is fetched from the backend, not\n // hardcoded. The backend stays the authority and re-validates on submit.\n private policyRes = this.policy.policyResource();\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 | null) ?? initial }),\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(() => (this.step() === 'review' ? $localize`:@@intake.indienen:Aanvraag indienen` : $localize`:@@wizard.volgende:Volgende`));\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.policyRes.value()?.scholingThreshold ?? SCHOLING_THRESHOLD_DEFAULT;\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": "", @@ -4125,7 +11812,7 @@ "deprecated": false, "deprecationMessage": "", "args": [], - "line": 148 + "line": 178 }, "extends": [] }, @@ -4182,7 +11869,7 @@ }, { "name": "LoginFormComponent", - "id": "component-LoginFormComponent-8dba6a4389a532f36aaf74d6c5258521a2020ac11eb8c207aa1b0605da6f3971e1aeada702062295b5310aa9043c413de220e6062d0b8de97241f4a37f280ff0", + "id": "component-LoginFormComponent-a686fcffd7d24f1cfe21f4e6308aa698b319bffdb9ba9dab515953969a0ef53f378dd5c751806cd68c104f5fd89c4eadf6eb8da6796ceafd59501fa4767f29c2", "file": "src/app/auth/ui/login-form/login-form.component.ts", "encapsulation": [], "entryComponents": [], @@ -4192,7 +11879,7 @@ "selector": "app-login-form", "styleUrls": [], "styles": [], - "template": "
\n \n \n \n\n \n \n \n\n
\n Inloggen met DigiD\n
\n
\n", + "template": "
\n \n \n \n\n \n \n \n\n Inloggen met DigiD\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -4206,7 +11893,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 30, + "line": 28, "required": false } ], @@ -4220,7 +11907,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 28 + "line": 26 }, { "name": "password", @@ -4231,7 +11918,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 29 + "line": 27 } ], "methodsClass": [], @@ -4261,7 +11948,7 @@ "description": "

Organism: DigiD-style mock login. No real auth — just composes atoms/molecules.

\n", "rawdescription": "\nOrganism: DigiD-style mock login. No real auth — just composes atoms/molecules.", "type": "component", - "sourceCode": "import { Component, output } 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 { ButtonComponent } from '@shared/ui/button/button.component';\n\n/** Organism: DigiD-style mock login. No real auth — just composes atoms/molecules. */\n@Component({\n selector: 'app-login-form',\n imports: [FormsModule, FormFieldComponent, TextInputComponent, ButtonComponent],\n template: `\n
\n \n \n \n\n \n \n \n\n
\n Inloggen met DigiD\n
\n
\n `,\n})\nexport class LoginFormComponent {\n bsn = '';\n password = '';\n submitted = output();\n}\n", + "sourceCode": "import { Component, output } 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 { ButtonComponent } from '@shared/ui/button/button.component';\n\n/** Organism: DigiD-style mock login. No real auth — just composes atoms/molecules. */\n@Component({\n selector: 'app-login-form',\n imports: [FormsModule, FormFieldComponent, TextInputComponent, ButtonComponent],\n template: `\n
\n \n \n \n\n \n \n \n\n Inloggen met DigiD\n
\n `,\n})\nexport class LoginFormComponent {\n bsn = '';\n password = '';\n submitted = output();\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -4269,7 +11956,7 @@ }, { "name": "LoginPage", - "id": "component-LoginPage-0cdc77f70073f58aa4eb17a72400adf1897b91d2c2d9df1dba75768c6f53a7f702d7389d6e9b43082faec0c24240d1963d21bd0f564f8980240b53009f615749", + "id": "component-LoginPage-8360ce09834f323691c650e3c682e57f431504c3660e1269b832feb8fe109f04f5b9e120b6e4fdcf7a06006d42ead8797359133b3354f01545a5175df38a4f11", "file": "src/app/auth/ui/login.page.ts", "encapsulation": [], "entryComponents": [], @@ -4279,7 +11966,7 @@ "selector": "app-login-page", "styleUrls": [], "styles": [], - "template": "\n @if (error()) { {{ error() }} }\n \n\n", + "template": "\n @if (error()) { {{ error() }} }\n \n\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -4385,7 +12072,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { Component, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { LoginFormComponent } from '@auth/ui/login-form/login-form.component';\nimport { SessionStore } from '@auth/application/session.store';\n\n@Component({\n selector: 'app-login-page',\n imports: [PageShellComponent, AlertComponent, LoginFormComponent],\n template: `\n \n @if (error()) { {{ error() }} }\n \n \n `,\n})\nexport class LoginPage {\n private store = inject(SessionStore);\n private router = inject(Router);\n error = signal('');\n\n async login(bsn: string) {\n const r = await this.store.login(bsn);\n if (r.ok) this.router.navigate(['/dashboard']);\n else this.error.set(r.error);\n }\n}\n", + "sourceCode": "import { Component, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { LoginFormComponent } from '@auth/ui/login-form/login-form.component';\nimport { SessionStore } from '@auth/application/session.store';\n\n@Component({\n selector: 'app-login-page',\n imports: [PageShellComponent, AlertComponent, LoginFormComponent],\n template: `\n \n @if (error()) { {{ error() }} }\n \n \n `,\n})\nexport class LoginPage {\n private store = inject(SessionStore);\n private router = inject(Router);\n error = signal('');\n\n async login(bsn: string) {\n const r = await this.store.login(bsn);\n if (r.ok) this.router.navigate(['/dashboard']);\n else this.error.set(r.error);\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -4393,7 +12080,7 @@ }, { "name": "PageShellComponent", - "id": "component-PageShellComponent-31358e27927ab9673066fef0e3dd43ab91c1d80ec87ecf99b63696dc8b050b0617895c809a2e76815b3ad8d4e0adfddd8ea0774c734bb7b08b0efa56bea0236c", + "id": "component-PageShellComponent-b863d58c6a1bfb770578f4a70b3e9902293ba864ae010d7484b135d15183893c2337adbcf46ee8bf2f492d1096603e8215272b6aa0ca31cc1cec4cfd6fb22734", "file": "src/app/shared/layout/page-shell/page-shell.component.ts", "encapsulation": [], "entryComponents": [], @@ -4403,22 +12090,22 @@ "selector": "app-page-shell", "styleUrls": [], "styles": [ - "\n :host{display:block}\n .body--narrow{max-inline-size:var(--app-form-narrow)}\n .crumb{margin-block-end:var(--rhc-space-max-xl)}\n .intro{margin-block-end:var(--rhc-space-max-2xl)}\n " + "\n :host{display:block}\n .body--narrow{max-inline-size:var(--app-form-narrow)}\n .back{margin:0 0 var(--rhc-space-max-lg)}\n .intro{margin-block:var(--rhc-space-max-md) var(--rhc-space-max-2xl);max-inline-size:42rem;color:var(--rhc-color-foreground-subtle)}\n " ], - "template": "
\n @if (breadcrumb()) {\n \n }\n @if (backLink()) {\n

← {{ backLabel() }}

\n }\n {{ heading() }}\n @if (intro()) {\n

{{ intro() }}

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

← {{ backLabel() }}

\n }\n {{ heading() }}\n @if (intro()) {\n

{{ intro() }}

\n }\n \n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], "inputsClass": [ { "name": "backLabel", - "defaultValue": "'Terug naar overzicht'", + "defaultValue": "$localize`:@@pageShell.backLabel:Terug naar overzicht`", "deprecated": false, "deprecationMessage": "", "indexKey": "", "optional": false, "description": "", - "line": 38, + "line": 35, "required": false }, { @@ -4429,18 +12116,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 37, - "required": false - }, - { - "name": "breadcrumb", - "deprecated": false, - "deprecationMessage": "", - "type": "BreadcrumbItem[]", - "indexKey": "", - "optional": false, - "description": "", - "line": 40, + "line": 34, "required": false }, { @@ -4451,7 +12127,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 35, + "line": 32, "required": true }, { @@ -4462,7 +12138,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 36, + "line": 33, "required": false }, { @@ -4474,7 +12150,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 39, + "line": 36, "required": false } ], @@ -4494,24 +12170,20 @@ { "name": "LinkComponent", "type": "component" - }, - { - "name": "BreadcrumbComponent", - "type": "component" } ], - "description": "

Template: standard page body — optional breadcrumb, optional back-link, a\nheading, optional intro, and projected content. Rendered inside the persistent\nShellComponent via the router outlet, so it owns only the content (not chrome).

\n", - "rawdescription": "\nTemplate: standard page body — optional breadcrumb, optional back-link, a\nheading, optional intro, and projected content. Rendered inside the persistent\nShellComponent via the router outlet, so it owns only the content (not chrome).", + "description": "

Template: standard page body — optional back-link, a heading, optional intro,\nand projected content. The breadcrumb lives in the site header (blue bar), so\nit's not repeated here. Rendered inside the persistent ShellComponent via the\nrouter outlet, so it owns only the content (not chrome).

\n", + "rawdescription": "\nTemplate: standard page body — optional back-link, a heading, optional intro,\nand projected content. The breadcrumb lives in the site header (blue bar), so\nit's not repeated here. Rendered inside the persistent ShellComponent via the\nrouter outlet, so it owns only the content (not chrome).", "type": "component", - "sourceCode": "import { Component, input } from '@angular/core';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\nimport { LinkComponent } from '@shared/ui/link/link.component';\nimport { BreadcrumbComponent, BreadcrumbItem } from '@shared/layout/breadcrumb/breadcrumb.component';\n\n/** Template: standard page body — optional breadcrumb, optional back-link, a\n heading, optional intro, and projected content. Rendered inside the persistent\n ShellComponent via the router outlet, so it owns only the content (not chrome). */\n@Component({\n selector: 'app-page-shell',\n imports: [HeadingComponent, LinkComponent, BreadcrumbComponent],\n styles: [`\n :host{display:block}\n .body--narrow{max-inline-size:var(--app-form-narrow)}\n .crumb{margin-block-end:var(--rhc-space-max-xl)}\n .intro{margin-block-end:var(--rhc-space-max-2xl)}\n `],\n template: `\n
\n @if (breadcrumb()) {\n \n }\n @if (backLink()) {\n

← {{ backLabel() }}

\n }\n {{ heading() }}\n @if (intro()) {\n

{{ intro() }}

\n }\n \n
\n `,\n})\nexport class PageShellComponent {\n heading = input.required();\n intro = input();\n backLink = input();\n backLabel = input('Terug naar overzicht');\n width = input<'default' | 'narrow'>('default');\n breadcrumb = input();\n}\n", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { HeadingComponent } from '@shared/ui/heading/heading.component';\nimport { LinkComponent } from '@shared/ui/link/link.component';\n\n/** Template: standard page body — optional back-link, a heading, optional intro,\n and projected content. The breadcrumb lives in the site header (blue bar), so\n it's not repeated here. Rendered inside the persistent ShellComponent via the\n router outlet, so it owns only the content (not chrome). */\n@Component({\n selector: 'app-page-shell',\n imports: [HeadingComponent, LinkComponent],\n styles: [`\n :host{display:block}\n .body--narrow{max-inline-size:var(--app-form-narrow)}\n .back{margin:0 0 var(--rhc-space-max-lg)}\n .intro{margin-block:var(--rhc-space-max-md) var(--rhc-space-max-2xl);max-inline-size:42rem;color:var(--rhc-color-foreground-subtle)}\n `],\n template: `\n
\n @if (backLink()) {\n

← {{ backLabel() }}

\n }\n {{ heading() }}\n @if (intro()) {\n

{{ intro() }}

\n }\n \n
\n `,\n})\nexport class PageShellComponent {\n heading = input.required();\n intro = input();\n backLink = input();\n backLabel = input($localize`:@@pageShell.backLabel:Terug naar overzicht`);\n width = input<'default' | 'narrow'>('default');\n}\n", "assetsDirs": [], "styleUrlsData": "", - "stylesData": "\n :host{display:block}\n .body--narrow{max-inline-size:var(--app-form-narrow)}\n .crumb{margin-block-end:var(--rhc-space-max-xl)}\n .intro{margin-block-end:var(--rhc-space-max-2xl)}\n \n", + "stylesData": "\n :host{display:block}\n .body--narrow{max-inline-size:var(--app-form-narrow)}\n .back{margin:0 0 var(--rhc-space-max-lg)}\n .intro{margin-block:var(--rhc-space-max-md) var(--rhc-space-max-2xl);max-inline-size:42rem;color:var(--rhc-color-foreground-subtle)}\n \n", "extends": [] }, { "name": "RadioGroupComponent", - "id": "component-RadioGroupComponent-a4c75390d3b62730cdd6f53a2ffcb3badde60f23c9104d57d8f8221d038f1dc96a229916ee28bbec4a54dd41e0e88c838ea46b35facfab0ddb5fea79fed37cc0", + "id": "component-RadioGroupComponent-6203162055a34b4133e76690b148d45884cd1f41bf3d478fb1a54123a7aeb725b01d619611cf73b9807dd8144cc9d276b36a7e8f90d0b3191e1948a4452929fd", "file": "src/app/shared/ui/radio-group/radio-group.component.ts", "encapsulation": [], "entryComponents": [], @@ -4540,7 +12212,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 50, + "line": 57, "required": false }, { @@ -4551,7 +12223,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 49, + "line": 56, "required": true }, { @@ -4562,7 +12234,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 48, + "line": 55, "required": true } ], @@ -4577,7 +12249,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 53 + "line": 60 }, { "name": "onChange", @@ -4588,7 +12260,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 54 + "line": 61 }, { "name": "onTouched", @@ -4599,7 +12271,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 55 + "line": 62 }, { "name": "value", @@ -4610,7 +12282,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 52 + "line": 59 } ], "methodsClass": [ @@ -4639,7 +12311,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 62, + "line": 69, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -4682,7 +12354,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 63, + "line": 70, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -4715,7 +12387,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 57, + "line": 64, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -4747,7 +12419,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 64, + "line": 71, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -4779,7 +12451,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 61, + "line": 68, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -4806,7 +12478,7 @@ "description": "

Atom: a radio group. Thin wrapper over the Utrecht/RHC radio CSS, wired as a\nform control so it works with ngModel just like the text-input atom.

\n", "rawdescription": "\nAtom: a radio group. Thin wrapper over the Utrecht/RHC radio CSS, wired as a\nform control so it works with ngModel just like the text-input atom.", "type": "component", - "sourceCode": "import { Component, forwardRef, input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface RadioOption {\n value: string;\n label: string;\n}\n\n/** Atom: a radio group. Thin wrapper over the Utrecht/RHC radio CSS, wired as a\n form control so it works with ngModel just like the text-input atom. */\n@Component({\n selector: 'app-radio-group',\n styles: [`\n .rhc-radio-option {\n display: flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n }\n `],\n template: `\n \n @for (opt of options(); track opt.value) {\n \n }\n
\n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true }],\n})\nexport class RadioGroupComponent implements ControlValueAccessor {\n options = input.required();\n name = input.required();\n invalid = input(false);\n\n value = '';\n disabled = false;\n onChange: (v: string) => void = () => {};\n onTouched: () => void = () => {};\n\n select(v: string) {\n this.value = v;\n this.onChange(v);\n }\n writeValue(v: string) { this.value = v ?? ''; }\n registerOnChange(fn: (v: string) => void) { this.onChange = fn; }\n registerOnTouched(fn: () => void) { this.onTouched = fn; }\n setDisabledState(d: boolean) { this.disabled = d; }\n}\n", + "sourceCode": "import { Component, forwardRef, input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nexport interface RadioOption {\n value: string;\n label: string;\n}\n\n/** The ubiquitous yes/no option pair. Language-agnostic now the labels are\n localized, so it lives next to RadioOption and both wizards import it. */\nexport const JA_NEE: RadioOption[] = [\n { value: 'ja', label: $localize`:@@common.ja:Ja` },\n { value: 'nee', label: $localize`:@@common.nee:Nee` },\n];\n\n/** Atom: a radio group. Thin wrapper over the Utrecht/RHC radio CSS, wired as a\n form control so it works with ngModel just like the text-input atom. */\n@Component({\n selector: 'app-radio-group',\n styles: [`\n .rhc-radio-option {\n display: flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n }\n `],\n template: `\n \n @for (opt of options(); track opt.value) {\n \n }\n
\n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true }],\n})\nexport class RadioGroupComponent implements ControlValueAccessor {\n options = input.required();\n name = input.required();\n invalid = input(false);\n\n value = '';\n disabled = false;\n onChange: (v: string) => void = () => {};\n onTouched: () => void = () => {};\n\n select(v: string) {\n this.value = v;\n this.onChange(v);\n }\n writeValue(v: string) { this.value = v ?? ''; }\n registerOnChange(fn: (v: string) => void) { this.onChange = fn; }\n registerOnTouched(fn: () => void) { this.onTouched = fn; }\n setDisabledState(d: boolean) { this.disabled = d; }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "\n .rhc-radio-option {\n display: flex;\n align-items: center;\n gap: var(--rhc-space-max-md);\n padding-block: var(--rhc-space-max-sm);\n }\n \n", @@ -4817,7 +12489,7 @@ }, { "name": "RegistratiePage", - "id": "component-RegistratiePage-90adf901a35dfb1d68fde165ed8bbed0a6d8c111cc033d0dc464aa1787630e07ce0ca89d287ff0b9344571fff03b13caaac81e657c32dfdddbf699563a7d4cc3", + "id": "component-RegistratiePage-df4e1ca6ac40fac3e82ebc188b2e213e7320f222b9ced7084ed695ce313bc0a654bf1cdff8929f68b9f6e0f4786a31c0edb401bde1cf57be7bcaa9e078b5190f", "file": "src/app/registratie/ui/registratie.page.ts", "encapsulation": [], "entryComponents": [], @@ -4827,7 +12499,7 @@ "selector": "app-registratie-page", "styleUrls": [], "styles": [], - "template": "\n \n In drie stappen schrijft u zich in: uw adres en correspondentievoorkeur, het\n diploma waarmee u zich registreert, en een controle. Uw gegevens blijven bewaard\n als u de pagina herlaadt.\n \n
\n \n
\n\n", + "template": "\n \n In drie stappen schrijft u zich in: uw adres en correspondentievoorkeur, het\n diploma waarmee u zich registreert, en een controle. Uw gegevens blijven bewaard\n als u de pagina herlaadt.\n \n
\n \n
\n\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -4857,7 +12529,7 @@ "description": "

Page: register in the BIG-register. Built entirely from existing building\nblocks (page shell + alert + the registratie-wizard organism).

\n", "rawdescription": "\nPage: register in the BIG-register. Built entirely from existing building\nblocks (page shell + alert + the registratie-wizard organism).", "type": "component", - "sourceCode": "import { Component } from '@angular/core';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { RegistratieWizardComponent } from '@registratie/ui/registratie-wizard/registratie-wizard.component';\n\n/** Page: register in the BIG-register. Built entirely from existing building\n blocks (page shell + alert + the registratie-wizard organism). */\n@Component({\n selector: 'app-registratie-page',\n imports: [PageShellComponent, AlertComponent, RegistratieWizardComponent],\n template: `\n \n \n In drie stappen schrijft u zich in: uw adres en correspondentievoorkeur, het\n diploma waarmee u zich registreert, en een controle. Uw gegevens blijven bewaard\n als u de pagina herlaadt.\n \n
\n \n
\n \n `,\n})\nexport class RegistratiePage {}\n", + "sourceCode": "import { Component } from '@angular/core';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { RegistratieWizardComponent } from '@registratie/ui/registratie-wizard/registratie-wizard.component';\n\n/** Page: register in the BIG-register. Built entirely from existing building\n blocks (page shell + alert + the registratie-wizard organism). */\n@Component({\n selector: 'app-registratie-page',\n imports: [PageShellComponent, AlertComponent, RegistratieWizardComponent],\n template: `\n \n \n In drie stappen schrijft u zich in: uw adres en correspondentievoorkeur, het\n diploma waarmee u zich registreert, en een controle. Uw gegevens blijven bewaard\n als u de pagina herlaadt.\n \n
\n \n
\n \n `,\n})\nexport class RegistratiePage {}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -4865,7 +12537,7 @@ }, { "name": "RegistratieWizardComponent", - "id": "component-RegistratieWizardComponent-db420c0c655aba555101de3bab37ec4eb12df2290c2b5fb98d047e0bca827b66c3209cb4dd53e5d472e7d841444da01d5340ea53ecf4f35707386565975f65cb", + "id": "component-RegistratieWizardComponent-6699582faf33f53f52e163a7d6139c619837873bdcde4759036630ad0c8e0a15066f7014e097e562d31c15d08b8ba68c5c5e4fcbd1ccffb7ea60f2c2aecccdc4", "file": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", "encapsulation": [], "entryComponents": [], @@ -4875,7 +12547,7 @@ "selector": "app-registratie-wizard", "styleUrls": [], "styles": [], - "template": "@switch (state().tag) {\n @case ('Invullen') {\n \n

{{ stepTitle() }}

\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 @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 @for (item of samenvattingVragen(); track item.vraag) {\n \n }\n
\n
\n Adres wijzigen\n Diploma wijzigen\n
\n }\n }\n
\n @if (cursor() > 0) {\n Vorige\n }\n {{ step() === 'controle' ? 'Registratie indienen' : 'Volgende' }}\n Annuleren\n
\n \n }\n @case ('Indienen') {\n Uw registratie wordt verwerkt…\n }\n @case ('Ingediend') {\n Uw registratie is ontvangen. Uw referentienummer is {{ referentie() }}. Bewaar dit nummer voor uw administratie.\n
\n Nieuwe registratie starten\n
\n }\n @case ('Mislukt') {\n Het indienen is niet gelukt: {{ failedError() }}\n
\n Opnieuw proberen\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\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 @for (item of samenvattingVragen(); track item.vraag) {\n \n }\n
\n
\n Adres wijzigen\n Diploma wijzigen\n
\n }\n }\n\n
\n Uw registratie is ontvangen. Uw referentienummer is {{ referentie() }}. Bewaar dit nummer voor uw administratie.\n
\n Nieuwe registratie starten\n
\n
\n\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -4889,7 +12561,7 @@ "indexKey": "", "optional": false, "description": "

Optional seed so Storybook / tests can mount any state directly.

\n", - "line": 181, + "line": 200, "rawdescription": "\nOptional seed so Storybook / tests can mount any state directly.", "required": false } @@ -4905,7 +12577,7 @@ "indexKey": "", "optional": false, "description": "

The policy questions that apply to the current choice (server-decided).

\n", - "line": 255, + "line": 314, "rawdescription": "\nThe policy questions that apply to the current choice (server-decided).", "modifierKind": [ 124 @@ -4913,14 +12585,14 @@ }, { "name": "adresHerkomstLabel", - "defaultValue": "computed(() => ({ brp: 'Automatisch uit de BRP', handmatig: 'Handmatig ingevoerd' }[this.draft().adresHerkomst ?? 'handmatig']))", + "defaultValue": "computed(() => ({ brp: $localize`:@@regWizard.herkomst.adresBrp:Automatisch uit de BRP`, handmatig: $localize`:@@regWizard.herkomst.adresHandmatig:Handmatig ingevoerd` }[this.draft().adresHerkomst ?? 'handmatig']))", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 204, + "line": 263, "modifierKind": [ 124 ] @@ -4934,7 +12606,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 177, + "line": 196, "modifierKind": [ 124 ] @@ -4948,7 +12620,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 199, + "line": 258, "modifierKind": [ 124 ] @@ -4962,7 +12634,7 @@ "indexKey": "", "optional": false, "description": "

BRP lookup outcome. A failure or "geen adres" never blocks the wizard — both\nfall back to manual entry (PRD §7). 'geen' covers both no-address-found and a\nmalformed response; 'fout' is an unreachable BRP.

\n", - "line": 211, + "line": 270, "rawdescription": "\nBRP lookup outcome. A failure or \"geen adres\" never blocks the wizard — both\nfall back to manual entry (PRD §7). 'geen' covers both no-address-found and a\nmalformed response; 'fout' is an unreachable BRP.", "modifierKind": [ 124 @@ -4977,7 +12649,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 252, + "line": 311, "modifierKind": [ 124 ] @@ -4991,21 +12663,21 @@ "indexKey": "", "optional": false, "description": "", - "line": 173, + "line": 186, "modifierKind": [ 123 ] }, { "name": "correspondentieLabel", - "defaultValue": "computed(() => ({ email: 'Per e-mail', post: 'Per post' }[this.draft().correspondentie ?? 'post']))", + "defaultValue": "computed(() => ({ email: $localize`:@@regWizard.corr.email:Per e-mail`, post: $localize`:@@regWizard.corr.post:Per post` }[this.draft().correspondentie ?? 'post']))", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 205, + "line": 264, "modifierKind": [ 124 ] @@ -5019,21 +12691,21 @@ "indexKey": "", "optional": false, "description": "", - "line": 193, + "line": 209, "modifierKind": [ 124 ] }, { "name": "diplomaHerkomstLabel", - "defaultValue": "computed(() => ({ duo: 'Geverifieerd via DUO', handmatig: 'Handmatig ingevoerd (wordt beoordeeld)' }[this.draft().diplomaHerkomst ?? 'handmatig']))", + "defaultValue": "computed(() => ({ duo: $localize`:@@regWizard.herkomst.diplomaDuo:Geverifieerd via DUO`, handmatig: $localize`:@@regWizard.herkomst.diplomaHandmatig:Handmatig ingevoerd (wordt beoordeeld)` }[this.draft().diplomaHerkomst ?? 'handmatig']))", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 206, + "line": 265, "modifierKind": [ 124 ] @@ -5047,7 +12719,7 @@ "indexKey": "", "optional": false, "description": "

The radio selection: a diploma id, or the "not listed" sentinel in manual mode.

\n", - "line": 245, + "line": 304, "rawdescription": "\nThe radio selection: a diploma id, or the \"not listed\" sentinel in manual mode.", "modifierKind": [ 124 @@ -5062,7 +12734,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 247, + "line": 306, "modifierKind": [ 124 ] @@ -5076,7 +12748,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 178, + "line": 197, "modifierKind": [ 123 ] @@ -5090,7 +12762,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 187, + "line": 206, "modifierKind": [ 148 ] @@ -5104,11 +12776,25 @@ "indexKey": "", "optional": false, "description": "", - "line": 194, + "line": 210, "modifierKind": [ 124 ] }, + { + "name": "draftSync", + "defaultValue": "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 | null) ?? initial }),\n enabled: () => this.seed() === initial,\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 219, + "modifierKind": [ + 123 + ] + }, { "name": "duo", "defaultValue": "inject(DuoAdapter)", @@ -5118,7 +12804,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 174, + "line": 187, "modifierKind": [ 123 ] @@ -5132,7 +12818,7 @@ "indexKey": "", "optional": false, "description": "

Parsed lookup as a plain value (or null) — used outside the beroep step (the\ncontrole summary) where the template variable isn't in scope.

\n", - "line": 230, + "line": 289, "rawdescription": "\nParsed lookup as a plain value (or null) — used outside the beroep step (the\ncontrole summary) where the template variable isn't in scope.", "modifierKind": [ 123 @@ -5147,6 +12833,35 @@ "indexKey": "", "optional": false, "description": "", + "line": 296, + "modifierKind": [ + 124 + ] + }, + { + "name": "errorList", + "defaultValue": "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 })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

Current step's errors (incl. per-question), flattened for the error summary.

\n", + "line": 247, + "rawdescription": "\nCurrent step's errors (incl. per-question), flattened for the error summary.", + "modifierKind": [ + 124 + ] + }, + { + "name": "errorMessage", + "defaultValue": "computed(() => $localize`:@@regWizard.indienenMislukt:Het indienen is niet gelukt:` + ` ${this.failedError()}`)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", "line": 237, "modifierKind": [ 124 @@ -5154,14 +12869,14 @@ }, { "name": "failedError", - "defaultValue": "computed(() => (this.state().tag === 'Mislukt' ? (this.state() as Extract).error : ''))", + "defaultValue": "computed(() => whenTag(this.state(), 'Mislukt')?.error ?? '')", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 198, + "line": 233, "modifierKind": [ 124 ] @@ -5175,7 +12890,7 @@ "indexKey": "", "optional": false, "description": "

True while the user is entering a diploma manually (not in the DUO list).

\n", - "line": 243, + "line": 302, "rawdescription": "\nTrue while the user is entering a diploma manually (not in the DUO list).", "modifierKind": [ 124 @@ -5183,14 +12898,14 @@ }, { "name": "invullen", - "defaultValue": "computed(() => (this.state().tag === 'Invullen' ? (this.state() as Extract) : null))", + "defaultValue": "computed(() => whenTag(this.state(), 'Invullen'))", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 192, + "line": 208, "modifierKind": [ 123 ] @@ -5204,7 +12919,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 235, + "line": 294, "modifierKind": [ 148 ] @@ -5218,7 +12933,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 183, + "line": 202, "modifierKind": [ 148 ] @@ -5232,22 +12947,51 @@ "indexKey": "", "optional": false, "description": "

The DUO lookup (diplomas + manual fallback), validated at the trust boundary.

\n", - "line": 221, + "line": 280, "rawdescription": "\nThe DUO lookup (diplomas + manual fallback), validated at the trust boundary.", "modifierKind": [ 124 ] }, { - "name": "referentie", - "defaultValue": "computed(() => (this.state().tag === 'Ingediend' ? (this.state() as Extract).referentie : ''))", + "name": "previewUrlFor", + "defaultValue": "() => {...}", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

Preview/download link for a completed upload; the dev-simulation demo-* ids\nhave no stored bytes, so they get no link.

\n", + "line": 193, + "rawdescription": "\nPreview/download link for a completed upload; the dev-simulation `demo-*` ids\nhave no stored bytes, so they get no link.", + "modifierKind": [ + 124 + ] + }, + { + "name": "primaryLabel", + "defaultValue": "computed(() => (this.step() === 'controle' ? $localize`:@@regWizard.indienen:Registratie indienen` : $localize`:@@wizard.volgende:Volgende`))", "deprecated": false, "deprecationMessage": "", "type": "unknown", "indexKey": "", "optional": false, "description": "", - "line": 197, + "line": 236, + "modifierKind": [ + 124 + ] + }, + { + "name": "referentie", + "defaultValue": "computed(() => whenTag(this.state(), 'Ingediend')?.referentie ?? '')", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 232, "modifierKind": [ 124 ] @@ -5261,7 +13005,7 @@ "indexKey": "", "optional": false, "description": "

Answered policy questions for the controle summary (question text + answer).

\n", - "line": 261, + "line": 320, "rawdescription": "\nAnswered policy questions for the controle summary (question text + answer).", "modifierKind": [ 124 @@ -5276,7 +13020,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 239, + "line": 298, "modifierKind": [ 124 ] @@ -5290,7 +13034,21 @@ "indexKey": "", "optional": false, "description": "", - "line": 240, + "line": 299, + "modifierKind": [ + 124 + ] + }, + { + "name": "shellStatus", + "defaultValue": "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 })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 238, "modifierKind": [ 124 ] @@ -5304,7 +13062,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 186, + "line": 205, "modifierKind": [ 148 ] @@ -5318,36 +13076,21 @@ "indexKey": "", "optional": false, "description": "", - "line": 195, + "line": 230, "modifierKind": [ 124 ] }, - { - "name": "stepHeading", - "defaultValue": "viewChild>('stepHeading')", - "deprecated": false, - "deprecationMessage": "", - "type": "unknown", - "indexKey": "", - "optional": false, - "description": "

Focus target: the step heading receives focus on step change (a11y).

\n", - "line": 190, - "rawdescription": "\nFocus target: the step heading receives focus on step change (a11y).", - "modifierKind": [ - 123 - ] - }, { "name": "stepLabels", - "defaultValue": "['Adres', 'Beroep', 'Controle']", + "defaultValue": "[$localize`:@@regWizard.step.adres:Adres`, $localize`:@@regWizard.step.beroep:Beroep`, $localize`:@@regWizard.step.controle:Controle`]", "deprecated": false, "deprecationMessage": "", "type": "[]", "indexKey": "", "optional": false, "description": "", - "line": 184, + "line": 203, "modifierKind": [ 148 ] @@ -5361,21 +13104,21 @@ "indexKey": "", "optional": false, "description": "", - "line": 196, + "line": 231, "modifierKind": [ 124 ] }, { "name": "stepTitles", - "defaultValue": "['Adres en correspondentievoorkeur', 'Beroep op basis van uw diploma', 'Controleren en indienen']", + "defaultValue": "[$localize`:@@regWizard.title.adres:Adres en correspondentievoorkeur`, $localize`:@@regWizard.title.beroep:Beroep op basis van uw diploma`, $localize`:@@regWizard.title.controle:Controleren en indienen`]", "deprecated": false, "deprecationMessage": "", "type": "[]", "indexKey": "", "optional": false, "description": "", - "line": 185, + "line": 204, "modifierKind": [ 123 ] @@ -5389,11 +13132,53 @@ "indexKey": "", "optional": false, "description": "", - "line": 175, + "line": 189, "modifierKind": [ 123 ] }, + { + "name": "upload", + "defaultValue": "computed(() => this.invullen()?.upload ?? initialUpload)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 211, + "modifierKind": [ + 124 + ] + }, + { + "name": "uploadAdapter", + "defaultValue": "inject(UploadAdapter)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 188, + "modifierKind": [ + 123 + ] + }, + { + "name": "uploadCtl", + "defaultValue": "createUploadController({\n wizardId: 'registratie',\n getUpload: () => this.upload(),\n dispatch: (msg) => this.dispatch({ tag: 'Upload', msg }),\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 212, + "modifierKind": [ + 124 + ] + }, { "name": "vraagErr", "defaultValue": "() => {...}", @@ -5403,7 +13188,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 238, + "line": 297, "modifierKind": [ 124 ] @@ -5433,7 +13218,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 269, + "line": 328, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -5470,7 +13255,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 329, + "line": 363, "deprecated": false, "deprecationMessage": "" }, @@ -5480,7 +13265,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 336, + "line": 370, "deprecated": false, "deprecationMessage": "" }, @@ -5490,36 +13275,23 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 343, + "line": 377, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReset the wizard to a fresh start. Reload the BRP lookup so the address\nre-prefills, keeping the form and the \"vooraf ingevuld\" note consistent.", "description": "

Reset the wizard to a fresh start. Reload the BRP lookup so the address\nre-prefills, keeping the form and the "vooraf ingevuld" note consistent.

\n" }, - { - "name": "restore", - "args": [], - "optional": false, - "returnType": "RegistratieState | null", - "typeParameters": [], - "line": 319, - "deprecated": false, - "deprecationMessage": "", - "modifierKind": [ - 123 - ] - }, { "name": "runIfIndienen", "args": [], "optional": false, "returnType": "any", "typeParameters": [], - "line": 350, + "line": 385, "deprecated": false, "deprecationMessage": "", - "rawdescription": "\nThe effect: when we enter Indienen, call the backend, then dispatch the\noutcome (success carries the confirmation reference).", - "description": "

The effect: when we enter Indienen, call the backend, then dispatch the\noutcome (success carries the confirmation reference).

\n", + "rawdescription": "\nThe effect: when we enter Indienen, submit through the aanvraag lifecycle\n(duo → auto-approve, handmatig → manual), then dispatch the outcome.", + "description": "

The effect: when we enter Indienen, submit through the aanvraag lifecycle\n(duo → auto-approve, handmatig → manual), then dispatch the outcome.

\n", "modifierKind": [ 123, 134 @@ -5556,10 +13328,6 @@ "name": "AlertComponent", "type": "component" }, - { - "name": "SpinnerComponent", - "type": "component" - }, { "name": "SkeletonComponent", "type": "component" @@ -5569,21 +13337,25 @@ "type": "component" }, { - "name": "StepperComponent", + "name": "WizardShellComponent", "type": "component" }, { "name": "AddressFieldsComponent", "type": "component" }, + { + "name": "DocumentUploadComponent", + "type": "component" + }, { "name": "ASYNC" } ], - "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\nlocalStorage so a reload keeps the user's progress. Built entirely 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\nlocalStorage so a reload keeps the user's progress. Built entirely from existing\natoms/molecules.", + "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, ElementRef, computed, effect, inject, input, untracked, viewChild } 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 } 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 { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { SkeletonComponent } from '@shared/ui/skeleton/skeleton.component';\nimport { DataRowComponent } from '@shared/ui/data-row/data-row.component';\nimport { StepperComponent } from '@shared/ui/stepper/stepper.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 { RemoteData, fromResource } from '@shared/application/remote-data';\nimport { BrpAdapter, parseBrpAddress } from '@registratie/infrastructure/brp.adapter';\nimport { DuoAdapter, parseDuoLookup } from '@registratie/infrastructure/duo.adapter';\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 STEPS,\n} from '@registratie/domain/registratie-wizard.machine';\nimport { submitRegistratie } from '@registratie/application/submit-registratie';\n\nconst STORAGE_KEY = 'registratie-v1'; // ponytail: bump the suffix if the persisted shape changes; no migration.\nconst KANALEN = [{ value: 'email', label: 'E-mail' }, { value: 'post', label: 'Post' }];\nconst JA_NEE = [{ value: 'ja', label: 'Ja' }, { value: 'nee', label: 'Nee' }];\nconst HANDMATIG = '__handmatig__'; // sentinel option: \"my diploma isn't listed\"\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\n localStorage so a reload keeps the user's progress. Built entirely from existing\n atoms/molecules. */\n@Component({\n selector: 'app-registratie-wizard',\n imports: [\n FormsModule, FormFieldComponent, TextInputComponent, RadioGroupComponent, ButtonComponent,\n AlertComponent, SpinnerComponent, SkeletonComponent, DataRowComponent, StepperComponent,\n AddressFieldsComponent, ...ASYNC,\n ],\n template: `\n @switch (state().tag) {\n @case ('Invullen') {\n \n

{{ stepTitle() }}

\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 @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 @for (item of samenvattingVragen(); track item.vraag) {\n \n }\n
\n
\n Adres wijzigen\n Diploma wijzigen\n
\n }\n }\n
\n @if (cursor() > 0) {\n Vorige\n }\n {{ step() === 'controle' ? 'Registratie indienen' : 'Volgende' }}\n Annuleren\n
\n \n }\n @case ('Indienen') {\n Uw registratie wordt verwerkt…\n }\n @case ('Ingediend') {\n Uw registratie is ontvangen. Uw referentienummer is {{ referentie() }}. Bewaar dit nummer voor uw administratie.\n
\n Nieuwe registratie starten\n
\n }\n @case ('Mislukt') {\n Het indienen is niet gelukt: {{ failedError() }}\n
\n Opnieuw proberen\n
\n }\n }\n `,\n})\nexport class RegistratieWizardComponent {\n private brp = inject(BrpAdapter);\n private duo = inject(DuoAdapter);\n private store = createStore(initial, reduce);\n\n protected adresRes = this.brp.adresResource();\n private diplomasRes = this.duo.diplomasResource();\n\n /** Optional seed so Storybook / tests can mount any state directly. */\n seed = input(initial);\n\n readonly kanalen = KANALEN;\n readonly stepLabels = ['Adres', 'Beroep', 'Controle']; // short labels for the stepper\n private stepTitles = ['Adres en correspondentievoorkeur', 'Beroep op basis van uw diploma', 'Controleren en indienen'];\n readonly state = this.store.model;\n readonly dispatch = this.store.dispatch;\n\n /** Focus target: the step heading receives focus on step change (a11y). */\n private stepHeading = viewChild>('stepHeading');\n\n private invullen = computed(() => (this.state().tag === 'Invullen' ? (this.state() as Extract) : null));\n protected cursor = computed(() => this.invullen()?.cursor ?? 0);\n protected draft = computed(() => this.invullen()?.draft ?? { antwoorden: {} });\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(() => (this.state().tag === 'Ingediend' ? (this.state() as Extract).referentie : ''));\n protected failedError = computed(() => (this.state().tag === 'Mislukt' ? (this.state() as Extract).error : ''));\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: 'Automatisch uit de BRP', handmatig: 'Handmatig ingevoerd' }[this.draft().adresHerkomst ?? 'handmatig']));\n protected correspondentieLabel = computed(() => ({ email: 'Per e-mail', post: 'Per post' }[this.draft().correspondentie ?? 'post']));\n protected diplomaHerkomstLabel = computed(() => ({ duo: 'Geverifieerd via DUO', handmatig: 'Handmatig ingevoerd (wordt beoordeeld)' }[this.draft().diplomaHerkomst ?? 'handmatig']));\n\n /** BRP lookup outcome. A failure or \"geen adres\" never blocks the wizard — both\n fall back to manual entry (PRD §7). 'geen' covers both no-address-found and a\n malformed response; 'fout' is an unreachable BRP. */\n protected adresStatus = computed<'laden' | 'gevonden' | 'geen' | 'fout'>(() => {\n const st = this.adresRes.status();\n if (st === 'loading' || st === 'reloading') return 'laden';\n if (st === 'error') return 'fout';\n const json = this.adresRes.value();\n const parsed = json !== undefined ? parseBrpAddress(json) : null;\n return parsed && parsed.ok && parsed.value.gevonden ? 'gevonden' : 'geen';\n });\n\n /** The DUO lookup (diplomas + manual fallback), validated at the trust boundary. */\n protected lookupRd = computed>(() => {\n const rd = fromResource(this.diplomasRes);\n if (rd.tag !== 'Success') return rd;\n const parsed = parseDuoLookup(rd.value);\n return parsed.ok ? { tag: 'Success', value: parsed.value } : { tag: 'Failure', error: new Error(parsed.error) };\n });\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') => this.invullen()?.errors[k] ?? '';\n protected vraagErr = (id: string) => this.invullen()?.errors.antwoorden?.[id] ?? '';\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: '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) wins; otherwise resume from localStorage.\n const seeded = this.seed();\n queueMicrotask(() => this.dispatch({ tag: 'Seed', state: seeded !== initial ? seeded : (this.restore() ?? initial) }));\n // Persist only while filling in; clear once the flow is done.\n effect(() => {\n const s = this.state();\n if (s.tag === 'Invullen') localStorage.setItem(STORAGE_KEY, JSON.stringify(s));\n else localStorage.removeItem(STORAGE_KEY);\n });\n // Prefill the address from the BRP lookup as it arrives. Track only the resource\n // value; untrack the dispatch (it reads the state signal, which would otherwise\n // make this effect loop on its own write). Don't clobber edits/restored data.\n effect(() => {\n const json = this.adresRes.value();\n if (!json) return;\n const parsed = parseBrpAddress(json);\n untracked(() => {\n const s = this.state();\n if (s.tag !== 'Invullen' || s.draft.straat) return;\n // ponytail: slice 2 handles gevonden === false -> manual entry stays handmatig.\n if (parsed.ok && parsed.value.gevonden && parsed.value.adres) {\n const a = parsed.value.adres;\n this.dispatch({ tag: 'PrefillAdres', straat: a.straat, postcode: a.postcode, woonplaats: a.woonplaats });\n }\n });\n });\n // A11y: move focus to the step heading when the STEP changes (depends only on\n // cursor(), which is value-stable across keystrokes — so typing never steals\n // focus). Skip the first run so we don't grab focus on initial load.\n let firstStep = true;\n effect(() => {\n this.cursor();\n if (firstStep) { firstStep = false; return; }\n untracked(() => {\n if (this.state().tag !== 'Invullen') return;\n queueMicrotask(() => this.stepHeading()?.nativeElement.focus());\n });\n });\n }\n\n private restore(): RegistratieState | null {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return null;\n try {\n return JSON.parse(raw) as RegistratieState;\n } catch {\n return null; // ponytail: corrupt entry -> start fresh, no migration.\n }\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.dispatch({ tag: 'Seed', state: initial });\n this.adresRes.reload();\n }\n\n /** The effect: when we enter Indienen, call the backend, then dispatch the\n outcome (success carries the confirmation reference). */\n private async runIfIndienen() {\n const s = this.state();\n if (s.tag !== 'Indienen') return;\n const r = await submitRegistratie(s.data);\n if (r.ok) this.dispatch({ tag: 'SubmitConfirmed', referentie: r.value });\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 { WizardShellComponent, WizardError, WizardStatus } 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, fromResource } from '@shared/application/remote-data';\nimport { BrpAdapter, parseBrpAddress } from '@registratie/infrastructure/brp.adapter';\nimport { DuoAdapter, parseDuoLookup } from '@registratie/infrastructure/duo.adapter';\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\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, 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\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 @for (item of samenvattingVragen(); track item.vraag) {\n \n }\n
\n
\n Adres wijzigen\n Diploma wijzigen\n
\n }\n }\n\n
\n Uw registratie is ontvangen. Uw referentienummer is {{ referentie() }}. Bewaar dit nummer voor uw administratie.\n
\n Nieuwe registratie starten\n
\n
\n \n `,\n})\nexport class RegistratieWizardComponent {\n private brp = inject(BrpAdapter);\n private duo = inject(DuoAdapter);\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 protected adresRes = this.brp.adresResource();\n private diplomasRes = this.duo.diplomasResource();\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 });\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 | null) ?? initial }),\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(() => (this.step() === 'controle' ? $localize`:@@regWizard.indienen:Registratie indienen` : $localize`:@@wizard.volgende:Volgende`));\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. A failure or \"geen adres\" never blocks the wizard — both\n fall back to manual entry (PRD §7). 'geen' covers both no-address-found and a\n malformed response; 'fout' is an unreachable BRP. */\n protected adresStatus = computed<'laden' | 'gevonden' | 'geen' | 'fout'>(() => {\n const st = this.adresRes.status();\n if (st === 'loading' || st === 'reloading') return 'laden';\n if (st === 'error') return 'fout';\n const json = this.adresRes.value();\n const parsed = json !== undefined ? parseBrpAddress(json) : null;\n return parsed && parsed.ok && parsed.value.gevonden ? 'gevonden' : 'geen';\n });\n\n /** The DUO lookup (diplomas + manual fallback), validated at the trust boundary. */\n protected lookupRd = computed>(() => {\n const rd = fromResource(this.diplomasRes);\n if (rd.tag !== 'Success') return rd;\n const parsed = parseDuoLookup(rd.value);\n return parsed.ok ? { tag: 'Success', value: parsed.value } : { tag: 'Failure', error: new Error(parsed.error) };\n });\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 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 resource\n // value; untrack the dispatch (it reads the state signal, which would otherwise\n // make this effect loop on its own write). Don't clobber edits/restored data.\n effect(() => {\n const json = this.adresRes.value();\n if (!json) return;\n const parsed = parseBrpAddress(json);\n untracked(() => {\n const s = this.state();\n if (s.tag !== 'Invullen' || s.draft.straat) return;\n // ponytail: slice 2 handles gevonden === false -> manual entry stays handmatig.\n if (parsed.ok && parsed.value.gevonden && parsed.value.adres) {\n const a = parsed.value.adres;\n this.dispatch({ tag: 'PrefillAdres', straat: a.straat, postcode: a.postcode, woonplaats: a.woonplaats });\n }\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(); // detach from the old Concept; next progress creates a new one\n this.dispatch({ tag: 'Seed', state: initial });\n this.adresRes.reload();\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": "", @@ -5593,13 +13365,13 @@ "deprecated": false, "deprecationMessage": "", "args": [], - "line": 276 + "line": 335 }, "extends": [] }, { "name": "RegistrationDetailPage", - "id": "component-RegistrationDetailPage-5aa270b47adfa8bd0334225a51df3a1656468e109d14ca9967660455a734884f4fb358b0f2a6c97e19b4df859f4c5e9773d5dd9c728dbcd785a3d43a60472811", + "id": "component-RegistrationDetailPage-0b50be0253fc369bd6181ffcaccda334bf0cd0da280205bed4f1c09fd7e4543feba7fc28033cce9908257482bf69c50c346656ea4fe232ed7a7ecd61de102b21", "file": "src/app/registratie/ui/registration-detail.page.ts", "encapsulation": [], "entryComponents": [], @@ -5609,7 +13381,7 @@ "selector": "app-registration-detail-page", "styleUrls": [], "styles": [], - "template": "\n \n \n \n \n \n \n \n \n\n
\n @if (submitted()) {\n Uw adreswijziging is ontvangen. U ontvangt binnen 5 werkdagen bericht.\n } @else {\n \n }\n
\n
\n", + "template": "\n \n \n \n \n \n \n \n \n\n
\n \n
\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -5625,21 +13397,10 @@ "indexKey": "", "optional": false, "description": "", - "line": 38, + "line": 33, "modifierKind": [ 124 ] - }, - { - "name": "submitted", - "defaultValue": "signal(false)", - "deprecated": false, - "deprecationMessage": "", - "type": "unknown", - "indexKey": "", - "optional": false, - "description": "", - "line": 39 } ], "methodsClass": [], @@ -5653,10 +13414,6 @@ "name": "PageShellComponent", "type": "component" }, - { - "name": "AlertComponent", - "type": "component" - }, { "name": "SkeletonComponent", "type": "component" @@ -5676,7 +13433,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { Component, inject, signal } from '@angular/core';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { SkeletonComponent } from '@shared/ui/skeleton/skeleton.component';\nimport { ASYNC } from '@shared/ui/async/async.component';\nimport { RegistrationSummaryComponent } from '@registratie/ui/registration-summary/registration-summary.component';\nimport { ChangeRequestFormComponent } from '@registratie/ui/change-request-form/change-request-form.component';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\n\n@Component({\n selector: 'app-registration-detail-page',\n imports: [\n PageShellComponent, AlertComponent, SkeletonComponent, ...ASYNC,\n RegistrationSummaryComponent, ChangeRequestFormComponent,\n ],\n template: `\n \n \n \n \n \n \n \n \n \n\n
\n @if (submitted()) {\n Uw adreswijziging is ontvangen. U ontvangt binnen 5 werkdagen bericht.\n } @else {\n \n }\n
\n
\n `,\n})\nexport class RegistrationDetailPage {\n protected store = inject(BigProfileStore);\n submitted = signal(false);\n}\n", + "sourceCode": "import { Component, inject } from '@angular/core';\nimport { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';\nimport { SkeletonComponent } from '@shared/ui/skeleton/skeleton.component';\nimport { ASYNC } from '@shared/ui/async/async.component';\nimport { RegistrationSummaryComponent } from '@registratie/ui/registration-summary/registration-summary.component';\nimport { ChangeRequestFormComponent } from '@registratie/ui/change-request-form/change-request-form.component';\nimport { BigProfileStore } from '@registratie/application/big-profile.store';\n\n@Component({\n selector: 'app-registration-detail-page',\n imports: [\n PageShellComponent, SkeletonComponent, ...ASYNC,\n RegistrationSummaryComponent, ChangeRequestFormComponent,\n ],\n template: `\n \n \n \n \n \n \n \n \n \n\n
\n \n
\n
\n `,\n})\nexport class RegistrationDetailPage {\n protected store = inject(BigProfileStore);\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -5684,7 +13441,7 @@ }, { "name": "RegistrationSummaryComponent", - "id": "component-RegistrationSummaryComponent-15a446478708503b850ebbf635068398874034b3824504dc3a05802f6743029578088280540988dacfb6c768b92a2ee0371368369f455edc6dda03cf5f179e17", + "id": "component-RegistrationSummaryComponent-d8ecfd76e7748369d4dfa5f2d4d36a4de884f43ab7bb95c4c7983b1e4890cdb0ba10024357a341f7634dd8327f5487a8c2f22188d6e43383b637b1b2a1535ad3", "file": "src/app/registratie/ui/registration-summary/registration-summary.component.ts", "encapsulation": [], "entryComponents": [], @@ -5694,7 +13451,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 \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", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -5707,7 +13464,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 41, + "line": 42, "required": true } ], @@ -5722,7 +13479,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 43, + "line": 44, "modifierKind": [ 124 ] @@ -5736,7 +13493,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 42, + "line": 43, "modifierKind": [ 124 ] @@ -5760,12 +13517,16 @@ { "name": "StatusBadgeComponent", "type": "component" + }, + { + "name": "CardComponent", + "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.", "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';\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],\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 { 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", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -5773,7 +13534,7 @@ }, { "name": "RegistrationTableComponent", - "id": "component-RegistrationTableComponent-d1fcc222260a33b20e1562a1bf325269cd07ebaed4838e1d74e883be3fbc1ef521d9250ba478316f93f8e133c0c5576cde367822159d6dff36d7b9da2c4d0a79", + "id": "component-RegistrationTableComponent-1456e903accd17e94b631ad74915c9a021e91caa782c375d193a6122be0bba5651f2698f3d1ace22dd77bffb2ae88d23452874b0ed52cc189da9da4de3c425f6", "file": "src/app/registratie/ui/registration-table/registration-table.component.ts", "encapsulation": [], "entryComponents": [], @@ -5783,7 +13544,7 @@ "selector": "app-registration-table", "styleUrls": [], "styles": [], - "template": "
\n \n \n \n \n \n \n \n \n \n @for (row of rows(); track row.omschrijving) {\n \n \n \n \n \n }\n \n
TypeOmschrijvingDatum
{{ row.type }}{{ row.omschrijving }}{{ row.datum | date:'mediumDate' }}
\n
\n", + "template": "
\n \n \n \n \n \n \n \n \n \n @for (row of rows(); track row.omschrijving) {\n \n \n \n \n \n }\n \n
TypeOmschrijvingDatum
{{ row.type }}{{ row.omschrijving }}{{ row.datum | date:'mediumDate' }}
\n
\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -5817,7 +13578,7 @@ "description": "

Organism: table of specialismen/aantekeningen.

\n", "rawdescription": "\nOrganism: table of specialismen/aantekeningen.", "type": "component", - "sourceCode": "import { Component, input } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Aantekening } from '@registratie/domain/registration';\n\n/** Organism: table of specialismen/aantekeningen. */\n@Component({\n selector: 'app-registration-table',\n imports: [DatePipe],\n template: `\n
\n \n \n \n \n \n \n \n \n \n @for (row of rows(); track row.omschrijving) {\n \n \n \n \n \n }\n \n
TypeOmschrijvingDatum
{{ row.type }}{{ row.omschrijving }}{{ row.datum | date:'mediumDate' }}
\n
\n `,\n})\nexport class RegistrationTableComponent {\n rows = input.required();\n}\n", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { Aantekening } from '@registratie/domain/registration';\n\n/** Organism: table of specialismen/aantekeningen. */\n@Component({\n selector: 'app-registration-table',\n imports: [DatePipe],\n template: `\n
\n \n \n \n \n \n \n \n \n \n @for (row of rows(); track row.omschrijving) {\n \n \n \n \n \n }\n \n
TypeOmschrijvingDatum
{{ row.type }}{{ row.omschrijving }}{{ row.datum | date:'mediumDate' }}
\n
\n `,\n})\nexport class RegistrationTableComponent {\n rows = input.required();\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -5825,7 +13586,7 @@ }, { "name": "ShellComponent", - "id": "component-ShellComponent-9395255b45520c41ee6d43e2baf02d475e80d4ba8451334ef421b7debb14942f207c8e905bdac73b80b2d2b6f1b26b8ec7b341e2504bf31f8c0c326c59dbadac", + "id": "component-ShellComponent-746a968b2771f790a902663b5441f57f8bc03551dfe1a5fa21b1c1d012352aea187d7f68a30057c479be792e2af94d3d57ed203123f6292ee3c6547de5380638", "file": "src/app/shared/layout/shell/shell.component.ts", "encapsulation": [], "entryComponents": [], @@ -5837,13 +13598,29 @@ "styles": [ "\n :host{display:block}\n .skip{position:absolute;left:var(--app-skip-link-offset)}\n .layout{min-block-size:100vh;align-items:stretch}\n .main{flex:1;inline-size:100%;box-sizing:border-box}\n .content{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-3xl) var(--rhc-space-max-2xl);box-sizing:border-box}\n " ], - "template": "Naar de inhoud\n
\n \n
\n
\n \n
\n
\n \n
\n", + "template": "Naar de inhoud\n
\n \n
\n
\n \n
\n
\n \n
\n@if (isDev) {\n \n}\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], "inputsClass": [], "outputsClass": [], - "propertiesClass": [], + "propertiesClass": [ + { + "name": "isDev", + "defaultValue": "isDevMode()", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 36, + "modifierKind": [ + 124, + 148 + ] + } + ], "methodsClass": [], "deprecated": false, "deprecationMessage": "", @@ -5861,83 +13638,61 @@ { "name": "SiteFooterComponent", "type": "component" + }, + { + "name": "DebugStateComponent", + "type": "component" } ], "description": "

Template: persistent app chrome. Header + footer mount once; only the routed\ncontent inside changes (and cross-fades — see styles.scss).

\n", "rawdescription": "\nTemplate: persistent app chrome. Header + footer mount once; only the routed\ncontent inside changes (and cross-fades — see styles.scss).", "type": "component", - "sourceCode": "import { Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { SiteHeaderComponent } from '@shared/layout/site-header/site-header.component';\nimport { SiteFooterComponent } from '@shared/layout/site-footer/site-footer.component';\n\n/** Template: persistent app chrome. Header + footer mount once; only the routed\n content inside changes (and cross-fades — see styles.scss). */\n@Component({\n selector: 'app-shell',\n imports: [RouterOutlet, SiteHeaderComponent, SiteFooterComponent],\n styles: [`\n :host{display:block}\n .skip{position:absolute;left:var(--app-skip-link-offset)}\n .layout{min-block-size:100vh;align-items:stretch}\n .main{flex:1;inline-size:100%;box-sizing:border-box}\n .content{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-3xl) var(--rhc-space-max-2xl);box-sizing:border-box}\n `],\n template: `\n Naar de inhoud\n
\n \n
\n
\n \n
\n
\n \n
\n `,\n})\nexport class ShellComponent {}\n", + "sourceCode": "import { Component, isDevMode } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { SiteHeaderComponent } from '@shared/layout/site-header/site-header.component';\nimport { SiteFooterComponent } from '@shared/layout/site-footer/site-footer.component';\nimport { DebugStateComponent } from '@shared/ui/debug-state/debug-state.component';\n\n/** Template: persistent app chrome. Header + footer mount once; only the routed\n content inside changes (and cross-fades — see styles.scss). */\n@Component({\n selector: 'app-shell',\n imports: [RouterOutlet, SiteHeaderComponent, SiteFooterComponent, DebugStateComponent],\n styles: [`\n :host{display:block}\n .skip{position:absolute;left:var(--app-skip-link-offset)}\n .layout{min-block-size:100vh;align-items:stretch}\n .main{flex:1;inline-size:100%;box-sizing:border-box}\n .content{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-3xl) var(--rhc-space-max-2xl);box-sizing:border-box}\n `],\n template: `\n Naar de inhoud\n
\n \n
\n
\n \n
\n
\n \n
\n @if (isDev) {\n \n }\n `,\n})\nexport class ShellComponent {\n protected readonly isDev = isDevMode();\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "\n :host{display:block}\n .skip{position:absolute;left:var(--app-skip-link-offset)}\n .layout{min-block-size:100vh;align-items:stretch}\n .main{flex:1;inline-size:100%;box-sizing:border-box}\n .content{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-3xl) var(--rhc-space-max-2xl);box-sizing:border-box}\n \n", "extends": [] }, { - "name": "SiteFooterComponent", - "id": "component-SiteFooterComponent-57d90cda3179b0a39d4bc90cc725913dfa228828585709666584e469de964abc65dbf2b93f2155fc42fc071f61db4649924a05b2fc8e3af31a53fa8143744162", - "file": "src/app/shared/layout/site-footer/site-footer.component.ts", + "name": "SideNavComponent", + "id": "component-SideNavComponent-9a0c974f175932b74bac6b9499d52109b91e008e20aad37498229296c31027ce1e8d9451f5e195926b0514ff3961eb9c0632cdf710292f5b143d4233c1358e45", + "file": "src/app/shared/layout/side-nav/side-nav.component.ts", "encapsulation": [], "entryComponents": [], "inputs": [], "outputs": [], "providers": [], - "selector": "app-site-footer", + "selector": "app-side-nav", "styleUrls": [], "styles": [ - "\n :host{display:block}\n .bar{background:var(--rhc-color-donkerblauw-700);color:var(--rhc-color-wit);margin-block-start:var(--rhc-space-max-5xl);inline-size:100%}\n .inner{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-2xl);display:flex;gap:var(--rhc-space-max-3xl);flex-wrap:wrap;box-sizing:border-box}\n .end{margin-inline-start:auto}\n " + "\n :host{display:block}\n .list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-xs)}\n .item{\n display:block;\n padding:var(--rhc-space-max-md) var(--rhc-space-max-lg);\n color:var(--rhc-color-foreground-default);\n text-decoration:none;\n border-radius:var(--rhc-border-radius-sm);\n border-inline-start:var(--rhc-border-width-md) solid transparent;\n }\n .item:hover{background:var(--rhc-color-cool-grey-100)}\n .item.active{\n background:var(--rhc-color-lintblauw-100);\n border-inline-start-color:var(--rhc-color-lintblauw-700);\n color:var(--rhc-color-lintblauw-700);\n font-weight:var(--rhc-text-font-weight-semi-bold);\n }\n " ], - "template": "
\n
\n BIG-register\n CIBG — Ministerie van Volksgezondheid, Welzijn en Sport\n Demo / POC — geen echte gegevens\n
\n
\n", - "templateUrl": [], - "viewProviders": [], - "hostDirectives": [], - "inputsClass": [], - "outputsClass": [], - "propertiesClass": [], - "methodsClass": [], - "deprecated": false, - "deprecationMessage": "", - "hostBindings": [], - "hostListeners": [], - "standalone": false, - "imports": [], - "description": "

Organism: site footer.

\n", - "rawdescription": "\nOrganism: site footer.", - "type": "component", - "sourceCode": "import { Component } from '@angular/core';\n\n/** Organism: site footer. */\n@Component({\n selector: 'app-site-footer',\n styles: [`\n :host{display:block}\n .bar{background:var(--rhc-color-donkerblauw-700);color:var(--rhc-color-wit);margin-block-start:var(--rhc-space-max-5xl);inline-size:100%}\n .inner{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-2xl);display:flex;gap:var(--rhc-space-max-3xl);flex-wrap:wrap;box-sizing:border-box}\n .end{margin-inline-start:auto}\n `],\n template: `\n
\n
\n BIG-register\n CIBG — Ministerie van Volksgezondheid, Welzijn en Sport\n Demo / POC — geen echte gegevens\n
\n
\n `,\n})\nexport class SiteFooterComponent {}\n", - "assetsDirs": [], - "styleUrlsData": "", - "stylesData": "\n :host{display:block}\n .bar{background:var(--rhc-color-donkerblauw-700);color:var(--rhc-color-wit);margin-block-start:var(--rhc-space-max-5xl);inline-size:100%}\n .inner{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-2xl);display:flex;gap:var(--rhc-space-max-3xl);flex-wrap:wrap;box-sizing:border-box}\n .end{margin-inline-start:auto}\n \n", - "extends": [] - }, - { - "name": "SiteHeaderComponent", - "id": "component-SiteHeaderComponent-f5e80a4225213863b1448920f4a6300aec28b9ca4de6a6a0acad2e69a6aa0359cdd8194aa71fd6f8fcff7e0200b6715201f09241ac3bc32314c5af3392a4639e", - "file": "src/app/shared/layout/site-header/site-header.component.ts", - "encapsulation": [], - "entryComponents": [], - "inputs": [], - "outputs": [], - "providers": [], - "selector": "app-site-header", - "styleUrls": [], - "styles": [ - "\n :host{display:block}\n .bar{background:var(--rhc-color-lintblauw-700);color:var(--rhc-color-wit);inline-size:100%}\n .inner{display:flex;align-items:center;gap:var(--rhc-space-max-xl);max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-xl) var(--rhc-space-max-2xl);box-sizing:border-box}\n .brand{display:flex;align-items:center;gap:var(--rhc-space-max-lg);color:inherit;text-decoration:none}\n .mark{display:inline-block;inline-size:var(--rhc-space-max-md);block-size:var(--rhc-space-max-4xl);background:var(--rhc-color-wit)}\n .name{font-weight:var(--rhc-text-font-weight-bold);line-height:var(--rhc-text-line-height-sm)}\n .sub{font-weight:var(--rhc-text-font-weight-regular);font-size:var(--rhc-text-font-size-sm)}\n .portal{margin-inline-start:auto;font-weight:var(--rhc-text-font-weight-semi-bold)}\n " - ], - "template": "
\n \n
\n", + "template": "\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], "inputsClass": [ { - "name": "subtitle", - "defaultValue": "'Mijn omgeving'", + "name": "ariaLabel", + "defaultValue": "$localize`:@@sideNav.aria:Mijn omgeving`", "deprecated": false, "deprecationMessage": "", "indexKey": "", "optional": false, "description": "", - "line": 36, + "line": 49, "required": false + }, + { + "name": "items", + "deprecated": false, + "deprecationMessage": "", + "type": "NavItem[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 48, + "required": true } ], "outputsClass": [], @@ -5951,15 +13706,319 @@ "imports": [ { "name": "RouterLink" + }, + { + "name": "RouterLinkActive" } ], - "description": "

Organism: site header with Rijksoverheid-style wordmark + title.\nponytail: text wordmark instead of the licensed Rijksoverheid logo.

\n", - "rawdescription": "\nOrganism: site header with Rijksoverheid-style wordmark + title.\nponytail: text wordmark instead of the licensed Rijksoverheid logo.", + "description": "

Organism: vertical side navigation for the "Mijn omgeving" portal. The active\nroute is marked with routerLinkActive. Domain-free — the caller supplies the\nitems (English-named shared chrome).

\n", + "rawdescription": "\nOrganism: vertical side navigation for the \"Mijn omgeving\" portal. The active\nroute is marked with `routerLinkActive`. Domain-free — the caller supplies the\nitems (English-named shared chrome).", "type": "component", - "sourceCode": "import { Component, input } from '@angular/core';\nimport { RouterLink } from '@angular/router';\n\n/** Organism: site header with Rijksoverheid-style wordmark + title.\n ponytail: text wordmark instead of the licensed Rijksoverheid logo. */\n@Component({\n selector: 'app-site-header',\n imports: [RouterLink],\n // :host display:block so the full-bleed bar fills the flex column (custom\n // elements default to display:inline, which collapsed the bar to its content).\n styles: [`\n :host{display:block}\n .bar{background:var(--rhc-color-lintblauw-700);color:var(--rhc-color-wit);inline-size:100%}\n .inner{display:flex;align-items:center;gap:var(--rhc-space-max-xl);max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-xl) var(--rhc-space-max-2xl);box-sizing:border-box}\n .brand{display:flex;align-items:center;gap:var(--rhc-space-max-lg);color:inherit;text-decoration:none}\n .mark{display:inline-block;inline-size:var(--rhc-space-max-md);block-size:var(--rhc-space-max-4xl);background:var(--rhc-color-wit)}\n .name{font-weight:var(--rhc-text-font-weight-bold);line-height:var(--rhc-text-line-height-sm)}\n .sub{font-weight:var(--rhc-text-font-weight-regular);font-size:var(--rhc-text-font-size-sm)}\n .portal{margin-inline-start:auto;font-weight:var(--rhc-text-font-weight-semi-bold)}\n `],\n template: `\n
\n \n
\n `,\n})\nexport class SiteHeaderComponent {\n subtitle = input('Mijn omgeving');\n}\n", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\n\nexport interface NavItem {\n readonly label: string;\n readonly to: string;\n}\n\n/** Organism: vertical side navigation for the \"Mijn omgeving\" portal. The active\n route is marked with `routerLinkActive`. Domain-free — the caller supplies the\n items (English-named shared chrome). */\n@Component({\n selector: 'app-side-nav',\n imports: [RouterLink, RouterLinkActive],\n styles: [`\n :host{display:block}\n .list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-xs)}\n .item{\n display:block;\n padding:var(--rhc-space-max-md) var(--rhc-space-max-lg);\n color:var(--rhc-color-foreground-default);\n text-decoration:none;\n border-radius:var(--rhc-border-radius-sm);\n border-inline-start:var(--rhc-border-width-md) solid transparent;\n }\n .item:hover{background:var(--rhc-color-cool-grey-100)}\n .item.active{\n background:var(--rhc-color-lintblauw-100);\n border-inline-start-color:var(--rhc-color-lintblauw-700);\n color:var(--rhc-color-lintblauw-700);\n font-weight:var(--rhc-text-font-weight-semi-bold);\n }\n `],\n template: `\n \n `,\n})\nexport class SideNavComponent {\n items = input.required();\n ariaLabel = input($localize`:@@sideNav.aria:Mijn omgeving`);\n}\n", "assetsDirs": [], "styleUrlsData": "", - "stylesData": "\n :host{display:block}\n .bar{background:var(--rhc-color-lintblauw-700);color:var(--rhc-color-wit);inline-size:100%}\n .inner{display:flex;align-items:center;gap:var(--rhc-space-max-xl);max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-xl) var(--rhc-space-max-2xl);box-sizing:border-box}\n .brand{display:flex;align-items:center;gap:var(--rhc-space-max-lg);color:inherit;text-decoration:none}\n .mark{display:inline-block;inline-size:var(--rhc-space-max-md);block-size:var(--rhc-space-max-4xl);background:var(--rhc-color-wit)}\n .name{font-weight:var(--rhc-text-font-weight-bold);line-height:var(--rhc-text-line-height-sm)}\n .sub{font-weight:var(--rhc-text-font-weight-regular);font-size:var(--rhc-text-font-size-sm)}\n .portal{margin-inline-start:auto;font-weight:var(--rhc-text-font-weight-semi-bold)}\n \n", + "stylesData": "\n :host{display:block}\n .list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-xs)}\n .item{\n display:block;\n padding:var(--rhc-space-max-md) var(--rhc-space-max-lg);\n color:var(--rhc-color-foreground-default);\n text-decoration:none;\n border-radius:var(--rhc-border-radius-sm);\n border-inline-start:var(--rhc-border-width-md) solid transparent;\n }\n .item:hover{background:var(--rhc-color-cool-grey-100)}\n .item.active{\n background:var(--rhc-color-lintblauw-100);\n border-inline-start-color:var(--rhc-color-lintblauw-700);\n color:var(--rhc-color-lintblauw-700);\n font-weight:var(--rhc-text-font-weight-semi-bold);\n }\n \n", + "extends": [] + }, + { + "name": "SingleUploadComponent", + "id": "component-SingleUploadComponent-432f76299a1d6d60d3b04597214545fc4e6d5bd59538657435310065fb5d24a177e0ecfee20b7d369aaddcdf58e3209535d51a965eb67dc74a0b990d0f5b4ce6", + "file": "src/app/shared/ui/upload/single-upload/single-upload.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-single-upload", + "styleUrls": [], + "styles": [ + "\n :host { display: flex; flex-direction: column; gap: var(--rhc-space-max-sm); }\n " + ], + "template": "\n@if (progressPct() !== null) {\n \n}\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "previewUrlFor", + "deprecated": false, + "deprecationMessage": "", + "type": "(documentId: string) => string | undefined", + "indexKey": "", + "optional": false, + "description": "

Builds a preview URL for a completed upload's documentId (undefined = no link).

\n", + "line": 29, + "rawdescription": "\nBuilds a preview URL for a completed upload's documentId (undefined = no link).", + "required": false + }, + { + "name": "upload", + "deprecated": false, + "deprecationMessage": "", + "type": "Upload", + "indexKey": "", + "optional": false, + "description": "", + "line": 27, + "required": true + } + ], + "outputsClass": [ + { + "name": "remove", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 42, + "required": false + }, + { + "name": "retry", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 43, + "required": false + } + ], + "propertiesClass": [ + { + "name": "previewUrl", + "defaultValue": "computed(() => {\n const status = this.upload().status;\n return status.type === 'complete' ? this.previewUrlFor()?.(status.documentId) : undefined;\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 37, + "modifierKind": [ + 124, + 148 + ] + }, + { + "name": "progressPct", + "defaultValue": "computed(() => {\n const status = this.upload().status;\n return status.type === 'uploading' ? status.progressPct : null;\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "

Narrow the status union once, in TS, so the template stays type-safe.

\n", + "line": 32, + "rawdescription": "\nNarrow the status union once, in TS, so the template stays type-safe.", + "modifierKind": [ + 124, + 148 + ] + } + ], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "DocumentChipComponent", + "type": "component" + }, + { + "name": "UploadProgressBarComponent", + "type": "component" + } + ], + "description": "

Molecule: one upload row — its chip plus a progress bar while uploading. Pure UI:\nforwards remove/retry from the chip.

\n", + "rawdescription": "\nMolecule: one upload row — its chip plus a progress bar while uploading. Pure UI:\nforwards `remove`/`retry` from the chip.", + "type": "component", + "sourceCode": "import { Component, computed, input, output } from '@angular/core';\nimport type { Upload } from '@shared/upload/upload.machine';\nimport { DocumentChipComponent } from '../document-chip/document-chip.component';\nimport { UploadProgressBarComponent } from '../upload-progress-bar/upload-progress-bar.component';\n\n/** Molecule: one upload row — its chip plus a progress bar while uploading. Pure UI:\n forwards `remove`/`retry` from the chip. */\n@Component({\n selector: 'app-single-upload',\n imports: [DocumentChipComponent, UploadProgressBarComponent],\n styles: [`\n :host { display: flex; flex-direction: column; gap: var(--rhc-space-max-sm); }\n `],\n template: `\n \n @if (progressPct() !== null) {\n \n }\n `,\n})\nexport class SingleUploadComponent {\n upload = input.required();\n /** Builds a preview URL for a completed upload's documentId (undefined = no link). */\n previewUrlFor = input<(documentId: string) => string | undefined>();\n\n /** Narrow the status union once, in TS, so the template stays type-safe. */\n protected readonly progressPct = computed(() => {\n const status = this.upload().status;\n return status.type === 'uploading' ? status.progressPct : null;\n });\n\n protected readonly previewUrl = computed(() => {\n const status = this.upload().status;\n return status.type === 'complete' ? this.previewUrlFor()?.(status.documentId) : undefined;\n });\n\n remove = output();\n retry = output();\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host { display: flex; flex-direction: column; gap: var(--rhc-space-max-sm); }\n \n", + "extends": [] + }, + { + "name": "SiteFooterComponent", + "id": "component-SiteFooterComponent-9277557434faa066d6b9c9f6015f5cf7b8834a928200b0eaa07dfd703b2c20640f3a1332a46095ee7cc65bd22bb7eb5d289b2640167f47b9150525b6cd5cf74c", + "file": "src/app/shared/layout/site-footer/site-footer.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-site-footer", + "styleUrls": [], + "styles": [ + "\n :host{display:block}\n .bar{background:var(--rhc-color-donkerblauw-700);color:var(--rhc-color-foreground-on-primary);margin-block-start:var(--rhc-space-max-5xl);inline-size:100%}\n .inner{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-3xl) var(--rhc-space-max-2xl);box-sizing:border-box;display:flex;gap:var(--rhc-space-max-3xl);flex-wrap:wrap;justify-content:space-between}\n .tagline{font-style:italic;font-weight:var(--rhc-text-font-weight-semi-bold);font-size:var(--rhc-text-font-size-lg);max-inline-size:18rem}\n .ministry{margin-block-start:var(--rhc-space-max-md);font-size:var(--rhc-text-font-size-sm);color:var(--rhc-color-foreground-on-primary)}\n .col h2{margin:0 0 var(--rhc-space-max-md);font-size:var(--rhc-text-font-size-sm);font-weight:var(--rhc-text-font-weight-bold);text-transform:uppercase;letter-spacing:.04em}\n .links{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-sm);font-size:var(--rhc-text-font-size-sm)}\n .links a{color:var(--rhc-color-foreground-on-primary);text-decoration:none}\n .links a:hover{text-decoration:underline}\n .meta{inline-size:100%;border-block-start:var(--rhc-border-width-sm) solid var(--rhc-color-lintblauw-600);margin-block-start:var(--rhc-space-max-xl);padding-block-start:var(--rhc-space-max-lg);font-size:var(--rhc-text-font-size-sm);opacity:.85}\n " + ], + "template": "
\n
\n
\n
De Rijksoverheid. Voor Nederland.
\n
CIBG — Ministerie van Volksgezondheid, Welzijn en Sport
\n
\n \n
Demo / POC — geen echte gegevens.
\n
\n
\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [], + "outputsClass": [], + "propertiesClass": [], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [], + "description": "

Organism: Rijksoverheid-style site footer — dark-blue, with the\n"De Rijksoverheid. Voor Nederland." tagline, responsible-ministry attribution,\nand a small "Over deze site" link column. ponytail: links point at the real\nrijksoverheid.nl pages, not a fabricated dead-link forest.

\n", + "rawdescription": "\nOrganism: Rijksoverheid-style site footer — dark-blue, with the\n\"De Rijksoverheid. Voor Nederland.\" tagline, responsible-ministry attribution,\nand a small \"Over deze site\" link column. ponytail: links point at the real\nrijksoverheid.nl pages, not a fabricated dead-link forest.", + "type": "component", + "sourceCode": "import { Component } from '@angular/core';\n\n/** Organism: Rijksoverheid-style site footer — dark-blue, with the\n \"De Rijksoverheid. Voor Nederland.\" tagline, responsible-ministry attribution,\n and a small \"Over deze site\" link column. ponytail: links point at the real\n rijksoverheid.nl pages, not a fabricated dead-link forest. */\n@Component({\n selector: 'app-site-footer',\n styles: [`\n :host{display:block}\n .bar{background:var(--rhc-color-donkerblauw-700);color:var(--rhc-color-foreground-on-primary);margin-block-start:var(--rhc-space-max-5xl);inline-size:100%}\n .inner{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-3xl) var(--rhc-space-max-2xl);box-sizing:border-box;display:flex;gap:var(--rhc-space-max-3xl);flex-wrap:wrap;justify-content:space-between}\n .tagline{font-style:italic;font-weight:var(--rhc-text-font-weight-semi-bold);font-size:var(--rhc-text-font-size-lg);max-inline-size:18rem}\n .ministry{margin-block-start:var(--rhc-space-max-md);font-size:var(--rhc-text-font-size-sm);color:var(--rhc-color-foreground-on-primary)}\n .col h2{margin:0 0 var(--rhc-space-max-md);font-size:var(--rhc-text-font-size-sm);font-weight:var(--rhc-text-font-weight-bold);text-transform:uppercase;letter-spacing:.04em}\n .links{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-sm);font-size:var(--rhc-text-font-size-sm)}\n .links a{color:var(--rhc-color-foreground-on-primary);text-decoration:none}\n .links a:hover{text-decoration:underline}\n .meta{inline-size:100%;border-block-start:var(--rhc-border-width-sm) solid var(--rhc-color-lintblauw-600);margin-block-start:var(--rhc-space-max-xl);padding-block-start:var(--rhc-space-max-lg);font-size:var(--rhc-text-font-size-sm);opacity:.85}\n `],\n template: `\n
\n
\n
\n
De Rijksoverheid. Voor Nederland.
\n
CIBG — Ministerie van Volksgezondheid, Welzijn en Sport
\n
\n \n
Demo / POC — geen echte gegevens.
\n
\n
\n `,\n})\nexport class SiteFooterComponent {}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host{display:block}\n .bar{background:var(--rhc-color-donkerblauw-700);color:var(--rhc-color-foreground-on-primary);margin-block-start:var(--rhc-space-max-5xl);inline-size:100%}\n .inner{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-3xl) var(--rhc-space-max-2xl);box-sizing:border-box;display:flex;gap:var(--rhc-space-max-3xl);flex-wrap:wrap;justify-content:space-between}\n .tagline{font-style:italic;font-weight:var(--rhc-text-font-weight-semi-bold);font-size:var(--rhc-text-font-size-lg);max-inline-size:18rem}\n .ministry{margin-block-start:var(--rhc-space-max-md);font-size:var(--rhc-text-font-size-sm);color:var(--rhc-color-foreground-on-primary)}\n .col h2{margin:0 0 var(--rhc-space-max-md);font-size:var(--rhc-text-font-size-sm);font-weight:var(--rhc-text-font-weight-bold);text-transform:uppercase;letter-spacing:.04em}\n .links{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-sm);font-size:var(--rhc-text-font-size-sm)}\n .links a{color:var(--rhc-color-foreground-on-primary);text-decoration:none}\n .links a:hover{text-decoration:underline}\n .meta{inline-size:100%;border-block-start:var(--rhc-border-width-sm) solid var(--rhc-color-lintblauw-600);margin-block-start:var(--rhc-space-max-xl);padding-block-start:var(--rhc-space-max-lg);font-size:var(--rhc-text-font-size-sm);opacity:.85}\n \n", + "extends": [] + }, + { + "name": "SiteHeaderComponent", + "id": "component-SiteHeaderComponent-35a3fcd73778e62ff04f299edaa3cde5490b2800314762ac4b7fe01a68af79246c6fda70c45e0113ac7cb2ec0a81f2405c14a6c2a92a7a1f21f1b2f57ea1042f", + "file": "src/app/shared/layout/site-header/site-header.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-site-header", + "styleUrls": [], + "styles": [ + "\n :host{display:block}\n /* Tier 1 — white brand bar */\n .brandbar{background:var(--rhc-color-wit);border-block-end:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);inline-size:100%}\n .brandbar .inner{display:flex;align-items:center;gap:var(--rhc-space-max-xl);max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-lg) var(--rhc-space-max-2xl);box-sizing:border-box}\n .brand{display:flex;align-items:center;gap:var(--rhc-space-max-lg);color:var(--rhc-color-foreground-default);text-decoration:none}\n .mark{display:inline-block;inline-size:var(--rhc-space-max-md);block-size:var(--rhc-space-max-4xl);background:var(--rhc-color-lintblauw-700)}\n .name{font-weight:var(--rhc-text-font-weight-bold);line-height:var(--rhc-text-line-height-sm)}\n .sub{font-weight:var(--rhc-text-font-weight-regular);font-size:var(--rhc-text-font-size-sm);color:var(--rhc-color-foreground-subtle)}\n .session{margin-inline-start:auto;display:flex;align-items:center;gap:var(--rhc-space-max-lg);font-size:var(--rhc-text-font-size-sm)}\n .user{color:var(--rhc-color-foreground-subtle)}\n .logout{background:none;border:0;padding:0;cursor:pointer;color:var(--rhc-color-foreground-link);text-decoration:underline;font:inherit}\n .logout:hover{color:var(--rhc-color-foreground-link-hover)}\n /* Tier 2 — blue breadcrumb bar */\n .navbar{background:var(--rhc-color-lintblauw-700);color:var(--rhc-color-foreground-on-primary);inline-size:100%}\n .navbar .inner{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-md) var(--rhc-space-max-2xl);box-sizing:border-box}\n " + ], + "template": "
\n
\n \n \n Rijksoverheid
BIG-register
\n
\n {{ subtitle() }}\n @if (session(); as s) {\n \n Ingelogd als {{ s.naam }}\n \n \n }\n
\n
\n@if (trail().length) {\n
\n
\n \n
\n
\n}\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "subtitle", + "defaultValue": "$localize`:@@header.subtitle:Mijn omgeving`", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 59, + "required": false + } + ], + "outputsClass": [], + "propertiesClass": [ + { + "name": "router", + "defaultValue": "inject(Router)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 61, + "modifierKind": [ + 123 + ] + }, + { + "name": "session", + "defaultValue": "computed(() => this.sessionPort?.session() ?? null)", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 64, + "modifierKind": [ + 148 + ] + }, + { + "name": "sessionPort", + "defaultValue": "inject(SESSION_PORT, { optional: true })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 62, + "modifierKind": [ + 123 + ] + }, + { + "name": "trail", + "defaultValue": "computed(() => trailFor(this.url()))", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 69, + "modifierKind": [ + 124 + ] + }, + { + "name": "url", + "defaultValue": "toSignal(\n this.router.events.pipe(filter((e) => e instanceof NavigationEnd), map(() => this.router.url)),\n { initialValue: this.router.url },\n )", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 65, + "modifierKind": [ + 123 + ] + } + ], + "methodsClass": [ + { + "name": "logout", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 71, + "deprecated": false, + "deprecationMessage": "" + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "RouterLink" + }, + { + "name": "BreadcrumbComponent", + "type": "component" + } + ], + "description": "

Organism: Rijksoverheid-style site header. Two tiers, like rijksoverheid.nl:\na white brand bar (wordmark + session/logout) over a lint-blue bar carrying\nthe breadcrumb. ponytail: text wordmark, not the licensed Rijksoverheid logo;\nno search box (no search feature yet).

\n", + "rawdescription": "\nOrganism: Rijksoverheid-style site header. Two tiers, like rijksoverheid.nl:\na white brand bar (wordmark + session/logout) over a lint-blue bar carrying\nthe breadcrumb. ponytail: text wordmark, not the licensed Rijksoverheid logo;\nno search box (no search feature yet).", + "type": "component", + "sourceCode": "import { Component, computed, inject, input } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router, RouterLink } from '@angular/router';\nimport { filter, map } from 'rxjs/operators';\nimport { SESSION_PORT } from '@shared/application/session.port';\nimport { BreadcrumbComponent } from '@shared/layout/breadcrumb/breadcrumb.component';\nimport { trailFor } from '@shared/layout/breadcrumb/breadcrumb-trail';\n\n/** Organism: Rijksoverheid-style site header. Two tiers, like rijksoverheid.nl:\n a white brand bar (wordmark + session/logout) over a lint-blue bar carrying\n the breadcrumb. ponytail: text wordmark, not the licensed Rijksoverheid logo;\n no search box (no search feature yet). */\n@Component({\n selector: 'app-site-header',\n imports: [RouterLink, BreadcrumbComponent],\n styles: [`\n :host{display:block}\n /* Tier 1 — white brand bar */\n .brandbar{background:var(--rhc-color-wit);border-block-end:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);inline-size:100%}\n .brandbar .inner{display:flex;align-items:center;gap:var(--rhc-space-max-xl);max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-lg) var(--rhc-space-max-2xl);box-sizing:border-box}\n .brand{display:flex;align-items:center;gap:var(--rhc-space-max-lg);color:var(--rhc-color-foreground-default);text-decoration:none}\n .mark{display:inline-block;inline-size:var(--rhc-space-max-md);block-size:var(--rhc-space-max-4xl);background:var(--rhc-color-lintblauw-700)}\n .name{font-weight:var(--rhc-text-font-weight-bold);line-height:var(--rhc-text-line-height-sm)}\n .sub{font-weight:var(--rhc-text-font-weight-regular);font-size:var(--rhc-text-font-size-sm);color:var(--rhc-color-foreground-subtle)}\n .session{margin-inline-start:auto;display:flex;align-items:center;gap:var(--rhc-space-max-lg);font-size:var(--rhc-text-font-size-sm)}\n .user{color:var(--rhc-color-foreground-subtle)}\n .logout{background:none;border:0;padding:0;cursor:pointer;color:var(--rhc-color-foreground-link);text-decoration:underline;font:inherit}\n .logout:hover{color:var(--rhc-color-foreground-link-hover)}\n /* Tier 2 — blue breadcrumb bar */\n .navbar{background:var(--rhc-color-lintblauw-700);color:var(--rhc-color-foreground-on-primary);inline-size:100%}\n .navbar .inner{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-md) var(--rhc-space-max-2xl);box-sizing:border-box}\n `],\n template: `\n
\n
\n \n \n Rijksoverheid
BIG-register
\n
\n {{ subtitle() }}\n @if (session(); as s) {\n \n Ingelogd als {{ s.naam }}\n \n \n }\n
\n
\n @if (trail().length) {\n
\n
\n \n
\n
\n }\n `,\n})\nexport class SiteHeaderComponent {\n subtitle = input($localize`:@@header.subtitle:Mijn omgeving`);\n\n private router = inject(Router);\n private sessionPort = inject(SESSION_PORT, { optional: true });\n\n readonly session = computed(() => this.sessionPort?.session() ?? null);\n private url = toSignal(\n this.router.events.pipe(filter((e) => e instanceof NavigationEnd), map(() => this.router.url)),\n { initialValue: this.router.url },\n );\n protected trail = computed(() => trailFor(this.url()));\n\n logout() {\n this.sessionPort?.logout();\n this.router.navigate(['/login']);\n }\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host{display:block}\n /* Tier 1 — white brand bar */\n .brandbar{background:var(--rhc-color-wit);border-block-end:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);inline-size:100%}\n .brandbar .inner{display:flex;align-items:center;gap:var(--rhc-space-max-xl);max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-lg) var(--rhc-space-max-2xl);box-sizing:border-box}\n .brand{display:flex;align-items:center;gap:var(--rhc-space-max-lg);color:var(--rhc-color-foreground-default);text-decoration:none}\n .mark{display:inline-block;inline-size:var(--rhc-space-max-md);block-size:var(--rhc-space-max-4xl);background:var(--rhc-color-lintblauw-700)}\n .name{font-weight:var(--rhc-text-font-weight-bold);line-height:var(--rhc-text-line-height-sm)}\n .sub{font-weight:var(--rhc-text-font-weight-regular);font-size:var(--rhc-text-font-size-sm);color:var(--rhc-color-foreground-subtle)}\n .session{margin-inline-start:auto;display:flex;align-items:center;gap:var(--rhc-space-max-lg);font-size:var(--rhc-text-font-size-sm)}\n .user{color:var(--rhc-color-foreground-subtle)}\n .logout{background:none;border:0;padding:0;cursor:pointer;color:var(--rhc-color-foreground-link);text-decoration:underline;font:inherit}\n .logout:hover{color:var(--rhc-color-foreground-link-hover)}\n /* Tier 2 — blue breadcrumb bar */\n .navbar{background:var(--rhc-color-lintblauw-700);color:var(--rhc-color-foreground-on-primary);inline-size:100%}\n .navbar .inner{max-inline-size:var(--app-content-max);margin-inline:auto;padding:var(--rhc-space-max-md) var(--rhc-space-max-2xl);box-sizing:border-box}\n \n", "extends": [] }, { @@ -6113,7 +14172,7 @@ }, { "name": "SpinnerComponent", - "id": "component-SpinnerComponent-a2815cf269d64067cc661956599274ab670cf13aa1a86ca3945a1ab725dc3b48a1e481d171799205b25682e3ed47cada574109891f4c56ea3bd92991d0f883e7", + "id": "component-SpinnerComponent-8d0c8af4a5bb0383f4ea3446e6e05c6c5f82642ff439a6fc7344372cf065e6808f080d311c669647e9f7cf7ecbe499b7b59804eda2389dcc31696fe5e603699f", "file": "src/app/shared/ui/spinner/spinner.component.ts", "encapsulation": [], "entryComponents": [], @@ -6125,7 +14184,7 @@ "styles": [ "\n :host{display:block}\n .sp{inline-size:var(--rhc-space-max-3xl);block-size:var(--rhc-space-max-3xl);border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-space-max-xs) solid var(--rhc-color-cool-grey-300);\n border-block-start-color:var(--rhc-color-lintblauw-700);\n animation:sp 0.8s linear infinite;margin:var(--rhc-space-max-2xl) auto}\n @keyframes sp{to{transform:rotate(360deg)}}\n " ], - "template": "@if (visible()) {\n
\n}\n", + "template": "@if (visible()) {\n
\n}\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -6203,7 +14262,7 @@ "description": "

Atom: spinner that only appears after delay ms — fast responses never\nflash a spinner, slow ones get feedback.

\n", "rawdescription": "\nAtom: spinner that only appears after `delay` ms — fast responses never\nflash a spinner, slow ones get feedback.", "type": "component", - "sourceCode": "import { Component, OnDestroy, OnInit, input, signal } from '@angular/core';\n\n/** Atom: spinner that only appears after `delay` ms — fast responses never\n flash a spinner, slow ones get feedback. */\n@Component({\n selector: 'app-spinner',\n styles: [`\n :host{display:block}\n .sp{inline-size:var(--rhc-space-max-3xl);block-size:var(--rhc-space-max-3xl);border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-space-max-xs) solid var(--rhc-color-cool-grey-300);\n border-block-start-color:var(--rhc-color-lintblauw-700);\n animation:sp 0.8s linear infinite;margin:var(--rhc-space-max-2xl) auto}\n @keyframes sp{to{transform:rotate(360deg)}}\n `],\n template: `\n @if (visible()) {\n
\n }\n `,\n})\nexport class SpinnerComponent implements OnInit, OnDestroy {\n delay = input(250);\n protected visible = signal(false);\n private timer?: ReturnType;\n\n ngOnInit() { this.timer = setTimeout(() => this.visible.set(true), this.delay()); }\n ngOnDestroy() { clearTimeout(this.timer); }\n}\n", + "sourceCode": "import { Component, OnDestroy, OnInit, input, signal } from '@angular/core';\n\n/** Atom: spinner that only appears after `delay` ms — fast responses never\n flash a spinner, slow ones get feedback. */\n@Component({\n selector: 'app-spinner',\n styles: [`\n :host{display:block}\n .sp{inline-size:var(--rhc-space-max-3xl);block-size:var(--rhc-space-max-3xl);border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-space-max-xs) solid var(--rhc-color-cool-grey-300);\n border-block-start-color:var(--rhc-color-lintblauw-700);\n animation:sp 0.8s linear infinite;margin:var(--rhc-space-max-2xl) auto}\n @keyframes sp{to{transform:rotate(360deg)}}\n `],\n template: `\n @if (visible()) {\n
\n }\n `,\n})\nexport class SpinnerComponent implements OnInit, OnDestroy {\n delay = input(250);\n protected visible = signal(false);\n private timer?: ReturnType;\n\n ngOnInit() { this.timer = setTimeout(() => this.visible.set(true), this.delay()); }\n ngOnDestroy() { clearTimeout(this.timer); }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "\n :host{display:block}\n .sp{inline-size:var(--rhc-space-max-3xl);block-size:var(--rhc-space-max-3xl);border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-space-max-xs) solid var(--rhc-color-cool-grey-300);\n border-block-start-color:var(--rhc-color-lintblauw-700);\n animation:sp 0.8s linear infinite;margin:var(--rhc-space-max-2xl) auto}\n @keyframes sp{to{transform:rotate(360deg)}}\n \n", @@ -6275,7 +14334,7 @@ }, { "name": "StepperComponent", - "id": "component-StepperComponent-ca92d637825cdea2afd87a8afb4b5446cb07d6f3429ebfa9ebdbc9f84569dfff27fb0a8274cae1d5a87440ee7821930479154f40dd4d29cbcb441e10341ca9c8", + "id": "component-StepperComponent-d75583b2e9c1502dec4aeeb7aae521c12cc920db861cf649f72040b83361ee60caef4b553eaccb5bdfdf16c79fc7e5db584f3c99d9db15052a631320735fce16", "file": "src/app/shared/ui/stepper/stepper.component.ts", "encapsulation": [], "entryComponents": [], @@ -6285,9 +14344,9 @@ "selector": "app-stepper", "styleUrls": [], "styles": [ - "\n :host{display:block}\n .sr-only{position:absolute;inline-size:1px;block-size:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n .steps{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-xl);list-style:none;margin:0;padding:0}\n .step{display:flex;align-items:center;gap:var(--rhc-space-max-md);color:var(--rhc-color-foreground-subtle)}\n .num{\n display:grid;place-items:center;\n inline-size:var(--rhc-space-max-4xl);block-size:var(--rhc-space-max-4xl);\n border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-space-max-xs) solid var(--rhc-color-cool-grey-400);\n font-weight:var(--rhc-text-font-weight-bold);\n }\n .step--done .num{background:var(--rhc-color-lintblauw-500);border-color:var(--rhc-color-lintblauw-500);color:var(--rhc-color-wit)}\n .step--current{color:var(--rhc-color-foreground-default)}\n .step--current .num{background:var(--rhc-color-lintblauw-700);border-color:var(--rhc-color-lintblauw-700);color:var(--rhc-color-wit)}\n .step--current .label{font-weight:var(--rhc-text-font-weight-semi-bold)}\n " + "\n :host{display:block}\n .sr-only{position:absolute;inline-size:1px;block-size:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n .steps{display:flex;list-style:none;margin:0;padding:0}\n .step{\n flex:1 1 0;min-inline-size:0;position:relative;\n display:flex;flex-direction:column;align-items:center;gap:var(--rhc-space-max-sm);\n text-align:center;color:var(--rhc-color-foreground-subtle);\n }\n /* connector line to the previous step, drawn behind the circles */\n .step::before{\n content:'';position:absolute;z-index:0;\n inset-block-start:calc(var(--rhc-space-max-4xl) / 2);\n inset-inline-start:-50%;inline-size:100%;block-size:var(--rhc-border-width-md);\n background:var(--rhc-color-cool-grey-300);\n }\n .step:first-child::before{display:none}\n .step--done::before,.step--current::before{background:var(--rhc-color-lintblauw-500)}\n .num{\n position:relative;z-index:1;display:grid;place-items:center;\n inline-size:var(--rhc-space-max-4xl);block-size:var(--rhc-space-max-4xl);\n border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-border-width-md) solid var(--rhc-color-cool-grey-300);\n background:var(--rhc-color-wit);\n font-weight:var(--rhc-text-font-weight-bold);\n }\n .label{font-size:var(--rhc-text-font-size-sm);padding-inline:var(--rhc-space-max-sm)}\n .step--done .num{background:var(--rhc-color-lintblauw-500);border-color:var(--rhc-color-lintblauw-500);color:var(--rhc-color-foreground-on-primary)}\n .step--current{color:var(--rhc-color-foreground-default)}\n .step--current .num{background:var(--rhc-color-lintblauw-700);border-color:var(--rhc-color-lintblauw-700);color:var(--rhc-color-foreground-on-primary)}\n .step--current .label{font-weight:var(--rhc-text-font-weight-semi-bold)}\n " ], - "template": "\n", + "template": "\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -6300,7 +14359,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 45, + "line": 60, "required": true }, { @@ -6311,7 +14370,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 44, + "line": 59, "required": true } ], @@ -6327,15 +14386,69 @@ "description": "

Molecule: a horizontal step indicator for a multi-step flow. Visual progress\nplus accessible semantics — an ordered list with aria-current="step" on the\nactive step and a visually-hidden "Stap X van Y" summary. Domain-free.

\n", "rawdescription": "\nMolecule: a horizontal step indicator for a multi-step flow. Visual progress\nplus accessible semantics — an ordered list with `aria-current=\"step\"` on the\nactive step and a visually-hidden \"Stap X van Y\" summary. Domain-free.", "type": "component", - "sourceCode": "import { Component, input } from '@angular/core';\n\n/** Molecule: a horizontal step indicator for a multi-step flow. Visual progress\n plus accessible semantics — an ordered list with `aria-current=\"step\"` on the\n active step and a visually-hidden \"Stap X van Y\" summary. Domain-free. */\n@Component({\n selector: 'app-stepper',\n styles: [`\n :host{display:block}\n .sr-only{position:absolute;inline-size:1px;block-size:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n .steps{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-xl);list-style:none;margin:0;padding:0}\n .step{display:flex;align-items:center;gap:var(--rhc-space-max-md);color:var(--rhc-color-foreground-subtle)}\n .num{\n display:grid;place-items:center;\n inline-size:var(--rhc-space-max-4xl);block-size:var(--rhc-space-max-4xl);\n border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-space-max-xs) solid var(--rhc-color-cool-grey-400);\n font-weight:var(--rhc-text-font-weight-bold);\n }\n .step--done .num{background:var(--rhc-color-lintblauw-500);border-color:var(--rhc-color-lintblauw-500);color:var(--rhc-color-wit)}\n .step--current{color:var(--rhc-color-foreground-default)}\n .step--current .num{background:var(--rhc-color-lintblauw-700);border-color:var(--rhc-color-lintblauw-700);color:var(--rhc-color-wit)}\n .step--current .label{font-weight:var(--rhc-text-font-weight-semi-bold)}\n `],\n template: `\n \n `,\n})\nexport class StepperComponent {\n steps = input.required();\n current = input.required();\n}\n", + "sourceCode": "import { Component, input } from '@angular/core';\n\n/** Molecule: a horizontal step indicator for a multi-step flow. Visual progress\n plus accessible semantics — an ordered list with `aria-current=\"step\"` on the\n active step and a visually-hidden \"Stap X van Y\" summary. Domain-free. */\n@Component({\n selector: 'app-stepper',\n styles: [`\n :host{display:block}\n .sr-only{position:absolute;inline-size:1px;block-size:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n .steps{display:flex;list-style:none;margin:0;padding:0}\n .step{\n flex:1 1 0;min-inline-size:0;position:relative;\n display:flex;flex-direction:column;align-items:center;gap:var(--rhc-space-max-sm);\n text-align:center;color:var(--rhc-color-foreground-subtle);\n }\n /* connector line to the previous step, drawn behind the circles */\n .step::before{\n content:'';position:absolute;z-index:0;\n inset-block-start:calc(var(--rhc-space-max-4xl) / 2);\n inset-inline-start:-50%;inline-size:100%;block-size:var(--rhc-border-width-md);\n background:var(--rhc-color-cool-grey-300);\n }\n .step:first-child::before{display:none}\n .step--done::before,.step--current::before{background:var(--rhc-color-lintblauw-500)}\n .num{\n position:relative;z-index:1;display:grid;place-items:center;\n inline-size:var(--rhc-space-max-4xl);block-size:var(--rhc-space-max-4xl);\n border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-border-width-md) solid var(--rhc-color-cool-grey-300);\n background:var(--rhc-color-wit);\n font-weight:var(--rhc-text-font-weight-bold);\n }\n .label{font-size:var(--rhc-text-font-size-sm);padding-inline:var(--rhc-space-max-sm)}\n .step--done .num{background:var(--rhc-color-lintblauw-500);border-color:var(--rhc-color-lintblauw-500);color:var(--rhc-color-foreground-on-primary)}\n .step--current{color:var(--rhc-color-foreground-default)}\n .step--current .num{background:var(--rhc-color-lintblauw-700);border-color:var(--rhc-color-lintblauw-700);color:var(--rhc-color-foreground-on-primary)}\n .step--current .label{font-weight:var(--rhc-text-font-weight-semi-bold)}\n `],\n template: `\n \n `,\n})\nexport class StepperComponent {\n steps = input.required();\n current = input.required();\n}\n", "assetsDirs": [], "styleUrlsData": "", - "stylesData": "\n :host{display:block}\n .sr-only{position:absolute;inline-size:1px;block-size:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n .steps{display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-xl);list-style:none;margin:0;padding:0}\n .step{display:flex;align-items:center;gap:var(--rhc-space-max-md);color:var(--rhc-color-foreground-subtle)}\n .num{\n display:grid;place-items:center;\n inline-size:var(--rhc-space-max-4xl);block-size:var(--rhc-space-max-4xl);\n border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-space-max-xs) solid var(--rhc-color-cool-grey-400);\n font-weight:var(--rhc-text-font-weight-bold);\n }\n .step--done .num{background:var(--rhc-color-lintblauw-500);border-color:var(--rhc-color-lintblauw-500);color:var(--rhc-color-wit)}\n .step--current{color:var(--rhc-color-foreground-default)}\n .step--current .num{background:var(--rhc-color-lintblauw-700);border-color:var(--rhc-color-lintblauw-700);color:var(--rhc-color-wit)}\n .step--current .label{font-weight:var(--rhc-text-font-weight-semi-bold)}\n \n", + "stylesData": "\n :host{display:block}\n .sr-only{position:absolute;inline-size:1px;block-size:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n .steps{display:flex;list-style:none;margin:0;padding:0}\n .step{\n flex:1 1 0;min-inline-size:0;position:relative;\n display:flex;flex-direction:column;align-items:center;gap:var(--rhc-space-max-sm);\n text-align:center;color:var(--rhc-color-foreground-subtle);\n }\n /* connector line to the previous step, drawn behind the circles */\n .step::before{\n content:'';position:absolute;z-index:0;\n inset-block-start:calc(var(--rhc-space-max-4xl) / 2);\n inset-inline-start:-50%;inline-size:100%;block-size:var(--rhc-border-width-md);\n background:var(--rhc-color-cool-grey-300);\n }\n .step:first-child::before{display:none}\n .step--done::before,.step--current::before{background:var(--rhc-color-lintblauw-500)}\n .num{\n position:relative;z-index:1;display:grid;place-items:center;\n inline-size:var(--rhc-space-max-4xl);block-size:var(--rhc-space-max-4xl);\n border-radius:var(--rhc-border-radius-round);\n border:var(--rhc-border-width-md) solid var(--rhc-color-cool-grey-300);\n background:var(--rhc-color-wit);\n font-weight:var(--rhc-text-font-weight-bold);\n }\n .label{font-size:var(--rhc-text-font-size-sm);padding-inline:var(--rhc-space-max-sm)}\n .step--done .num{background:var(--rhc-color-lintblauw-500);border-color:var(--rhc-color-lintblauw-500);color:var(--rhc-color-foreground-on-primary)}\n .step--current{color:var(--rhc-color-foreground-default)}\n .step--current .num{background:var(--rhc-color-lintblauw-700);border-color:var(--rhc-color-lintblauw-700);color:var(--rhc-color-foreground-on-primary)}\n .step--current .label{font-weight:var(--rhc-text-font-weight-semi-bold)}\n \n", + "extends": [] + }, + { + "name": "TaskListComponent", + "id": "component-TaskListComponent-0de17745750573b2f302d6355409064bc5a2cd3835cbb67b5935992409efa3154c91acd23eea7fe469c1837582f24c0d8b14aa8bad0761bd63e1231b2cd427a4", + "file": "src/app/shared/ui/task-list/task-list.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-task-list", + "styleUrls": [], + "styles": [ + "\n :host{display:block}\n .tasks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-md)}\n .task{\n display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md) var(--rhc-space-max-xl);\n align-items:center;justify-content:space-between;\n background:var(--rhc-color-wit);\n border:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-inline-start:var(--rhc-border-width-md) solid var(--rhc-color-lintblauw-700);\n border-radius:var(--rhc-border-radius-md);\n padding:var(--rhc-space-max-lg) var(--rhc-space-max-xl);\n }\n .title{margin:0 0 var(--rhc-space-max-xs);font-weight:var(--rhc-text-font-weight-semi-bold)}\n .desc{margin:0;color:var(--rhc-color-foreground-subtle);font-size:var(--rhc-text-font-size-sm)}\n .cta{flex:0 0 auto}\n " + ], + "template": "
    \n @for (t of tasks(); track t.title) {\n
  • \n
    \n

    {{ t.title }}

    \n

    {{ t.description }}

    \n
    \n {{ t.actionLabel }} →\n
  • \n }\n
\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "tasks", + "deprecated": false, + "deprecationMessage": "", + "type": "readonly TaskItem[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 50, + "required": true + } + ], + "outputsClass": [], + "propertiesClass": [], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "LinkComponent", + "type": "component" + } + ], + "description": "

Molecule: the "Wat moet ik regelen" action list (NL Design System "Mijn\nomgeving" pattern). Each task is a titled row with a call to action.

\n", + "rawdescription": "\nMolecule: the \"Wat moet ik regelen\" action list (NL Design System \"Mijn\nomgeving\" pattern). Each task is a titled row with a call to action.", + "type": "component", + "sourceCode": "import { Component, input } from '@angular/core';\nimport { LinkComponent } from '@shared/ui/link/link.component';\n\n/** Presentational task shape — what \"Wat moet ik regelen\" renders. Domain-free so\n shared/ stays independent of any context (a context's task type that has these\n fields is structurally assignable). */\nexport interface TaskItem {\n readonly title: string;\n readonly description: string;\n readonly to: string;\n readonly actionLabel: string;\n}\n\n/** Molecule: the \"Wat moet ik regelen\" action list (NL Design System \"Mijn\n omgeving\" pattern). Each task is a titled row with a call to action. */\n@Component({\n selector: 'app-task-list',\n imports: [LinkComponent],\n styles: [`\n :host{display:block}\n .tasks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-md)}\n .task{\n display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md) var(--rhc-space-max-xl);\n align-items:center;justify-content:space-between;\n background:var(--rhc-color-wit);\n border:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-inline-start:var(--rhc-border-width-md) solid var(--rhc-color-lintblauw-700);\n border-radius:var(--rhc-border-radius-md);\n padding:var(--rhc-space-max-lg) var(--rhc-space-max-xl);\n }\n .title{margin:0 0 var(--rhc-space-max-xs);font-weight:var(--rhc-text-font-weight-semi-bold)}\n .desc{margin:0;color:var(--rhc-color-foreground-subtle);font-size:var(--rhc-text-font-size-sm)}\n .cta{flex:0 0 auto}\n `],\n template: `\n
    \n @for (t of tasks(); track t.title) {\n
  • \n
    \n

    {{ t.title }}

    \n

    {{ t.description }}

    \n
    \n {{ t.actionLabel }} →\n
  • \n }\n
\n `,\n})\nexport class TaskListComponent {\n tasks = input.required();\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host{display:block}\n .tasks{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--rhc-space-max-md)}\n .task{\n display:flex;flex-wrap:wrap;gap:var(--rhc-space-max-md) var(--rhc-space-max-xl);\n align-items:center;justify-content:space-between;\n background:var(--rhc-color-wit);\n border:var(--rhc-border-width-sm) solid var(--rhc-color-border-subtle);\n border-inline-start:var(--rhc-border-width-md) solid var(--rhc-color-lintblauw-700);\n border-radius:var(--rhc-border-radius-md);\n padding:var(--rhc-space-max-lg) var(--rhc-space-max-xl);\n }\n .title{margin:0 0 var(--rhc-space-max-xs);font-weight:var(--rhc-text-font-weight-semi-bold)}\n .desc{margin:0;color:var(--rhc-color-foreground-subtle);font-size:var(--rhc-text-font-size-sm)}\n .cta{flex:0 0 auto}\n \n", "extends": [] }, { "name": "TextInputComponent", - "id": "component-TextInputComponent-712f6ffbc84c3ae2868d0a7dbb2c885712e01d4e340d36f57db0ed7d49d33dbcbab13fb8d0655c3e52f4557af2ed88b899e48167c10c5d9a7cec6bc3cd55d5ae", + "id": "component-TextInputComponent-0e6897888b2e40769cd04df49da0c12c685fecc687185c0e3995862e60c9e55cce5d47721c3bedc8ce874c717eee9c94252fe007d5943446bf57b4d6fe7ee93a", "file": "src/app/shared/ui/text-input/text-input.component.ts", "encapsulation": [], "entryComponents": [], @@ -6348,7 +14461,9 @@ ], "selector": "app-text-input", "styleUrls": [], - "styles": [], + "styles": [ + "\n :host{display:block}\n input{inline-size:100%;box-sizing:border-box}\n " + ], "template": "\n", "templateUrl": [], "viewProviders": [], @@ -6362,7 +14477,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 27, + "line": 31, "required": false }, { @@ -6373,7 +14488,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 26, + "line": 30, "required": false }, { @@ -6384,7 +14499,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 25, + "line": 29, "required": false }, { @@ -6396,7 +14511,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 24, + "line": 28, "required": false } ], @@ -6411,7 +14526,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 30 + "line": 34 }, { "name": "onChange", @@ -6422,7 +14537,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 31 + "line": 35 }, { "name": "onTouched", @@ -6433,7 +14548,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 32 + "line": 36 }, { "name": "value", @@ -6444,7 +14559,7 @@ "indexKey": "", "optional": false, "description": "", - "line": 29 + "line": 33 } ], "methodsClass": [ @@ -6463,7 +14578,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 34, + "line": 38, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -6505,7 +14620,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 39, + "line": 43, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -6548,7 +14663,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 40, + "line": 44, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -6581,7 +14696,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 41, + "line": 45, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -6613,7 +14728,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 38, + "line": 42, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -6640,19 +14755,547 @@ "description": "

Atom: text input. Utrecht textbox wired up as a form control (ngModel/reactive).

\n", "rawdescription": "\nAtom: text input. Utrecht textbox wired up as a form control (ngModel/reactive).", "type": "component", - "sourceCode": "import { Component, forwardRef, input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Atom: text input. Utrecht textbox wired up as a form control (ngModel/reactive). */\n@Component({\n selector: 'app-text-input',\n template: `\n \n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TextInputComponent), multi: true }],\n})\nexport class TextInputComponent implements ControlValueAccessor {\n type = input<'text' | 'password' | 'email'>('text');\n placeholder = input('');\n invalid = input(false);\n inputId = input();\n\n value = '';\n disabled = false;\n onChange: (v: string) => void = () => {};\n onTouched: () => void = () => {};\n\n onInput(e: Event) {\n this.value = (e.target as HTMLInputElement).value;\n this.onChange(this.value);\n }\n writeValue(v: string) { this.value = v ?? ''; }\n registerOnChange(fn: (v: string) => void) { this.onChange = fn; }\n registerOnTouched(fn: () => void) { this.onTouched = fn; }\n setDisabledState(d: boolean) { this.disabled = d; }\n}\n", + "sourceCode": "import { Component, forwardRef, input } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** Atom: text input. Utrecht textbox wired up as a form control (ngModel/reactive). */\n@Component({\n selector: 'app-text-input',\n styles: [`\n :host{display:block}\n input{inline-size:100%;box-sizing:border-box}\n `],\n template: `\n \n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TextInputComponent), multi: true }],\n})\nexport class TextInputComponent implements ControlValueAccessor {\n type = input<'text' | 'password' | 'email'>('text');\n placeholder = input('');\n invalid = input(false);\n inputId = input();\n\n value = '';\n disabled = false;\n onChange: (v: string) => void = () => {};\n onTouched: () => void = () => {};\n\n onInput(e: Event) {\n this.value = (e.target as HTMLInputElement).value;\n this.onChange(this.value);\n }\n writeValue(v: string) { this.value = v ?? ''; }\n registerOnChange(fn: (v: string) => void) { this.onChange = fn; }\n registerOnTouched(fn: () => void) { this.onTouched = fn; }\n setDisabledState(d: boolean) { this.disabled = d; }\n}\n", "assetsDirs": [], "styleUrlsData": "", - "stylesData": "", + "stylesData": "\n :host{display:block}\n input{inline-size:100%;box-sizing:border-box}\n \n", "extends": [], "implements": [ "ControlValueAccessor" ] + }, + { + "name": "UploadProgressBarComponent", + "id": "component-UploadProgressBarComponent-c7954b5fe8ca64e3554479c2677f523b46486b0b6ac132beef94a068b90b0e3647a74fe452cb3152a121b546b2a3dd5ea8fadd9ffcdbcaef039c826ac98fb0e6", + "file": "src/app/shared/ui/upload/upload-progress-bar/upload-progress-bar.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-upload-progress-bar", + "styleUrls": [], + "styles": [ + "\n :host { display: flex; align-items: center; gap: var(--rhc-space-max-md); }\n progress { flex: 1; height: var(--rhc-space-max-md); }\n .pct { font-size: var(--rhc-text-font-size-sm); color: var(--rhc-color-foreground-subtle); min-width: 3ch; text-align: end; }\n " + ], + "template": "\n{{ progressPct() }}%\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "progressPct", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": false, + "description": "", + "line": 21, + "required": true + } + ], + "outputsClass": [], + "propertiesClass": [ + { + "name": "progressLabel", + "defaultValue": "$localize`:@@upload.progress.label:Uploadvoortgang`", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 23, + "modifierKind": [ + 124, + 148 + ] + } + ], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [], + "description": "

Atom: native progress bar for an in-flight upload. Pure UI — the caller supplies\nthe percentage.

\n", + "rawdescription": "\nAtom: native progress bar for an in-flight upload. Pure UI — the caller supplies\nthe percentage.", + "type": "component", + "sourceCode": "import { Component, input } from '@angular/core';\n\n/** Atom: native progress bar for an in-flight upload. Pure UI — the caller supplies\n the percentage. */\n@Component({\n selector: 'app-upload-progress-bar',\n styles: [`\n :host { display: flex; align-items: center; gap: var(--rhc-space-max-md); }\n progress { flex: 1; height: var(--rhc-space-max-md); }\n .pct { font-size: var(--rhc-text-font-size-sm); color: var(--rhc-color-foreground-subtle); min-width: 3ch; text-align: end; }\n `],\n template: `\n \n {{ progressPct() }}%\n `,\n})\nexport class UploadProgressBarComponent {\n progressPct = input.required();\n\n protected readonly progressLabel = $localize`:@@upload.progress.label:Uploadvoortgang`;\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n :host { display: flex; align-items: center; gap: var(--rhc-space-max-md); }\n progress { flex: 1; height: var(--rhc-space-max-md); }\n .pct { font-size: var(--rhc-text-font-size-sm); color: var(--rhc-color-foreground-subtle); min-width: 3ch; text-align: end; }\n \n", + "extends": [] + }, + { + "name": "UploadStatusBannerComponent", + "id": "component-UploadStatusBannerComponent-bd43a8ab3e3102bf27f08c6969f36192f05089712c019bd99cb63bfd83c158174c8a9e71d9c48550de2ead19eb78bfaa2c49baa85be1880adb487129f632174c", + "file": "src/app/shared/ui/upload/upload-status-banner/upload-status-banner.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-upload-status-banner", + "styleUrls": [], + "styles": [], + "template": "
\n {{ message() }}\n
\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "message", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 19, + "required": true + }, + { + "name": "type", + "defaultValue": "'info'", + "deprecated": false, + "deprecationMessage": "", + "type": "BannerType", + "indexKey": "", + "optional": false, + "description": "", + "line": 20, + "required": false + } + ], + "outputsClass": [], + "propertiesClass": [ + { + "name": "alertType", + "defaultValue": "computed(() => (this.type() === 'info' ? 'info' : this.type()))", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 22, + "modifierKind": [ + 124, + 148 + ] + } + ], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "AlertComponent", + "type": "component" + } + ], + "description": "

Molecule: a polite, announced status banner. Wraps the alert atom and maps the\nbanner type to an alert type. Pure UI: the container computes the message.

\n", + "rawdescription": "\nMolecule: a polite, announced status banner. Wraps the alert atom and maps the\nbanner type to an alert type. Pure UI: the container computes the message.", + "type": "component", + "sourceCode": "import { Component, computed, input } from '@angular/core';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\n\ntype BannerType = 'info' | 'warning' | 'error';\ntype AlertType = 'info' | 'ok' | 'warning' | 'error';\n\n/** Molecule: a polite, announced status banner. Wraps the alert atom and maps the\n banner type to an alert type. Pure UI: the container computes the message. */\n@Component({\n selector: 'app-upload-status-banner',\n imports: [AlertComponent],\n template: `\n
\n {{ message() }}\n
\n `,\n})\nexport class UploadStatusBannerComponent {\n message = input.required();\n type = input('info');\n\n protected readonly alertType = computed(() => (this.type() === 'info' ? 'info' : this.type()));\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "", + "extends": [] + }, + { + "name": "UploadStatusIconComponent", + "id": "component-UploadStatusIconComponent-bc824192fb4b5b1e5ca46093e18a138c2c643d35be29ea257636d0b96b1867c3aa6d37f84437e9315f4e8157cdd99351b9bb1fe0f58adadd7cafca9c69d46185", + "file": "src/app/shared/ui/upload/upload-status-icon/upload-status-icon.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-upload-status-icon", + "styleUrls": [], + "styles": [ + "\n .glyph { font-weight: var(--rhc-text-font-weight-semi-bold); }\n " + ], + "template": "@if (glyph()) {\n \n {{ glyph()!.char }}\n \n}\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "UploadStatus['type']", + "indexKey": "", + "optional": false, + "description": "", + "line": 26, + "required": true + } + ], + "outputsClass": [], + "propertiesClass": [ + { + "name": "glyph", + "defaultValue": "computed(() => {\n switch (this.status()) {\n case 'queued':\n return { char: '…', label: $localize`:@@upload.status.queued:In wachtrij`, color: 'var(--rhc-color-foreground-subtle)' };\n case 'uploading':\n return { char: '↑', label: $localize`:@@upload.status.uploading:Bezig met uploaden`, color: 'var(--rhc-color-lintblauw-600)' };\n case 'complete':\n return { char: '✓', label: $localize`:@@upload.status.complete:Geüpload`, color: 'var(--rhc-color-groen-500)' };\n case 'failed':\n return { char: '✕', label: $localize`:@@upload.status.failed:Mislukt`, color: 'var(--rhc-color-rood-500)' };\n case 'deleting':\n return { char: '⟳', label: $localize`:@@upload.status.deleting:Bezig met verwijderen`, color: 'var(--rhc-color-foreground-subtle)' };\n case 'idle':\n case 'deleted':\n return null;\n }\n })", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 28, + "modifierKind": [ + 124, + 148 + ] + } + ], + "methodsClass": [], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [], + "description": "

Atom: a small status glyph for one upload. Pure UI — glyph, colour and a11y\nlabel derive purely from the status type.

\n", + "rawdescription": "\nAtom: a small status glyph for one upload. Pure UI — glyph, colour and a11y\nlabel derive purely from the status type.", + "type": "component", + "sourceCode": "import { Component, computed, input } from '@angular/core';\nimport type { UploadStatus } from '@shared/upload/upload.machine';\n\ninterface Glyph {\n char: string;\n label: string;\n color: string;\n}\n\n/** Atom: a small status glyph for one upload. Pure UI — glyph, colour and a11y\n label derive purely from the status type. */\n@Component({\n selector: 'app-upload-status-icon',\n styles: [`\n .glyph { font-weight: var(--rhc-text-font-weight-semi-bold); }\n `],\n template: `\n @if (glyph()) {\n \n {{ glyph()!.char }}\n \n }\n `,\n})\nexport class UploadStatusIconComponent {\n status = input.required();\n\n protected readonly glyph = computed(() => {\n switch (this.status()) {\n case 'queued':\n return { char: '…', label: $localize`:@@upload.status.queued:In wachtrij`, color: 'var(--rhc-color-foreground-subtle)' };\n case 'uploading':\n return { char: '↑', label: $localize`:@@upload.status.uploading:Bezig met uploaden`, color: 'var(--rhc-color-lintblauw-600)' };\n case 'complete':\n return { char: '✓', label: $localize`:@@upload.status.complete:Geüpload`, color: 'var(--rhc-color-groen-500)' };\n case 'failed':\n return { char: '✕', label: $localize`:@@upload.status.failed:Mislukt`, color: 'var(--rhc-color-rood-500)' };\n case 'deleting':\n return { char: '⟳', label: $localize`:@@upload.status.deleting:Bezig met verwijderen`, color: 'var(--rhc-color-foreground-subtle)' };\n case 'idle':\n case 'deleted':\n return null;\n }\n });\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n .glyph { font-weight: var(--rhc-text-font-weight-semi-bold); }\n \n", + "extends": [] + }, + { + "name": "WizardShellComponent", + "id": "component-WizardShellComponent-83776d36ee9e352e1f6e9d6be8422e18099e626c0cd999197ad35df7d5ce1e58ef6639ab1973e1840b2a727eb9cd7ccf71626ca7f6e31a4c887969ad9d9d435f", + "file": "src/app/shared/layout/wizard-shell/wizard-shell.component.ts", + "encapsulation": [], + "entryComponents": [], + "inputs": [], + "outputs": [], + "providers": [], + "selector": "app-wizard-shell", + "styleUrls": [], + "styles": [ + "\n .es-title{margin:0 0 var(--rhc-space-max-sm)}\n .es-list{margin:0;padding-inline-start:var(--rhc-space-max-xl)}\n " + ], + "template": "@switch (status()) {\n @case ('editing') {\n \n

{{ stepTitle() }}

\n @if (errors().length) {\n
\n \n

Er ging iets mis met uw invoer

\n \n
\n
\n }\n
\n \n
\n @if (canGoBack()) {\n Vorige\n }\n {{ primaryLabel() }}\n Annuleren\n
\n \n }\n @case ('submitting') {\n {{ submittingLabel() }}\n }\n @case ('submitted') {\n \n }\n @case ('failed') {\n {{ errorMessage() }}\n
\n Opnieuw proberen\n
\n }\n}\n", + "templateUrl": [], + "viewProviders": [], + "hostDirectives": [], + "inputsClass": [ + { + "name": "canGoBack", + "defaultValue": "false", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 83, + "required": false + }, + { + "name": "current", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "indexKey": "", + "optional": false, + "description": "", + "line": 79, + "required": true + }, + { + "name": "errorMessage", + "defaultValue": "''", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 85, + "required": false + }, + { + "name": "errors", + "defaultValue": "[]", + "deprecated": false, + "deprecationMessage": "", + "type": "readonly WizardError[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 84, + "required": false + }, + { + "name": "primaryLabel", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 82, + "required": true + }, + { + "name": "status", + "deprecated": false, + "deprecationMessage": "", + "type": "WizardStatus", + "indexKey": "", + "optional": false, + "description": "", + "line": 81, + "required": true + }, + { + "name": "steps", + "deprecated": false, + "deprecationMessage": "", + "type": "string[]", + "indexKey": "", + "optional": false, + "description": "", + "line": 78, + "required": true + }, + { + "name": "stepTitle", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "indexKey": "", + "optional": false, + "description": "", + "line": 80, + "required": true + }, + { + "name": "submittingLabel", + "defaultValue": "$localize`:@@wizard.submitting:Aanvraag wordt verwerkt…`", + "deprecated": false, + "deprecationMessage": "", + "indexKey": "", + "optional": false, + "description": "", + "line": 86, + "required": false + } + ], + "outputsClass": [ + { + "name": "back", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 89, + "required": false + }, + { + "name": "cancel", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 90, + "required": false + }, + { + "name": "primary", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 88, + "required": false + }, + { + "name": "retry", + "deprecated": false, + "deprecationMessage": "", + "type": "void", + "indexKey": "", + "optional": false, + "description": "", + "line": 91, + "required": false + } + ], + "propertiesClass": [ + { + "name": "errorSummary", + "defaultValue": "viewChild>('errorSummary')", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 102, + "modifierKind": [ + 123 + ] + }, + { + "name": "stepHeading", + "defaultValue": "viewChild>('stepHeading')", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "indexKey": "", + "optional": false, + "description": "", + "line": 101, + "modifierKind": [ + 123 + ] + } + ], + "methodsClass": [ + { + "name": "goToField", + "args": [ + { + "name": "ev", + "type": "Event", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 96, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nError-summary link: focus the field instead of letting the browser navigate.\nA fragment href resolves against , not the current route, so\na real navigation would reload to \"/\" and bounce to login.", + "description": "

Error-summary link: focus the field instead of letting the browser navigate.\nA fragment href resolves against , not the current route, so\na real navigation would reload to "/" and bounce to login.

\n", + "modifierKind": [ + 124 + ], + "jsdoctags": [ + { + "name": "ev", + "type": "Event", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "id", + "type": "string", + "optional": false, + "dotDotDotToken": false, + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "deprecated": false, + "deprecationMessage": "", + "hostBindings": [], + "hostListeners": [], + "standalone": false, + "imports": [ + { + "name": "FormsModule", + "type": "module" + }, + { + "name": "ButtonComponent", + "type": "component" + }, + { + "name": "AlertComponent", + "type": "component" + }, + { + "name": "SpinnerComponent", + "type": "component" + }, + { + "name": "StepperComponent", + "type": "component" + } + ], + "description": "

Template: the canonical shell every wizard renders into, so they cannot drift.\nIt owns the consistent outline — stepper + focusable step heading + error\nsummary + the

+ the Back/Next/Cancel action bar + the submitting/\nsubmitted/failed states — and the a11y focus management.

\n

Presentational and unidirectional: all state stays in the wizard container\n(the Elm-style store). Inputs flow down; the container reacts to the outputs\nand dispatches messages. The step's own fields are projected as the default\nslot; the success screen is projected via [wizardSuccess].

\n", + "rawdescription": "\n\nTemplate: the canonical shell every wizard renders into, so they cannot drift.\nIt owns the consistent outline — stepper + focusable step heading + error\nsummary + the + the Back/Next/Cancel action bar + the submitting/\nsubmitted/failed states — and the a11y focus management.\n\nPresentational and unidirectional: all state stays in the wizard container\n(the Elm-style store). Inputs flow down; the container reacts to the outputs\nand dispatches messages. The step's own fields are projected as the default\nslot; the success screen is projected via [wizardSuccess].\n", + "type": "component", + "sourceCode": "import { Component, ElementRef, effect, input, output, untracked, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonComponent } from '@shared/ui/button/button.component';\nimport { AlertComponent } from '@shared/ui/alert/alert.component';\nimport { SpinnerComponent } from '@shared/ui/spinner/spinner.component';\nimport { StepperComponent } from '@shared/ui/stepper/stepper.component';\n\n/** A flat validation error pointing at a field: `id` matches the field's anchor. */\nexport interface WizardError {\n readonly id: string;\n readonly message: string;\n}\n\nexport type WizardStatus = 'editing' | 'submitting' | 'submitted' | 'failed';\n\n/**\n * Template: the canonical shell every wizard renders into, so they cannot drift.\n * It owns the consistent outline — stepper + focusable step heading + error\n * summary + the + the Back/Next/Cancel action bar + the submitting/\n * submitted/failed states — and the a11y focus management.\n *\n * Presentational and unidirectional: all state stays in the wizard container\n * (the Elm-style store). Inputs flow down; the container reacts to the outputs\n * and dispatches messages. The step's own fields are projected as the default\n * slot; the success screen is projected via [wizardSuccess].\n */\n@Component({\n selector: 'app-wizard-shell',\n imports: [FormsModule, ButtonComponent, AlertComponent, SpinnerComponent, StepperComponent],\n styles: [`\n .es-title{margin:0 0 var(--rhc-space-max-sm)}\n .es-list{margin:0;padding-inline-start:var(--rhc-space-max-xl)}\n `],\n template: `\n @switch (status()) {\n @case ('editing') {\n \n

{{ stepTitle() }}

\n @if (errors().length) {\n
\n \n

Er ging iets mis met uw invoer

\n \n
\n
\n }\n \n \n
\n @if (canGoBack()) {\n Vorige\n }\n {{ primaryLabel() }}\n Annuleren\n
\n \n }\n @case ('submitting') {\n {{ submittingLabel() }}\n }\n @case ('submitted') {\n \n }\n @case ('failed') {\n {{ errorMessage() }}\n
\n Opnieuw proberen\n
\n }\n }\n `,\n})\nexport class WizardShellComponent {\n steps = input.required();\n current = input.required();\n stepTitle = input.required();\n status = input.required();\n primaryLabel = input.required();\n canGoBack = input(false);\n errors = input([]);\n errorMessage = input('');\n submittingLabel = input($localize`:@@wizard.submitting:Aanvraag wordt verwerkt…`);\n\n primary = output();\n back = output();\n cancel = output();\n retry = output();\n\n /** Error-summary link: focus the field instead of letting the browser navigate.\n A fragment href resolves against , not the current route, so\n a real navigation would reload to \"/\" and bounce to login. */\n protected goToField(ev: Event, id: string) {\n ev.preventDefault();\n document.getElementById(id)?.focus(); // focus() scrolls the input into view\n }\n\n private stepHeading = viewChild>('stepHeading');\n private errorSummary = viewChild>('errorSummary');\n\n constructor() {\n // A11y: move focus to the step heading when the step changes (skip first run\n // so we don't grab focus on initial load). Tracks current(), which is value-\n // stable across keystrokes, so typing never steals focus.\n let firstStep = true;\n effect(() => {\n this.current();\n if (firstStep) { firstStep = false; return; }\n untracked(() => queueMicrotask(() => this.stepHeading()?.nativeElement.focus()));\n });\n // A11y: when validation errors first appear (after a failed submit), move\n // focus to the error summary so it's announced. Only on the rising edge\n // (none → some): typing rebuilds the errors array each keystroke, and\n // re-focusing then would scroll the page up mid-edit. The summary keeps\n // role=\"alert\", so content changes are still announced without the jump.\n let firstErr = true;\n let hadErrors = false;\n effect(() => {\n const has = this.errors().length > 0;\n if (firstErr) { firstErr = false; hadErrors = has; return; }\n if (has && !hadErrors) untracked(() => queueMicrotask(() => this.errorSummary()?.nativeElement.focus()));\n hadErrors = has;\n });\n }\n}\n", + "assetsDirs": [], + "styleUrlsData": "", + "stylesData": "\n .es-title{margin:0 0 var(--rhc-space-max-sm)}\n .es-list{margin:0;padding-inline-start:var(--rhc-space-max-xl)}\n \n", + "constructorObj": { + "name": "constructor", + "description": "", + "deprecated": false, + "deprecationMessage": "", + "args": [], + "line": 102 + }, + "extends": [] } ], "modules": [], "miscellaneous": { "variables": [ + { + "name": "AANVRAAG_TYPES", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "string[]", + "defaultValue": "['registratie', 'herregistratie', 'intake']" + }, + { + "name": "ACTIVE", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "ReadonlyArray", + "defaultValue": "['queued', 'uploading', 'complete']" + }, { "name": "appConfig", "ctype": "miscellaneous", @@ -6661,7 +15304,7 @@ "deprecated": false, "deprecationMessage": "", "type": "ApplicationConfig", - "defaultValue": "{\n providers: [\n provideBrowserGlobalErrorListeners(),\n provideRouter(routes, withViewTransitions()),\n provideHttpClient(withInterceptors([scenarioInterceptor])),\n { provide: LOCALE_ID, useValue: 'nl' },\n ]\n}" + "defaultValue": "{\n providers: [\n provideBrowserGlobalErrorListeners(),\n provideRouter(routes, withViewTransitions()),\n // Dev-only: the ?scenario= toggle must never reach a production build, where\n // a query param could otherwise force errors on the live app.\n provideHttpClient(withInterceptors(isDevMode() ? [scenarioInterceptor] : [])),\n provideApiClient(),\n { provide: SESSION_PORT, useExisting: SessionStore },\n { provide: LOCALE_ID, useValue: 'nl' },\n ]\n}" }, { "name": "ASYNC", @@ -6688,14 +15331,24 @@ "description": "

Route guard: only let authenticated users in; otherwise redirect to /login.

\n" }, { - "name": "EMPTY", + "name": "categoryOf", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/registratie/infrastructure/duo.adapter.ts", + "file": "src/app/shared/upload/upload.machine.ts", "deprecated": false, "deprecationMessage": "", - "type": "DuoLookupDto", - "defaultValue": "{ diplomas: [], handmatig: { beroepen: [], policyQuestions: [] } }" + "type": "unknown", + "defaultValue": "(s: UploadState, categoryId: string) => s.categories.find((c) => c.categoryId === categoryId)" + }, + { + "name": "DEBOUNCE_MS", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/registratie/application/draft-sync.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "600" }, { "name": "emptyDraft", @@ -6707,6 +15360,30 @@ "type": "Draft", "defaultValue": "{ antwoorden: {} }" }, + { + "name": "environment", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/environments/environment.prod.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "object", + "defaultValue": "{\n production: true,\n apiBaseUrl: '',\n}", + "rawdescription": "Production environment. `apiBaseUrl` stays relative ('') for a same-origin /\nreverse-proxy deployment; set it to the API origin (e.g. 'https://api.example.nl')\nwhen the SPA and backend are served from different hosts. This is the single\nplace the deployed API location is configured.", + "description": "

Production environment. apiBaseUrl stays relative ('') for a same-origin /\nreverse-proxy deployment; set it to the API origin (e.g. 'https://api.example.nl')\nwhen the SPA and backend are served from different hosts. This is the single\nplace the deployed API location is configured.

\n" + }, + { + "name": "environment", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/environments/environment.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "object", + "defaultValue": "{\n production: false,\n apiBaseUrl: '',\n}", + "rawdescription": "Default (development) environment. `apiBaseUrl` is empty so requests are\nrelative to the current origin — in dev the ng-serve proxy forwards /api to the\nbackend (proxy.conf.json). Swapped for environment.prod.ts in production builds\n(angular.json fileReplacements).", + "description": "

Default (development) environment. apiBaseUrl is empty so requests are\nrelative to the current origin — in dev the ng-serve proxy forwards /api to the\nbackend (proxy.conf.json). Swapped for environment.prod.ts in production builds\n(angular.json fileReplacements).

\n" + }, { "name": "err", "ctype": "miscellaneous", @@ -6717,6 +15394,26 @@ "type": "unknown", "defaultValue": "(error: E): Result => ({ ok: false, error })" }, + { + "name": "find", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "(s: UploadState, localId: string) => s.uploads.find((u) => u.localId === localId)" + }, + { + "name": "genericError", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "(): string => UPLOAD_FAILED" + }, { "name": "HANDMATIG", "ctype": "miscellaneous", @@ -6728,14 +15425,16 @@ "defaultValue": "'__handmatig__'" }, { - "name": "initial", + "name": "inFlight", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "file": "src/app/shared/upload/upload.machine.ts", "deprecated": false, "deprecationMessage": "", - "type": "RegistratieState", - "defaultValue": "{ tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {} }" + "type": "unknown", + "defaultValue": "(s: UploadState): Upload[] =>\n s.uploads.filter((u) => u.status.type === 'queued' || u.status.type === 'uploading')", + "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", @@ -6745,7 +15444,7 @@ "deprecated": false, "deprecationMessage": "", "type": "WizardState", - "defaultValue": "{ tag: 'Editing', step: 1, draft: { uren: '', jaren: '', punten: '' }, errors: {} }" + "defaultValue": "{ tag: 'Editing', step: 1, draft: { uren: '', jaren: '', punten: '' }, errors: {}, upload: initialUpload }" }, { "name": "initial", @@ -6758,24 +15457,46 @@ "defaultValue": "{ tag: 'Answering', answers: {}, cursor: 0, errors: {}, scholingThreshold: SCHOLING_THRESHOLD_DEFAULT }" }, { - "name": "JA_NEE", + "name": "initial", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", + "file": "src/app/registratie/domain/change-request.machine.ts", "deprecated": false, "deprecationMessage": "", - "type": "[]", - "defaultValue": "[{ value: 'ja', label: 'Ja' }, { value: 'nee', label: 'Nee' }]" + "type": "State", + "defaultValue": "{\n tag: 'Editing',\n draft: { straat: '', postcode: '', woonplaats: '' },\n errors: {},\n}" + }, + { + "name": "initial", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "RegistratieState", + "defaultValue": "{ tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {}, upload: initialUpload }" + }, + { + "name": "initialUpload", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "UploadState", + "defaultValue": "{\n categories: [],\n uploads: [],\n deliveryChannel: {},\n rejections: {},\n backgroundSyncAvailable: false,\n}" }, { "name": "JA_NEE", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts", + "file": "src/app/shared/ui/radio-group/radio-group.component.ts", "deprecated": false, "deprecationMessage": "", - "type": "[]", - "defaultValue": "[{ value: 'ja', label: 'Ja' }, { value: 'nee', label: 'Nee' }]" + "type": "RadioOption[]", + "defaultValue": "[\n { value: 'ja', label: $localize`:@@common.ja:Ja` },\n { value: 'nee', label: $localize`:@@common.nee:Nee` },\n]", + "rawdescription": "The ubiquitous yes/no option pair. Language-agnostic now the labels are\nlocalized, so it lives next to RadioOption and both wizards import it.", + "description": "

The ubiquitous yes/no option pair. Language-agnostic now the labels are\nlocalized, so it lives next to RadioOption and both wizards import it.

\n" }, { "name": "KANALEN", @@ -6785,7 +15506,7 @@ "deprecated": false, "deprecationMessage": "", "type": "[]", - "defaultValue": "[{ value: 'email', label: 'E-mail' }, { value: 'post', label: 'Post' }]" + "defaultValue": "[\n { value: 'email', label: $localize`:@@registratie.kanaalEmail:E-mail` },\n { value: 'post', label: $localize`:@@registratie.kanaalPost:Post` },\n]" }, { "name": "ok", @@ -6797,6 +15518,48 @@ "type": "unknown", "defaultValue": "(value: T): Result => ({ ok: true, value })" }, + { + "name": "parseError", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "(body: string): string => {\n try {\n return problemDetail(JSON.parse(body), UPLOAD_FAILED);\n } catch {\n return genericError();\n }\n}" + }, + { + "name": "REDACTED", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/ui/debug-state/mask.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "defaultValue": "'‹redacted›'" + }, + { + "name": "REJECTION_MESSAGES", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Record<\"type\" | \"size\" | \"multiple\", string>", + "defaultValue": "{\n type: $localize`:@@upload.reject.type:Dit bestandstype is niet toegestaan voor deze categorie.`,\n size: $localize`:@@upload.reject.size:Dit bestand is te groot.`,\n multiple: $localize`:@@upload.reject.multiple:U kunt voor deze categorie maar één bestand uploaden.`,\n}" + }, + { + "name": "REQUEST_TIMEOUT_MS", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/infrastructure/api-client.provider.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "10_000", + "rawdescription": "Single place every API call passes through: the seam for cross-cutting concerns.", + "description": "

Single place every API call passes through: the seam for cross-cutting concerns.

\n" + }, { "name": "routes", "ctype": "miscellaneous", @@ -6807,6 +15570,16 @@ "type": "Routes", "defaultValue": "[\n {\n path: '',\n component: ShellComponent, // persistent header/footer; only children swap\n children: [\n { path: '', pathMatch: 'full', redirectTo: 'login' },\n { path: 'login', loadComponent: () => \"import('@auth/ui/login.page').then(m => m.LoginPage)\" },\n { path: 'dashboard', canActivate: [authGuard], loadComponent: () => \"import('@registratie/ui/dashboard.page').then(m => m.DashboardPage)\" },\n { path: 'registratie', canActivate: [authGuard], loadComponent: () => \"import('@registratie/ui/registration-detail.page').then(m => m.RegistrationDetailPage)\" },\n { path: 'registreren', canActivate: [authGuard], loadComponent: () => \"import('@registratie/ui/registratie.page').then(m => m.RegistratiePage)\" },\n { path: 'herregistratie', canActivate: [authGuard], loadComponent: () => \"import('@herregistratie/ui/herregistratie.page').then(m => m.HerregistratiePage)\" },\n { path: 'intake', canActivate: [authGuard], loadComponent: () => \"import('@herregistratie/ui/intake.page').then(m => m.IntakePage)\" },\n { path: 'concepts', loadComponent: () => \"import('./showcase/concepts.page').then(m => m.ConceptsPage)\" },\n { path: '**', redirectTo: 'login' },\n ],\n },\n]" }, + { + "name": "ROUTES", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Record", + "defaultValue": "{\n '/dashboard': { label: $localize`:@@crumb.dashboard:Mijn overzicht` },\n '/registratie': { label: $localize`:@@crumb.registratie:Mijn gegevens`, parent: '/dashboard' },\n '/registreren': { label: $localize`:@@crumb.registreren:Inschrijven`, parent: '/dashboard' },\n '/herregistratie': { label: $localize`:@@crumb.herregistratie:Herregistratie`, parent: '/dashboard' },\n '/intake': { label: $localize`:@@crumb.intake:Herregistratie-intake`, parent: '/dashboard' },\n '/concepts': { label: $localize`:@@crumb.concepts:Functionele patronen`, parent: '/dashboard' },\n}" + }, { "name": "scenarioInterceptor", "ctype": "miscellaneous", @@ -6815,9 +15588,9 @@ "deprecated": false, "deprecationMessage": "", "type": "HttpInterceptorFn", - "defaultValue": "(req, next) => {\n if (!req.url.includes('mock/')) return next(req);\n\n switch (currentScenario()) {\n case 'slow':\n return next(req).pipe(delay(2500));\n case 'loading':\n return next(req).pipe(delay(600_000)); // effectively never resolves\n case 'empty':\n return of(new HttpResponse({ status: 200, body: [] })).pipe(delay(400));\n case 'error':\n return timer(400).pipe(\n switchMap(() => throwError(() =>\n new HttpErrorResponse({ status: 500, statusText: 'Demo-fout', url: req.url }))),\n );\n default:\n return next(req);\n }\n}", - "rawdescription": "Demo-only: rewrites the timing/outcome of mock data requests based on\n?scenario= so loading / empty / error states can be shown on demand.\nReal requests are untouched.", - "description": "

Demo-only: rewrites the timing/outcome of mock data requests based on\n?scenario= so loading / empty / error states can be shown on demand.\nReal requests are untouched.

\n" + "defaultValue": "(req, next) => {\n if (!req.url.includes('/api/')) return next(req);\n\n switch (currentScenario()) {\n case 'slow':\n return next(req).pipe(delay(2500));\n case 'loading':\n return next(req).pipe(delay(600_000)); // effectively never resolves\n case 'empty':\n // '[]' so the typed client parses it to an empty array (notes → Empty state).\n return of(new HttpResponse({ status: 200, body: '[]' })).pipe(delay(400));\n case 'error':\n return timer(400).pipe(\n switchMap(() => throwError(() =>\n new HttpErrorResponse({ status: 500, statusText: 'Demo-fout', url: req.url }))),\n );\n default:\n return next(req);\n }\n}", + "rawdescription": "Demo-only: rewrites the timing/outcome of API data requests based on\n?scenario= so loading / empty / error states can be shown on demand.\nNon-API requests are untouched.", + "description": "

Demo-only: rewrites the timing/outcome of API data requests based on\n?scenario= so loading / empty / error states can be shown on demand.\nNon-API requests are untouched.

\n" }, { "name": "SCHOLING_THRESHOLD_DEFAULT", @@ -6832,16 +15605,14 @@ "description": "

Demo fallback only — the real threshold is a SERVER-OWNED policy value fetched\nat runtime (see IntakePolicyDto / SetPolicy). ponytail: default is the offline\nfallback; the server value wins.

\n" }, { - "name": "STEPS", + "name": "SESSION_PORT", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "file": "src/app/shared/application/session.port.ts", "deprecated": false, "deprecationMessage": "", - "type": "StepId[]", - "defaultValue": "['adres', 'beroep', 'controle']", - "rawdescription": "The fixed step list. Number of steps never changes; questions reveal inline.", - "description": "

The fixed step list. Number of steps never changes; questions reveal inline.

\n" + "type": "unknown", + "defaultValue": "new InjectionToken('SESSION_PORT')" }, { "name": "STEPS", @@ -6855,6 +15626,18 @@ "rawdescription": "The fixed step list. Number of steps never changes; questions reveal inline.", "description": "

The fixed step list. Number of steps never changes; questions reveal inline.

\n" }, + { + "name": "STEPS", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "StepId[]", + "defaultValue": "['adres', 'beroep', 'controle']", + "rawdescription": "The fixed step list. Number of steps never changes; questions reveal inline.", + "description": "

The fixed step list. Number of steps never changes; questions reveal inline.

\n" + }, { "name": "STORAGE_KEY", "ctype": "miscellaneous", @@ -6866,24 +15649,46 @@ "defaultValue": "'session-v1'" }, { - "name": "STORAGE_KEY", + "name": "SUBMIT_FAILED", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", + "file": "src/app/shared/application/submit.ts", "deprecated": false, "deprecationMessage": "", - "type": "string", - "defaultValue": "'registratie-v1'" + "type": "unknown", + "defaultValue": "$localize`:@@submit.failed:Het indienen is niet gelukt. Probeer het later opnieuw.`" }, { - "name": "STORAGE_KEY", + "name": "TYPE_LABELS", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts", + "file": "src/app/registratie/ui/aanvraag-block/aanvraag-block.component.ts", "deprecated": false, "deprecationMessage": "", - "type": "string", - "defaultValue": "'intake-v3'" + "type": "Record", + "defaultValue": "{\n registratie: $localize`:@@aanvraagBlock.type.registratie:Inschrijving`,\n herregistratie: $localize`:@@aanvraagBlock.type.herregistratie:Herregistratie`,\n intake: $localize`:@@aanvraagBlock.type.intake:Herregistratie-intake`,\n}" + }, + { + "name": "UPLOAD_ABORTED", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "Symbol('upload-aborted')", + "rawdescription": "Sentinel rejection so the caller can tell a user-cancel from a real failure.", + "description": "

Sentinel rejection so the caller can tell a user-cancel from a real failure.

\n" + }, + { + "name": "UPLOAD_FAILED", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "$localize`:@@upload.failed:Uploaden is niet gelukt. Probeer het opnieuw.`" }, { "name": "VALID", @@ -6893,7 +15698,7 @@ "deprecated": false, "deprecationMessage": "", "type": "Scenario[]", - "defaultValue": "['default', 'slow', 'loading', 'empty', 'error']" + "defaultValue": "['default', 'slow', 'loading', 'empty', 'error', 'upload-slow', 'upload-fail']" } ], "functions": [ @@ -6968,35 +15773,6 @@ } ] }, - { - "name": "back", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "back", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -7055,6 +15831,136 @@ } ] }, + { + "name": "back", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "blockActions", + "file": "src/app/registratie/domain/block-actions.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "status", + "type": "AanvraagStatus", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "BlockAction[]", + "jsdoctags": [ + { + "name": "status", + "type": "AanvraagStatus", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "categorySatisfied", + "file": "src/app/shared/upload/upload.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

A required category is satisfied by an initiated upload OR a post-delivery choice.

\n", + "args": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "categoryId", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "categoryId", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "createDraftSync", + "file": "src/app/registratie/application/draft-sync.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

The effectful glue that replaces per-wizard sessionStorage with a backend-owned\nConcept (PRD 0001, phase D). Instantiated in a field initializer (like\ncreateStore/createUploadController). Responsibilities:

\n
    \n
  • resume: if the URL carries ?aanvraag=<id>, load that draft and seed the machine;
  • \n
  • create-on-first-progress: the Concept is created lazily the first time the wizard\nreports a non-null snapshot, and the id is stamped into the URL (so a reload resumes);
  • \n
  • debounced draft sync on every subsequent change.
  • \n
\n

Inert without a Router (stories) or when enabled() is false — no network, no resume.

\n", + "args": [ + { + "name": "deps", + "type": "DraftSyncDeps", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "deps", + "type": "DraftSyncDeps", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "createStore", "file": "src/app/shared/application/store.ts", @@ -7097,6 +16003,34 @@ } ] }, + { + "name": "createUploadController", + "file": "src/app/shared/upload/upload-controller.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

The effectful glue between the <app-document-upload> organism's events and the\npure upload reducer + transport. Both wizards instantiate one (in a field\ninitializer, like createStore). Holds the only state a reducer can't: the live\nFile blobs keyed by localId (needed to retry an upload). Loads categories,\nreports background-sync availability, and polls on tab refocus.

\n", + "args": [ + { + "name": "deps", + "type": "UploadControllerDeps", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "deps", + "type": "UploadControllerDeps", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "currentScenario", "file": "src/app/shared/infrastructure/scenario.ts", @@ -7110,7 +16044,7 @@ }, { "name": "currentStep", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "file": "src/app/herregistratie/domain/intake.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, @@ -7139,7 +16073,7 @@ }, { "name": "currentStep", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, @@ -7210,6 +16144,35 @@ } ] }, + { + "name": "deliveryRefs", + "file": "src/app/shared/upload/upload.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

The submit payload fragment: digital docs carry their documentId, post categories the channel.

\n", + "args": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Array", + "jsdoctags": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "fakeResource", "file": "src/app/showcase/concepts.page.ts", @@ -7315,6 +16278,35 @@ } ] }, + { + "name": "formatNL", + "file": "src/app/registratie/domain/tasks.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "d", + "type": "Date", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "string", + "jsdoctags": [ + { + "name": "d", + "type": "Date", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "fromResource", "file": "src/app/shared/application/remote-data.ts", @@ -7403,6 +16395,93 @@ } ] }, + { + "name": "hasProgress", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Has the user meaningfully started, so it's worth persisting as a Concept?

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "hasProgress", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Has the user meaningfully started, so it's worth persisting as a Concept?\n(No auto-prefill here — pristine means truly untouched.)

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "hasProgress", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Has the user meaningfully started, so it's worth persisting as a Concept? Excludes\nthe automatic BRP address prefill on step 0 — a bare page visit creates nothing.\nponytail: an address typed at step 0 without any of these signals is not yet\npersisted (created once they advance/choose); accepted regression vs. sessionStorage.

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "herregistratieDeadline", "file": "src/app/registratie/domain/registration.policy.ts", @@ -7432,6 +16511,34 @@ } ] }, + { + "name": "httpClientFetch", + "file": "src/app/shared/infrastructure/api-client.provider.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Adapts Angular's HttpClient to the fetch-shaped interface the NSwag-generated\nclient expects, so every API call flows through HttpClient interceptors (the\n?scenario= toggle) and the cross-cutting concerns below. The generated client\nis the only place HTTP shapes are known; this is the only place it meets\nAngular's HTTP stack — i.e. the one seam to add:

\n
    \n
  • timeout (done — REQUEST_TIMEOUT_MS),
  • \n
  • correlation id (done — X-Correlation-Id, echoed in backend logs),
  • \n
  • idempotency key for writes (done — Idempotency-Key; a real retry would thread\na STABLE key per logical submit so re-sends dedupe; here it's per-attempt),
  • \n
  • auth: attach Authorization: Bearer … here (one line) when real DigiD lands,
  • \n
  • retry/backoff: wrap the pipe with rxjs retry({ count, delay }) here.
  • \n
\n", + "args": [ + { + "name": "http", + "type": "HttpClient", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "http", + "type": "HttpClient", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "isAuthenticated", "file": "src/app/auth/domain/session.ts", @@ -7881,8 +16988,94 @@ ] }, { - "name": "next", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "name": "mapUpload", + "file": "src/app/shared/upload/upload.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Map one upload's status, leaving the rest of the list untouched.

\n", + "args": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "localId", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "f", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "UploadState", + "jsdoctags": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "localId", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "f", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "maskBsn", + "file": "src/app/shared/ui/debug-state/mask.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Redact a BSN for the dev state view: keep the last 3 digits, mask the rest.

\n", + "args": [ + { + "name": "bsn", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "string", + "jsdoctags": [ + { + "name": "bsn", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "maskSession", + "file": "src/app/shared/ui/debug-state/debug-state.component.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, @@ -7891,16 +17084,58 @@ "args": [ { "name": "s", - "type": "RegistratieState", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "RegistratieState", + "returnType": "Session | null", "jsdoctags": [ { "name": "s", - "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "maskTail", + "file": "src/app/shared/ui/debug-state/mask.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Keep the last keep characters, mask the rest.

\n", + "args": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "keep", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "string", + "jsdoctags": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "keep", + "type": "number", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -7916,7 +17151,7 @@ "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Step 1 → 2: advance only when BOTH step-1 fields parse. Illegal elsewhere = no-op.

\n", + "description": "

Advance one step, gating on that step's fields. Illegal elsewhere = no-op.

\n", "args": [ { "name": "s", @@ -7967,6 +17202,143 @@ } ] }, + { + "name": "next", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "parseAanvraagStatus", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Trust-boundary parse of the status union — the tag drives which fields must exist.

\n", + "args": [ + { + "name": "s", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "s", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "parseApplicationDetail", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "parseApplications", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "parseApplicationSummary", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "parseBigNummer", "file": "src/app/registratie/domain/value-objects/big-nummer.ts", @@ -8023,6 +17395,35 @@ } ] }, + { + "name": "parseCommon", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "dto", + "type": "ApplicationSummaryDto", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "dto", + "type": "ApplicationSummaryDto", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "parseDashboardView", "file": "src/app/registratie/infrastructure/dashboard-view.adapter.ts", @@ -8266,32 +17667,30 @@ ] }, { - "name": "reduce", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "name": "problemDetail", + "file": "src/app/shared/infrastructure/api-error.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "", + "description": "

Extract a human-readable message from a rejected API call. A 4xx/5xx with a\nProblemDetails body (RFC 7807) is thrown by the generated client as the parsed\nobject; anything else falls back to the given message.

\n", "args": [ { - "name": "s", - "type": "RegistratieState", + "name": "e", "deprecated": false, "deprecationMessage": "" }, { - "name": "m", - "type": "RegistratieMsg", + "name": "fallback", + "type": "string", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "RegistratieState", + "returnType": "string", "jsdoctags": [ { - "name": "s", - "type": "RegistratieState", + "name": "e", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -8299,8 +17698,75 @@ } }, { - "name": "m", - "type": "RegistratieMsg", + "name": "fallback", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "problemFieldErrors", + "file": "src/app/shared/infrastructure/api-error.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

SEAM (G4): map a server validation envelope to field-level errors.

\n

ASP.NET's ValidationProblemDetails carries errors: { field: string[] }. The\nbackend today returns only detail (one banner message), so this returns {}.\nWhen the backend starts sending errors, a machine's SubmitFailed handler can\nmerge this into its own errors map — the field-keyed shape the wizards already\nrender — so a rejection shows inline per field, not just as a banner. The\nconsumer hook is the only thing left to wire; the contract boundary lives here.

\n", + "args": [ + { + "name": "e", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Record", + "jsdoctags": [ + { + "name": "e", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "provideApiClient", + "file": "src/app/shared/infrastructure/api-client.provider.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Provide a root ApiClient that talks through HttpClient. Base URL comes from the\nenvironment (relative '' in dev → proxy; configurable per deployment).

\n", + "args": [], + "returnType": "Provider" + }, + { + "name": "redactProfile", + "file": "src/app/shared/ui/debug-state/mask.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Data minimisation for the dev "show the Model" panel: keep the structural /\ndecision-relevant fields (status, beroep, dates of registration) but redact\ndirect personal identifiers (name, address, date of birth) and mask the BIG\nnumber. The panel is for inspecting state SHAPE, never for reading PII.

\n", + "args": [ + { + "name": "p", + "type": "BigProfile", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "unknown", + "jsdoctags": [ + { + "name": "p", + "type": "BigProfile", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -8398,7 +17864,51 @@ ] }, { - "name": "resolve", + "name": "reduce", + "file": "src/app/registratie/domain/change-request.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "State", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "Msg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "State", + "jsdoctags": [ + { + "name": "s", + "type": "State", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "Msg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reduce", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "ctype": "miscellaneous", "subtype": "function", @@ -8413,8 +17923,8 @@ "deprecationMessage": "" }, { - "name": "r", - "type": "Result", + "name": "m", + "type": "RegistratieMsg", "deprecated": false, "deprecationMessage": "" } @@ -8431,8 +17941,123 @@ } }, { - "name": "r", - "type": "Result", + "name": "m", + "type": "RegistratieMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reduceUpload", + "file": "src/app/shared/upload/upload.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "UploadState", + "jsdoctags": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "rejectReason", + "file": "src/app/shared/upload/upload.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

FE format-validation (never authority — the server re-validates). Returns the\nrejection reason for one file, or null if it passes the category's type/size.

\n", + "args": [ + { + "name": "cat", + "type": "DocumentCategory", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "file", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "\"type\" | \"size\" | null", + "jsdoctags": [ + { + "name": "cat", + "type": "DocumentCategory", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "file", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "requiredCategoriesSatisfied", + "file": "src/app/shared/upload/upload.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "UploadState", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -8529,6 +18154,50 @@ } ] }, + { + "name": "resolve", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "restore", "file": "src/app/auth/application/session.store.ts", @@ -8536,10 +18205,52 @@ "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Restore a persisted session (best-effort; corrupt entry → logged out).

\n", + "description": "

Restore a persisted session (best-effort; corrupt entry → logged out).\nG2: validate the shape before trusting it. G1: the BSN is never persisted\n(see the effect below), so a restored session carries an empty one — it is\nunused after login; only naam is shown in the chrome.

\n", "args": [], "returnType": "Session | null" }, + { + "name": "runSubmit", + "file": "src/app/shared/application/submit.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Run a mutating API call and fold it into a Result — the one place the\ntry/catch + ProblemDetails-mapping lives, so every submit-* command is just\nits own payload mapping. The backend re-validates and returns a 422\nProblemDetails on rejection, surfaced here as the error string.

\n", + "args": [ + { + "name": "fn", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "fallback", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Promise>", + "jsdoctags": [ + { + "name": "fn", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "fallback", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "setAnswer", "file": "src/app/herregistratie/domain/intake.machine.ts", @@ -8700,6 +18411,63 @@ } ] }, + { + "name": "setField", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Update one draft field while editing; ignored in any other state.

\n", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "key", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "key", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "setField", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", @@ -8759,63 +18527,6 @@ } ] }, - { - "name": "setField", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Update one draft field while editing; ignored in any other state.

\n", - "args": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "key", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "WizardState", - "jsdoctags": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "key", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "setPolicy", "file": "src/app/herregistratie/domain/intake.machine.ts", @@ -8860,6 +18571,46 @@ } ] }, + { + "name": "simulateUpload", + "file": "src/app/shared/upload/upload.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Demo-only (dev): the real XHR POST finishes instantly for metadata, so progress\nand failure can't otherwise be shown. Drives the progress bar over ~2.5s, then\nsucceeds (upload-slow) or fails (upload-fail). ponytail: timer-based, cancel\nvia the returned handle; no network.

\n", + "args": [ + { + "name": "scenario", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "onProgress", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "XhrUploadHandle", + "jsdoctags": [ + { + "name": "scenario", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "onProgress", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "statusColor", "file": "src/app/registratie/domain/registration.policy.ts", @@ -8918,35 +18669,6 @@ } ] }, - { - "name": "submit", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "RegistratieState", - "jsdoctags": [ - { - "name": "s", - "type": "RegistratieState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, { "name": "submit", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", @@ -8954,7 +18676,7 @@ "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Step 2 submit: parse everything; move to Submitting only with Valid data.

\n", + "description": "

Step 3 submit: parse everything + require documents; Submitting only with Valid.

\n", "args": [ { "name": "s", @@ -9006,26 +18728,26 @@ ] }, { - "name": "submitHerregistratie", - "file": "src/app/herregistratie/application/submit-herregistratie.ts", + "name": "submit", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

The mutation/command: send a herregistratie application to the backend.\nReturns a Result so the caller can branch on success/failure without\ntry/catch. ponytail: faked with a timer; swap for a real POST when there's\nan API. The "uren must be > 0" rule lets the demo show a failure path.

\n", + "description": "", "args": [ { - "name": "data", - "type": "Valid", + "name": "s", + "type": "RegistratieState", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "Promise>", + "returnType": "RegistratieState", "jsdoctags": [ { - "name": "data", - "type": "Valid", + "name": "s", + "type": "RegistratieState", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -9035,55 +18757,378 @@ ] }, { - "name": "submitIntake", - "file": "src/app/herregistratie/application/submit-intake.ts", + "name": "submitChangeRequest", + "file": "src/app/registratie/application/submit-change-request.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Command: send the intake questionnaire to the backend. Returns a Result so the\ncaller branches on success/failure without try/catch. ponytail: faked with a\ntimer; swap for a real POST when there's an API. The "uren must be > 0" rule\nlets the demo show the failure path.

\n", + "description": "

Command: POST an address change to the backend (/api/v1/change-requests),\nwhich re-validates and returns a reference. Same shape as the other submit\ncommands — a Result, never a thrown error — so the form's reduce can branch.

\n", "args": [ { - "name": "data", - "type": "ValidIntake", + "name": "client", + "type": "ApiClient", "deprecated": false, "deprecationMessage": "" - } - ], - "returnType": "Promise>", - "jsdoctags": [ + }, { "name": "data", - "type": "ValidIntake", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "submitRegistratie", - "file": "src/app/registratie/application/submit-registratie.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Command: send the completed registration to the backend, which invokes the\ndomain command to create/finalize the registration aggregate. Returns a Result\nso the caller branches on success/failure without try/catch; on success it\nyields the confirmation reference (PRD §9). ponytail: faked with a timer; swap\nfor a real POST when there's an API. The "manually entered diploma" rule lets\nthe demo show the failure path.

\n", - "args": [ - { - "name": "data", - "type": "ValidRegistratie", + "type": "Valid", "deprecated": false, "deprecationMessage": "" } ], "returnType": "Promise>", "jsdoctags": [ + { + "name": "client", + "type": "ApiClient", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, { "name": "data", - "type": "ValidRegistratie", + "type": "Valid", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "tasksFromProfile", + "file": "src/app/registratie/domain/tasks.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Derive the open tasks for a professional (pure). Eligibility is the server's\ndecision (decisions.eligibleForHerregistratie), passed in — the FE renders it,\nit does not recompute the rule (ADR-0001). The deadline is still formatted\nclient-side for the task copy (presentation, not a rule).

\n", + "args": [ + { + "name": "reg", + "type": "Registration", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "eligibleForHerregistratie", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "PortalTask[]", + "jsdoctags": [ + { + "name": "reg", + "type": "Registration", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "eligibleForHerregistratie", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "throwException", + "file": "src/app/shared/infrastructure/api-client.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "message", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "status", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "response", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "headers", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "result", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "returnType": "any", + "jsdoctags": [ + { + "name": "message", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "status", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "response", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "headers", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "result", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "toAantekening", + "file": "src/app/registratie/infrastructure/big-register.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Map the wire DTO (all fields optional) onto our domain type.

\n", + "args": [ + { + "name": "n", + "type": "AantekeningDto", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Aantekening", + "jsdoctags": [ + { + "name": "n", + "type": "AantekeningDto", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "toCategory", + "file": "src/app/shared/upload/upload.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Wire DTO (all fields optional) → domain.

\n", + "args": [ + { + "name": "c", + "type": "DocumentCategoryDto", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "DocumentCategory", + "jsdoctags": [ + { + "name": "c", + "type": "DocumentCategoryDto", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "toStatusItem", + "file": "src/app/shared/upload/upload.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "UploadStatusItemDto", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "StatusItem", + "jsdoctags": [ + { + "name": "s", + "type": "UploadStatusItemDto", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "trailFor", + "file": "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Build the breadcrumb trail for a router url (query/fragment stripped).\nReturns [] for unknown routes (e.g. /login) so the bar can hide itself.

\n", + "args": [ + { + "name": "url", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "BreadcrumbItem[]", + "jsdoctags": [ + { + "name": "url", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "upload", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Route an upload sub-message through the pure upload reducer (Editing only).

\n", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "upload", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Route an upload sub-message through the pure upload reducer (Invullen only).

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "msg", + "type": "UploadMsg", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -9106,9 +19151,15 @@ "type": "Draft", "deprecated": false, "deprecationMessage": "" + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" } ], - "returnType": "Result>, Valid>", + "returnType": "Result", "jsdoctags": [ { "name": "draft", @@ -9118,29 +19169,38 @@ "tagName": { "text": "param" } + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } } ] }, { - "name": "validateAll", - "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "name": "validate", + "file": "src/app/registratie/domain/change-request.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Parse the whole wizard into a ValidRegistratie (called on submit).

\n", + "description": "

Parse via the value objects; on success hand back a Valid, else per-field errors.

\n", "args": [ { - "name": "d", + "name": "draft", "type": "Draft", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "Result", + "returnType": "Result", "jsdoctags": [ { - "name": "d", + "name": "draft", "type": "Draft", "deprecated": false, "deprecationMessage": "", @@ -9195,32 +19255,32 @@ ] }, { - "name": "validateStep", + "name": "validateAll", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Validate every question currently visible in ONE step. Errors keyed per field.

\n", + "description": "

Parse the whole wizard into a ValidRegistratie (called on submit).

\n", "args": [ - { - "name": "step", - "type": "StepId", - "deprecated": false, - "deprecationMessage": "" - }, { "name": "d", "type": "Draft", "deprecated": false, "deprecationMessage": "" + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" } ], - "returnType": "Result", + "returnType": "Result", "jsdoctags": [ { - "name": "step", - "type": "StepId", + "name": "d", + "type": "Draft", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -9228,8 +19288,8 @@ } }, { - "name": "d", - "type": "Draft", + "name": "upload", + "type": "UploadState", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -9296,6 +19356,109 @@ } } ] + }, + { + "name": "validateStep", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Validate every question currently visible in ONE step. Errors keyed per field.

\n", + "args": [ + { + "name": "step", + "type": "StepId", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "d", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "step", + "type": "StepId", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "d", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "whenTag", + "file": "src/app/shared/kernel/fp.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Narrow a tagged union to one variant by its tag, or null. The single place\nthe cast lives — TS can't narrow through a runtime tag argument, so callers get\nwhenTag(state, 'Editing')?.foo instead of repeating as Extract<…>.

\n", + "args": [ + { + "name": "u", + "type": "U", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "tag", + "type": "K", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Extract | null", + "jsdoctags": [ + { + "name": "u", + "type": "U", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "tag", + "type": "K", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] } ], "typealiases": [ @@ -9310,6 +19473,28 @@ "description": "

A note is either a recognised specialism or a plain annotation — a closed set,\nnot an open string, so a typo can't slip through.

\n", "kind": 193 }, + { + "name": "AanvraagStatus", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type", + "file": "src/app/registratie/domain/aanvraag.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, + { + "name": "AanvraagType", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"registratie\" | \"herregistratie\" | \"intake\"", + "file": "src/app/registratie/domain/aanvraag.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

An application (aanvraag) as the frontend sees it — the parsed, domain-side view\nof the backend-owned aggregate (see backend ApplicationStore + PRD 0001). Pure\ntypes, no Angular. Lives in registratie because the dashboard (here) is the\nconsumer and the downstream wizards (herregistratie → registratie) produce them.

\n

The status is a discriminated union so illegal states are unrepresentable — same\nreflex as RemoteData. The server computes which tag applies (auto-approval on\nread); the FE renders it, it does not recompute the lifecycle.

\n", + "kind": 193 + }, { "name": "AdresErrors", "ctype": "miscellaneous", @@ -9343,6 +19528,28 @@ "description": "", "kind": 193 }, + { + "name": "AlertType", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"info\" | \"ok\" | \"warning\" | \"error\"", + "file": "src/app/shared/ui/upload/upload-status-banner/upload-status-banner.component.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, + { + "name": "BannerType", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"info\" | \"warning\" | \"error\"", + "file": "src/app/shared/ui/upload/upload-status-banner/upload-status-banner.component.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, { "name": "BigNummer", "ctype": "miscellaneous", @@ -9354,6 +19561,17 @@ "description": "

Value object: a BIG registration number — 11 digits.

\n", "kind": 184 }, + { + "name": "BlockAction", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"resume\" | \"cancel\" | \"viewDocuments\"", + "file": "src/app/registratie/domain/block-actions.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

What a dashboard "Mijn aanvragen" block offers per status. The badge itself\nfollows directly from status.tag (the UI maps tag → colour + label), so this\npure function owns only the actions decision.

\n", + "kind": 193 + }, { "name": "Brand", "ctype": "miscellaneous", @@ -9376,6 +19594,17 @@ "description": "", "kind": 193 }, + { + "name": "DeliveryChannel", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"digital\" | \"post\"", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, { "name": "DiplomaHerkomst", "ctype": "miscellaneous", @@ -9387,6 +19616,17 @@ "description": "", "kind": 193 }, + { + "name": "Dispatch", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "function", + "file": "src/app/shared/upload/upload-shell.service.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 185 + }, { "name": "DraftField", "ctype": "miscellaneous", @@ -9409,6 +19649,17 @@ "description": "

Value object: an e-mail address. "Parse, don't validate" — an Email is a\ndistinct type from a raw string, mintable only via parseEmail, so holding one\nis proof it is well-formed. Format-only check (the FE keeps format validation\nfor instant feedback; the backend stays the authority — see ADR-0001).

\n", "kind": 184 }, + { + "name": "Err", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "Error | undefined", + "file": "src/app/registratie/application/applications.store.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, { "name": "Err", "ctype": "miscellaneous", @@ -9431,6 +19682,17 @@ "description": "

Per-field error map: one message per question, since a step holds several.

\n", "kind": 184 }, + { + "name": "Errors", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "Partial>", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 184 + }, { "name": "IntakeMsg", "ctype": "miscellaneous", @@ -9464,6 +19726,17 @@ "description": "

A FIXED 3-step wizard with progressive disclosure. The steps never change in\nnumber (always STEPS); instead, follow-up questions appear inline within a\nstep depending on earlier answers — answer "buiten Nederland gewerkt? → ja"\nand the country/hours questions reveal in the same step; report few hours and\nthe scholing-question reveals inside the 'werk' step. "Is this field required\nright now" is a pure function (validateStep/lageUren), so it's trivial to\ntest and impossible to get out of sync with the data.

\n", "kind": 193 }, + { + "name": "Msg", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, { "name": "Postcode", "ctype": "miscellaneous", @@ -9479,7 +19752,7 @@ "name": "RegistratieMsg", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "deprecated": false, "deprecationMessage": "", @@ -9534,13 +19807,24 @@ "name": "Scenario", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "\"default\" | \"slow\" | \"loading\" | \"empty\" | \"error\"", + "rawtype": "\"default\" | \"slow\" | \"loading\" | \"empty\" | \"error\" | \"upload-slow\" | \"upload-fail\"", "file": "src/app/shared/infrastructure/scenario.ts", "deprecated": false, "deprecationMessage": "", "description": "", "kind": 193 }, + { + "name": "State", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

The change-request (adreswijziging) form as one tagged union — the SAME idiom\nas the wizards, just single-step. draft/errors exist only while Editing;\nSubmitting/Submitted/Failed carry the parsed Valid. Illegal states (submitting\nan invalid draft, a success screen with errors) are unrepresentable.

\n", + "kind": 193 + }, { "name": "StatusTag", "ctype": "miscellaneous", @@ -9552,6 +19836,28 @@ "description": "

Just the discriminant — for atoms that only need the label/color.

\n", "kind": 200 }, + { + "name": "StepErrors", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "Partial>", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 184 + }, + { + "name": "StepId", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"buitenland\" | \"werk\" | \"review\"", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

The three fixed steps. Each step groups one or more questions.

\n", + "kind": 193 + }, { "name": "StepId", "ctype": "miscellaneous", @@ -9564,14 +19870,25 @@ "kind": 193 }, { - "name": "StepId", + "name": "UploadMsg", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "\"buitenland\" | \"werk\" | \"review\"", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "file": "src/app/shared/upload/upload.machine.ts", "deprecated": false, "deprecationMessage": "", - "description": "

The three fixed steps. Each step groups one or more questions.

\n", + "description": "", + "kind": 193 + }, + { + "name": "UploadStatus", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

Pure upload domain (no Angular). Reusable across wizards: the host wizard folds\nUploadState into its Model and delegates upload Msgs to reduceUpload.\nIllegal states are unrepresentable by construction; the few transitions a union\ncan't express (channel↔upload exclusivity, single-file categories) are enforced\nhere in the reducer. Effects live in the shell (upload-shell.service.ts).

\n", "kind": 193 }, { @@ -9600,7 +19917,7 @@ "name": "WizardMsg", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", "file": "src/app/herregistratie/domain/herregistratie.machine.ts", "deprecated": false, "deprecationMessage": "", @@ -9617,10 +19934,97 @@ "deprecationMessage": "", "description": "

The whole wizard as one tagged union. step and errors exist ONLY while\nEditing; Submitting/Submitted/Failed carry a Valid payload and nothing else.\nSo "submitting while a field is invalid" or "showing the success screen with\nerrors set" are unrepresentable — the bug class is gone by construction.

\n", "kind": 193 + }, + { + "name": "WizardStatus", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"editing\" | \"submitting\" | \"submitted\" | \"failed\"", + "file": "src/app/shared/layout/wizard-shell/wizard-shell.component.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 } ], "enumerations": [], "groupedVariables": { + "src/app/registratie/infrastructure/applications.adapter.ts": [ + { + "name": "AANVRAAG_TYPES", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "string[]", + "defaultValue": "['registratie', 'herregistratie', 'intake']" + } + ], + "src/app/shared/upload/upload.machine.ts": [ + { + "name": "ACTIVE", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "ReadonlyArray", + "defaultValue": "['queued', 'uploading', 'complete']" + }, + { + "name": "categoryOf", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "(s: UploadState, categoryId: string) => s.categories.find((c) => c.categoryId === categoryId)" + }, + { + "name": "find", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "(s: UploadState, localId: string) => s.uploads.find((u) => u.localId === localId)" + }, + { + "name": "inFlight", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "(s: UploadState): Upload[] =>\n s.uploads.filter((u) => u.status.type === 'queued' || u.status.type === 'uploading')", + "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": "initialUpload", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "UploadState", + "defaultValue": "{\n categories: [],\n uploads: [],\n deliveryChannel: {},\n rejections: {},\n backgroundSyncAvailable: false,\n}" + }, + { + "name": "REJECTION_MESSAGES", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Record<\"type\" | \"size\" | \"multiple\", string>", + "defaultValue": "{\n type: $localize`:@@upload.reject.type:Dit bestandstype is niet toegestaan voor deze categorie.`,\n size: $localize`:@@upload.reject.size:Dit bestand is te groot.`,\n multiple: $localize`:@@upload.reject.multiple:U kunt voor deze categorie maar één bestand uploaden.`,\n}" + } + ], "src/app/app.config.ts": [ { "name": "appConfig", @@ -9630,7 +20034,7 @@ "deprecated": false, "deprecationMessage": "", "type": "ApplicationConfig", - "defaultValue": "{\n providers: [\n provideBrowserGlobalErrorListeners(),\n provideRouter(routes, withViewTransitions()),\n provideHttpClient(withInterceptors([scenarioInterceptor])),\n { provide: LOCALE_ID, useValue: 'nl' },\n ]\n}" + "defaultValue": "{\n providers: [\n provideBrowserGlobalErrorListeners(),\n provideRouter(routes, withViewTransitions()),\n // Dev-only: the ?scenario= toggle must never reach a production build, where\n // a query param could otherwise force errors on the live app.\n provideHttpClient(withInterceptors(isDevMode() ? [scenarioInterceptor] : [])),\n provideApiClient(),\n { provide: SESSION_PORT, useExisting: SessionStore },\n { provide: LOCALE_ID, useValue: 'nl' },\n ]\n}" } ], "src/app/shared/ui/async/async.component.ts": [ @@ -9661,16 +20065,16 @@ "description": "

Route guard: only let authenticated users in; otherwise redirect to /login.

\n" } ], - "src/app/registratie/infrastructure/duo.adapter.ts": [ + "src/app/registratie/application/draft-sync.ts": [ { - "name": "EMPTY", + "name": "DEBOUNCE_MS", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/registratie/infrastructure/duo.adapter.ts", + "file": "src/app/registratie/application/draft-sync.ts", "deprecated": false, "deprecationMessage": "", - "type": "DuoLookupDto", - "defaultValue": "{ diplomas: [], handmatig: { beroepen: [], policyQuestions: [] } }" + "type": "number", + "defaultValue": "600" } ], "src/app/registratie/domain/registratie-wizard.machine.ts": [ @@ -9692,7 +20096,7 @@ "deprecated": false, "deprecationMessage": "", "type": "RegistratieState", - "defaultValue": "{ tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {} }" + "defaultValue": "{ tag: 'Invullen', draft: emptyDraft, cursor: 0, errors: {}, upload: initialUpload }" }, { "name": "STEPS", @@ -9707,6 +20111,34 @@ "description": "

The fixed step list. Number of steps never changes; questions reveal inline.

\n" } ], + "src/environments/environment.prod.ts": [ + { + "name": "environment", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/environments/environment.prod.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "object", + "defaultValue": "{\n production: true,\n apiBaseUrl: '',\n}", + "rawdescription": "Production environment. `apiBaseUrl` stays relative ('') for a same-origin /\nreverse-proxy deployment; set it to the API origin (e.g. 'https://api.example.nl')\nwhen the SPA and backend are served from different hosts. This is the single\nplace the deployed API location is configured.", + "description": "

Production environment. apiBaseUrl stays relative ('') for a same-origin /\nreverse-proxy deployment; set it to the API origin (e.g. 'https://api.example.nl')\nwhen the SPA and backend are served from different hosts. This is the single\nplace the deployed API location is configured.

\n" + } + ], + "src/environments/environment.ts": [ + { + "name": "environment", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/environments/environment.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "object", + "defaultValue": "{\n production: false,\n apiBaseUrl: '',\n}", + "rawdescription": "Default (development) environment. `apiBaseUrl` is empty so requests are\nrelative to the current origin — in dev the ng-serve proxy forwards /api to the\nbackend (proxy.conf.json). Swapped for environment.prod.ts in production builds\n(angular.json fileReplacements).", + "description": "

Default (development) environment. apiBaseUrl is empty so requests are\nrelative to the current origin — in dev the ng-serve proxy forwards /api to the\nbackend (proxy.conf.json). Swapped for environment.prod.ts in production builds\n(angular.json fileReplacements).

\n" + } + ], "src/app/shared/kernel/fp.ts": [ { "name": "err", @@ -9729,6 +20161,50 @@ "defaultValue": "(value: T): Result => ({ ok: true, value })" } ], + "src/app/shared/upload/upload.adapter.ts": [ + { + "name": "genericError", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "(): string => UPLOAD_FAILED" + }, + { + "name": "parseError", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "(body: string): string => {\n try {\n return problemDetail(JSON.parse(body), UPLOAD_FAILED);\n } catch {\n return genericError();\n }\n}" + }, + { + "name": "UPLOAD_ABORTED", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "Symbol('upload-aborted')", + "rawdescription": "Sentinel rejection so the caller can tell a user-cancel from a real failure.", + "description": "

Sentinel rejection so the caller can tell a user-cancel from a real failure.

\n" + }, + { + "name": "UPLOAD_FAILED", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/upload/upload.adapter.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "$localize`:@@upload.failed:Uploaden is niet gelukt. Probeer het opnieuw.`" + } + ], "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts": [ { "name": "HANDMATIG", @@ -9740,16 +20216,6 @@ "type": "string", "defaultValue": "'__handmatig__'" }, - { - "name": "JA_NEE", - "ctype": "miscellaneous", - "subtype": "variable", - "file": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "[]", - "defaultValue": "[{ value: 'ja', label: 'Ja' }, { value: 'nee', label: 'Nee' }]" - }, { "name": "KANALEN", "ctype": "miscellaneous", @@ -9758,17 +20224,7 @@ "deprecated": false, "deprecationMessage": "", "type": "[]", - "defaultValue": "[{ value: 'email', label: 'E-mail' }, { value: 'post', label: 'Post' }]" - }, - { - "name": "STORAGE_KEY", - "ctype": "miscellaneous", - "subtype": "variable", - "file": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", - "deprecated": false, - "deprecationMessage": "", - "type": "string", - "defaultValue": "'registratie-v1'" + "defaultValue": "[\n { value: 'email', label: $localize`:@@registratie.kanaalEmail:E-mail` },\n { value: 'post', label: $localize`:@@registratie.kanaalPost:Post` },\n]" } ], "src/app/herregistratie/domain/herregistratie.machine.ts": [ @@ -9780,7 +20236,7 @@ "deprecated": false, "deprecationMessage": "", "type": "WizardState", - "defaultValue": "{ tag: 'Editing', step: 1, draft: { uren: '', jaren: '', punten: '' }, errors: {} }" + "defaultValue": "{ tag: 'Editing', step: 1, draft: { uren: '', jaren: '', punten: '' }, errors: {}, upload: initialUpload }" } ], "src/app/herregistratie/domain/intake.machine.ts": [ @@ -9819,26 +20275,56 @@ "description": "

The fixed step list. Number of steps never changes; questions reveal inline.

\n" } ], - "src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts": [ + "src/app/registratie/domain/change-request.machine.ts": [ + { + "name": "initial", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "State", + "defaultValue": "{\n tag: 'Editing',\n draft: { straat: '', postcode: '', woonplaats: '' },\n errors: {},\n}" + } + ], + "src/app/shared/ui/radio-group/radio-group.component.ts": [ { "name": "JA_NEE", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts", + "file": "src/app/shared/ui/radio-group/radio-group.component.ts", "deprecated": false, "deprecationMessage": "", - "type": "[]", - "defaultValue": "[{ value: 'ja', label: 'Ja' }, { value: 'nee', label: 'Nee' }]" - }, + "type": "RadioOption[]", + "defaultValue": "[\n { value: 'ja', label: $localize`:@@common.ja:Ja` },\n { value: 'nee', label: $localize`:@@common.nee:Nee` },\n]", + "rawdescription": "The ubiquitous yes/no option pair. Language-agnostic now the labels are\nlocalized, so it lives next to RadioOption and both wizards import it.", + "description": "

The ubiquitous yes/no option pair. Language-agnostic now the labels are\nlocalized, so it lives next to RadioOption and both wizards import it.

\n" + } + ], + "src/app/shared/ui/debug-state/mask.ts": [ { - "name": "STORAGE_KEY", + "name": "REDACTED", "ctype": "miscellaneous", "subtype": "variable", - "file": "src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts", + "file": "src/app/shared/ui/debug-state/mask.ts", "deprecated": false, "deprecationMessage": "", "type": "string", - "defaultValue": "'intake-v3'" + "defaultValue": "'‹redacted›'" + } + ], + "src/app/shared/infrastructure/api-client.provider.ts": [ + { + "name": "REQUEST_TIMEOUT_MS", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/infrastructure/api-client.provider.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "number", + "defaultValue": "10_000", + "rawdescription": "Single place every API call passes through: the seam for cross-cutting concerns.", + "description": "

Single place every API call passes through: the seam for cross-cutting concerns.

\n" } ], "src/app/app.routes.ts": [ @@ -9853,6 +20339,18 @@ "defaultValue": "[\n {\n path: '',\n component: ShellComponent, // persistent header/footer; only children swap\n children: [\n { path: '', pathMatch: 'full', redirectTo: 'login' },\n { path: 'login', loadComponent: () => \"import('@auth/ui/login.page').then(m => m.LoginPage)\" },\n { path: 'dashboard', canActivate: [authGuard], loadComponent: () => \"import('@registratie/ui/dashboard.page').then(m => m.DashboardPage)\" },\n { path: 'registratie', canActivate: [authGuard], loadComponent: () => \"import('@registratie/ui/registration-detail.page').then(m => m.RegistrationDetailPage)\" },\n { path: 'registreren', canActivate: [authGuard], loadComponent: () => \"import('@registratie/ui/registratie.page').then(m => m.RegistratiePage)\" },\n { path: 'herregistratie', canActivate: [authGuard], loadComponent: () => \"import('@herregistratie/ui/herregistratie.page').then(m => m.HerregistratiePage)\" },\n { path: 'intake', canActivate: [authGuard], loadComponent: () => \"import('@herregistratie/ui/intake.page').then(m => m.IntakePage)\" },\n { path: 'concepts', loadComponent: () => \"import('./showcase/concepts.page').then(m => m.ConceptsPage)\" },\n { path: '**', redirectTo: 'login' },\n ],\n },\n]" } ], + "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts": [ + { + "name": "ROUTES", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Record", + "defaultValue": "{\n '/dashboard': { label: $localize`:@@crumb.dashboard:Mijn overzicht` },\n '/registratie': { label: $localize`:@@crumb.registratie:Mijn gegevens`, parent: '/dashboard' },\n '/registreren': { label: $localize`:@@crumb.registreren:Inschrijven`, parent: '/dashboard' },\n '/herregistratie': { label: $localize`:@@crumb.herregistratie:Herregistratie`, parent: '/dashboard' },\n '/intake': { label: $localize`:@@crumb.intake:Herregistratie-intake`, parent: '/dashboard' },\n '/concepts': { label: $localize`:@@crumb.concepts:Functionele patronen`, parent: '/dashboard' },\n}" + } + ], "src/app/shared/infrastructure/scenario.interceptor.ts": [ { "name": "scenarioInterceptor", @@ -9862,9 +20360,21 @@ "deprecated": false, "deprecationMessage": "", "type": "HttpInterceptorFn", - "defaultValue": "(req, next) => {\n if (!req.url.includes('mock/')) return next(req);\n\n switch (currentScenario()) {\n case 'slow':\n return next(req).pipe(delay(2500));\n case 'loading':\n return next(req).pipe(delay(600_000)); // effectively never resolves\n case 'empty':\n return of(new HttpResponse({ status: 200, body: [] })).pipe(delay(400));\n case 'error':\n return timer(400).pipe(\n switchMap(() => throwError(() =>\n new HttpErrorResponse({ status: 500, statusText: 'Demo-fout', url: req.url }))),\n );\n default:\n return next(req);\n }\n}", - "rawdescription": "Demo-only: rewrites the timing/outcome of mock data requests based on\n?scenario= so loading / empty / error states can be shown on demand.\nReal requests are untouched.", - "description": "

Demo-only: rewrites the timing/outcome of mock data requests based on\n?scenario= so loading / empty / error states can be shown on demand.\nReal requests are untouched.

\n" + "defaultValue": "(req, next) => {\n if (!req.url.includes('/api/')) return next(req);\n\n switch (currentScenario()) {\n case 'slow':\n return next(req).pipe(delay(2500));\n case 'loading':\n return next(req).pipe(delay(600_000)); // effectively never resolves\n case 'empty':\n // '[]' so the typed client parses it to an empty array (notes → Empty state).\n return of(new HttpResponse({ status: 200, body: '[]' })).pipe(delay(400));\n case 'error':\n return timer(400).pipe(\n switchMap(() => throwError(() =>\n new HttpErrorResponse({ status: 500, statusText: 'Demo-fout', url: req.url }))),\n );\n default:\n return next(req);\n }\n}", + "rawdescription": "Demo-only: rewrites the timing/outcome of API data requests based on\n?scenario= so loading / empty / error states can be shown on demand.\nNon-API requests are untouched.", + "description": "

Demo-only: rewrites the timing/outcome of API data requests based on\n?scenario= so loading / empty / error states can be shown on demand.\nNon-API requests are untouched.

\n" + } + ], + "src/app/shared/application/session.port.ts": [ + { + "name": "SESSION_PORT", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/application/session.port.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "new InjectionToken('SESSION_PORT')" } ], "src/app/auth/application/session.store.ts": [ @@ -9879,6 +20389,30 @@ "defaultValue": "'session-v1'" } ], + "src/app/shared/application/submit.ts": [ + { + "name": "SUBMIT_FAILED", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/shared/application/submit.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "unknown", + "defaultValue": "$localize`:@@submit.failed:Het indienen is niet gelukt. Probeer het later opnieuw.`" + } + ], + "src/app/registratie/ui/aanvraag-block/aanvraag-block.component.ts": [ + { + "name": "TYPE_LABELS", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "src/app/registratie/ui/aanvraag-block/aanvraag-block.component.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "Record", + "defaultValue": "{\n registratie: $localize`:@@aanvraagBlock.type.registratie:Inschrijving`,\n herregistratie: $localize`:@@aanvraagBlock.type.herregistratie:Herregistratie`,\n intake: $localize`:@@aanvraagBlock.type.intake:Herregistratie-intake`,\n}" + } + ], "src/app/shared/infrastructure/scenario.ts": [ { "name": "VALID", @@ -9888,7 +20422,7 @@ "deprecated": false, "deprecationMessage": "", "type": "Scenario[]", - "defaultValue": "['default', 'slow', 'loading', 'empty', 'error']" + "defaultValue": "['default', 'slow', 'loading', 'empty', 'error', 'upload-slow', 'upload-fail']" } ] }, @@ -10223,6 +20757,886 @@ } } ] + }, + { + "name": "whenTag", + "file": "src/app/shared/kernel/fp.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Narrow a tagged union to one variant by its tag, or null. The single place\nthe cast lives — TS can't narrow through a runtime tag argument, so callers get\nwhenTag(state, 'Editing')?.foo instead of repeating as Extract<…>.

\n", + "args": [ + { + "name": "u", + "type": "U", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "tag", + "type": "K", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Extract | null", + "jsdoctags": [ + { + "name": "u", + "type": "U", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "tag", + "type": "K", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "src/app/herregistratie/domain/herregistratie.machine.ts": [ + { + "name": "back", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "hasProgress", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Has the user meaningfully started, so it's worth persisting as a Concept?

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "next", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Advance one step, gating on that step's fields. Illegal elsewhere = no-op.

\n", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reduce", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "WizardMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "WizardMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "resolve", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Resolve the async submit. Only meaningful while Submitting.

\n", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "setField", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Update one draft field while editing; ignored in any other state.

\n", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "key", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "key", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "submit", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Step 3 submit: parse everything + require documents; Submitting only with Valid.

\n", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "upload", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Route an upload sub-message through the pure upload reducer (Editing only).

\n", + "args": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "WizardState", + "jsdoctags": [ + { + "name": "s", + "type": "WizardState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "validate", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Parse every field; on success hand back a Valid, else the per-field errors.

\n", + "args": [ + { + "name": "draft", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "draft", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "src/app/herregistratie/domain/intake.machine.ts": [ + { + "name": "back", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "IntakeState", + "jsdoctags": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "currentStep", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Which step the cursor currently points at (clamped to the fixed list).

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "StepId", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "hasProgress", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Has the user meaningfully started, so it's worth persisting as a Concept?\n(No auto-prefill here — pristine means truly untouched.)

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "lageUren", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

True when NL-hours are low enough that the scholing question must be answered.\nThe threshold is passed in (server-owned), not hardcoded.

\n", + "args": [ + { + "name": "a", + "type": "Answers", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "scholingThreshold", + "type": "unknown", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "SCHOLING_THRESHOLD_DEFAULT" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "a", + "type": "Answers", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "scholingThreshold", + "type": "unknown", + "deprecated": false, + "deprecationMessage": "", + "defaultValue": "SCHOLING_THRESHOLD_DEFAULT", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "next", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "IntakeState", + "jsdoctags": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reduce", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "IntakeMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "IntakeState", + "jsdoctags": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "IntakeMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "resolve", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "IntakeState", + "jsdoctags": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "r", + "type": "Result", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "setAnswer", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "key", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "IntakeState", + "jsdoctags": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "key", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "setPolicy", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Apply a server-owned policy value (e.g. the scholing threshold).

\n", + "args": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "scholingThreshold", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "IntakeState", + "jsdoctags": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "scholingThreshold", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "submit", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "IntakeState", + "jsdoctags": [ + { + "name": "s", + "type": "IntakeState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "validateAll", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Parse the whole questionnaire into a ValidIntake (called on submit).

\n", + "args": [ + { + "name": "a", + "type": "Answers", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "scholingThreshold", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "a", + "type": "Answers", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "scholingThreshold", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "validateStep", + "file": "src/app/herregistratie/domain/intake.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Validate every question currently visible in ONE step. Errors keyed per field.

\n", + "args": [ + { + "name": "step", + "type": "StepId", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "a", + "type": "Answers", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "scholingThreshold", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "step", + "type": "StepId", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "a", + "type": "Answers", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "scholingThreshold", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] } ], "src/app/registratie/domain/registratie-wizard.machine.ts": [ @@ -10372,6 +21786,35 @@ } ] }, + { + "name": "hasProgress", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Has the user meaningfully started, so it's worth persisting as a Concept? Excludes\nthe automatic BRP address prefill on step 0 — a bare page visit creates nothing.\nponytail: an address typed at step 0 without any of these signals is not yet\npersisted (created once they advance/choose); accepted regression vs. sessionStorage.

\n", + "args": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "boolean", + "jsdoctags": [ + { + "name": "s", + "type": "Extract", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "kiesDiploma", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", @@ -10868,6 +22311,50 @@ } ] }, + { + "name": "upload", + "file": "src/app/registratie/domain/registratie-wizard.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Route an upload sub-message through the pure upload reducer (Invullen only).

\n", + "args": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "RegistratieState", + "jsdoctags": [ + { + "name": "s", + "type": "RegistratieState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "msg", + "type": "UploadMsg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "validateAll", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", @@ -10882,6 +22369,12 @@ "type": "Draft", "deprecated": false, "deprecationMessage": "" + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" } ], "returnType": "Result", @@ -10894,6 +22387,15 @@ "tagName": { "text": "param" } + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } } ] }, @@ -10917,6 +22419,12 @@ "type": "Draft", "deprecated": false, "deprecationMessage": "" + }, + { + "name": "upload", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" } ], "returnType": "Result", @@ -10938,264 +22446,10 @@ "tagName": { "text": "param" } - } - ] - } - ], - "src/app/herregistratie/domain/herregistratie.machine.ts": [ - { - "name": "back", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "WizardState", - "jsdoctags": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "next", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Step 1 → 2: advance only when BOTH step-1 fields parse. Illegal elsewhere = no-op.

\n", - "args": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "WizardState", - "jsdoctags": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "reduce", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "" }, { - "name": "m", - "type": "WizardMsg", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "WizardState", - "jsdoctags": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "m", - "type": "WizardMsg", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "resolve", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Resolve the async submit. Only meaningful while Submitting.

\n", - "args": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "r", - "type": "Result", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "WizardState", - "jsdoctags": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "r", - "type": "Result", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "setField", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Update one draft field while editing; ignored in any other state.

\n", - "args": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "key", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "WizardState", - "jsdoctags": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "key", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "submit", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Step 2 submit: parse everything; move to Submitting only with Valid data.

\n", - "args": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "WizardState", - "jsdoctags": [ - { - "name": "s", - "type": "WizardState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "validate", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

Parse every field; on success hand back a Valid, else the per-field errors.

\n", - "args": [ - { - "name": "draft", - "type": "Draft", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "Result>, Valid>", - "jsdoctags": [ - { - "name": "draft", - "type": "Draft", + "name": "upload", + "type": "UploadState", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -11205,10 +22459,10 @@ ] } ], - "src/app/herregistratie/domain/intake.machine.ts": [ + "src/app/registratie/domain/block-actions.ts": [ { - "name": "back", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "name": "blockActions", + "file": "src/app/registratie/domain/block-actions.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, @@ -11216,17 +22470,17 @@ "description": "", "args": [ { - "name": "s", - "type": "IntakeState", + "name": "status", + "type": "AanvraagStatus", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "IntakeState", + "returnType": "BlockAction[]", "jsdoctags": [ { - "name": "s", - "type": "IntakeState", + "name": "status", + "type": "AanvraagStatus", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -11234,138 +22488,36 @@ } } ] - }, + } + ], + "src/app/shared/upload/upload.machine.ts": [ { - "name": "currentStep", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "name": "categorySatisfied", + "file": "src/app/shared/upload/upload.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Which step the cursor currently points at (clamped to the fixed list).

\n", + "description": "

A required category is satisfied by an initiated upload OR a post-delivery choice.

\n", "args": [ { "name": "s", - "type": "Extract", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "StepId", - "jsdoctags": [ - { - "name": "s", - "type": "Extract", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "lageUren", - "file": "src/app/herregistratie/domain/intake.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "

True when NL-hours are low enough that the scholing question must be answered.\nThe threshold is passed in (server-owned), not hardcoded.

\n", - "args": [ - { - "name": "a", - "type": "Answers", + "type": "UploadState", "deprecated": false, "deprecationMessage": "" }, { - "name": "scholingThreshold", - "type": "unknown", + "name": "categoryId", + "type": "string", "deprecated": false, - "deprecationMessage": "", - "defaultValue": "SCHOLING_THRESHOLD_DEFAULT" + "deprecationMessage": "" } ], "returnType": "boolean", "jsdoctags": [ - { - "name": "a", - "type": "Answers", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "scholingThreshold", - "type": "unknown", - "deprecated": false, - "deprecationMessage": "", - "defaultValue": "SCHOLING_THRESHOLD_DEFAULT", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "next", - "file": "src/app/herregistratie/domain/intake.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ { "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "IntakeState", - "jsdoctags": [ - { - "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "reduce", - "file": "src/app/herregistratie/domain/intake.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "m", - "type": "IntakeMsg", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "IntakeState", - "jsdoctags": [ - { - "name": "s", - "type": "IntakeState", + "type": "UploadState", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -11373,108 +22525,7 @@ } }, { - "name": "m", - "type": "IntakeMsg", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "resolve", - "file": "src/app/herregistratie/domain/intake.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "r", - "type": "Result", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "IntakeState", - "jsdoctags": [ - { - "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "r", - "type": "Result", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - } - ] - }, - { - "name": "setAnswer", - "file": "src/app/herregistratie/domain/intake.machine.ts", - "ctype": "miscellaneous", - "subtype": "function", - "deprecated": false, - "deprecationMessage": "", - "description": "", - "args": [ - { - "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "key", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "value", - "type": "string", - "deprecated": false, - "deprecationMessage": "" - } - ], - "returnType": "IntakeState", - "jsdoctags": [ - { - "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "key", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "value", + "name": "categoryId", "type": "string", "deprecated": false, "deprecationMessage": "", @@ -11485,41 +22536,26 @@ ] }, { - "name": "setPolicy", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "name": "deliveryRefs", + "file": "src/app/shared/upload/upload.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Apply a server-owned policy value (e.g. the scholing threshold).

\n", + "description": "

The submit payload fragment: digital docs carry their documentId, post categories the channel.

\n", "args": [ { "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "scholingThreshold", - "type": "number", + "type": "UploadState", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "IntakeState", + "returnType": "Array", "jsdoctags": [ { "name": "s", - "type": "IntakeState", - "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, - { - "name": "scholingThreshold", - "type": "number", + "type": "UploadState", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -11529,8 +22565,65 @@ ] }, { - "name": "submit", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "name": "mapUpload", + "file": "src/app/shared/upload/upload.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Map one upload's status, leaving the rest of the list untouched.

\n", + "args": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "localId", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "f", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "UploadState", + "jsdoctags": [ + { + "name": "s", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "localId", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "f", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "reduceUpload", + "file": "src/app/shared/upload/upload.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, @@ -11539,16 +22632,31 @@ "args": [ { "name": "s", - "type": "IntakeState", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "UploadMsg", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "IntakeState", + "returnType": "UploadState", "jsdoctags": [ { "name": "s", - "type": "IntakeState", + "type": "UploadState", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "UploadMsg", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -11558,32 +22666,31 @@ ] }, { - "name": "validateAll", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "name": "rejectReason", + "file": "src/app/shared/upload/upload.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Parse the whole questionnaire into a ValidIntake (called on submit).

\n", + "description": "

FE format-validation (never authority — the server re-validates). Returns the\nrejection reason for one file, or null if it passes the category's type/size.

\n", "args": [ { - "name": "a", - "type": "Answers", + "name": "cat", + "type": "DocumentCategory", "deprecated": false, "deprecationMessage": "" }, { - "name": "scholingThreshold", - "type": "number", + "name": "file", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "Result", + "returnType": "\"type\" | \"size\" | null", "jsdoctags": [ { - "name": "a", - "type": "Answers", + "name": "cat", + "type": "DocumentCategory", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -11591,8 +22698,7 @@ } }, { - "name": "scholingThreshold", - "type": "number", + "name": "file", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -11602,56 +22708,56 @@ ] }, { - "name": "validateStep", - "file": "src/app/herregistratie/domain/intake.machine.ts", + "name": "requiredCategoriesSatisfied", + "file": "src/app/shared/upload/upload.machine.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Validate every question currently visible in ONE step. Errors keyed per field.

\n", + "description": "", "args": [ { - "name": "step", - "type": "StepId", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "a", - "type": "Answers", - "deprecated": false, - "deprecationMessage": "" - }, - { - "name": "scholingThreshold", - "type": "number", + "name": "s", + "type": "UploadState", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "Result", + "returnType": "boolean", "jsdoctags": [ { - "name": "step", - "type": "StepId", + "name": "s", + "type": "UploadState", "deprecated": false, "deprecationMessage": "", "tagName": { "text": "param" } - }, + } + ] + } + ], + "src/app/registratie/application/draft-sync.ts": [ + { + "name": "createDraftSync", + "file": "src/app/registratie/application/draft-sync.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

The effectful glue that replaces per-wizard sessionStorage with a backend-owned\nConcept (PRD 0001, phase D). Instantiated in a field initializer (like\ncreateStore/createUploadController). Responsibilities:

\n
    \n
  • resume: if the URL carries ?aanvraag=<id>, load that draft and seed the machine;
  • \n
  • create-on-first-progress: the Concept is created lazily the first time the wizard\nreports a non-null snapshot, and the id is stamped into the URL (so a reload resumes);
  • \n
  • debounced draft sync on every subsequent change.
  • \n
\n

Inert without a Router (stories) or when enabled() is false — no network, no resume.

\n", + "args": [ { - "name": "a", - "type": "Answers", + "name": "deps", + "type": "DraftSyncDeps", "deprecated": false, - "deprecationMessage": "", - "tagName": { - "text": "param" - } - }, + "deprecationMessage": "" + } + ], + "jsdoctags": [ { - "name": "scholingThreshold", - "type": "number", + "name": "deps", + "type": "DraftSyncDeps", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -11705,6 +22811,36 @@ ] } ], + "src/app/shared/upload/upload-controller.ts": [ + { + "name": "createUploadController", + "file": "src/app/shared/upload/upload-controller.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

The effectful glue between the <app-document-upload> organism's events and the\npure upload reducer + transport. Both wizards instantiate one (in a field\ninitializer, like createStore). Holds the only state a reducer can't: the live\nFile blobs keyed by localId (needed to retry an upload). Loads categories,\nreports background-sync availability, and polls on tab refocus.

\n", + "args": [ + { + "name": "deps", + "type": "UploadControllerDeps", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "deps", + "type": "UploadControllerDeps", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], "src/app/shared/infrastructure/scenario.ts": [ { "name": "currentScenario", @@ -11783,6 +22919,81 @@ ] } ], + "src/app/registratie/domain/tasks.ts": [ + { + "name": "formatNL", + "file": "src/app/registratie/domain/tasks.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "d", + "type": "Date", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "string", + "jsdoctags": [ + { + "name": "d", + "type": "Date", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "tasksFromProfile", + "file": "src/app/registratie/domain/tasks.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Derive the open tasks for a professional (pure). Eligibility is the server's\ndecision (decisions.eligibleForHerregistratie), passed in — the FE renders it,\nit does not recompute the rule (ADR-0001). The deadline is still formatted\nclient-side for the task copy (presentation, not a rule).

\n", + "args": [ + { + "name": "reg", + "type": "Registration", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "eligibleForHerregistratie", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "PortalTask[]", + "jsdoctags": [ + { + "name": "reg", + "type": "Registration", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "eligibleForHerregistratie", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], "src/app/registratie/domain/registration.policy.ts": [ { "name": "herregistratieDeadline", @@ -11962,6 +23173,47 @@ ] } ], + "src/app/shared/infrastructure/api-client.provider.ts": [ + { + "name": "httpClientFetch", + "file": "src/app/shared/infrastructure/api-client.provider.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Adapts Angular's HttpClient to the fetch-shaped interface the NSwag-generated\nclient expects, so every API call flows through HttpClient interceptors (the\n?scenario= toggle) and the cross-cutting concerns below. The generated client\nis the only place HTTP shapes are known; this is the only place it meets\nAngular's HTTP stack — i.e. the one seam to add:

\n
    \n
  • timeout (done — REQUEST_TIMEOUT_MS),
  • \n
  • correlation id (done — X-Correlation-Id, echoed in backend logs),
  • \n
  • idempotency key for writes (done — Idempotency-Key; a real retry would thread\na STABLE key per logical submit so re-sends dedupe; here it's per-attempt),
  • \n
  • auth: attach Authorization: Bearer … here (one line) when real DigiD lands,
  • \n
  • retry/backoff: wrap the pipe with rxjs retry({ count, delay }) here.
  • \n
\n", + "args": [ + { + "name": "http", + "type": "HttpClient", + "deprecated": false, + "deprecationMessage": "" + } + ], + "jsdoctags": [ + { + "name": "http", + "type": "HttpClient", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "provideApiClient", + "file": "src/app/shared/infrastructure/api-client.provider.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Provide a root ApiClient that talks through HttpClient. Base URL comes from the\nenvironment (relative '' in dev → proxy; configurable per deployment).

\n", + "args": [], + "returnType": "Provider" + } + ], "src/app/auth/domain/session.ts": [ { "name": "isAuthenticated", @@ -11991,6 +23243,278 @@ ] } ], + "src/app/shared/ui/debug-state/mask.ts": [ + { + "name": "maskBsn", + "file": "src/app/shared/ui/debug-state/mask.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Redact a BSN for the dev state view: keep the last 3 digits, mask the rest.

\n", + "args": [ + { + "name": "bsn", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "string", + "jsdoctags": [ + { + "name": "bsn", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "maskTail", + "file": "src/app/shared/ui/debug-state/mask.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Keep the last keep characters, mask the rest.

\n", + "args": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "keep", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "string", + "jsdoctags": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "keep", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "redactProfile", + "file": "src/app/shared/ui/debug-state/mask.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Data minimisation for the dev "show the Model" panel: keep the structural /\ndecision-relevant fields (status, beroep, dates of registration) but redact\ndirect personal identifiers (name, address, date of birth) and mask the BIG\nnumber. The panel is for inspecting state SHAPE, never for reading PII.

\n", + "args": [ + { + "name": "p", + "type": "BigProfile", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "unknown", + "jsdoctags": [ + { + "name": "p", + "type": "BigProfile", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "src/app/shared/ui/debug-state/debug-state.component.ts": [ + { + "name": "maskSession", + "file": "src/app/shared/ui/debug-state/debug-state.component.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Session | null", + "jsdoctags": [ + { + "name": "s", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "src/app/registratie/infrastructure/applications.adapter.ts": [ + { + "name": "parseAanvraagStatus", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Trust-boundary parse of the status union — the tag drives which fields must exist.

\n", + "args": [ + { + "name": "s", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "s", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "parseApplicationDetail", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "parseApplications", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "parseApplicationSummary", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "json", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "parseCommon", + "file": "src/app/registratie/infrastructure/applications.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "dto", + "type": "ApplicationSummaryDto", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "dto", + "type": "ApplicationSummaryDto", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], "src/app/registratie/domain/value-objects/big-nummer.ts": [ { "name": "parseBigNummer", @@ -12229,6 +23753,152 @@ ] } ], + "src/app/shared/infrastructure/api-error.ts": [ + { + "name": "problemDetail", + "file": "src/app/shared/infrastructure/api-error.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Extract a human-readable message from a rejected API call. A 4xx/5xx with a\nProblemDetails body (RFC 7807) is thrown by the generated client as the parsed\nobject; anything else falls back to the given message.

\n", + "args": [ + { + "name": "e", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "fallback", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "string", + "jsdoctags": [ + { + "name": "e", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "fallback", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "problemFieldErrors", + "file": "src/app/shared/infrastructure/api-error.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

SEAM (G4): map a server validation envelope to field-level errors.

\n

ASP.NET's ValidationProblemDetails carries errors: { field: string[] }. The\nbackend today returns only detail (one banner message), so this returns {}.\nWhen the backend starts sending errors, a machine's SubmitFailed handler can\nmerge this into its own errors map — the field-keyed shape the wizards already\nrender — so a rejection shows inline per field, not just as a banner. The\nconsumer hook is the only thing left to wire; the contract boundary lives here.

\n", + "args": [ + { + "name": "e", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Record", + "jsdoctags": [ + { + "name": "e", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "src/app/registratie/domain/change-request.machine.ts": [ + { + "name": "reduce", + "file": "src/app/registratie/domain/change-request.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "State", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "m", + "type": "Msg", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "State", + "jsdoctags": [ + { + "name": "s", + "type": "State", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "m", + "type": "Msg", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "validate", + "file": "src/app/registratie/domain/change-request.machine.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Parse via the value objects; on success hand back a Valid, else per-field errors.

\n", + "args": [ + { + "name": "draft", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Result", + "jsdoctags": [ + { + "name": "draft", + "type": "Draft", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], "src/app/auth/application/session.store.ts": [ { "name": "restore", @@ -12237,33 +23907,46 @@ "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Restore a persisted session (best-effort; corrupt entry → logged out).

\n", + "description": "

Restore a persisted session (best-effort; corrupt entry → logged out).\nG2: validate the shape before trusting it. G1: the BSN is never persisted\n(see the effect below), so a restored session carries an empty one — it is\nunused after login; only naam is shown in the chrome.

\n", "args": [], "returnType": "Session | null" } ], - "src/app/herregistratie/application/submit-herregistratie.ts": [ + "src/app/shared/application/submit.ts": [ { - "name": "submitHerregistratie", - "file": "src/app/herregistratie/application/submit-herregistratie.ts", + "name": "runSubmit", + "file": "src/app/shared/application/submit.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

The mutation/command: send a herregistratie application to the backend.\nReturns a Result so the caller can branch on success/failure without\ntry/catch. ponytail: faked with a timer; swap for a real POST when there's\nan API. The "uren must be > 0" rule lets the demo show a failure path.

\n", + "description": "

Run a mutating API call and fold it into a Result — the one place the\ntry/catch + ProblemDetails-mapping lives, so every submit-* command is just\nits own payload mapping. The backend re-validates and returns a 422\nProblemDetails on rejection, surfaced here as the error string.

\n", "args": [ { - "name": "data", - "type": "Valid", + "name": "fn", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "fallback", + "type": "string", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "Promise>", + "returnType": "Promise>", "jsdoctags": [ { - "name": "data", - "type": "Valid", + "name": "fn", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "fallback", + "type": "string", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -12273,28 +23956,97 @@ ] } ], - "src/app/herregistratie/application/submit-intake.ts": [ + "src/app/shared/upload/upload.adapter.ts": [ { - "name": "submitIntake", - "file": "src/app/herregistratie/application/submit-intake.ts", + "name": "simulateUpload", + "file": "src/app/shared/upload/upload.adapter.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Command: send the intake questionnaire to the backend. Returns a Result so the\ncaller branches on success/failure without try/catch. ponytail: faked with a\ntimer; swap for a real POST when there's an API. The "uren must be > 0" rule\nlets the demo show the failure path.

\n", + "description": "

Demo-only (dev): the real XHR POST finishes instantly for metadata, so progress\nand failure can't otherwise be shown. Drives the progress bar over ~2.5s, then\nsucceeds (upload-slow) or fails (upload-fail). ponytail: timer-based, cancel\nvia the returned handle; no network.

\n", "args": [ { - "name": "data", - "type": "ValidIntake", + "name": "scenario", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "onProgress", "deprecated": false, "deprecationMessage": "" } ], - "returnType": "Promise>", + "returnType": "XhrUploadHandle", "jsdoctags": [ { - "name": "data", - "type": "ValidIntake", + "name": "scenario", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "onProgress", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "toCategory", + "file": "src/app/shared/upload/upload.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Wire DTO (all fields optional) → domain.

\n", + "args": [ + { + "name": "c", + "type": "DocumentCategoryDto", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "DocumentCategory", + "jsdoctags": [ + { + "name": "c", + "type": "DocumentCategoryDto", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + { + "name": "toStatusItem", + "file": "src/app/shared/upload/upload.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "s", + "type": "UploadStatusItemDto", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "StatusItem", + "jsdoctags": [ + { + "name": "s", + "type": "UploadStatusItemDto", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -12304,28 +24056,196 @@ ] } ], - "src/app/registratie/application/submit-registratie.ts": [ + "src/app/registratie/application/submit-change-request.ts": [ { - "name": "submitRegistratie", - "file": "src/app/registratie/application/submit-registratie.ts", + "name": "submitChangeRequest", + "file": "src/app/registratie/application/submit-change-request.ts", "ctype": "miscellaneous", "subtype": "function", "deprecated": false, "deprecationMessage": "", - "description": "

Command: send the completed registration to the backend, which invokes the\ndomain command to create/finalize the registration aggregate. Returns a Result\nso the caller branches on success/failure without try/catch; on success it\nyields the confirmation reference (PRD §9). ponytail: faked with a timer; swap\nfor a real POST when there's an API. The "manually entered diploma" rule lets\nthe demo show the failure path.

\n", + "description": "

Command: POST an address change to the backend (/api/v1/change-requests),\nwhich re-validates and returns a reference. Same shape as the other submit\ncommands — a Result, never a thrown error — so the form's reduce can branch.

\n", "args": [ + { + "name": "client", + "type": "ApiClient", + "deprecated": false, + "deprecationMessage": "" + }, { "name": "data", - "type": "ValidRegistratie", + "type": "Valid", "deprecated": false, "deprecationMessage": "" } ], "returnType": "Promise>", "jsdoctags": [ + { + "name": "client", + "type": "ApiClient", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, { "name": "data", - "type": "ValidRegistratie", + "type": "Valid", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "src/app/shared/infrastructure/api-client.ts": [ + { + "name": "throwException", + "file": "src/app/shared/infrastructure/api-client.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "args": [ + { + "name": "message", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "status", + "type": "number", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "response", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "headers", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "result", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "optional": true + } + ], + "returnType": "any", + "jsdoctags": [ + { + "name": "message", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "status", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "response", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "headers", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "result", + "type": "any", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } + } + ] + } + ], + "src/app/registratie/infrastructure/big-register.adapter.ts": [ + { + "name": "toAantekening", + "file": "src/app/registratie/infrastructure/big-register.adapter.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Map the wire DTO (all fields optional) onto our domain type.

\n", + "args": [ + { + "name": "n", + "type": "AantekeningDto", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "Aantekening", + "jsdoctags": [ + { + "name": "n", + "type": "AantekeningDto", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], + "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts": [ + { + "name": "trailFor", + "file": "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts", + "ctype": "miscellaneous", + "subtype": "function", + "deprecated": false, + "deprecationMessage": "", + "description": "

Build the breadcrumb trail for a router url (query/fragment stripped).\nReturns [] for unknown routes (e.g. /login) so the bar can hide itself.

\n", + "args": [ + { + "name": "url", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "BreadcrumbItem[]", + "jsdoctags": [ + { + "name": "url", + "type": "string", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -12373,6 +24293,30 @@ "kind": 200 } ], + "src/app/registratie/domain/aanvraag.ts": [ + { + "name": "AanvraagStatus", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type", + "file": "src/app/registratie/domain/aanvraag.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, + { + "name": "AanvraagType", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"registratie\" | \"herregistratie\" | \"intake\"", + "file": "src/app/registratie/domain/aanvraag.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

An application (aanvraag) as the frontend sees it — the parsed, domain-side view\nof the backend-owned aggregate (see backend ApplicationStore + PRD 0001). Pure\ntypes, no Angular. Lives in registratie because the dashboard (here) is the\nconsumer and the downstream wizards (herregistratie → registratie) produce them.

\n

The status is a discriminated union so illegal states are unrepresentable — same\nreflex as RemoteData. The server computes which tag applies (auto-approval on\nread); the FE renders it, it does not recompute the lifecycle.

\n", + "kind": 193 + } + ], "src/app/registratie/ui/address-fields/address-fields.component.ts": [ { "name": "AdresErrors", @@ -12435,7 +24379,7 @@ "name": "RegistratieMsg", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", "file": "src/app/registratie/domain/registratie-wizard.machine.ts", "deprecated": false, "deprecationMessage": "", @@ -12478,6 +24422,30 @@ "kind": 193 } ], + "src/app/shared/ui/upload/upload-status-banner/upload-status-banner.component.ts": [ + { + "name": "AlertType", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"info\" | \"ok\" | \"warning\" | \"error\"", + "file": "src/app/shared/ui/upload/upload-status-banner/upload-status-banner.component.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, + { + "name": "BannerType", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"info\" | \"warning\" | \"error\"", + "file": "src/app/shared/ui/upload/upload-status-banner/upload-status-banner.component.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + } + ], "src/app/registratie/domain/value-objects/big-nummer.ts": [ { "name": "BigNummer", @@ -12491,6 +24459,19 @@ "kind": 184 } ], + "src/app/registratie/domain/block-actions.ts": [ + { + "name": "BlockAction", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"resume\" | \"cancel\" | \"viewDocuments\"", + "file": "src/app/registratie/domain/block-actions.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

What a dashboard "Mijn aanvragen" block offers per status. The badge itself\nfollows directly from status.tag (the UI maps tag → colour + label), so this\npure function owns only the actions decision.

\n", + "kind": 193 + } + ], "src/app/shared/kernel/fp.ts": [ { "name": "Brand", @@ -12515,6 +24496,54 @@ "kind": 193 } ], + "src/app/shared/upload/upload.machine.ts": [ + { + "name": "DeliveryChannel", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "\"digital\" | \"post\"", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, + { + "name": "UploadMsg", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, + { + "name": "UploadStatus", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "file": "src/app/shared/upload/upload.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

Pure upload domain (no Angular). Reusable across wizards: the host wizard folds\nUploadState into its Model and delegates upload Msgs to reduceUpload.\nIllegal states are unrepresentable by construction; the few transitions a union\ncan't express (channel↔upload exclusivity, single-file categories) are enforced\nhere in the reducer. Effects live in the shell (upload-shell.service.ts).

\n", + "kind": 193 + } + ], + "src/app/shared/upload/upload-shell.service.ts": [ + { + "name": "Dispatch", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "function", + "file": "src/app/shared/upload/upload-shell.service.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 185 + } + ], "src/app/registratie/domain/value-objects/email.ts": [ { "name": "Email", @@ -12528,6 +24557,19 @@ "kind": 184 } ], + "src/app/registratie/application/applications.store.ts": [ + { + "name": "Err", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "Error | undefined", + "file": "src/app/registratie/application/applications.store.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + } + ], "src/app/registratie/application/big-profile.store.ts": [ { "name": "Err", @@ -12598,6 +24640,41 @@ "kind": 193 } ], + "src/app/registratie/domain/change-request.machine.ts": [ + { + "name": "Errors", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "Partial>", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 184 + }, + { + "name": "Msg", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 193 + }, + { + "name": "State", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type", + "file": "src/app/registratie/domain/change-request.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

The change-request (adreswijziging) form as one tagged union — the SAME idiom\nas the wizards, just single-step. draft/errors exist only while Editing;\nSubmitting/Submitted/Failed carry the parsed Valid. Illegal states (submitting\nan invalid draft, a success screen with errors) are unrepresentable.

\n", + "kind": 193 + } + ], "src/app/registratie/domain/value-objects/postcode.ts": [ { "name": "Postcode", @@ -12629,7 +24706,7 @@ "name": "Scenario", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "\"default\" | \"slow\" | \"loading\" | \"empty\" | \"error\"", + "rawtype": "\"default\" | \"slow\" | \"loading\" | \"empty\" | \"error\" | \"upload-slow\" | \"upload-fail\"", "file": "src/app/shared/infrastructure/scenario.ts", "deprecated": false, "deprecationMessage": "", @@ -12637,6 +24714,41 @@ "kind": 193 } ], + "src/app/herregistratie/domain/herregistratie.machine.ts": [ + { + "name": "StepErrors", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "Partial>", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "", + "kind": 184 + }, + { + "name": "WizardMsg", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

Every event that can happen to the wizard, as one message type. The component\nsends a WizardMsg; reduce decides the next state. This is the Elm\nModel+Msg+update pattern: ONE pure function describes all state changes.

\n", + "kind": 193 + }, + { + "name": "WizardState", + "ctype": "miscellaneous", + "subtype": "typealias", + "rawtype": "literal type | literal type | literal type | literal type", + "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "deprecated": false, + "deprecationMessage": "", + "description": "

The whole wizard as one tagged union. step and errors exist ONLY while\nEditing; Submitting/Submitted/Failed carry a Valid payload and nothing else.\nSo "submitting while a field is invalid" or "showing the success screen with\nerrors set" are unrepresentable — the bug class is gone by construction.

\n", + "kind": 193 + } + ], "src/app/registratie/domain/value-objects/uren.ts": [ { "name": "Uren", @@ -12663,27 +24775,16 @@ "kind": 193 } ], - "src/app/herregistratie/domain/herregistratie.machine.ts": [ + "src/app/shared/layout/wizard-shell/wizard-shell.component.ts": [ { - "name": "WizardMsg", + "name": "WizardStatus", "ctype": "miscellaneous", "subtype": "typealias", - "rawtype": "literal type | literal type | literal type | literal type | literal type | literal type | literal type | literal type", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", + "rawtype": "\"editing\" | \"submitting\" | \"submitted\" | \"failed\"", + "file": "src/app/shared/layout/wizard-shell/wizard-shell.component.ts", "deprecated": false, "deprecationMessage": "", - "description": "

Every event that can happen to the wizard, as one message type. The component\nsends a WizardMsg; reduce decides the next state. This is the Elm\nModel+Msg+update pattern: ONE pure function describes all state changes.

\n", - "kind": 193 - }, - { - "name": "WizardState", - "ctype": "miscellaneous", - "subtype": "typealias", - "rawtype": "literal type | literal type | literal type | literal type", - "file": "src/app/herregistratie/domain/herregistratie.machine.ts", - "deprecated": false, - "deprecationMessage": "", - "description": "

The whole wizard as one tagged union. step and errors exist ONLY while\nEditing; Submitting/Submitted/Failed carry a Valid payload and nothing else.\nSo "submitting while a field is invalid" or "showing the success screen with\nerrors set" are unrepresentable — the bug class is gone by construction.

\n", + "description": "", "kind": 193 } ] @@ -12751,7 +24852,7 @@ ] }, "coverage": { - "count": 44, + "count": 38, "status": "medium", "files": [ { @@ -12868,35 +24969,6 @@ "coverageCount": "0/5", "status": "low" }, - { - "filePath": "src/app/herregistratie/application/submit-herregistratie.ts", - "type": "function", - "linktype": "miscellaneous", - "linksubtype": "function", - "name": "submitHerregistratie", - "coveragePercent": 100, - "coverageCount": "1/1", - "status": "very-good" - }, - { - "filePath": "src/app/herregistratie/application/submit-intake.ts", - "type": "function", - "linktype": "miscellaneous", - "linksubtype": "function", - "name": "submitIntake", - "coveragePercent": 100, - "coverageCount": "1/1", - "status": "very-good" - }, - { - "filePath": "src/app/herregistratie/contracts/intake-policy.dto.ts", - "type": "interface", - "linktype": "interface", - "name": "IntakePolicyDto", - "coveragePercent": 100, - "coverageCount": "2/2", - "status": "very-good" - }, { "filePath": "src/app/herregistratie/domain/herregistratie.machine.ts", "type": "interface", @@ -12911,8 +24983,8 @@ "type": "interface", "linktype": "interface", "name": "Valid", - "coveragePercent": 25, - "coverageCount": "1/4", + "coveragePercent": 20, + "coverageCount": "1/5", "status": "low" }, { @@ -12925,6 +24997,16 @@ "coverageCount": "0/1", "status": "low" }, + { + "filePath": "src/app/herregistratie/domain/herregistratie.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "hasProgress", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/herregistratie/domain/herregistratie.machine.ts", "type": "function", @@ -12975,6 +25057,16 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/herregistratie/domain/herregistratie.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "upload", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/herregistratie/domain/herregistratie.machine.ts", "type": "function", @@ -12995,6 +25087,16 @@ "coverageCount": "0/1", "status": "low" }, + { + "filePath": "src/app/herregistratie/domain/herregistratie.machine.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "StepErrors", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, { "filePath": "src/app/herregistratie/domain/herregistratie.machine.ts", "type": "type alias", @@ -13053,6 +25155,16 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/herregistratie/domain/intake.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "hasProgress", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/herregistratie/domain/intake.machine.ts", "type": "function", @@ -13223,13 +25335,22 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/herregistratie/infrastructure/intake-policy.adapter.ts", + "type": "injectable", + "linktype": "injectable", + "name": "IntakePolicyAdapter", + "coveragePercent": 33, + "coverageCount": "1/3", + "status": "medium" + }, { "filePath": "src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.component.ts", "type": "component", "linktype": "component", "name": "HerregistratieWizardComponent", - "coveragePercent": 22, - "coverageCount": "4/18", + "coveragePercent": 19, + "coverageCount": "6/31", "status": "low" }, { @@ -13246,28 +25367,8 @@ "type": "component", "linktype": "component", "name": "IntakeWizardComponent", - "coveragePercent": 25, - "coverageCount": "6/24", - "status": "low" - }, - { - "filePath": "src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts", - "type": "variable", - "linktype": "miscellaneous", - "linksubtype": "variable", - "name": "JA_NEE", - "coveragePercent": 0, - "coverageCount": "0/1", - "status": "low" - }, - { - "filePath": "src/app/herregistratie/ui/intake-wizard/intake-wizard.component.ts", - "type": "variable", - "linktype": "miscellaneous", - "linksubtype": "variable", - "name": "STORAGE_KEY", - "coveragePercent": 0, - "coverageCount": "0/1", + "coveragePercent": 21, + "coverageCount": "7/32", "status": "low" }, { @@ -13279,6 +25380,25 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/registratie/application/applications.store.ts", + "type": "injectable", + "linktype": "injectable", + "name": "ApplicationsStore", + "coveragePercent": 57, + "coverageCount": "4/7", + "status": "good" + }, + { + "filePath": "src/app/registratie/application/applications.store.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "Err", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, { "filePath": "src/app/registratie/application/big-profile.store.ts", "type": "injectable", @@ -13299,11 +25419,49 @@ "status": "low" }, { - "filePath": "src/app/registratie/application/submit-registratie.ts", + "filePath": "src/app/registratie/application/draft-sync.ts", + "type": "interface", + "linktype": "interface", + "name": "DraftSnapshot", + "coveragePercent": 20, + "coverageCount": "1/5", + "status": "low" + }, + { + "filePath": "src/app/registratie/application/draft-sync.ts", + "type": "interface", + "linktype": "interface", + "name": "DraftSyncDeps", + "coveragePercent": 60, + "coverageCount": "3/5", + "status": "good" + }, + { + "filePath": "src/app/registratie/application/draft-sync.ts", "type": "function", "linktype": "miscellaneous", "linksubtype": "function", - "name": "submitRegistratie", + "name": "createDraftSync", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/registratie/application/draft-sync.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "DEBOUNCE_MS", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/application/submit-change-request.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "submitChangeRequest", "coveragePercent": 100, "coverageCount": "1/1", "status": "very-good" @@ -13380,6 +25538,44 @@ "coverageCount": "0/4", "status": "low" }, + { + "filePath": "src/app/registratie/domain/aanvraag.ts", + "type": "interface", + "linktype": "interface", + "name": "Aanvraag", + "coveragePercent": 0, + "coverageCount": "0/8", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/aanvraag.ts", + "type": "interface", + "linktype": "interface", + "name": "AanvraagDetail", + "coveragePercent": 50, + "coverageCount": "1/2", + "status": "medium" + }, + { + "filePath": "src/app/registratie/domain/aanvraag.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "AanvraagStatus", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/aanvraag.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "AanvraagType", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/registratie/domain/big-profile.ts", "type": "interface", @@ -13389,6 +25585,104 @@ "coverageCount": "1/3", "status": "medium" }, + { + "filePath": "src/app/registratie/domain/block-actions.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "blockActions", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/block-actions.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "BlockAction", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/registratie/domain/change-request.machine.ts", + "type": "interface", + "linktype": "interface", + "name": "Draft", + "coveragePercent": 25, + "coverageCount": "1/4", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/change-request.machine.ts", + "type": "interface", + "linktype": "interface", + "name": "Valid", + "coveragePercent": 25, + "coverageCount": "1/4", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/change-request.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "reduce", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/change-request.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "validate", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/registratie/domain/change-request.machine.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "initial", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/change-request.machine.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "Errors", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/change-request.machine.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "Msg", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/change-request.machine.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "State", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/registratie/domain/person.ts", "type": "interface", @@ -13421,8 +25715,8 @@ "type": "interface", "linktype": "interface", "name": "Errors", - "coveragePercent": 12, - "coverageCount": "1/8", + "coveragePercent": 11, + "coverageCount": "1/9", "status": "low" }, { @@ -13430,8 +25724,8 @@ "type": "interface", "linktype": "interface", "name": "ValidRegistratie", - "coveragePercent": 11, - "coverageCount": "1/9", + "coveragePercent": 10, + "coverageCount": "1/10", "status": "low" }, { @@ -13474,6 +25768,16 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/registratie/domain/registratie-wizard.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "hasProgress", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/registratie/domain/registratie-wizard.machine.ts", "type": "function", @@ -13574,6 +25878,16 @@ "coverageCount": "0/1", "status": "low" }, + { + "filePath": "src/app/registratie/domain/registratie-wizard.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "upload", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/registratie/domain/registratie-wizard.machine.ts", "type": "function", @@ -13792,6 +26106,35 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/registratie/domain/tasks.ts", + "type": "interface", + "linktype": "interface", + "name": "PortalTask", + "coveragePercent": 20, + "coverageCount": "1/5", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/tasks.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "formatNL", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/domain/tasks.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "tasksFromProfile", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/registratie/domain/value-objects/big-nummer.ts", "type": "function", @@ -13872,22 +26215,101 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/registratie/infrastructure/applications.adapter.ts", + "type": "injectable", + "linktype": "injectable", + "name": "ApplicationsAdapter", + "coveragePercent": 62, + "coverageCount": "5/8", + "status": "good" + }, + { + "filePath": "src/app/registratie/infrastructure/applications.adapter.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "parseAanvraagStatus", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/registratie/infrastructure/applications.adapter.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "parseApplicationDetail", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/infrastructure/applications.adapter.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "parseApplications", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/infrastructure/applications.adapter.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "parseApplicationSummary", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/infrastructure/applications.adapter.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "parseCommon", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/registratie/infrastructure/applications.adapter.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "AANVRAAG_TYPES", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, { "filePath": "src/app/registratie/infrastructure/big-register.adapter.ts", "type": "injectable", "linktype": "injectable", "name": "BigRegisterAdapter", - "coveragePercent": 50, - "coverageCount": "1/2", + "coveragePercent": 33, + "coverageCount": "1/3", "status": "medium" }, + { + "filePath": "src/app/registratie/infrastructure/big-register.adapter.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "toAantekening", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/registratie/infrastructure/brp.adapter.ts", "type": "injectable", "linktype": "injectable", "name": "BrpAdapter", - "coveragePercent": 50, - "coverageCount": "1/2", + "coveragePercent": 33, + "coverageCount": "1/3", "status": "medium" }, { @@ -13905,8 +26327,8 @@ "type": "injectable", "linktype": "injectable", "name": "DashboardViewAdapter", - "coveragePercent": 50, - "coverageCount": "1/2", + "coveragePercent": 33, + "coverageCount": "1/3", "status": "medium" }, { @@ -13924,8 +26346,8 @@ "type": "injectable", "linktype": "injectable", "name": "DuoAdapter", - "coveragePercent": 50, - "coverageCount": "1/2", + "coveragePercent": 33, + "coverageCount": "1/3", "status": "medium" }, { @@ -13949,11 +26371,20 @@ "status": "low" }, { - "filePath": "src/app/registratie/infrastructure/duo.adapter.ts", + "filePath": "src/app/registratie/ui/aanvraag-block/aanvraag-block.component.ts", + "type": "component", + "linktype": "component", + "name": "AanvraagBlockComponent", + "coveragePercent": 8, + "coverageCount": "1/12", + "status": "low" + }, + { + "filePath": "src/app/registratie/ui/aanvraag-block/aanvraag-block.component.ts", "type": "variable", "linktype": "miscellaneous", "linksubtype": "variable", - "name": "EMPTY", + "name": "TYPE_LABELS", "coveragePercent": 0, "coverageCount": "0/1", "status": "low" @@ -13991,17 +26422,8 @@ "type": "component", "linktype": "component", "name": "ChangeRequestFormComponent", - "coveragePercent": 11, - "coverageCount": "1/9", - "status": "low" - }, - { - "filePath": "src/app/registratie/ui/change-request-form/change-request-form.component.ts", - "type": "interface", - "linktype": "interface", - "name": "ChangeRequest", "coveragePercent": 25, - "coverageCount": "1/4", + "coverageCount": "4/16", "status": "low" }, { @@ -14009,18 +26431,18 @@ "type": "component", "linktype": "component", "name": "DashboardPage", - "coveragePercent": 0, - "coverageCount": "0/2", - "status": "low" + "coveragePercent": 38, + "coverageCount": "5/13", + "status": "medium" }, { "filePath": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", "type": "component", "linktype": "component", "name": "RegistratieWizardComponent", - "coveragePercent": 26, - "coverageCount": "12/45", - "status": "medium" + "coveragePercent": 25, + "coverageCount": "13/52", + "status": "low" }, { "filePath": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", @@ -14032,16 +26454,6 @@ "coverageCount": "0/1", "status": "low" }, - { - "filePath": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", - "type": "variable", - "linktype": "miscellaneous", - "linksubtype": "variable", - "name": "JA_NEE", - "coveragePercent": 0, - "coverageCount": "0/1", - "status": "low" - }, { "filePath": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", "type": "variable", @@ -14052,16 +26464,6 @@ "coverageCount": "0/1", "status": "low" }, - { - "filePath": "src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts", - "type": "variable", - "linktype": "miscellaneous", - "linksubtype": "variable", - "name": "STORAGE_KEY", - "coveragePercent": 0, - "coverageCount": "0/1", - "status": "low" - }, { "filePath": "src/app/registratie/ui/registratie.page.ts", "type": "component", @@ -14077,7 +26479,7 @@ "linktype": "component", "name": "RegistrationDetailPage", "coveragePercent": 0, - "coverageCount": "0/3", + "coverageCount": "0/2", "status": "low" }, { @@ -14168,6 +26570,25 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/shared/application/session.port.ts", + "type": "interface", + "linktype": "interface", + "name": "SessionPort", + "coveragePercent": 33, + "coverageCount": "1/3", + "status": "medium" + }, + { + "filePath": "src/app/shared/application/session.port.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "SESSION_PORT", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, { "filePath": "src/app/shared/application/store.ts", "type": "interface", @@ -14187,6 +26608,383 @@ "coverageCount": "0/1", "status": "low" }, + { + "filePath": "src/app/shared/application/submit.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "runSubmit", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/application/submit.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "SUBMIT_FAILED", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.provider.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "httpClientFetch", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.provider.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "provideApiClient", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.provider.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "REQUEST_TIMEOUT_MS", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "class", + "linktype": "classe", + "name": "ApiClient", + "coveragePercent": 0, + "coverageCount": "0/49", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "class", + "linktype": "classe", + "name": "SwaggerException", + "coveragePercent": 0, + "coverageCount": "0/9", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "AantekeningDto", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "AanvraagStatusDto", + "coveragePercent": 0, + "coverageCount": "0/7", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "AdresDto", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "ApplicationDetailDto", + "coveragePercent": 0, + "coverageCount": "0/9", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "ApplicationSummaryDto", + "coveragePercent": 0, + "coverageCount": "0/8", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "BrpAddressDto", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "ChangeRequestRequest", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "CreateApplicationRequest", + "coveragePercent": 0, + "coverageCount": "0/2", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "DashboardViewDto", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "DocumentCategoryDto", + "coveragePercent": 0, + "coverageCount": "0/9", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "DocumentRefDto", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "DraftSyncRequest", + "coveragePercent": 0, + "coverageCount": "0/5", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "DuoDiplomaDto", + "coveragePercent": 0, + "coverageCount": "0/7", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "DuoLookupDto", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "HerregistratieDecisionsDto", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "HerregistratieRequest", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "IntakePolicyDto", + "coveragePercent": 0, + "coverageCount": "0/2", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "IntakeRequest", + "coveragePercent": 0, + "coverageCount": "0/2", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "ManualDiplomaPolicyDto", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "PersonDto", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "PolicyQuestionDto", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "ProblemDetails", + "coveragePercent": 0, + "coverageCount": "0/6", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "ReferentieResponse", + "coveragePercent": 0, + "coverageCount": "0/2", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "RegistratieRequest", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "RegistrationDto", + "coveragePercent": 0, + "coverageCount": "0/7", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "RegistrationStatusDto", + "coveragePercent": 0, + "coverageCount": "0/6", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "SubmitApplicationRequest", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "SubmitApplicationResponse", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "UploadCategoriesDto", + "coveragePercent": 0, + "coverageCount": "0/2", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "UploadStatusDto", + "coveragePercent": 0, + "coverageCount": "0/2", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "interface", + "linktype": "interface", + "name": "UploadStatusItemDto", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-client.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "throwException", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/infrastructure/api-error.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "problemDetail", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/infrastructure/api-error.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "problemFieldErrors", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/shared/infrastructure/scenario.interceptor.ts", "type": "variable", @@ -14237,6 +27035,16 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/shared/kernel/fp.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "whenTag", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/shared/kernel/fp.ts", "type": "variable", @@ -14277,6 +27085,35 @@ "coverageCount": "1/1", "status": "very-good" }, + { + "filePath": "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts", + "type": "interface", + "linktype": "interface", + "name": "Crumb", + "coveragePercent": 33, + "coverageCount": "1/3", + "status": "medium" + }, + { + "filePath": "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "trailFor", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/layout/breadcrumb/breadcrumb-trail.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ROUTES", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, { "filePath": "src/app/shared/layout/breadcrumb/breadcrumb.component.ts", "type": "component", @@ -14300,8 +27137,8 @@ "type": "component", "linktype": "component", "name": "PageShellComponent", - "coveragePercent": 14, - "coverageCount": "1/7", + "coveragePercent": 16, + "coverageCount": "1/6", "status": "low" }, { @@ -14309,9 +27146,27 @@ "type": "component", "linktype": "component", "name": "ShellComponent", - "coveragePercent": 100, - "coverageCount": "1/1", - "status": "very-good" + "coveragePercent": 50, + "coverageCount": "1/2", + "status": "medium" + }, + { + "filePath": "src/app/shared/layout/side-nav/side-nav.component.ts", + "type": "component", + "linktype": "component", + "name": "SideNavComponent", + "coveragePercent": 33, + "coverageCount": "1/3", + "status": "medium" + }, + { + "filePath": "src/app/shared/layout/side-nav/side-nav.component.ts", + "type": "interface", + "linktype": "interface", + "name": "NavItem", + "coveragePercent": 0, + "coverageCount": "0/3", + "status": "low" }, { "filePath": "src/app/shared/layout/site-footer/site-footer.component.ts", @@ -14327,10 +27182,38 @@ "type": "component", "linktype": "component", "name": "SiteHeaderComponent", - "coveragePercent": 50, - "coverageCount": "1/2", + "coveragePercent": 12, + "coverageCount": "1/8", + "status": "low" + }, + { + "filePath": "src/app/shared/layout/wizard-shell/wizard-shell.component.ts", + "type": "component", + "linktype": "component", + "name": "WizardShellComponent", + "coveragePercent": 11, + "coverageCount": "2/18", + "status": "low" + }, + { + "filePath": "src/app/shared/layout/wizard-shell/wizard-shell.component.ts", + "type": "interface", + "linktype": "interface", + "name": "WizardError", + "coveragePercent": 33, + "coverageCount": "1/3", "status": "medium" }, + { + "filePath": "src/app/shared/layout/wizard-shell/wizard-shell.component.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "WizardStatus", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, { "filePath": "src/app/shared/ui/alert/alert.component.ts", "type": "component", @@ -14355,8 +27238,8 @@ "type": "component", "linktype": "component", "name": "AsyncComponent", - "coveragePercent": 8, - "coverageCount": "1/12", + "coveragePercent": 6, + "coverageCount": "1/15", "status": "low" }, { @@ -14424,6 +27307,15 @@ "coverageCount": "0/1", "status": "low" }, + { + "filePath": "src/app/shared/ui/card/card.component.ts", + "type": "component", + "linktype": "component", + "name": "CardComponent", + "coveragePercent": 33, + "coverageCount": "1/3", + "status": "medium" + }, { "filePath": "src/app/shared/ui/data-row/data-row.component.ts", "type": "component", @@ -14433,13 +27325,72 @@ "coverageCount": "1/3", "status": "medium" }, + { + "filePath": "src/app/shared/ui/debug-state/debug-state.component.ts", + "type": "component", + "linktype": "component", + "name": "DebugStateComponent", + "coveragePercent": 12, + "coverageCount": "1/8", + "status": "low" + }, + { + "filePath": "src/app/shared/ui/debug-state/debug-state.component.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "maskSession", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/ui/debug-state/mask.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "maskBsn", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/ui/debug-state/mask.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "maskTail", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/ui/debug-state/mask.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "redactProfile", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/ui/debug-state/mask.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "REDACTED", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, { "filePath": "src/app/shared/ui/form-field/form-field.component.ts", "type": "component", "linktype": "component", "name": "FormFieldComponent", - "coveragePercent": 20, - "coverageCount": "1/5", + "coveragePercent": 16, + "coverageCount": "1/6", "status": "low" }, { @@ -14478,6 +27429,16 @@ "coverageCount": "0/3", "status": "low" }, + { + "filePath": "src/app/shared/ui/radio-group/radio-group.component.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "JA_NEE", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/shared/ui/skeleton/skeleton.component.ts", "type": "component", @@ -14514,6 +27475,24 @@ "coverageCount": "1/3", "status": "medium" }, + { + "filePath": "src/app/shared/ui/task-list/task-list.component.ts", + "type": "component", + "linktype": "component", + "name": "TaskListComponent", + "coveragePercent": 50, + "coverageCount": "1/2", + "status": "medium" + }, + { + "filePath": "src/app/shared/ui/task-list/task-list.component.ts", + "type": "interface", + "linktype": "interface", + "name": "TaskItem", + "coveragePercent": 20, + "coverageCount": "1/5", + "status": "low" + }, { "filePath": "src/app/shared/ui/text-input/text-input.component.ts", "type": "component", @@ -14523,6 +27502,455 @@ "coverageCount": "1/14", "status": "low" }, + { + "filePath": "src/app/shared/ui/upload/delivery-channel-toggle/delivery-channel-toggle.component.ts", + "type": "component", + "linktype": "component", + "name": "DeliveryChannelToggleComponent", + "coveragePercent": 16, + "coverageCount": "1/6", + "status": "low" + }, + { + "filePath": "src/app/shared/ui/upload/document-category/document-category.component.ts", + "type": "component", + "linktype": "component", + "name": "DocumentCategoryComponent", + "coveragePercent": 15, + "coverageCount": "2/13", + "status": "low" + }, + { + "filePath": "src/app/shared/ui/upload/document-chip/document-chip.component.ts", + "type": "component", + "linktype": "component", + "name": "DocumentChipComponent", + "coveragePercent": 33, + "coverageCount": "2/6", + "status": "medium" + }, + { + "filePath": "src/app/shared/ui/upload/document-upload/document-upload.component.ts", + "type": "component", + "linktype": "component", + "name": "DocumentUploadComponent", + "coveragePercent": 18, + "coverageCount": "2/11", + "status": "low" + }, + { + "filePath": "src/app/shared/ui/upload/file-input/file-input.component.ts", + "type": "component", + "linktype": "component", + "name": "FileInputComponent", + "coveragePercent": 22, + "coverageCount": "2/9", + "status": "low" + }, + { + "filePath": "src/app/shared/ui/upload/single-upload/single-upload.component.ts", + "type": "component", + "linktype": "component", + "name": "SingleUploadComponent", + "coveragePercent": 42, + "coverageCount": "3/7", + "status": "medium" + }, + { + "filePath": "src/app/shared/ui/upload/upload-progress-bar/upload-progress-bar.component.ts", + "type": "component", + "linktype": "component", + "name": "UploadProgressBarComponent", + "coveragePercent": 33, + "coverageCount": "1/3", + "status": "medium" + }, + { + "filePath": "src/app/shared/ui/upload/upload-status-banner/upload-status-banner.component.ts", + "type": "component", + "linktype": "component", + "name": "UploadStatusBannerComponent", + "coveragePercent": 25, + "coverageCount": "1/4", + "status": "low" + }, + { + "filePath": "src/app/shared/ui/upload/upload-status-banner/upload-status-banner.component.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "AlertType", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/ui/upload/upload-status-banner/upload-status-banner.component.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "BannerType", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/ui/upload/upload-status-icon/upload-status-icon.component.ts", + "type": "component", + "linktype": "component", + "name": "UploadStatusIconComponent", + "coveragePercent": 33, + "coverageCount": "1/3", + "status": "medium" + }, + { + "filePath": "src/app/shared/ui/upload/upload-status-icon/upload-status-icon.component.ts", + "type": "interface", + "linktype": "interface", + "name": "Glyph", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload-controller.ts", + "type": "interface", + "linktype": "interface", + "name": "UploadControllerDeps", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload-controller.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "createUploadController", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/upload/upload-shell.service.ts", + "type": "injectable", + "linktype": "injectable", + "name": "KeepaliveTransport", + "coveragePercent": 0, + "coverageCount": "0/4", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload-shell.service.ts", + "type": "injectable", + "linktype": "injectable", + "name": "UploadShellService", + "coveragePercent": 62, + "coverageCount": "5/8", + "status": "good" + }, + { + "filePath": "src/app/shared/upload/upload-shell.service.ts", + "type": "interface", + "linktype": "interface", + "name": "UploadTransport", + "coveragePercent": 33, + "coverageCount": "1/3", + "status": "medium" + }, + { + "filePath": "src/app/shared/upload/upload-shell.service.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "Dispatch", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "injectable", + "linktype": "injectable", + "name": "UploadAdapter", + "coveragePercent": 71, + "coverageCount": "5/7", + "status": "good" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "interface", + "linktype": "interface", + "name": "StatusItem", + "coveragePercent": 25, + "coverageCount": "1/4", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "interface", + "linktype": "interface", + "name": "XhrUploadHandle", + "coveragePercent": 33, + "coverageCount": "1/3", + "status": "medium" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "interface", + "linktype": "interface", + "name": "XhrUploadRequest", + "coveragePercent": 0, + "coverageCount": "0/5", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "simulateUpload", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "toCategory", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "toStatusItem", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "genericError", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "parseError", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "UPLOAD_ABORTED", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/upload/upload.adapter.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "UPLOAD_FAILED", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "interface", + "linktype": "interface", + "name": "DocumentCategory", + "coveragePercent": 0, + "coverageCount": "0/9", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "interface", + "linktype": "interface", + "name": "Upload", + "coveragePercent": 0, + "coverageCount": "0/7", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "interface", + "linktype": "interface", + "name": "UploadState", + "coveragePercent": 0, + "coverageCount": "0/7", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "categorySatisfied", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "deliveryRefs", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "mapUpload", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "reduceUpload", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "rejectReason", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "function", + "linktype": "miscellaneous", + "linksubtype": "function", + "name": "requiredCategoriesSatisfied", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "ACTIVE", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "categoryOf", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "find", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "inFlight", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "initialUpload", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "REJECTION_MESSAGES", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "DeliveryChannel", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "UploadMsg", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" + }, + { + "filePath": "src/app/shared/upload/upload.machine.ts", + "type": "type alias", + "linktype": "miscellaneous", + "linksubtype": "typealias", + "name": "UploadStatus", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, { "filePath": "src/app/showcase/concepts.page.ts", "type": "component", @@ -14541,6 +27969,26 @@ "coveragePercent": 100, "coverageCount": "1/1", "status": "very-good" + }, + { + "filePath": "src/environments/environment.prod.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "environment", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" + }, + { + "filePath": "src/environments/environment.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "environment", + "coveragePercent": 100, + "coverageCount": "1/1", + "status": "very-good" } ] } diff --git a/src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.component.ts b/src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.component.ts index 05f9863..75324f8 100644 --- a/src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.component.ts +++ b/src/app/herregistratie/ui/herregistratie-wizard/herregistratie-wizard.component.ts @@ -11,6 +11,7 @@ import { WizardState, WizardMsg, Draft, initial, reduce, hasProgress } from '@he import { createDraftSync } from '@registratie/application/draft-sync'; import { DocumentUploadComponent } from '@shared/ui/upload/document-upload/document-upload.component'; import { createUploadController } from '@shared/upload/upload-controller'; +import { UploadAdapter } from '@shared/upload/upload.adapter'; import { UploadState, initialUpload, deliveryRefs } from '@shared/upload/upload.machine'; /** Organism: multi-step herregistratie wizard. ALL state lives in one signal @@ -57,6 +58,7 @@ import { UploadState, initialUpload, deliveryRefs } from '@shared/upload/upload. @case (3) { (initial, reduce); + /** Preview/download link for a completed upload; dev-simulation `demo-*` ids have + no stored bytes, so they get no link. */ + protected previewUrlFor = (documentId: string): string | undefined => + documentId.startsWith('demo-') ? undefined : this.uploadAdapter.contentUrl(documentId); + /** Optional seed so Storybook / the showcase can mount any state directly. */ seed = input(initial); 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 2dadda6..b336958 100644 --- a/src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts +++ b/src/app/registratie/ui/registratie-wizard/registratie-wizard.component.ts @@ -31,6 +31,7 @@ import { import { createDraftSync } from '@registratie/application/draft-sync'; import { DocumentUploadComponent } from '@shared/ui/upload/document-upload/document-upload.component'; import { createUploadController } from '@shared/upload/upload-controller'; +import { UploadAdapter } from '@shared/upload/upload.adapter'; import { UploadState, initialUpload, deliveryRefs } from '@shared/upload/upload.machine'; const KANALEN = [ @@ -140,6 +141,7 @@ const HANDMATIG = '__handmatig__'; // sentinel option: "my diploma isn't listed" (initial, reduce); + /** Preview/download link for a completed upload; the dev-simulation `demo-*` ids + have no stored bytes, so they get no link. */ + protected previewUrlFor = (documentId: string): string | undefined => + documentId.startsWith('demo-') ? undefined : this.uploadAdapter.contentUrl(documentId); + protected adresRes = this.brp.adresResource(); private diplomasRes = this.duo.diplomasResource(); diff --git a/src/app/shared/ui/upload/document-category/document-category.component.ts b/src/app/shared/ui/upload/document-category/document-category.component.ts index 56f5520..35fb302 100644 --- a/src/app/shared/ui/upload/document-category/document-category.component.ts +++ b/src/app/shared/ui/upload/document-category/document-category.component.ts @@ -51,6 +51,7 @@ import { SingleUploadComponent } from '../single-upload/single-upload.component' @for (u of uploads(); track u.localId) { } @@ -67,6 +68,7 @@ export class DocumentCategoryComponent { uploads = input.required(); channel = input.required(); rejection = input(); + previewUrlFor = input<(documentId: string) => string | undefined>(); /** Accessible name for the file picker, e.g. "Bestand kiezen voor Diploma". */ protected fileInputLabel = computed(() => $localize`:@@upload.fileInput.labelFor:Bestand kiezen voor ${this.category().label}:category:`); diff --git a/src/app/shared/ui/upload/document-chip/document-chip.component.ts b/src/app/shared/ui/upload/document-chip/document-chip.component.ts index 72d866a..661a782 100644 --- a/src/app/shared/ui/upload/document-chip/document-chip.component.ts +++ b/src/app/shared/ui/upload/document-chip/document-chip.component.ts @@ -29,10 +29,16 @@ import { UploadStatusIconComponent } from '../upload-status-icon/upload-status-i text-decoration: underline; } .action:hover { color: var(--rhc-color-foreground-link-hover); } + a.action { display: inline-block; } `], template: ` {{ fileName() }} + @if (previewUrl()) { + + Voorbeeld / Download + + } @if (status().type === 'failed') {