UNPKG

@visma/rjsf-material-ui

Version:

Material UI theme, fields and widgets for react-jsonschema-form

1,588 lines (1,439 loc) 72.4 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var rjsfCore = require('@visma/rjsf-core'); var React = require('react'); var React__default = _interopDefault(React); var Box = _interopDefault(require('@material-ui/core/Box')); var Button = _interopDefault(require('@material-ui/core/Button')); var reactIntl = require('react-intl'); var Grid = _interopDefault(require('@material-ui/core/Grid')); var Paper = _interopDefault(require('@material-ui/core/Paper')); var AddIcon = _interopDefault(require('@material-ui/icons/Add')); var ArrowUpward = _interopDefault(require('@material-ui/icons/ArrowUpward')); var ArrowDownward = _interopDefault(require('@material-ui/icons/ArrowDownward')); var DeleteForever = _interopDefault(require('@material-ui/icons/DeleteForever')); var VerticalAlignTop = _interopDefault(require('@material-ui/icons/VerticalAlignTop')); var VerticalAlignBottom = _interopDefault(require('@material-ui/icons/VerticalAlignBottom')); var Typography = _interopDefault(require('@material-ui/core/Typography')); var Divider = _interopDefault(require('@material-ui/core/Divider')); var Checkbox = _interopDefault(require('@material-ui/core/Checkbox')); var FormControlLabel = _interopDefault(require('@material-ui/core/FormControlLabel')); var List = _interopDefault(require('@material-ui/core/List')); var ListItem = _interopDefault(require('@material-ui/core/ListItem')); var ListItemIcon = _interopDefault(require('@material-ui/core/ListItemIcon')); var ErrorIcon = _interopDefault(require('@material-ui/icons/Error')); var ListItemText = _interopDefault(require('@material-ui/core/ListItemText')); var styles = require('@material-ui/styles'); var FormControl = _interopDefault(require('@material-ui/core/FormControl')); var FormHelperText = _interopDefault(require('@material-ui/core/FormHelperText')); var Input = _interopDefault(require('@material-ui/core/Input')); var InputLabel = _interopDefault(require('@material-ui/core/InputLabel')); var core = require('@material-ui/core'); var FormGroup = _interopDefault(require('@material-ui/core/FormGroup')); var Radio = _interopDefault(require('@material-ui/core/Radio')); var RadioGroup = _interopDefault(require('@material-ui/core/RadioGroup')); var Slider = _interopDefault(require('@material-ui/core/Slider')); var styles$1 = require('@material-ui/core/styles'); var MenuItem = _interopDefault(require('@material-ui/core/MenuItem')); var TextField = _interopDefault(require('@material-ui/core/TextField')); var IconButton$1 = _interopDefault(require('@material-ui/core/IconButton')); var DescriptionIcon = _interopDefault(require('@material-ui/icons/Description')); var HighlightOffIcon = _interopDefault(require('@material-ui/icons/HighlightOff')); var prettyBytes = _interopDefault(require('pretty-bytes')); function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError("Cannot destructure undefined"); } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } var AddButton = function AddButton(props) { return React__default.createElement(Button, Object.assign({}, props, { color: "secondary" }), React__default.createElement(AddIcon, null), " ", reactIntl.useIntl().formatMessage({ id: "kNLPWW", defaultMessage: [{ "type": 0, "value": "Add Item" }] })); }; var mappings = { remove: DeleteForever, plus: AddIcon, "arrow-up": ArrowUpward, "arrow-down": ArrowDownward, "double-arrow-up": VerticalAlignTop, "double-arrow-down": VerticalAlignBottom }; var IconButton = function IconButton(props) { var icon = props.icon, iconProps = props.iconProps, otherProps = _objectWithoutPropertiesLoose(props, ["icon", "className", "iconProps"]); var IconComp = mappings[icon]; return React__default.createElement(Button, Object.assign({}, otherProps, { variant: "outlined", size: "small" }), React__default.createElement(IconComp, Object.assign({ alt: otherProps['aria-label'] }, iconProps))); }; var isMultiSelect = rjsfCore.utils.isMultiSelect, getDefaultRegistry = rjsfCore.utils.getDefaultRegistry; var indentation = function indentation(element) { return element.indent; }; var ArrayFieldTitle = function ArrayFieldTitle(_ref) { var schema = _ref.schema, idSchema = _ref.idSchema, title = _ref.title, required = _ref.required; if (!title) { return null; } var headerNumber = idSchema.$id.split('_').length + 1; var id = idSchema.$id + "__title"; // return <TitleField id={id} title={title} required={required} />; return React__default.createElement(Box, { id: id, mb: 1, mt: 1 }, React__default.createElement(Typography, Object.assign({}, schema.items && schema.items.type === 'object' ? { component: headerNumber === 2 ? "h2" : "h3" } : { component: "p", 'aria-hidden': true }, { variant: "subtitle1" }), title, required && React__default.createElement(React__default.Fragment, null, " *")), React__default.createElement(Divider, null)); }; var ArrayFieldDescription = function ArrayFieldDescription(_ref2) { var idSchema = _ref2.idSchema, description = _ref2.description; if (!description) { return null; } var id = rjsfCore.utils.descriptionId(idSchema.$id); //return <DescriptionField id={id} description={description} />; return React__default.createElement(Typography, { component: "p", variant: "subtitle2", id: id }, description); }; // Used in the two templates var DefaultArrayItem = function DefaultArrayItem(props) { var btnStyle = { flex: 1, paddingLeft: 3, paddingRight: 3, fontWeight: 'bold', minWidth: 0, marginLeft: 5, marginBottom: 10, borderRadius: 15, borderWidth: 2 }; var intl = reactIntl.useIntl(); return React__default.createElement(Grid, { container: true, key: props.key, alignItems: "center" }, props.extraOptions && React__default.createElement(Grid, { container: true, style: { justifyContent: "flex-end" } }, React__default.createElement(Grid, { item: true }, React__default.createElement(Box, { mb: 2 }, React__default.createElement(AddButton, { className: "array-item-add", onClick: props.onAddIndexClick(props.index), disabled: props.disabled || props.readonly })))), React__default.createElement(Grid, { item: true, xs: true }, React__default.createElement(Box, { mb: 2 }, React__default.createElement(Paper, { elevation: 2 }, React__default.createElement(Box, { p: 2 }, props.children)))), props.hasToolbar && React__default.createElement(Grid, { item: true }, React__default.createElement(Grid, { container: true, direction: "column" }, (props.hasMoveUp || props.hasMoveDown) && props.extraOptions && React__default.createElement(IconButton, { icon: "double-arrow-up", className: "array-item-move-up", "aria-label": intl.formatMessage({ id: "CEqozz", defaultMessage: [{ "type": 0, "value": "Move first" }] }), //tabIndex={-1} style: btnStyle, iconProps: { fontSize: 'small' }, disabled: props.disabled || props.readonly || !props.hasMoveUp, onClick: props.onReorderClick(props.index, 0) }), (props.hasMoveUp || props.hasMoveDown) && React__default.createElement(React__default.Fragment, null, React__default.createElement(IconButton, { icon: "arrow-up", className: "array-item-move-up", "aria-label": intl.formatMessage({ id: "wmFdws", defaultMessage: [{ "type": 0, "value": "Move up" }] }), //tabIndex={-1} style: btnStyle, iconProps: { fontSize: 'small' }, disabled: props.disabled || props.readonly || !props.hasMoveUp, onClick: props.onReorderClick(props.index, props.index - 1) }), React__default.createElement(IconButton, { icon: "arrow-down", "aria-label": intl.formatMessage({ id: "H/r5m6", defaultMessage: [{ "type": 0, "value": "Move down" }] }), //tabIndex={-1} style: btnStyle, iconProps: { fontSize: 'small' }, disabled: props.disabled || props.readonly || !props.hasMoveDown, onClick: props.onReorderClick(props.index, props.index + 1) })), (props.hasMoveUp || props.hasMoveDown) && props.extraOptions && React__default.createElement(IconButton, { icon: "double-arrow-down", className: "array-item-move-up", "aria-label": intl.formatMessage({ id: "Q5rRZ3", defaultMessage: [{ "type": 0, "value": "Move last" }] }), //tabIndex={-1} style: btnStyle, iconProps: { fontSize: 'small' }, disabled: props.disabled || props.readonly || !props.hasMoveDown, onClick: props.onReorderClick(props.index, props.size - 1) }), props.hasRemove && React__default.createElement(IconButton, { icon: "remove", "aria-label": intl.formatMessage({ id: "3dwSlf", defaultMessage: [{ "type": 0, "value": "Remove item" }] }), //tabIndex={-1} style: btnStyle, iconProps: { fontSize: 'small' }, disabled: props.disabled || props.readonly, onClick: props.onDropIndexClick(props.index) })))); }; var DefaultFixedArrayFieldTemplate = function DefaultFixedArrayFieldTemplate(props) { return React__default.createElement("fieldset", { className: props.className }, React__default.createElement(ArrayFieldTitle, { key: "array-field-title-" + props.idSchema.$id, TitleField: props.TitleField, idSchema: props.idSchema, title: props.uiSchema['ui:title'] || props.title, required: props.required, schema: props.schema }), (props.uiSchema['ui:description'] || props.schema.description) && React__default.createElement(ArrayFieldDescription, { key: "array-field-description-" + props.idSchema.$id, idSchema: props.idSchema, description: props.uiSchema['ui:description'] || props.schema.description }), React__default.createElement("div", { className: "row array-item-list", key: "array-item-list-" + props.idSchema.$id }, props.items && props.items.map(function (p) { return DefaultArrayItem(_extends({}, p, { size: props.items.length, hasRemove: props.items.length > (props.schema.minItems ? props.schema.minItems : 0) && p.hasRemove, extraOptions: props.schema.extraListOptions })); })), props.canAdd && React__default.createElement(AddButton, { className: "array-item-add", onClick: props.onAddClick, disabled: props.disabled || props.readonly })); }; var PaginationBar = function PaginationBar(props) { var currentPage = props.currentPage, pageAmount = props.pageAmount, setPage = props.setPage; return React__default.createElement(React__default.Fragment, null, React__default.createElement(Button, { size: "large", style: { minWidth: 20, marginLeft: 20 }, disabled: currentPage === 0, onClick: function onClick() { return setPage(0); } }, '<<|'), React__default.createElement(Button, { size: "large", style: { minWidth: 20, marginLeft: 5 }, disabled: currentPage === 0, onClick: function onClick() { return setPage(currentPage - 1); } }, '<|'), Array.from({ length: pageAmount }, function (_, i) { return i; }).map(function (i) { return React__default.createElement(Button, { size: "large", style: { minWidth: 40, marginLeft: 5 }, disabled: i === currentPage, onClick: function onClick() { return setPage(i); } }, i + 1); }), React__default.createElement(Button, { size: "large", style: { minWidth: 20, marginLeft: 5 }, disabled: currentPage === pageAmount - 1, onClick: function onClick() { return setPage(currentPage + 1); } }, '|>'), React__default.createElement(Button, { size: "large", style: { minWidth: 20, marginLeft: 5 }, disabled: currentPage === pageAmount - 1, onClick: function onClick() { return setPage(pageAmount - 1); } }, '|>>')); }; var DefaultNormalArrayFieldTemplate = function DefaultNormalArrayFieldTemplate(props) { var intl = reactIntl.useIntl(); var paginated = props.schema.items.pagination !== undefined ? props.schema.items.pagination : false; var _useState = React.useState([]), visibleItems = _useState[0], setVisibleItems = _useState[1]; var _useState2 = React.useState(localStorage.getItem('formulaDisablePagination') === 'true'), disablePagination = _useState2[0], setDisablePagination = _useState2[1]; var _useState3 = React.useState(0), page = _useState3[0], setPage = _useState3[1]; var _useState4 = React.useState(localStorage.getItem('formulaPaginationElements') ? Number(localStorage.getItem('formulaPaginationElements')) : 5), elementsPerPage = _useState4[0], setElementsPerPage = _useState4[1]; var _useState5 = React.useState(paginated ? Math.ceil(props.items.length / elementsPerPage) : 1), pageAmount = _useState5[0], setPageAmount = _useState5[1]; var _useState6 = React.useState(false), scrollIntoView = _useState6[0], setScrollIntoView = _useState6[1]; React.useEffect(function () { if (visibleItems && visibleItems.length > 0 && scrollIntoView) { // @ts-ignore var firstElement = document.getElementById(props.idSchema.$id + '__title'); firstElement.focus(); firstElement.scrollIntoView({ behavior: 'smooth' }); setScrollIntoView(false); } }, [visibleItems]); React.useEffect(function () { if (page > props.items.length / elementsPerPage && page > -1) { setPage(Math.floor(props.items.length / elementsPerPage)); } else if (page > -1) { // @ts-ignore setVisibleItems(props.items.slice(elementsPerPage * page, elementsPerPage * page + elementsPerPage)); } }, [page, props.items, elementsPerPage]); React.useEffect(function () { setPageAmount(paginated ? Math.ceil(props.items.length / elementsPerPage) : 1); }, [props.items, elementsPerPage]); var handlePageChange = function handlePageChange(pageNumber) { setPage(pageNumber); setScrollIntoView(true); }; var handleSetElementsPerPage = function handleSetElementsPerPage(amount) { localStorage.setItem('formulaPaginationElements', amount.toString()); setElementsPerPage(amount); }; var handleDisablePagination = function handleDisablePagination(event) { localStorage.setItem('formulaDisablePagination', event.target.checked ? "true" : "false"); setDisablePagination(event.target.checked); }; return React__default.createElement(Paper, { elevation: 2 }, React__default.createElement(Box, { p: 2 }, React__default.createElement(ArrayFieldTitle, { key: "array-field-title-" + props.idSchema.$id, TitleField: props.TitleField, idSchema: props.idSchema, title: props.uiSchema['ui:title'] || props.title, required: props.required, schema: props.schema }), (props.uiSchema['ui:description'] || props.schema.description) && React__default.createElement(ArrayFieldDescription, { key: "array-field-description-" + props.idSchema.$id, idSchema: props.idSchema, description: props.uiSchema['ui:description'] || props.schema.description }), paginated && !disablePagination && pageAmount > 1 && React__default.createElement(PaginationBar, { currentPage: page, pageAmount: pageAmount, setPage: handlePageChange }), React__default.createElement(Grid, { container: true, key: "array-item-list-" + props.idSchema.$id }, paginated && !disablePagination && visibleItems && visibleItems.map(function (p) { return DefaultArrayItem( // @ts-ignore _extends({}, p, { size: props.items.length, hasRemove: props.items.length > (props.schema.minItems ? props.schema.minItems : 0) && p.hasRemove, extraOptions: props.schema.extraListOptions })); }), !(paginated && !disablePagination) && props.items && props.items.map(function (p) { return DefaultArrayItem(_extends({}, p, { size: props.items.length, hasRemove: props.items.length > (props.schema.minItems ? props.schema.minItems : 0) && p.hasRemove, extraOptions: props.schema.extraListOptions })); }), props.canAdd && React__default.createElement(Grid, { container: true, style: { justifyContent: "flex-end" } }, React__default.createElement(Grid, { item: true }, React__default.createElement(Box, { mt: 2 }, React__default.createElement(AddButton, { className: "array-item-add", onClick: paginated && !disablePagination && props.items.length > 0 ? function () { props.items[0].onAddIndexClick((page + 1) * elementsPerPage)(); if (page + 1 < pageAmount || props.items.length - (page + 1) * elementsPerPage >= 0) { setScrollIntoView(true); setPage(page + 1); } } : props.onAddClick, disabled: props.disabled || props.readonly })))))), paginated && !disablePagination && pageAmount > 1 && React__default.createElement(PaginationBar, { currentPage: page, pageAmount: pageAmount, setPage: handlePageChange }), paginated && !disablePagination && React__default.createElement("p", { style: { paddingLeft: 20 } }, intl.formatMessage({ id: "vJPbhT", defaultMessage: [{ "type": 0, "value": "Elements per page:" }] }), [5, 10, 15].map(function (i) { return React__default.createElement(Button, { size: "small", style: { minWidth: 1, maxWidth: 30, borderRadius: 32, marginLeft: 5 }, variant: "outlined", disabled: i === elementsPerPage, onClick: function onClick() { return handleSetElementsPerPage(i); } }, i); })), paginated && React__default.createElement(FormControlLabel, { style: { paddingLeft: 20, paddingBottom: 15 }, control: React__default.createElement(Checkbox, { checked: disablePagination, onChange: handleDisablePagination }), label: intl.formatMessage({ id: "FsKJR1", defaultMessage: [{ "type": 0, "value": "Disable pagination" }] }) })); }; var ArrayFieldTemplate = function ArrayFieldTemplate(props) { var schema = props.schema, _props$registry = props.registry, registry = _props$registry === void 0 ? getDefaultRegistry() : _props$registry, uiSchema = props.uiSchema; return React__default.createElement(Box, { pl: uiSchema.items && uiSchema.items['ui:options'] && indentation(uiSchema.items['ui:options'].element) ? 3 * indentation(uiSchema.items['ui:options'].element) : 0 }, isMultiSelect(schema, registry.rootSchema) ? React__default.createElement(DefaultFixedArrayFieldTemplate, Object.assign({}, props)) : React__default.createElement(DefaultNormalArrayFieldTemplate, Object.assign({}, props))); }; var ErrorList = function ErrorList(_ref) { var errors = _ref.errors, uiSchema = _ref.uiSchema; var intl = reactIntl.useIntl(); var uiOrder = uiSchema['ui:order'] || []; //Sorted array of errors according to uiOrder for correct error message order var newErrors = errors.map(function (error) { var newError = _extends({}, error); // Get content from inside the first square brackets var match = newError.property ? newError.property.match(/\[(.*?)\]/) : undefined; if (match) { // Remove single quotes newError.property = match[1].replace(/'/g, ''); } // If property starts with a dot and is not a number, remove dot and keep the rest, done for ex .autofill_age else if (/^\./.test(newError.property)) { newError.property = newError.property.replace('.', ''); } return newError; // Sort list of newErrors according to uiOrder }).sort(function (a, b) { var indexA = uiOrder.indexOf(a.property); var indexB = uiOrder.indexOf(b.property); return indexA - indexB; }); return React__default.createElement(Paper, { elevation: 2 }, React__default.createElement(Box, { id: "formula-validation-errors", mb: 2, p: 2 }, uiSchema.formWithSteps ? React__default.createElement(Typography, { component: "h4", variant: "h6", role: "alert" }, intl.formatMessage({ id: "9XTsp0", defaultMessage: [{ "type": 0, "value": "Invalid inputs" }] })) : React__default.createElement(Typography, { component: "h2", variant: "h6", role: "alert" }, intl.formatMessage({ id: "9XTsp0", defaultMessage: [{ "type": 0, "value": "Invalid inputs" }] })), React__default.createElement(List, { dense: true, role: "alert" }, newErrors.map(function (error, i) { return React__default.createElement(ListItem, { key: i }, React__default.createElement(ListItemIcon, null, React__default.createElement(ErrorIcon, { color: "error" })), React__default.createElement(ListItemText, { primary: error.stack })); })))); }; var useStyles = /*#__PURE__*/ styles.makeStyles({ root: { marginTop: 5 } }); var DescriptionField = function DescriptionField(_ref) { var description = _ref.description; if (description) { var classes = useStyles(); return React__default.createElement(Typography, { component: "span", variant: "subtitle2", className: classes.root }, description); } return null; }; var TitleField = function TitleField(_ref) { var title = _ref.title; return React__default.createElement(React__default.Fragment, null, React__default.createElement(Box, { mb: 1, mt: 1 }, React__default.createElement(Typography, { component: "h2", variant: "h5" }, title), React__default.createElement(Divider, null))); }; var Fields = { DescriptionField: DescriptionField, TitleField: TitleField }; var ADDITIONAL_PROPERTY_FLAG = rjsfCore.utils.ADDITIONAL_PROPERTY_FLAG; var WrapIfAdditional = function WrapIfAdditional(_ref) { var children = _ref.children, disabled = _ref.disabled, id = _ref.id, label = _ref.label, uiSchema = _ref.uiSchema, onDropPropertyClick = _ref.onDropPropertyClick, onKeyChange = _ref.onKeyChange, readonly = _ref.readonly, required = _ref.required, schema = _ref.schema; var keyLabel = label + " Key"; // i18n ? var additional = schema.hasOwnProperty(ADDITIONAL_PROPERTY_FLAG); var btnStyle = { flex: 1, paddingLeft: 6, paddingRight: 6, fontWeight: "bold" }; if (!additional) { return React__default.createElement(React__default.Fragment, null, children); } var handleBlur = function handleBlur(_ref2) { var target = _ref2.target; return onKeyChange(target.value); }; return React__default.createElement(Grid, { container: true, key: id + "-key", alignItems: "center", spacing: 2 }, React__default.createElement(Grid, { item: true, xs: true }, React__default.createElement(FormControl, { fullWidth: true, required: required }, React__default.createElement(InputLabel, null, keyLabel), React__default.createElement(Input, { defaultValue: label, disabled: disabled || readonly, id: id + "-key", name: id + "-key", onBlur: !readonly ? handleBlur : undefined, type: "text", "aria-describedby": rjsfCore.utils.ariaDescribedBy(id, uiSchema) }))), React__default.createElement(Grid, { item: true, xs: true }, children), React__default.createElement(Grid, { item: true }, React__default.createElement(IconButton, { icon: "remove", tabIndex: -1, style: btnStyle, disabled: disabled || readonly, onClick: onDropPropertyClick(label) }))); }; var showTitle = function showTitle(schema, uiSchema) { if (schema.type === 'array') { return schema.items.type !== 'object' && (schema.items["enum"] || schema.items.enumNames); } else if (uiSchema['ui:options'].element.type === 'dateRange' && uiSchema['ui:options'].element.list === false) { return uiSchema['ui:options'].element.title || uiSchema['ui:options'].element.label; } else if (uiSchema['ui:widget'] === 'checkbox' || schema.type === 'boolean' && uiSchema['ui:widget'] !== 'radio' || uiSchema['ui:options'].element.type === 'button') { return false; } return schema.format === 'table' || schema.format === 'confirmField' || !(schema.type === 'object' || schema.type === 'string' && schema.title === undefined); }; var getLabel = function getLabel(uiSchema, defaultLabel) { if (uiSchema['ui:options'] && uiSchema['ui:options'].element) { var _uiSchema$uiOptions$ = uiSchema['ui:options'].element, useLabel = _uiSchema$uiOptions$.useLabel, label = _uiSchema$uiOptions$.label, title = _uiSchema$uiOptions$.title; return useLabel ? label : title; } return defaultLabel; }; var indentation$1 = function indentation(element) { if (element.list || !element.list && element.listItem) { return 0; } return element.indent; }; var ErrorList$1 = function ErrorList(props) { var id = props.id, errors = props.errors; return React__default.createElement(List, { id: rjsfCore.utils.errorsId(id), dense: true, disablePadding: true }, errors.map(function (error, i) { return React__default.createElement(ListItem, { key: i, disableGutters: true }, React__default.createElement(FormHelperText, null, error)); })); }; var FieldTemplate = function FieldTemplate(_ref) { var id = _ref.id, children = _ref.children, classNames = _ref.classNames, disabled = _ref.disabled, hidden = _ref.hidden, label = _ref.label, onDropPropertyClick = _ref.onDropPropertyClick, onKeyChange = _ref.onKeyChange, readonly = _ref.readonly, required = _ref.required, _ref$rawErrors = _ref.rawErrors, rawErrors = _ref$rawErrors === void 0 ? [] : _ref$rawErrors, rawHelp = _ref.rawHelp, rawDescription = _ref.rawDescription, schema = _ref.schema, uiSchema = _ref.uiSchema; if (hidden) { return null; } var type = schema.type; var dateRange = function dateRange(schema) { if (schema.properties.start) { return true; } else { return false; } }; var displayLabel = function displayLabel(uiSchema) { if (uiSchema['ui:options'].element.description) { return true; } else { return false; } }; return React__default.createElement(Box, { pl: uiSchema['ui:options'] && indentation$1(uiSchema['ui:options'].element) ? 3 * indentation$1(uiSchema['ui:options'].element) : 0 }, React__default.createElement(WrapIfAdditional, { classNames: classNames, disabled: disabled, id: id, uiSchema: uiSchema, label: label, onDropPropertyClick: onDropPropertyClick, onKeyChange: onKeyChange, readonly: readonly, required: required, schema: schema }, React__default.createElement(FormControl, { fullWidth: true, error: rawErrors.length ? true : false, required: required }, showTitle(schema, uiSchema) && getLabel(uiSchema, label) && getLabel(uiSchema, label).trim() !== '' ? React__default.createElement(Typography, { "aria-hidden": true, component: "p", variant: "subtitle1" }, getLabel(uiSchema, label), required && " *") : null, displayLabel && rawDescription && (schema.type !== 'boolean' || uiSchema['ui:widget'] === 'radio') ? React__default.createElement(Typography, { id: rjsfCore.utils.descriptionId(id), variant: "caption", color: "textSecondary" }, rawDescription) : null, rawErrors.length > 0 && type === 'object' && !dateRange(schema) && React__default.createElement(ErrorList$1, { id: id, errors: rawErrors }), children, rawErrors.length > 0 && (type !== 'object' || dateRange(schema)) && React__default.createElement(ErrorList$1, { id: id, errors: rawErrors }), rawHelp && React__default.createElement(FormHelperText, { id: rjsfCore.utils.helpId(id) }, rawHelp)))); }; var canExpand = rjsfCore.utils.canExpand; var useStyles$1 = /*#__PURE__*/ styles.makeStyles({ root: { marginTop: 10 } }); var ObjectFieldTemplate = function ObjectFieldTemplate(_ref) { var DescriptionField = _ref.DescriptionField, description = _ref.description, title = _ref.title, properties = _ref.properties, disabled = _ref.disabled, readonly = _ref.readonly, uiSchema = _ref.uiSchema, idSchema = _ref.idSchema, schema = _ref.schema, formData = _ref.formData, onAddClick = _ref.onAddClick; var classes = useStyles$1(); var isInArray = schema.originalConfig ? schema.originalConfig.listItem : false; return React__default.createElement(React__default.Fragment, null, (uiSchema['ui:title'] || title) && !isInArray && React__default.createElement(Box, { id: idSchema.$id + "-title", mb: 1, mt: 1 }, React__default.createElement(Typography, { component: idSchema.$id === 'root' ? 'h2' : 'h3', variant: "subtitle1", style: { fontSize: 18 } }, title), React__default.createElement(Divider, null)), description && React__default.createElement(DescriptionField, { id: idSchema.$id + "-description", description: description }), React__default.createElement(Grid, { container: true, spacing: 2, className: classes.root }, properties.map(function (element, index) { return (// Remove the <Grid> if the inner element is hidden as the <Grid> // itself would otherwise still take up space. element.hidden ? element.content : React__default.createElement(Grid, { item: true, xs: 12, key: index, style: { marginBottom: "10px" } }, element.content) ); }), canExpand(schema, uiSchema, formData) && React__default.createElement(Grid, { container: true, style: { justifyContent: 'flex-end' } }, React__default.createElement(Grid, { item: true }, React__default.createElement(AddButton, { className: 'object-property-expand', onClick: onAddClick(schema), disabled: disabled || readonly }))))); }; var CheckboxWidget = function CheckboxWidget(props) { var id = props.id, value = props.value, disabled = props.disabled, readonly = props.readonly, autofocus = props.autofocus, onChange = props.onChange, onBlur = props.onBlur, onFocus = props.onFocus, options = props.options, required = props.required, rawErrors = props.rawErrors; var _onChange = function _onChange(_ref, checked) { _objectDestructuringEmpty(_ref); return onChange(checked); }; var _onBlur = function _onBlur(_ref2) { var value = _ref2.target.value; return onBlur(id, value); }; var _onFocus = function _onFocus(_ref3) { var value = _ref3.target.value; return onFocus(id, value); }; return React__default.createElement(React__default.Fragment, null, options.description && React__default.createElement(core.FormHelperText, { id: id + "__description" }, options.description), React__default.createElement(FormControlLabel, { control: React__default.createElement(Checkbox, { id: id, checked: typeof value === "undefined" ? false : value, required: required, disabled: disabled || readonly, autoFocus: autofocus, onChange: _onChange, onBlur: _onBlur, onFocus: _onFocus, inputProps: { 'aria-describedby': rjsfCore.utils.ariaDescribedBy(id, { 'ui:options': { element: props.options } }, rawErrors) } }), "aria-label": rjsfCore.utils.generateAriaLabel(props.label, options, required), label: React__default.createElement("span", null, props.label, required && " *") })); }; var getScore = function getScore(choices, value) { var choice = choices.find(function (choice) { return choice["enum"] === value; }); if (!choice) { choice = choices[Number(value)]; } return choice && choice.meta ? choice.meta.score : undefined; }; var getScores = function getScores(choices, value) { if (value.length > 0) { var choiceString = value.map(function (item) { return getScore(choices, item); }); choiceString = choiceString.filter(function (value) { return value !== undefined; }); return choiceString.length > 0 ? choiceString.join(', ') : ''; } else { return ""; } }; var selectValue = function selectValue(value, selected, all) { var at = all.indexOf(value); var updated = selected.slice(0, at).concat(value, selected.slice(at)); // As inserting values at predefined index positions doesn't work with empty // arrays, we need to reorder the updated selection to match the initial order return updated.sort(function (a, b) { return all.indexOf(a) > all.indexOf(b); }); }; var deselectValue = function deselectValue(value, selected) { return selected.filter(function (v) { return v !== value; }); }; var CheckboxesWidget = function CheckboxesWidget(_ref) { var id = _ref.id, disabled = _ref.disabled, label = _ref.label, required = _ref.required, options = _ref.options, value = _ref.value, autofocus = _ref.autofocus, readonly = _ref.readonly, onChange = _ref.onChange, onBlur = _ref.onBlur, onFocus = _ref.onFocus, rawErrors = _ref.rawErrors; var enumOptions = options.enumOptions, enumDisabled = options.enumDisabled, inline = options.inline, showScore = options.showScore, element = options.element; var rawChoices = element ? options.element.choices : []; var _onChange = function _onChange(option) { return function (_ref2) { var checked = _ref2.target.checked; var all = enumOptions.map(function (_ref3) { var value = _ref3.value; return value; }); if (checked) { onChange(selectValue(option.value, value, all)); } else { onChange(deselectValue(option.value, value)); } }; }; var _onBlur = function _onBlur(_ref4) { var value = _ref4.target.value; return onBlur(id, value); }; var _onFocus = function _onFocus(_ref5) { var value = _ref5.target.value; return onFocus(id, value); }; var ariaDescribedby = rjsfCore.utils.ariaDescribedBy(id, { 'ui:options': { element: options } }, rawErrors); return React__default.createElement("div", { style: { display: 'flex' } }, React__default.createElement("div", { style: { flex: '1 1' } }, React__default.createElement(FormControl, { component: "fieldset", "aria-describedby": ariaDescribedby }, React__default.createElement("legend", { style: { position: 'absolute', clip: 'rect(0,0,0,0)' } }, rjsfCore.utils.generateAriaLabel(label, options, required)), React__default.createElement(FormGroup, { row: !!inline }, enumOptions.map(function (option, index) { var checked = value.indexOf(option.value) !== -1; var itemDisabled = enumDisabled && enumDisabled.indexOf(option.value) != -1; var checkbox = React__default.createElement(Checkbox, { id: id + "_" + index, checked: checked, disabled: disabled || itemDisabled || readonly, autoFocus: autofocus && index === 0, onChange: _onChange(option), onBlur: _onBlur, onFocus: _onFocus }); return React__default.createElement(FormControlLabel, { control: checkbox, key: index, style: { marginTop: '6px' }, label: option.label }); })))), React__default.createElement("div", null, showScore && value && React__default.createElement(Typography, null, getScores(rawChoices, value)))); }; var ColorWidget = function ColorWidget(props) { var registry = props.registry; var TextWidget = registry.widgets.TextWidget; return React__default.createElement(TextWidget, Object.assign({ type: "color" }, props)); }; var DateWidget = function DateWidget(props) { var registry = props.registry; var TextWidget = registry.widgets.TextWidget; return React__default.createElement(TextWidget, Object.assign({ type: "date", InputLabelProps: { shrink: true } }, props)); }; var localToUTC = rjsfCore.utils.localToUTC, utcToLocal = rjsfCore.utils.utcToLocal; var DateTimeWidget = function DateTimeWidget(props) { var registry = props.registry; var TextWidget = registry.widgets.TextWidget; var value = utcToLocal(props.value); var onChange = function onChange(value) { props.onChange(localToUTC(value)); }; return React__default.createElement(TextWidget, Object.assign({ type: "datetime-local", InputLabelProps: { shrink: true } }, props, { value: value, onChange: onChange })); }; var EmailWidget = function EmailWidget(props) { var registry = props.registry; var TextWidget = registry.widgets.TextWidget; return React__default.createElement(TextWidget, Object.assign({ type: "email" }, props)); }; var PasswordWidget = function PasswordWidget(props) { var registry = props.registry; var TextWidget = registry.widgets.TextWidget; return React__default.createElement(TextWidget, Object.assign({ type: "password" }, props)); }; var getScore$1 = function getScore(choices, value) { var choice = choices.find(function (choice) { return choice["enum"] === value; }); if (!choice) { choice = choices[Number(value)]; } return choice && choice.meta ? choice.meta.score : 0; }; var RadioWidget = function RadioWidget(_ref) { var id = _ref.id, schema = _ref.schema, label = _ref.label, options = _ref.options, value = _ref.value, required = _ref.required, disabled = _ref.disabled, readonly = _ref.readonly, onChange = _ref.onChange, onBlur = _ref.onBlur, onFocus = _ref.onFocus, uiSchema = _ref.uiSchema, rawErrors = _ref.rawErrors; var enumOptions = options.enumOptions, enumDisabled = options.enumDisabled; var _onChange = function _onChange(_ref2, value) { _objectDestructuringEmpty(_ref2); return onChange(schema.type == "boolean" ? value !== "false" : value); }; var _onBlur = function _onBlur(_ref3) { var value = _ref3.target.value; return onBlur(id, value); }; var _onFocus = function _onFocus(_ref4) { var value = _ref4.target.value; return onFocus(id, value); }; var row = options ? options.inline : false; var showScore = options ? options.showScore : false; var rawChoices = options && options.element ? options.element.choices : []; return React__default.createElement("div", { style: { display: 'flex' } }, React__default.createElement("div", { style: { flex: '1 1' } }, React__default.createElement(FormControl, { component: "fieldset", "aria-describedby": rjsfCore.utils.ariaDescribedBy(id, uiSchema, rawErrors) }, React__default.createElement("legend", { style: { position: 'absolute', clip: 'rect(0,0,0,0)' } }, rjsfCore.utils.generateAriaLabel(label, options, required)), schema.type === 'boolean' && React__default.createElement(core.FormHelperText, { component: "span" }, options.description), React__default.createElement(RadioGroup, { value: "" + value, row: row, onChange: _onChange, onBlur: _onBlur, onFocus: _onFocus }, enumOptions.map(function (option, i) { var itemDisabled = enumDisabled && enumDisabled.indexOf(option.value) != -1; return React__default.createElement(FormControlLabel, { control: React__default.createElement(Radio, { color: "primary", key: i }), style: { marginTop: '6px' }, label: "" + option.label, value: "" + option.value, key: i, disabled: disabled || itemDisabled || readonly }); })))), showScore && value && React__default.createElement(Typography, null, getScore$1(rawChoices, value))); }; var rangeSpec = rjsfCore.utils.rangeSpec; var useStyles$2 = function useStyles(props) { return styles$1.makeStyles({ slider: { marginTop: '45px', '& .MuiSlider-markLabel': { wordWrap: 'break-word', whiteSpace: 'normal', textAlign: 'center', width: props.markWidth + '%', '&[style="left: 0%;"]': { textAlign: 'left', transform: 'translateX(0%)' }, '&[style="left: 100%;"]': { textAlign: 'right', transform: 'translateX(-100%)' } } }, sliderRoot: { marginBottom: '45px' } }); }; var getScaleProps = function getScaleProps(options) { var scaleMarks = options.element.scaleMarks && options.element.scaleMarks[0] === undefined ? undefined : options.element.scaleMarks; return { widget: options.element.widget, scaleMarks: scaleMarks }; }; var calculateMultiplier = function calculateMultiplier(min, max, step) { var multiplier = 1; var range = max - min; var maxAmountOfMarks = 10; var amountOfMarks = range / step; // finds a multiplier for step so that there are not too many marks // and all marks are also valid values while (amountOfMarks >= maxAmountOfMarks) { multiplier++; if (range % (step * multiplier) === 0) { amountOfMarks = range / (step * multiplier); } else { if (multiplier / range > 0.5) { multiplier = -1; amountOfMarks = 0; } } } return multiplier; /* let multiplier = 1; let amountOfMarks = (max-min)/step; while (amountOfMarks >= 10) { multiplier++; if ((max-min)%(step*multiplier)) amountOfMarks = (max-min)/(step*multiplier); } return multiplier; */ }; var generateWithMiddleMarks = function generateWithMiddleMarks(min, max, step) { var middleMarks = []; for (var i = min; i < max; i = i + step) { middleMarks.push({ value: i, label: i.toString() }); } middleMarks.push({ value: max, label: max.toString() }); return middleMarks; }; var generateEndpointMarks = function generateEndpointMarks(min, max) { if (min === undefined || max === undefined) { return undefined; } else { return [{ value: min, label: min.toString() }, { value: max, label: max.toString() }]; } }; var generateMarks = function generateMarks(min, max, step) { if (min === undefined || max === undefined) { return []; } var multiplier = calculateMultiplier(min, max, step ? step < 1 ? 0.5 : step : 1); if (multiplier > 0) { return generateWithMiddleMarks(min, max, (step ? step < 1 ? 0.5 : step : 1) * multiplier); } return generateEndpointMarks(min, max); }; var RangeWidget = function RangeWidget(_ref) { var value = _ref.value, readonly = _ref.readonly, disabled = _ref.disabled, onBlur = _ref.onBlur, required = _ref.required, onFocus = _ref.onFocus, options = _ref.options, schema = _ref.schema, onChange = _ref.onChange, label = _ref.label, id = _ref.id, uiSchema = _ref.uiSchema, rawErrors = _ref.rawErrors; var sliderProps = _extends({ value: value, label: label, id: id }, rangeSpec(schema)); var scaleProps = options.element ? getScaleProps(options) : { widget: 'noScale', scaleMarks: undefined }; var _onChange = function _onChange(_ref2, value) { _objectDestructuringEmpty(_ref2); return onChange(value === "" ? options.emptyValue : value); }; var _onBlur = function _onBlur(_ref3) { var value = _ref3.target.value; return onBlur(id, value); }; var _onFocus = function _onFocus(_ref4) { var value = _ref4.target.value; return onFocus(id, value); }; var marks = scaleProps.widget === 'customScale' ? scaleProps.scaleMarks : scaleProps.widget === 'automaticScale' ? generateMarks(sliderProps.min, sliderProps.max, sliderProps.step) : generateEndpointMarks(sliderProps.min, sliderProps.max); var markWidth = marks && Array.isArray(marks) ? Math.floor(95 / marks.length) : 15; var classes = useStyles$2({ markWidth: markWidth > 15 ? markWidth : 15 })(); return React__default.createElement("div", { className: classes.sliderRoot }, options.description && options.description !== "" && React__default.createElement(Typography, { id: rjsfCore.utils.descriptionId(id), variant: "caption", color: "textSecondary" }, options.description), React__default.createElement(Slider, Object.assign({ className: classes.slider, "aria-label": rjsfCore.utils.generateAriaLabel(label, options, required), "aria-describedby": rjsfCore.utils.ariaDescribedBy(id, uiSchema, rawErrors), disabled: disabled || readonly, onChange: _onChange, onBlur: _onBlur, onFocus: _onFocus, valueLabelDisplay: "on", defaultValue: value && isNaN(value) && value !== "" ? value : sliderProps.min, marks: marks }, sliderProps))); }; var useStyles$3 = /*#__PURE__*/ styles$1.makeStyles({ inputLabelRoot: { clip: "rect(0 0 0 0)", clipPath: "inset(50%)", height: 1, overflow: "hidden", position: "absolute", whiteSpace: "nowrap", width: 1 }, inputFormControl: { "label + &": { marginTop: 0 } } }); var asNumber = rjsfCore.utils.asNumber, guessType = rjsfCore.utils.guessType; var nums = /*#__PURE__*/ new Set(["number", "integer"]); /** * This is a silly limitation in the DOM where option change event values are * always retrieved as strings. */ var processValue = function processValue(schema, value) { // "enum" is a reserved word, so only "type" and "items" can be destructured var type = schema.type, items = schema.items; if (value === "") { return undefined; } else if (type === "array" && items && nums.has(items.type)) { return value.map(asNumber); } else if (type === "boolean") { return value === "true"; } else if (type === "number") { return asNumber(value); } // If type is undefined, but an enum is present, try and infer the type from // the enum values if (schema["enum"]) { if (schema["enum"].every(function (x) { return guessType(x) === "number"; })) { return asNumber(value); } else if (schema["enum"].every(function (x) { return guessType(x) === "boolean"; })) { return value === "true"; } } return value; }; var getScore$2 = function getScore(choices, value) { if (typeof value === 'string') { var choice = choices.find(function (choice) { return choice["enum"] === value; }); if (!choice) { choice = choices[Number(value)]; } return choice && choice.meta ? choice.meta.score : undefined; } else if (Array.isArray(value) && value.length > 0) { var choiceString = value.map(function (item) { return getScore(choices, item); }); choiceString = choiceString.filter(function (value) { return value !== undefined; }); return choiceString.length > 0 ? choiceString.join(', ') : ''; } else { return ''; } }; var SelectWidget = function SelectWidget(_ref) { var schema = _ref.schema, id = _ref.id, options = _ref.options, label = _ref.label, required = _ref.required, disabled = _ref.disabled, readonly = _ref.readonly, value = _ref.value, multiple = _ref.multiple, autofocus = _ref.autofocus, onChange = _ref.onChange, onBlur = _ref.onBlur, onFocus = _ref.onFocus, _ref$rawErrors = _ref.rawErrors, rawErrors = _ref$rawErrors === void 0 ? [] : _ref$rawErrors; var enumOptions = options.enumOptions, enumDisabled = options.enumDisabled; var emptyValue = multiple ? [] : ""; var _onChange = function _onChange(_ref2) { var value = _ref2.target.value; return onChange(processValue(schema, value)); }; var _onBlur = function _onBlur(_ref3) { var value = _ref3.target.value; return onBlur(id, processValue(schema, value)); }; var _onFocus = function _onFocus(_ref4) { var value = _ref4.target.value; return onFocus(id, processValue(schema, value)); }; var showScore = options ? options.showScore : false; var rawChoices = options && options.element ? options.element.choices : []; var classes = useStyles$3(); return React__default.createElement("div", { style: { display: 'flex' } }, React__default.createElement("div", { style: { flex: '1 1' } }, React__default.createElement(TextField, { id: id, select: true, fullWidth: true, value: typeof value === "undefined" ? emptyValue : value, required: required, label: rjsfCore.utils.generateAriaLabel(label, options, required), disabled: disabled || readonly, autoFocus: autofocus, error: rawErrors.l