@pinuts/bsr-uikit-relaunch 0.3.8 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/config-overrides.js +1 -0
  2. package/dist/hooks/useValidationMessage.d.ts.map +1 -1
  3. package/dist/hooks/useValidationMessage.js +8 -1
  4. package/dist/hooks/withFieldGroup.d.ts.map +1 -1
  5. package/dist/hooks/withFieldGroup.js +35 -1
  6. package/dist/index.d.ts +4 -0
  7. package/dist/index.js +1 -1
  8. package/dist/items/AbholdatumMaterialienField/AbholdatumMaterialienField.d.ts +25 -0
  9. package/dist/items/AbholdatumMaterialienField/AbholdatumMaterialienField.d.ts.map +1 -0
  10. package/dist/items/AbholdatumMaterialienField/AbholdatumMaterialienField.js +77 -0
  11. package/dist/items/AbholdatumMaterialienField/getAbholTermine.d.ts +7 -0
  12. package/dist/items/AbholdatumMaterialienField/getAbholTermine.d.ts.map +1 -0
  13. package/dist/items/AbholdatumMaterialienField/getAbholTermine.js +117 -0
  14. package/dist/items/AbholortMaterialienField/AbholortMaterialienField.d.ts +26 -0
  15. package/dist/items/AbholortMaterialienField/AbholortMaterialienField.d.ts.map +1 -0
  16. package/dist/items/AbholortMaterialienField/AbholortMaterialienField.js +73 -0
  17. package/dist/items/BSRAddressSelector/BSRAddressButtons.d.ts.map +1 -1
  18. package/dist/items/BSRAddressSelector/BSRAddressButtons.js +10 -0
  19. package/dist/items/BSRAddressSelector/BSRAddressSelector.d.ts +1 -0
  20. package/dist/items/BSRAddressSelector/BSRAddressSelector.d.ts.map +1 -1
  21. package/dist/items/BSRAddressSelector/BSRAddressSelector.js +21 -2
  22. package/dist/items/BSRAddressSelector/BSRAutocompleteField.d.ts.map +1 -1
  23. package/dist/items/BSRAddressSelector/BSRAutocompleteField.js +14 -3
  24. package/dist/items/BSRAddressSelector/BSRStreetPlzSelector.d.ts.map +1 -1
  25. package/dist/items/BSRAddressSelector/BSRStreetPlzSelector.js +6 -0
  26. package/dist/items/BSRAddressSelector/HouseNumberSelectField.d.ts.map +1 -1
  27. package/dist/items/BSRAddressSelector/HouseNumberSelectField.js +5 -0
  28. package/dist/items/BootstrapInputGroupField/BootstrapInputGroupField.d.ts.map +1 -1
  29. package/dist/items/BootstrapInputGroupField/BootstrapInputGroupField.js +2 -1
  30. package/dist/items/DateInputField/DateInputField.d.ts.map +1 -1
  31. package/dist/items/DateInputField/DateInputField.js +2 -1
  32. package/dist/items/FileUploadField/FileUploadField.d.ts +4 -0
  33. package/dist/items/FileUploadField/FileUploadField.d.ts.map +1 -0
  34. package/dist/items/FileUploadField/FileUploadField.js +271 -0
  35. package/dist/items/FileUploadField/uploadedFileStore.d.ts +4 -0
  36. package/dist/items/FileUploadField/uploadedFileStore.d.ts.map +1 -0
  37. package/dist/items/FileUploadField/uploadedFileStore.js +31 -0
  38. package/dist/items/FormFieldWrapper/FormFieldChildPropTypes.d.ts +1 -0
  39. package/dist/items/FormFieldWrapper/FormFieldChildPropTypes.d.ts.map +1 -1
  40. package/dist/items/FormFieldWrapper/FormFieldChildPropTypes.js +1 -0
  41. package/dist/items/GroupInputField/GroupInputField.d.ts.map +1 -1
  42. package/dist/items/GroupInputField/GroupInputField.js +41 -4
  43. package/dist/items/Modal/Modal.d.ts.map +1 -1
  44. package/dist/items/Modal/Modal.js +6 -1
  45. package/dist/items/MultiSelectField/MultiSelectField.d.ts.map +1 -1
  46. package/dist/items/MultiSelectField/MultiSelectField.js +15 -2
  47. package/dist/items/NumberInputField/NumberInputField.d.ts.map +1 -1
  48. package/dist/items/NumberInputField/NumberInputField.js +2 -1
  49. package/dist/items/ReviewValue/ReviewValueList.d.ts +17 -0
  50. package/dist/items/ReviewValue/ReviewValueList.d.ts.map +1 -0
  51. package/dist/items/ReviewValue/ReviewValueList.js +36 -0
  52. package/dist/items/SectionSpinner/SectionSpinner.d.ts +1 -0
  53. package/dist/items/SectionSpinner/SectionSpinner.d.ts.map +1 -1
  54. package/dist/items/SelectField/SelectField.d.ts.map +1 -1
  55. package/dist/items/SelectField/SelectField.js +3 -2
  56. package/dist/items/StaticAlert/StaticAlert.d.ts +1 -0
  57. package/dist/items/StaticAlert/StaticAlert.d.ts.map +1 -1
  58. package/dist/items/TextAreaField/TextAreaField.d.ts.map +1 -1
  59. package/dist/items/TextAreaField/TextAreaField.js +8 -0
  60. package/dist/items/TextBox/TextBox.d.ts +1 -0
  61. package/dist/items/TextBox/TextBox.d.ts.map +1 -1
  62. package/dist/items/TextBox/TextBox.js +11 -2
  63. package/dist/items/TextInputField/TextInputField.d.ts.map +1 -1
  64. package/dist/items/TextInputField/TextInputField.js +8 -1
  65. package/dist/items/Toast/Toast.d.ts +1 -0
  66. package/dist/items/Toast/Toast.d.ts.map +1 -1
  67. package/dist/items/ToggleSwitchField/ToggleSwitchField.d.ts.map +1 -1
  68. package/dist/items/ToggleSwitchField/ToggleSwitchField.js +2 -1
  69. package/dist/items/index.d.ts +4 -1
  70. package/dist/items/index.d.ts.map +1 -1
  71. package/dist/items/index.js +22 -1
  72. package/dist/items/validations.d.ts.map +1 -0
  73. package/dist/items/validations.js +27 -0
  74. package/dist/locales.d.ts +73 -2
  75. package/dist/locales.js +64 -0
  76. package/dist/shared/ErrorMessagesInfoBox/ErrorMessagesInfoBox.d.ts +16 -0
  77. package/dist/shared/ErrorMessagesInfoBox/ErrorMessagesInfoBox.d.ts.map +1 -0
  78. package/dist/shared/ErrorMessagesInfoBox/ErrorMessagesInfoBox.js +144 -0
  79. package/dist/shared/FormWidget/FormWidget.d.ts +30 -0
  80. package/dist/shared/FormWidget/FormWidget.d.ts.map +1 -0
  81. package/dist/shared/FormWidget/FormWidget.js +165 -0
  82. package/dist/shared/FormWidget/FormWidgetControlPage.d.ts +29 -0
  83. package/dist/shared/FormWidget/FormWidgetControlPage.d.ts.map +1 -0
  84. package/dist/shared/FormWidget/FormWidgetControlPage.js +84 -0
  85. package/dist/shared/FormWidget/FormWidgetFormPage.d.ts +26 -0
  86. package/dist/shared/FormWidget/FormWidgetFormPage.d.ts.map +1 -0
  87. package/dist/shared/FormWidget/FormWidgetFormPage.js +55 -0
  88. package/dist/shared/FormWidget/FormWidgetMessagePage.d.ts +20 -0
  89. package/dist/shared/FormWidget/FormWidgetMessagePage.d.ts.map +1 -0
  90. package/dist/shared/FormWidget/FormWidgetMessagePage.js +37 -0
  91. package/dist/shared/FormWidget/captions.d.ts +33 -0
  92. package/dist/shared/FormWidget/captions.d.ts.map +1 -0
  93. package/dist/shared/FormWidget/captions.js +43 -0
  94. package/dist/shared/KehrenbuergerForm/KehrenbuergerForm.d.ts +23 -0
  95. package/dist/shared/KehrenbuergerForm/KehrenbuergerForm.d.ts.map +1 -0
  96. package/dist/shared/KehrenbuergerForm/KehrenbuergerForm.js +173 -0
  97. package/dist/styles/_errorMessagesInfoBox.scss +42 -0
  98. package/dist/styles/_form.scss +9 -0
  99. package/dist/styles/_review.scss +29 -0
  100. package/dist/styles/main.scss +62 -49
  101. package/dist/styles/variables/_buttons.scss +4 -3
  102. package/dist/styles/variables/_variables.scss +15 -2
  103. package/dist/utils/files/convertFilesToUploadFiles.d.ts +8 -0
  104. package/dist/utils/files/convertFilesToUploadFiles.d.ts.map +1 -0
  105. package/dist/utils/files/convertFilesToUploadFiles.js +33 -0
  106. package/dist/utils/files/formatFileSize.d.ts +3 -0
  107. package/dist/utils/files/formatFileSize.d.ts.map +1 -0
  108. package/dist/utils/files/formatFileSize.js +44 -0
  109. package/dist/utils/files/generateUniqueFilename.d.ts +3 -0
  110. package/dist/utils/files/generateUniqueFilename.d.ts.map +1 -0
  111. package/dist/utils/files/generateUniqueFilename.js +32 -0
  112. package/dist/utils/files/index.d.ts +7 -0
  113. package/dist/utils/files/index.d.ts.map +1 -0
  114. package/dist/utils/files/index.js +71 -0
  115. package/dist/utils/files/validateFiles.d.ts +9 -0
  116. package/dist/utils/files/validateFiles.d.ts.map +1 -0
  117. package/dist/utils/files/validateFiles.js +28 -0
  118. package/dist/utils/files/validateFilesBySize.d.ts +6 -0
  119. package/dist/utils/files/validateFilesBySize.d.ts.map +1 -0
  120. package/dist/utils/files/validateFilesBySize.js +31 -0
  121. package/dist/utils/files/validateFilesByType.d.ts +9 -0
  122. package/dist/utils/files/validateFilesByType.d.ts.map +1 -0
  123. package/dist/utils/files/validateFilesByType.js +79 -0
  124. package/dist/utils/index.d.ts +1 -0
  125. package/dist/utils/index.js +11 -0
  126. package/dist/utils/reviewValue.d.ts +3 -0
  127. package/dist/utils/reviewValue.d.ts.map +1 -0
  128. package/dist/utils/reviewValue.js +16 -0
  129. package/package.json +1 -1
  130. package/webpack.config.js +3 -0
  131. package/dist/items/eventWizardItems/validations.d.ts.map +0 -1
  132. package/dist/items/eventWizardItems/validations.js +0 -7
  133. /package/dist/items/{eventWizardItems/validations.d.ts → validations.d.ts} +0 -0
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactI18next = require("react-i18next");
9
+ var _formBuilder = require("@pinuts/form-builder");
10
+ var _FormFieldChildPropTypes = _interopRequireDefault(require("../FormFieldWrapper/FormFieldChildPropTypes.jsx"));
11
+ var _FormFieldWrapper = _interopRequireDefault(require("../FormFieldWrapper/FormFieldWrapper.jsx"));
12
+ var _withFieldGroup = _interopRequireDefault(require("../../hooks/withFieldGroup.jsx"));
13
+ var _Close = _interopRequireDefault(require("../../icons/Close.jsx"));
14
+ var _formatFileSize = require("../../utils/files/formatFileSize.js");
15
+ var _validateFiles = require("../../utils/files/validateFiles.js");
16
+ var _ReviewValueList = _interopRequireDefault(require("../ReviewValue/ReviewValueList.jsx"));
17
+ var _uploadedFileStore = require("./uploadedFileStore.js");
18
+ var _FileUploadFieldModule = _interopRequireDefault(require("./FileUploadField.module.scss"));
19
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
21
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
22
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } // form-builder
23
+ const {
24
+ getClassNames
25
+ } = _formBuilder.utils;
26
+ const UNLIMITED_FILES = -1;
27
+ const UPLOAD_ERROR = 'uploadError';
28
+
29
+ // accept darf in der Config auch als Liste stehen ([".pdf", ".png"])
30
+ const normalizeAccept = accept => Array.isArray(accept) ? accept.join(',') : accept;
31
+ const FileUploadField = _ref => {
32
+ let {
33
+ className,
34
+ inputProps = {},
35
+ value,
36
+ onChange = () => {},
37
+ ariaAttributes,
38
+ field = {},
39
+ fieldIds,
40
+ isInvalid,
41
+ readOnly,
42
+ disabled,
43
+ viewMode,
44
+ reviewMode,
45
+ // Ziel-URL des Uploads. Ohne sie kann nicht hochgeladen werden.
46
+ uploadUrl,
47
+ // 1 = eine Datei, -1 = beliebig viele, > 1 = höchstens so viele
48
+ numFiles = 1,
49
+ accept,
50
+ // Maximale Dateigröße in Bytes. maxFileSize ist der Name in der FormConfig,
51
+ // maxSize der aus der Kehrenbürger-App - beide sind erlaubt.
52
+ maxSize,
53
+ maxFileSize: maxFileSizeConfig,
54
+ buttonText = 'bsrItems.fileUploadField.buttonText',
55
+ uploadBtnText = 'bsrItems.fileUploadField.uploadBtn',
56
+ placeholder = 'bsrItems.fileUploadField.placeholder'
57
+ } = _ref;
58
+ const [t] = (0, _reactI18next.useTranslation)();
59
+ const fileInputRef = (0, _react.useRef)(null);
60
+ const readyForUploadRef = (0, _react.useRef)(null);
61
+
62
+ // Datei ist ausgewählt, aber noch nicht hochgeladen
63
+ const [pendingFile, setPendingFile] = (0, _react.useState)(null);
64
+ const [isUploading, setIsUploading] = (0, _react.useState)(false);
65
+ const [errorMsg, setErrorMsg] = (0, _react.useState)('');
66
+ const [feedbackMsg, setFeedbackMsg] = (0, _react.useState)('');
67
+
68
+ // field.name (der Config-Key) ist über Remounts stabil und trägt den Store.
69
+ // Die Basic-Variante ohne FormFieldWrapper hat kein field.name - dann auf die
70
+ // eindeutige fieldId ausweichen, damit sich mehrere Felder nicht überschreiben.
71
+ const fieldKey = field.name || fieldIds?.fieldId;
72
+ const usedViewMode = readOnly || disabled || viewMode;
73
+ const usedAccept = normalizeAccept(accept);
74
+ const maxFileSize = Number(maxSize ?? maxFileSizeConfig) || undefined;
75
+ const maxFiles = numFiles === UNLIMITED_FILES ? Infinity : Math.max(Number(numFiles) || 1, 1);
76
+
77
+ // Der Formularwert sind die Ticket-Ids; Name/Größe kommen aus dem Store dazu
78
+ const tickets = (0, _react.useMemo)(() => Array.isArray(value) ? value : [], [value]);
79
+ const files = (0, _react.useMemo)(() => tickets.map(ticket => (0, _uploadedFileStore.getUploadedFile)(fieldKey, ticket)), [tickets, fieldKey]);
80
+ const announce = (0, _react.useCallback)((error, feedback) => {
81
+ setErrorMsg(error || '');
82
+ setFeedbackMsg(feedback || '');
83
+ }, []);
84
+ const onFileSelect = (0, _react.useCallback)(event => {
85
+ const selectedFile = event.target.files?.[0];
86
+
87
+ // gleiche Datei soll erneut auswählbar sein
88
+ event.target.value = '';
89
+ if (!selectedFile) {
90
+ return;
91
+ }
92
+ if (files.length >= maxFiles) {
93
+ announce(t('bsrItems.fileUploadField.errors.uploadNumFiles', {
94
+ numFiles: maxFiles
95
+ }));
96
+ return;
97
+ }
98
+ if (files.some(file => file.name === selectedFile.name)) {
99
+ announce(t('bsrItems.fileUploadField.errors.uploadDuplicateFilename', {
100
+ filename: selectedFile.name
101
+ }));
102
+ return;
103
+ }
104
+ const {
105
+ rejectedFiles
106
+ } = (0, _validateFiles.validateFiles)([selectedFile], {
107
+ accept: usedAccept,
108
+ maxFileSize
109
+ });
110
+ if (rejectedFiles.length) {
111
+ const isSizeError = rejectedFiles[0].reason === 'size';
112
+ announce(t(isSizeError ? 'bsrItems.fileUploadField.errors.uploadFileTooLarge' : 'bsrItems.fileUploadField.errors.uploadInvalidType', {
113
+ filename: selectedFile.name,
114
+ maxSize: (0, _formatFileSize.formatFileSize)(maxFileSize),
115
+ accept: usedAccept
116
+ }));
117
+ return;
118
+ }
119
+ announce();
120
+ setPendingFile(selectedFile);
121
+ readyForUploadRef.current?.focus();
122
+ }, [announce, files, maxFileSize, maxFiles, t, usedAccept]);
123
+ const uploadPendingFile = (0, _react.useCallback)(async () => {
124
+ if (!pendingFile || isUploading) {
125
+ return;
126
+ }
127
+ if (!uploadUrl) {
128
+ announce(t(`bsrItems.fileUploadField.errors.${UPLOAD_ERROR}`));
129
+ return;
130
+ }
131
+ setIsUploading(true);
132
+ announce('', t('bsrItems.fileUploadField.isUploading', {
133
+ filename: pendingFile.name
134
+ }));
135
+ const formData = new FormData();
136
+ formData.append('attrName', fieldKey);
137
+ formData.append('file', pendingFile);
138
+ try {
139
+ // Content-Type setzt der Browser selbst, inklusive multipart-boundary
140
+ const response = await fetch(uploadUrl, {
141
+ method: 'POST',
142
+ headers: {
143
+ 'X-CSRF-Safe': 'yes'
144
+ },
145
+ body: formData
146
+ });
147
+ const json = await response.json().catch(() => undefined);
148
+ const uploadedFile = json?.data?.file;
149
+ if (!json?.success || !uploadedFile?.ticket) {
150
+ const errorCode = json?.data?.error || UPLOAD_ERROR;
151
+
152
+ // Server meldet "zu groß", aber ohne konfiguriertes Limit kennen wir
153
+ // die Grenze nicht - dann die Variante ohne "maximal 0 B" nutzen.
154
+ const messageKey = errorCode === 'uploadFileTooLarge' && !maxFileSize ? 'uploadFileTooLargeNoLimit' : errorCode;
155
+ announce(t(`bsrItems.fileUploadField.errors.${messageKey}`, {
156
+ filename: pendingFile.name,
157
+ maxSize: maxFileSize ? (0, _formatFileSize.formatFileSize)(maxFileSize) : '',
158
+ accept: usedAccept
159
+ }));
160
+ return;
161
+ }
162
+ (0, _uploadedFileStore.rememberUploadedFile)(fieldKey, {
163
+ ticket: uploadedFile.ticket,
164
+ name: uploadedFile.name || pendingFile.name,
165
+ size: uploadedFile.size ?? pendingFile.size
166
+ });
167
+ onChange([...tickets, uploadedFile.ticket]);
168
+ announce('', t('bsrItems.fileUploadField.uploadSuccessful', {
169
+ filename: pendingFile.name
170
+ }));
171
+ setPendingFile(null);
172
+ } catch {
173
+ announce(t(`bsrItems.fileUploadField.errors.${UPLOAD_ERROR}`, {
174
+ filename: pendingFile.name
175
+ }));
176
+ } finally {
177
+ setIsUploading(false);
178
+ }
179
+ }, [announce, fieldKey, isUploading, maxFileSize, onChange, pendingFile, t, tickets, uploadUrl, usedAccept]);
180
+ const removeFile = (0, _react.useCallback)(ticket => {
181
+ const removed = (0, _uploadedFileStore.getUploadedFile)(fieldKey, ticket);
182
+ (0, _uploadedFileStore.forgetUploadedFile)(fieldKey, ticket);
183
+ onChange(tickets.filter(entry => entry !== ticket));
184
+ announce('', t('bsrItems.fileUploadField.fileRemoved', {
185
+ filename: removed.name
186
+ }));
187
+ }, [announce, fieldKey, onChange, t, tickets]);
188
+ const fileList = files.length ? /*#__PURE__*/_react.default.createElement("ul", {
189
+ className: _FileUploadFieldModule.default.fileList,
190
+ "aria-label": t('bsrItems.fileUploadField.fileListLabel')
191
+ }, files.map((file, index) => /*#__PURE__*/_react.default.createElement("li", {
192
+ key: file.ticket,
193
+ className: _FileUploadFieldModule.default.fileItem,
194
+ "aria-setsize": files.length,
195
+ "aria-posinset": index + 1
196
+ }, /*#__PURE__*/_react.default.createElement("span", {
197
+ className: _FileUploadFieldModule.default.fileInfo
198
+ }, `${file.name} (${(0, _formatFileSize.formatFileSize)(file.size)})`), !usedViewMode && /*#__PURE__*/_react.default.createElement("button", {
199
+ type: "button",
200
+ className: _FileUploadFieldModule.default.removeButton,
201
+ onClick: () => removeFile(file.ticket),
202
+ title: t('bsrItems.fileUploadField.removeFile'),
203
+ "aria-label": t('bsrItems.fileUploadField.removeFileAria', {
204
+ filename: file.name
205
+ })
206
+ }, /*#__PURE__*/_react.default.createElement(_Close.default, {
207
+ width: 20,
208
+ height: 20,
209
+ fill: 'currentColor',
210
+ stroke: 'currentColor',
211
+ "aria-hidden": "true"
212
+ }))))) : /*#__PURE__*/_react.default.createElement("span", {
213
+ className: _FileUploadFieldModule.default.placeholder
214
+ }, t(placeholder));
215
+ if (viewMode) {
216
+ return fileList;
217
+ }
218
+ if (reviewMode) {
219
+ return /*#__PURE__*/_react.default.createElement(_ReviewValueList.default, {
220
+ items: files.map(file => `${file.name} (${(0, _formatFileSize.formatFileSize)(file.size)})`)
221
+ });
222
+ }
223
+ return /*#__PURE__*/_react.default.createElement("div", {
224
+ className: getClassNames([_FileUploadFieldModule.default.uploadContainer, isInvalid && _FileUploadFieldModule.default.isInvalid, usedViewMode && _FileUploadFieldModule.default.isDisabled, className]),
225
+ role: "group",
226
+ "aria-label": t('bsrItems.fileUploadField.groupLabel')
227
+ }, fileList, !usedViewMode && files.length < maxFiles && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("button", {
228
+ type: "button",
229
+ className: getClassNames(['btn', 'btn-white', _FileUploadFieldModule.default.uploadButton]),
230
+ onClick: () => fileInputRef.current?.click()
231
+ }, t(buttonText)), /*#__PURE__*/_react.default.createElement("input", _extends({}, ariaAttributes, inputProps, {
232
+ ref: fileInputRef,
233
+ id: fieldIds?.fieldId,
234
+ type: "file",
235
+ className: _FileUploadFieldModule.default.uploadInput,
236
+ accept: usedAccept,
237
+ onChange: onFileSelect,
238
+ readOnly: false,
239
+ disabled: false
240
+ }))), pendingFile && !usedViewMode && /*#__PURE__*/_react.default.createElement("div", {
241
+ className: _FileUploadFieldModule.default.readyForUpload,
242
+ ref: readyForUploadRef,
243
+ tabIndex: -1
244
+ }, /*#__PURE__*/_react.default.createElement("span", {
245
+ className: _FileUploadFieldModule.default.fileInfo
246
+ }, t('bsrItems.fileUploadField.readyForUpload', {
247
+ filename: pendingFile.name
248
+ })), /*#__PURE__*/_react.default.createElement("button", {
249
+ type: "button",
250
+ className: getClassNames(['btn', 'btn-orange']),
251
+ onClick: uploadPendingFile,
252
+ disabled: isUploading
253
+ }, t(uploadBtnText))), errorMsg && /*#__PURE__*/_react.default.createElement("div", {
254
+ className: _FileUploadFieldModule.default.rejectionMessage
255
+ }, errorMsg), !errorMsg && feedbackMsg && /*#__PURE__*/_react.default.createElement("div", {
256
+ className: _FileUploadFieldModule.default.feedbackMessage
257
+ }, feedbackMsg), /*#__PURE__*/_react.default.createElement("div", {
258
+ role: "status",
259
+ "aria-live": "polite",
260
+ "aria-atomic": "true",
261
+ className: _FileUploadFieldModule.default.srOnly
262
+ }, errorMsg || feedbackMsg));
263
+ };
264
+ FileUploadField.propTypes = {
265
+ ..._FormFieldChildPropTypes.default
266
+ };
267
+ const HigherOrderFileUploadField = (0, _withFieldGroup.default)(FileUploadField);
268
+ const WrappedFileUploadField = props => /*#__PURE__*/_react.default.createElement(_FormFieldWrapper.default, props, /*#__PURE__*/_react.default.createElement(HigherOrderFileUploadField, props));
269
+ (0, _formBuilder.registerComponent)('FileUploadField', WrappedFileUploadField);
270
+ (0, _formBuilder.registerComponent)('FileUploadFieldBasic', HigherOrderFileUploadField);
271
+ var _default = exports.default = HigherOrderFileUploadField;
@@ -0,0 +1,4 @@
1
+ export function rememberUploadedFile(fieldKey: any, file: any): void;
2
+ export function forgetUploadedFile(fieldKey: any, ticket: any): void;
3
+ export function getUploadedFile(fieldKey: any, ticket: any): any;
4
+ //# sourceMappingURL=uploadedFileStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadedFileStore.d.ts","sourceRoot":"","sources":["../../../src/items/FileUploadField/uploadedFileStore.js"],"names":[],"mappings":"AAaO,qEAEN;AAEM,qEAEN;AAEM,iEACiC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.rememberUploadedFile = exports.getUploadedFile = exports.forgetUploadedFile = void 0;
7
+ /**
8
+ * Der Formularwert eines FileUploadField ist nur die Liste der Ticket-Ids, die der
9
+ * Server beim Upload zurückgibt - Name und Größe der Datei stehen nicht darin.
10
+ * Für die Anzeige (auch auf einer Kontrollseite, die den FormBuilder neu mountet)
11
+ * werden diese Metadaten hier zum Ticket gemerkt.
12
+ *
13
+ * Lebensdauer ist der Seitenaufruf: nach einem Reload sind die Metadaten weg, die
14
+ * Tickets im Formularwert bleiben gültig.
15
+ */
16
+ const uploadedFiles = new Map();
17
+ const storeKey = (fieldKey, ticket) => `${fieldKey}:${ticket}`;
18
+ const rememberUploadedFile = (fieldKey, file) => {
19
+ uploadedFiles.set(storeKey(fieldKey, file.ticket), file);
20
+ };
21
+ exports.rememberUploadedFile = rememberUploadedFile;
22
+ const forgetUploadedFile = (fieldKey, ticket) => {
23
+ uploadedFiles.delete(storeKey(fieldKey, ticket));
24
+ };
25
+ exports.forgetUploadedFile = forgetUploadedFile;
26
+ const getUploadedFile = (fieldKey, ticket) => uploadedFiles.get(storeKey(fieldKey, ticket)) || {
27
+ ticket,
28
+ name: ticket,
29
+ size: 0
30
+ };
31
+ exports.getUploadedFile = getUploadedFile;
@@ -37,6 +37,7 @@ declare namespace FormFieldChildPropTypes {
37
37
  let readOnly: PropTypes.Requireable<boolean>;
38
38
  let disabled: PropTypes.Requireable<boolean>;
39
39
  let viewMode: PropTypes.Requireable<boolean>;
40
+ let reviewMode: PropTypes.Requireable<boolean>;
40
41
  let stepId: PropTypes.Requireable<string>;
41
42
  let hideEmptyValues: PropTypes.Requireable<boolean>;
42
43
  let key: PropTypes.Requireable<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"FormFieldChildPropTypes.d.ts","sourceRoot":"","sources":["../../../src/items/FormFieldWrapper/FormFieldChildPropTypes.jsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAAsB,YAAY"}
1
+ {"version":3,"file":"FormFieldChildPropTypes.d.ts","sourceRoot":"","sources":["../../../src/items/FormFieldWrapper/FormFieldChildPropTypes.jsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAAsB,YAAY"}
@@ -52,6 +52,7 @@ const FormFieldChildPropTypes = {
52
52
  readOnly: _propTypes.default.bool,
53
53
  disabled: _propTypes.default.bool,
54
54
  viewMode: _propTypes.default.bool,
55
+ reviewMode: _propTypes.default.bool,
55
56
  stepId: _propTypes.default.string,
56
57
  hideEmptyValues: _propTypes.default.bool,
57
58
  // DAS KOMMT AUS DEN PROPS DER KOMPONENTE
@@ -1 +1 @@
1
- {"version":3,"file":"GroupInputField.d.ts","sourceRoot":"","sources":["../../../src/items/GroupInputField/GroupInputField.jsx"],"names":[],"mappings":";AAqKA,uEAMC;kBA3KiB,OAAO"}
1
+ {"version":3,"file":"GroupInputField.d.ts","sourceRoot":"","sources":["../../../src/items/GroupInputField/GroupInputField.jsx"],"names":[],"mappings":";AAsMA,uEAMC;kBA5MiB,OAAO"}
@@ -14,6 +14,8 @@ var _FormFieldWrapper = _interopRequireDefault(require("../FormFieldWrapper/Form
14
14
  var _withFieldGroup = _interopRequireDefault(require("../../hooks/withFieldGroup.jsx"));
15
15
  var _getUikitClassNames = require("../../utils/getUikitClassNames.js");
16
16
  var _HTMLParserSanitized = require("../HTMLParserSanitized/HTMLParserSanitized.jsx");
17
+ var _ReviewValueList = _interopRequireDefault(require("../ReviewValue/ReviewValueList.jsx"));
18
+ var _reviewValue = require("../../utils/reviewValue.js");
17
19
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
20
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } /* eslint-disable jsx-a11y/role-supports-aria-props */ // form-builder
19
21
  // components
@@ -21,12 +23,23 @@ const {
21
23
  getClassNames
22
24
  } = _formBuilder.utils;
23
25
  const getIsSelected = (value, opt) => Array.isArray(value) ? value.includes(opt.value) : value === opt.value;
24
- const GroupInputField = _ref => {
26
+
27
+ // Eine Gruppe mit genau einer Checkbox ist ein Ja/Nein-Feld
28
+ const isSingleCheckbox = _ref => {
29
+ let {
30
+ multipleChoice = true,
31
+ options
32
+ } = _ref;
33
+ return multipleChoice && options?.length === 1;
34
+ };
35
+ const GroupInputField = _ref2 => {
25
36
  let {
26
37
  viewMode,
38
+ reviewMode,
27
39
  readOnly,
28
40
  inputProps = {},
29
41
  field = {},
42
+ label,
30
43
  options,
31
44
  skipOptions,
32
45
  inline,
@@ -38,7 +51,7 @@ const GroupInputField = _ref => {
38
51
  isInvalid,
39
52
  disabled,
40
53
  helpText
41
- } = _ref;
54
+ } = _ref2;
42
55
  const [t] = (0, _reactI18next.useTranslation)();
43
56
  const inputOptions = (0, _useGetOptionList.default)(options, emptyOptionLabel, skipOptions);
44
57
  const inputClassNames = (0, _getUikitClassNames.getInputClassNames)(isInvalid, readOnly, disabled, inputProps.className, [['input']]);
@@ -59,8 +72,30 @@ const GroupInputField = _ref => {
59
72
  let label = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
60
73
  return !label.includes(':') && !label.includes('<') ? t(label) : label;
61
74
  };
75
+ const selectedLabels = inputOptions.filter(opt => getIsSelected(value, opt)).map(opt => translateLabel(opt.label));
62
76
  if (viewMode) {
63
- return /*#__PURE__*/_react.default.createElement(_HTMLParserSanitized.HTMLParserSanitized, null, inputOptions.filter(opt => getIsSelected(value, opt)).map(opt => translateLabel(opt.label)).join(', '));
77
+ return /*#__PURE__*/_react.default.createElement(_HTMLParserSanitized.HTMLParserSanitized, null, selectedLabels.join(', '));
78
+ }
79
+ if (reviewMode) {
80
+ // Einzelne Checkbox: Ja/Nein statt der Options-Beschriftung
81
+ if (isSingleCheckbox({
82
+ multipleChoice,
83
+ options
84
+ })) {
85
+ if (!selectedLabels.length) {
86
+ return t('bsrItems.review.no');
87
+ }
88
+ const optionLabel = selectedLabels[0];
89
+ const yes = t('bsrItems.review.yes');
90
+
91
+ // Den Options-Text nur ergänzen, wenn er nicht ohnehin das Feld-Label wiederholt
92
+ return optionLabel && optionLabel !== translateLabel(label || '') ? /*#__PURE__*/_react.default.createElement(_HTMLParserSanitized.HTMLParserSanitized, null, `${yes} – ${optionLabel}`) : yes;
93
+ }
94
+
95
+ // Mehrfachauswahl als Liste, Einzelauswahl als einfacher Text
96
+ return multipleChoice ? /*#__PURE__*/_react.default.createElement(_ReviewValueList.default, {
97
+ items: selectedLabels
98
+ }) : /*#__PURE__*/_react.default.createElement(_HTMLParserSanitized.HTMLParserSanitized, null, selectedLabels.join(''));
64
99
  }
65
100
  const ariaDescribedBy = [helpText && fieldIds.helpText, isInvalid && fieldIds.errorMessage].filter(Boolean).join(' ');
66
101
  return /*#__PURE__*/_react.default.createElement("div", null, inputOptions.length ? /*#__PURE__*/_react.default.createElement("ul", {
@@ -111,7 +146,9 @@ GroupInputField.propTypes = {
111
146
  };
112
147
  GroupInputField.formFieldConfig = {
113
148
  labelIsLegend: true,
114
- isFieldset: true
149
+ isFieldset: true,
150
+ // Eine nicht angehakte Checkbox ist kein leerer Wert, sondern ein "Nein"
151
+ isEmptyReviewValue: (value, props) => isSingleCheckbox(props) ? false : (0, _reviewValue.isEmptyReviewValue)(value)
115
152
  };
116
153
  const HigherOrderGroupInputField = (0, _withFieldGroup.default)(GroupInputField);
117
154
 
@@ -1 +1 @@
1
- {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/items/Modal/Modal.jsx"],"names":[],"mappings":";AAcA;;;;;;;;;;;kCAsGC;;;;;;;;;;;;;;;;;;;;;;;;;kBApHiB,OAAO;sBACH,YAAY"}
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/items/Modal/Modal.jsx"],"names":[],"mappings":";AAcA;;;;;;;;;;;kCA0GC;;;;;;;;;;;;;;;;;;;;;;;;;kBAxHiB,OAAO;sBACH,YAAY"}
@@ -44,7 +44,12 @@ const Modal = (_ref, props) => {
44
44
  'aria-labelledby': uniqueId.fieldId
45
45
  }, {
46
46
  centered: true,
47
- onEscapeKeyDown: noClose ? undefined : onHide,
47
+ onEscapeKeyDown: noClose ? undefined : onHide
48
+ // react-bootstrap renders the Modal in a portal on document.body,
49
+ // which escapes the consumer's `.bsr-uikit` wrapper. Adding the
50
+ // class here ensures the portaled dialog is still scoped/styled.
51
+ ,
52
+ dialogClassName: "bsr-uikit",
48
53
  className: _ModalModule.default.modalOuter,
49
54
  backdrop: "static",
50
55
  role: isAlert ? ' ' : 'dialog'
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelectField.d.ts","sourceRoot":"","sources":["../../../src/items/MultiSelectField/MultiSelectField.jsx"],"names":[],"mappings":";AAuOA,wEAMC;kBA7OqD,OAAO"}
1
+ {"version":3,"file":"MultiSelectField.d.ts","sourceRoot":"","sources":["../../../src/items/MultiSelectField/MultiSelectField.jsx"],"names":[],"mappings":";AAiPA,wEAMC;kBAvPqD,OAAO"}
@@ -14,6 +14,7 @@ var _index = require("../../utils/index.js");
14
14
  var _FormFieldChildPropTypes = _interopRequireDefault(require("../FormFieldWrapper/FormFieldChildPropTypes.jsx"));
15
15
  var _FormFieldWrapper = _interopRequireDefault(require("../FormFieldWrapper/FormFieldWrapper.jsx"));
16
16
  var _withFieldGroup = _interopRequireDefault(require("../../hooks/withFieldGroup.jsx"));
17
+ var _ReviewValueList = _interopRequireDefault(require("../ReviewValue/ReviewValueList.jsx"));
17
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
19
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
19
20
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -40,6 +41,7 @@ const MultiSelectField = _ref => {
40
41
  readOnly,
41
42
  disabled,
42
43
  viewMode,
44
+ reviewMode,
43
45
  ariaAttributes = {},
44
46
  allowCustom,
45
47
  dark,
@@ -99,6 +101,13 @@ const MultiSelectField = _ref => {
99
101
  if (viewMode) {
100
102
  return selectedOptions.map(opt => translateLabel(opt.label)).join(', ');
101
103
  }
104
+
105
+ // Mehrfachauswahl: in der Review als Liste, damit Screenreader die Einträge einzeln ansagen
106
+ if (reviewMode) {
107
+ return /*#__PURE__*/_react.default.createElement(_ReviewValueList.default, {
108
+ items: selectedOptions.map(opt => translateLabel(opt.label))
109
+ });
110
+ }
102
111
  const wrapperClassNames = (0, _index.getFormControlClassNames)(isInvalid, readOnly, disabled, className, ['multiSelectField', dark && 'dark', field.className].filter(Boolean));
103
112
  return /*#__PURE__*/_react.default.createElement(_react2.ComboboxProvider, {
104
113
  value: searchInput,
@@ -134,8 +143,12 @@ const MultiSelectField = _ref => {
134
143
  })), !disableDropdown && filteredOptions.length > 0 && /*#__PURE__*/_react.default.createElement(_react2.ComboboxPopover, {
135
144
  portal: true,
136
145
  sameWidth: true,
137
- gutter: 4,
138
- className: "multiSelectFieldPopover"
146
+ gutter: 4
147
+ // ariakit renders the popover in a portal on document.body,
148
+ // which escapes the consumer's `.bsr-uikit` wrapper. Adding
149
+ // the class here keeps the portaled dropdown scoped/styled.
150
+ ,
151
+ className: "bsr-uikit multiSelectFieldPopover"
139
152
  }, filteredOptions.map(opt => /*#__PURE__*/_react.default.createElement(_react2.ComboboxItem, {
140
153
  key: opt.value,
141
154
  value: opt.value,
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInputField.d.ts","sourceRoot":"","sources":["../../../src/items/NumberInputField/NumberInputField.jsx"],"names":[],"mappings":";AAkLA,6EAAqE;kBAjLJ,OAAO"}
1
+ {"version":3,"file":"NumberInputField.d.ts","sourceRoot":"","sources":["../../../src/items/NumberInputField/NumberInputField.jsx"],"names":[],"mappings":";AAmLA,6EAAqE;kBAlLJ,OAAO"}
@@ -46,6 +46,7 @@ const NumberInputField = _ref => {
46
46
  readOnly,
47
47
  disabled,
48
48
  viewMode,
49
+ reviewMode,
49
50
  step = 1,
50
51
  min = 0,
51
52
  max = 1000,
@@ -74,7 +75,7 @@ const NumberInputField = _ref => {
74
75
  usedChangeHandler(parseFloat(numberValue, 10) - parseFloat(step, 10));
75
76
  }, [numberValue, usedChangeHandler, step]);
76
77
  const handleInputChange = event => usedChangeHandler(event.target.value);
77
- if (viewMode) {
78
+ if (viewMode || reviewMode) {
78
79
  return numberValue;
79
80
  }
80
81
  const formControlClassNames = (0, _getUikitClassNames.getFormControlClassNames)(isInvalid, readOnly, disabled, className);
@@ -0,0 +1,17 @@
1
+ export default ReviewValueList;
2
+ /**
3
+ * Mehrfachwerte in der Review (Checkbox-Gruppen, MultiSelect, hochgeladene Dateien).
4
+ * Als Liste ausgezeichnet, damit Screenreader die Anzahl der Einträge ansagen und
5
+ * jeder Wert einzeln angesteuert werden kann.
6
+ */
7
+ declare function ReviewValueList({ items }: {
8
+ items: any;
9
+ }): React.JSX.Element;
10
+ declare namespace ReviewValueList {
11
+ namespace propTypes {
12
+ let items: PropTypes.Requireable<NonNullable<string | number>[]>;
13
+ }
14
+ }
15
+ import React from 'react';
16
+ import PropTypes from 'prop-types';
17
+ //# sourceMappingURL=ReviewValueList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReviewValueList.d.ts","sourceRoot":"","sources":["../../../src/items/ReviewValue/ReviewValueList.jsx"],"names":[],"mappings":";AAIA;;;;GAIG;AACH;;sBAgBC;;;;;;kBAzBiB,OAAO;sBACH,YAAY"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _HTMLParserSanitized = require("../HTMLParserSanitized/HTMLParserSanitized.jsx");
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ /**
12
+ * Mehrfachwerte in der Review (Checkbox-Gruppen, MultiSelect, hochgeladene Dateien).
13
+ * Als Liste ausgezeichnet, damit Screenreader die Anzahl der Einträge ansagen und
14
+ * jeder Wert einzeln angesteuert werden kann.
15
+ */
16
+ const ReviewValueList = _ref => {
17
+ let {
18
+ items
19
+ } = _ref;
20
+ if (!items?.length) {
21
+ return null;
22
+ }
23
+ return /*#__PURE__*/_react.default.createElement("ul", {
24
+ className: "pi-review-values"
25
+ }, items.map((item, index) =>
26
+ /*#__PURE__*/
27
+ // Werte können sich wiederholen (gleiche Label-Texte), daher Index im Key
28
+ // eslint-disable-next-line react/no-array-index-key
29
+ _react.default.createElement("li", {
30
+ key: `${index}-${item}`
31
+ }, /*#__PURE__*/_react.default.createElement(_HTMLParserSanitized.HTMLParserSanitized, null, String(item)))));
32
+ };
33
+ ReviewValueList.propTypes = {
34
+ items: _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]))
35
+ };
36
+ var _default = exports.default = ReviewValueList;
@@ -49,6 +49,7 @@ declare namespace SectionSpinner {
49
49
  readOnly: PropTypes.Requireable<boolean>;
50
50
  disabled: PropTypes.Requireable<boolean>;
51
51
  viewMode: PropTypes.Requireable<boolean>;
52
+ reviewMode: PropTypes.Requireable<boolean>;
52
53
  stepId: PropTypes.Requireable<string>;
53
54
  hideEmptyValues: PropTypes.Requireable<boolean>;
54
55
  key: PropTypes.Requireable<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"SectionSpinner.d.ts","sourceRoot":"","sources":["../../../src/items/SectionSpinner/SectionSpinner.jsx"],"names":[],"mappings":";AAQA;;;;;;;sBAiCC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAzCiB,OAAO;sBACH,YAAY"}
1
+ {"version":3,"file":"SectionSpinner.d.ts","sourceRoot":"","sources":["../../../src/items/SectionSpinner/SectionSpinner.jsx"],"names":[],"mappings":";AAQA;;;;;;;sBAiCC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAzCiB,OAAO;sBACH,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectField.d.ts","sourceRoot":"","sources":["../../../src/items/SelectField/SelectField.jsx"],"names":[],"mappings":";AAmHA,mEAMC;kBAzHiD,OAAO"}
1
+ {"version":3,"file":"SelectField.d.ts","sourceRoot":"","sources":["../../../src/items/SelectField/SelectField.jsx"],"names":[],"mappings":";AAoHA,mEAMC;kBA1HiD,OAAO"}
@@ -31,7 +31,8 @@ const SelectField = _ref => {
31
31
  isInvalid,
32
32
  ariaAttributes = {},
33
33
  disabled,
34
- viewMode
34
+ viewMode,
35
+ reviewMode
35
36
  } = _ref;
36
37
  const [t] = (0, _reactI18next.useTranslation)();
37
38
  const formControlClassNames = (0, _index.getFormControlClassNames)(isInvalid, readOnly, disabled, className, ['select', field.className].filter(Boolean));
@@ -51,7 +52,7 @@ const SelectField = _ref => {
51
52
  doItJustOnce.current = true; // doItJustOnce.current = true; // I'm not sure why this is needed here. But without it, it goes into an infinite loop!?
52
53
  }
53
54
  }, [field, emptyOption, selectOptions, helpers, doItJustOnce]);
54
- if (viewMode) {
55
+ if (viewMode || reviewMode) {
55
56
  return selectOptions.filter(opt => opt.value === field?.value || opt.value !== '' && Array.isArray(field?.value) && field?.value?.includes(opt.value)).map(opt => translateLabel(opt.label)).join(', ');
56
57
  }
57
58
  return /*#__PURE__*/_react.default.createElement("select", _extends({}, field, ariaAttributes, inputProps, {
@@ -46,6 +46,7 @@ declare namespace StaticAlert {
46
46
  readOnly: import("prop-types").Requireable<boolean>;
47
47
  disabled: import("prop-types").Requireable<boolean>;
48
48
  viewMode: import("prop-types").Requireable<boolean>;
49
+ reviewMode: import("prop-types").Requireable<boolean>;
49
50
  stepId: import("prop-types").Requireable<string>;
50
51
  hideEmptyValues: import("prop-types").Requireable<boolean>;
51
52
  key: import("prop-types").Requireable<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"StaticAlert.d.ts","sourceRoot":"","sources":["../../../src/items/StaticAlert/StaticAlert.jsx"],"names":[],"mappings":";AAKA;;;;;;;sBA4BC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAhCiB,OAAO"}
1
+ {"version":3,"file":"StaticAlert.d.ts","sourceRoot":"","sources":["../../../src/items/StaticAlert/StaticAlert.jsx"],"names":[],"mappings":";AAKA;;;;;;;sBA4BC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAhCiB,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextAreaField.d.ts","sourceRoot":"","sources":["../../../src/items/TextAreaField/TextAreaField.jsx"],"names":[],"mappings":";AAmFA,0EAA+D;kBAlF7C,OAAO"}
1
+ {"version":3,"file":"TextAreaField.d.ts","sourceRoot":"","sources":["../../../src/items/TextAreaField/TextAreaField.jsx"],"names":[],"mappings":";AAyFA,0EAA+D;kBAxF7C,OAAO"}