UNPKG

@pinuts/bsr-uikit-relaunch

Version:

BSR UI-KIT Relaunch

178 lines (174 loc) 9.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _formBuilder = require("@pinuts/form-builder"); var _reactI18next = require("react-i18next"); var _Button = _interopRequireDefault(require("../Button/Button.jsx")); var _Icon = _interopRequireDefault(require("../Icon/Icon.jsx")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } 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); } 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; } 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); } // FormBuilder const { useFormikContext, FieldArray } = _formBuilder.formik; // ArrayFieldset Conventions // obligatory: // * defaultValue of empty Array // * children des ArrayFieldsets müssen einen key beginnend mit 'fidx.' haben // example: // { // "component": "ArrayFieldset", // "config": { // "key": "nameData", -> WICHTIG: der key muss mit dem prefix der componenten keys übereinstimmen -> nameData.afidx.firstName // "defaultValue": [], // "label": "Kindernamen", // "showItemTitle": true, // "singularItemForList": "Kind", // "addButtonLabel": "Kind hinzufügen", // "addAnotherButtonLabel": "Weiteres Kind hinzufügen", // "removeButtonLabel": "Kindereintrag entfernen", // "helpText": "Hier ist der HelpText der erklärt, dass Sie hier weitere Felder ein und aus blenden bzw hinzufügen und entfernen können.", // "minElements": 1, // "maxElements": 3 // }, // "components": [ // { // "component": "TextInputField", // "wrapperComponent": "FormFieldWrapper", // "config": { // "key": "nameData.afidx.firstName" -> WICHTIG: Prefix "nameData" muss mit dem key des ArrayFieldsets übereinstimmen // "label": "Vorname", // "helpText": "Vorname bitte hier eingeben", // "validation": ["required"] // } // }, <--- // ... // FIXME required logik - bzw ungültig machen wenn required und mindestanzahl nicht erfüllt const ArrayFieldset = _ref => { let { config, components } = _ref; const { values } = useFormikContext(); const [arrayValues, valuesWereFilled] = (0, _react.useMemo)(() => { const valueFromForm = values[config.key]; if (valueFromForm?.length < config.minElements) { return [[...valueFromForm, ...Array(config.minElements - (valueFromForm?.length || 0)).fill({})], true]; } return [valueFromForm || [], false]; }, [values, config.key, config.minElements]); const arrayLength = arrayValues.length; const stringifiedComponents = (0, _react.useMemo)(() => JSON.stringify(components) || [], [components]); const showDeleteButton = (0, _react.useMemo)(() => arrayLength > (config.minElements || 0), [arrayLength, config.minElements]); const showAddButton = (!config.maxElements || arrayLength < config.maxElements) && !valuesWereFilled; const [t] = (0, _reactI18next.useTranslation)(); const usedAddButtonLabel = config.addButtonLabel ?? t('bsrItems.arrayFieldset.addButtonLabel'); const usedAddAnotherButtonLabel = config.addAnotherButtonLabel ?? t('bsrItems.arrayFieldset.addAnotherButtonLabel'); const usedRemoveButtonLabel = config.removeButtonLabel ?? t('bsrItems.arrayFieldset.removeButtonLabel'); const usedSingularItemForList = config.singularItemForList ?? t('bsrItems.arrayFieldset.singularItemForList'); const labelTemplate = config.labelTemplate; const AddElementButton = (0, _react.useCallback)(_ref2 => { let { arrayHelpers } = _ref2; return /*#__PURE__*/_react.default.createElement("li", { className: "d-flex justify-content-end" }, arrayLength > 0 && /*#__PURE__*/_react.default.createElement("hr", { className: "tuerkis-20" }), /*#__PURE__*/_react.default.createElement(_Button.default, _extends({ onClick: () => arrayHelpers.push({}), ariaLabel: arrayLength === 0 ? usedAddButtonLabel : usedAddAnotherButtonLabel, rounded: true, color: "tuerkis-20" }, config.addButtonProps || {}), /*#__PURE__*/_react.default.createElement(_Icon.default, { icon: "circlePlus", className: "me-2" }), arrayLength === 0 ? usedAddButtonLabel : usedAddAnotherButtonLabel)); }, [arrayLength, usedAddButtonLabel, usedAddAnotherButtonLabel, config.addButtonProps]); const renderFields = arrayHelpers => arrayValues.map((item, index) => { const componentsAsString = stringifiedComponents.replace(/afidx/g, index.toString()); const modifiedComponents = JSON.parse(componentsAsString).map(element => ({ ...element, config: { ...element.config, parentKey: config.key, readOnly: config.readOnly || config.disabled, disabled: config.readOnly || config.disabled } })); const itemTitleId = `${config.key}-${index}-heading`; const ariaLablelledbyAttr = config.showItemTitle ? { 'aria-labelledby': itemTitleId } : {}; const itemTitleFromLabelTemplate = labelTemplate?.replace(/(?:{)(.*?)(?:})/g, (_, key) => item[key] || ''); const itemTitle = labelTemplate && itemTitleFromLabelTemplate.trim() ? itemTitleFromLabelTemplate : `${index + 1}. ${usedSingularItemForList}`; return /*#__PURE__*/_react.default.createElement("li", _extends({ key: itemTitleId }, ariaLablelledbyAttr, { className: "p-4" }), config.showItemTitle && itemTitle && /*#__PURE__*/_react.default.createElement("h4", { className: "h5", id: itemTitleId }, itemTitle), /*#__PURE__*/_react.default.createElement(_formBuilder.ComponentPopulator, { formId: `${config.key}-${index}-array-fieldset-formId`, components: modifiedComponents }), showDeleteButton && /*#__PURE__*/_react.default.createElement(_Button.default, _extends({ onClick: () => arrayHelpers.remove(index), ariaLabel: usedRemoveButtonLabel, rounded: true, color: "tuerkis-20" }, config.removeButtonProps || {}), /*#__PURE__*/_react.default.createElement(_Icon.default, { icon: "trash", className: "me-2" }), usedRemoveButtonLabel)); }); return /*#__PURE__*/_react.default.createElement("div", { className: "arrayFieldSet" }, /*#__PURE__*/_react.default.createElement("fieldset", { className: "" }, /*#__PURE__*/_react.default.createElement("legend", null, /*#__PURE__*/_react.default.createElement("h3", { className: "h5" }, config.label)), config.helpText && /*#__PURE__*/_react.default.createElement("p", { className: "helperText" }, config.helpText), /*#__PURE__*/_react.default.createElement("ul", { className: "list-unstyled" }, /*#__PURE__*/_react.default.createElement(FieldArray, { name: config.key, render: arrayHelpers => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, renderFields(arrayHelpers), showAddButton && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(AddElementButton, { key: "add-button", arrayHelpers: arrayHelpers }))) })))); }; ArrayFieldset.propTypes = { components: _propTypes.default.instanceOf(Array).isRequired, config: _propTypes.default.shape({ key: _propTypes.default.string, minElements: _propTypes.default.number, maxElements: _propTypes.default.number, addButtonLabel: _propTypes.default.string, addAnotherButtonLabel: _propTypes.default.string, addButtonAria: _propTypes.default.string, addButtonProps: _propTypes.default.object, removeButtonLabel: _propTypes.default.string, removeButtonAria: _propTypes.default.string, removeButtonProps: _propTypes.default.object, singularItemForList: _propTypes.default.string, labelTemplate: _propTypes.default.string, showItemTitle: _propTypes.default.bool, label: _propTypes.default.string, helpText: _propTypes.default.string, readOnly: _propTypes.default.bool, disabled: _propTypes.default.bool }).isRequired }; (0, _formBuilder.registerComponent)('ArrayFieldset', ArrayFieldset); var _default = exports.default = ArrayFieldset;