@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.
- package/config-overrides.js +1 -0
- package/dist/hooks/useValidationMessage.d.ts.map +1 -1
- package/dist/hooks/useValidationMessage.js +8 -1
- package/dist/hooks/withFieldGroup.d.ts.map +1 -1
- package/dist/hooks/withFieldGroup.js +35 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +1 -1
- package/dist/items/AbholdatumMaterialienField/AbholdatumMaterialienField.d.ts +25 -0
- package/dist/items/AbholdatumMaterialienField/AbholdatumMaterialienField.d.ts.map +1 -0
- package/dist/items/AbholdatumMaterialienField/AbholdatumMaterialienField.js +77 -0
- package/dist/items/AbholdatumMaterialienField/getAbholTermine.d.ts +7 -0
- package/dist/items/AbholdatumMaterialienField/getAbholTermine.d.ts.map +1 -0
- package/dist/items/AbholdatumMaterialienField/getAbholTermine.js +117 -0
- package/dist/items/AbholortMaterialienField/AbholortMaterialienField.d.ts +26 -0
- package/dist/items/AbholortMaterialienField/AbholortMaterialienField.d.ts.map +1 -0
- package/dist/items/AbholortMaterialienField/AbholortMaterialienField.js +73 -0
- package/dist/items/BSRAddressSelector/BSRAddressButtons.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/BSRAddressButtons.js +10 -0
- package/dist/items/BSRAddressSelector/BSRAddressSelector.d.ts +1 -0
- package/dist/items/BSRAddressSelector/BSRAddressSelector.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/BSRAddressSelector.js +21 -2
- package/dist/items/BSRAddressSelector/BSRAutocompleteField.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/BSRAutocompleteField.js +14 -3
- package/dist/items/BSRAddressSelector/BSRStreetPlzSelector.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/BSRStreetPlzSelector.js +6 -0
- package/dist/items/BSRAddressSelector/HouseNumberSelectField.d.ts.map +1 -1
- package/dist/items/BSRAddressSelector/HouseNumberSelectField.js +5 -0
- package/dist/items/BootstrapInputGroupField/BootstrapInputGroupField.d.ts.map +1 -1
- package/dist/items/BootstrapInputGroupField/BootstrapInputGroupField.js +2 -1
- package/dist/items/DateInputField/DateInputField.d.ts.map +1 -1
- package/dist/items/DateInputField/DateInputField.js +2 -1
- package/dist/items/FileUploadField/FileUploadField.d.ts +4 -0
- package/dist/items/FileUploadField/FileUploadField.d.ts.map +1 -0
- package/dist/items/FileUploadField/FileUploadField.js +271 -0
- package/dist/items/FileUploadField/uploadedFileStore.d.ts +4 -0
- package/dist/items/FileUploadField/uploadedFileStore.d.ts.map +1 -0
- package/dist/items/FileUploadField/uploadedFileStore.js +31 -0
- package/dist/items/FormFieldWrapper/FormFieldChildPropTypes.d.ts +1 -0
- package/dist/items/FormFieldWrapper/FormFieldChildPropTypes.d.ts.map +1 -1
- package/dist/items/FormFieldWrapper/FormFieldChildPropTypes.js +1 -0
- package/dist/items/GroupInputField/GroupInputField.d.ts.map +1 -1
- package/dist/items/GroupInputField/GroupInputField.js +41 -4
- package/dist/items/Modal/Modal.d.ts.map +1 -1
- package/dist/items/Modal/Modal.js +6 -1
- package/dist/items/MultiSelectField/MultiSelectField.d.ts.map +1 -1
- package/dist/items/MultiSelectField/MultiSelectField.js +15 -2
- package/dist/items/NumberInputField/NumberInputField.d.ts.map +1 -1
- package/dist/items/NumberInputField/NumberInputField.js +2 -1
- package/dist/items/ReviewValue/ReviewValueList.d.ts +17 -0
- package/dist/items/ReviewValue/ReviewValueList.d.ts.map +1 -0
- package/dist/items/ReviewValue/ReviewValueList.js +36 -0
- package/dist/items/SectionSpinner/SectionSpinner.d.ts +1 -0
- package/dist/items/SectionSpinner/SectionSpinner.d.ts.map +1 -1
- package/dist/items/SelectField/SelectField.d.ts.map +1 -1
- package/dist/items/SelectField/SelectField.js +3 -2
- package/dist/items/StaticAlert/StaticAlert.d.ts +1 -0
- package/dist/items/StaticAlert/StaticAlert.d.ts.map +1 -1
- package/dist/items/TextAreaField/TextAreaField.d.ts.map +1 -1
- package/dist/items/TextAreaField/TextAreaField.js +8 -0
- package/dist/items/TextBox/TextBox.d.ts +1 -0
- package/dist/items/TextBox/TextBox.d.ts.map +1 -1
- package/dist/items/TextBox/TextBox.js +11 -2
- package/dist/items/TextInputField/TextInputField.d.ts.map +1 -1
- package/dist/items/TextInputField/TextInputField.js +8 -1
- package/dist/items/Toast/Toast.d.ts +1 -0
- package/dist/items/Toast/Toast.d.ts.map +1 -1
- package/dist/items/ToggleSwitchField/ToggleSwitchField.d.ts.map +1 -1
- package/dist/items/ToggleSwitchField/ToggleSwitchField.js +2 -1
- package/dist/items/index.d.ts +4 -1
- package/dist/items/index.d.ts.map +1 -1
- package/dist/items/index.js +22 -1
- package/dist/items/validations.d.ts.map +1 -0
- package/dist/items/validations.js +27 -0
- package/dist/locales.d.ts +73 -2
- package/dist/locales.js +64 -0
- package/dist/shared/ErrorMessagesInfoBox/ErrorMessagesInfoBox.d.ts +16 -0
- package/dist/shared/ErrorMessagesInfoBox/ErrorMessagesInfoBox.d.ts.map +1 -0
- package/dist/shared/ErrorMessagesInfoBox/ErrorMessagesInfoBox.js +144 -0
- package/dist/shared/FormWidget/FormWidget.d.ts +30 -0
- package/dist/shared/FormWidget/FormWidget.d.ts.map +1 -0
- package/dist/shared/FormWidget/FormWidget.js +165 -0
- package/dist/shared/FormWidget/FormWidgetControlPage.d.ts +29 -0
- package/dist/shared/FormWidget/FormWidgetControlPage.d.ts.map +1 -0
- package/dist/shared/FormWidget/FormWidgetControlPage.js +84 -0
- package/dist/shared/FormWidget/FormWidgetFormPage.d.ts +26 -0
- package/dist/shared/FormWidget/FormWidgetFormPage.d.ts.map +1 -0
- package/dist/shared/FormWidget/FormWidgetFormPage.js +55 -0
- package/dist/shared/FormWidget/FormWidgetMessagePage.d.ts +20 -0
- package/dist/shared/FormWidget/FormWidgetMessagePage.d.ts.map +1 -0
- package/dist/shared/FormWidget/FormWidgetMessagePage.js +37 -0
- package/dist/shared/FormWidget/captions.d.ts +33 -0
- package/dist/shared/FormWidget/captions.d.ts.map +1 -0
- package/dist/shared/FormWidget/captions.js +43 -0
- package/dist/shared/KehrenbuergerForm/KehrenbuergerForm.d.ts +23 -0
- package/dist/shared/KehrenbuergerForm/KehrenbuergerForm.d.ts.map +1 -0
- package/dist/shared/KehrenbuergerForm/KehrenbuergerForm.js +173 -0
- package/dist/styles/_errorMessagesInfoBox.scss +42 -0
- package/dist/styles/_form.scss +9 -0
- package/dist/styles/_review.scss +29 -0
- package/dist/styles/main.scss +62 -49
- package/dist/styles/variables/_buttons.scss +4 -3
- package/dist/styles/variables/_variables.scss +15 -2
- package/dist/utils/files/convertFilesToUploadFiles.d.ts +8 -0
- package/dist/utils/files/convertFilesToUploadFiles.d.ts.map +1 -0
- package/dist/utils/files/convertFilesToUploadFiles.js +33 -0
- package/dist/utils/files/formatFileSize.d.ts +3 -0
- package/dist/utils/files/formatFileSize.d.ts.map +1 -0
- package/dist/utils/files/formatFileSize.js +44 -0
- package/dist/utils/files/generateUniqueFilename.d.ts +3 -0
- package/dist/utils/files/generateUniqueFilename.d.ts.map +1 -0
- package/dist/utils/files/generateUniqueFilename.js +32 -0
- package/dist/utils/files/index.d.ts +7 -0
- package/dist/utils/files/index.d.ts.map +1 -0
- package/dist/utils/files/index.js +71 -0
- package/dist/utils/files/validateFiles.d.ts +9 -0
- package/dist/utils/files/validateFiles.d.ts.map +1 -0
- package/dist/utils/files/validateFiles.js +28 -0
- package/dist/utils/files/validateFilesBySize.d.ts +6 -0
- package/dist/utils/files/validateFilesBySize.d.ts.map +1 -0
- package/dist/utils/files/validateFilesBySize.js +31 -0
- package/dist/utils/files/validateFilesByType.d.ts +9 -0
- package/dist/utils/files/validateFilesByType.d.ts.map +1 -0
- package/dist/utils/files/validateFilesByType.js +79 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +11 -0
- package/dist/utils/reviewValue.d.ts +3 -0
- package/dist/utils/reviewValue.d.ts.map +1 -0
- package/dist/utils/reviewValue.js +16 -0
- package/package.json +1 -1
- package/webpack.config.js +3 -0
- package/dist/items/eventWizardItems/validations.d.ts.map +0 -1
- package/dist/items/eventWizardItems/validations.js +0 -7
- /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 @@
|
|
|
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":"
|
|
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":";
|
|
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
|
-
|
|
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
|
-
} =
|
|
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,
|
|
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;;;;;;;;;;;
|
|
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":";
|
|
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
|
-
|
|
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":";
|
|
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
|
|
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":";
|
|
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
|
|
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":";
|
|
1
|
+
{"version":3,"file":"TextAreaField.d.ts","sourceRoot":"","sources":["../../../src/items/TextAreaField/TextAreaField.jsx"],"names":[],"mappings":";AAyFA,0EAA+D;kBAxF7C,OAAO"}
|