UNPKG

test-jsonforms-react-spectrum-renderers

Version:

React Spectrum Renderer Set for JSONForms

267 lines (262 loc) 18.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); /* The MIT License Copyright (c) 2017-2019 EclipseSource Munich https://github.com/eclipsesource/jsonforms Copyright (c) 2022 headwire.com, Inc https://github.com/headwirecom/jsonforms-react-spectrum-renderers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var react_1 = tslib_1.__importStar(require("react")); var core_1 = require("@jsonforms/core"); var react_spectrum_1 = require("@adobe/react-spectrum"); var SpectrumArrayModalItem_1 = tslib_1.__importDefault(require("./SpectrumArrayModalItem")); var Add_1 = tslib_1.__importDefault(require("@spectrum-icons/workflow/Add")); var ArrowUp_1 = tslib_1.__importDefault(require("@spectrum-icons/workflow/ArrowUp")); var ArrowDown_1 = tslib_1.__importDefault(require("@spectrum-icons/workflow/ArrowDown")); var DragHandle_1 = tslib_1.__importDefault(require("@spectrum-icons/workflow/DragHandle")); var utils_1 = require("./utils"); var web_1 = require("@react-spring/web"); var react_2 = require("@use-gesture/react"); require("./SpectrumArrayModalItem.css"); var oneOf = 'oneOf'; exports.SpectrumArrayModalControl = react_1.default.memo(function (_a) { var addItem = _a.addItem, data = _a.data, label = _a.label, path = _a.path, removeItems = _a.removeItems, renderers = _a.renderers, rootSchema = _a.rootSchema, schema = _a.schema, uischema = _a.uischema, uischemas = _a.uischemas; var _b, _c; var _schema = react_1.useMemo(function () { return core_1.resolveSubSchemas(schema, rootSchema, oneOf); }, [schema, rootSchema, oneOf]); var oneOfRenderInfos = react_1.useMemo(function () { return core_1.createCombinatorRenderInfos(_schema.oneOf, rootSchema, oneOf, uischema, path, uischemas); }, [_schema, rootSchema, oneOf, uischema, uischemas, path]); var _d = react_1.useState(0), selectedIndex = _d[0], setSelectedIndex = _d[1]; var _e = react_1.useState(false), open = _e[0], setOpen = _e[1]; var handleClose = function () { return setOpen(false); }; var _f = react_1.useState(undefined), expanded = _f[0], setExpanded = _f[1]; var isExpanded = function (index) { return expanded === index; }; var onExpand = function (index) { return react_1.useCallback(function () { setExpanded(function (current) { return (current === index ? null : index); }); }, [index]); }; var _g = react_1.useState((_b = data === null || data === void 0 ? void 0 : data.map(function (boundData) { return (boundData ? undefined : 999); })) !== null && _b !== void 0 ? _b : []), indexOfFittingSchemaArray = _g[0], setIndexOfFittingSchemaArray = _g[1]; react_1.default.useEffect(function () { var _a; setIndexOfFittingSchemaArray((_a = data === null || data === void 0 ? void 0 : data.map(function (boundData) { return (boundData ? undefined : 999); })) !== null && _a !== void 0 ? _a : []); }, [removeItems]); var handleRemoveItem = react_1.useCallback(function (path, value) { return function () { removeItems(path, [value])(); indexOfFittingSchemaArray.splice(value, 1); }; }, [removeItems]); var handlePickerChange = react_1.useCallback(function (newOneOfIndex) { newOneOfIndex = Number(newOneOfIndex); setSelectedIndex(newOneOfIndex); }, [setSelectedIndex]); var handleListBoxChange = react_1.useCallback(function (newOneOfIndex) { if (newOneOfIndex.currentKey) { setSelectedIndex(newOneOfIndex.currentKey); } }, [setSelectedIndex]); var handleOnConfirm = function (handleClose, index) { setIndexOfFittingSchemaArray(tslib_1.__spreadArrays(indexOfFittingSchemaArray, [ Math.floor(index), ])); addItem(path, core_1.createDefaultValue(schema.oneOf[index]))(); setSelectedIndex(0); handleClose(); setExpanded(indexOfFittingSchemaArray.length); }; var usePickerInsteadOfListBox = (_c = uischema.options) === null || _c === void 0 ? void 0 : _c.picker; var moveItUp = function (index) { var indexOfFittingSchemaOriginal = utils_1.indexOfFittingSchemaObject[path + "." + index]; var indexOfFittingSchemaNew = utils_1.indexOfFittingSchemaObject[path + "." + (index - 1)]; utils_1.indexOfFittingSchemaObject[path + "." + index] = indexOfFittingSchemaNew; utils_1.indexOfFittingSchemaObject[path + "." + (index - 1)] = indexOfFittingSchemaOriginal; setExpanded(null); //removeItems is only used to update the data, change to a better solution in the future removeItems(path, [999999999])(); }; var moveDnD = function (curIndex, tarRow) { setExpanded(null); utils_1.moveFromTo(data, curIndex, tarRow); if (curIndex - tarRow > 0) { removeItems(path, [curIndex + 1])(); } else { removeItems(path, [curIndex])(); } if (curIndex - tarRow === 1 || curIndex - tarRow === -2) { var indexOfFittingSchemaOriginal = utils_1.indexOfFittingSchemaObject[path + "." + curIndex]; var indexOfFittingSchemaNew = utils_1.indexOfFittingSchemaObject[path + "." + (curIndex - 1)]; utils_1.indexOfFittingSchemaObject[path + "." + curIndex] = indexOfFittingSchemaNew; utils_1.indexOfFittingSchemaObject[path + "." + (curIndex - 1)] = indexOfFittingSchemaOriginal; } if (curIndex > 9999999) { moveItUp(curIndex); moveItDown(curIndex); } return data; }; var moveItDown = function (index) { var indexOfFittingSchemaOriginal = utils_1.indexOfFittingSchemaObject[path + "." + index]; var indexOfFittingSchemaNew = utils_1.indexOfFittingSchemaObject[path + "." + (index + 1)]; utils_1.indexOfFittingSchemaObject[path + "." + index] = indexOfFittingSchemaNew; utils_1.indexOfFittingSchemaObject[path + "." + (index + 1)] = indexOfFittingSchemaOriginal; setExpanded(null); //removeItems is only used to update the data, change to a better solution in the future removeItems(path, [data.length])(); }; // Drag and Drop var stringified = function (arr) { return arr.map(function (item) { return JSON.stringify(item); }); }; var order = react_1.default.useRef(Array.from(Array(data)).map(function (data, _) { return data; })); var HEIGHT_OF_COMPONENT = 88; var fn = function (order, active, originalIndex, curIndex, y) { if (active === void 0) { active = false; } if (originalIndex === void 0) { originalIndex = 0; } if (curIndex === void 0) { curIndex = 0; } if (y === void 0) { y = 0; } return function (index) { return active && index === originalIndex ? { y: curIndex * HEIGHT_OF_COMPONENT + y, scale: 1.03, zIndex: 50, shadow: 15, immediate: function (key) { return key === 'zIndex'; }, config: function (key) { return key === 'y' ? web_1.config.stiff : web_1.config.default; }, } : { y: stringified(order).indexOf(JSON.stringify(data[index])) * HEIGHT_OF_COMPONENT, scale: 1, zIndex: 20, shadow: 1, immediate: false, }; }; }; var _h = web_1.useSprings(data === null || data === void 0 ? void 0 : data.length, fn(order.current[0])), springs = _h[0], api = _h[1]; var DragHandleRef = web_1.useSpringRef(); var _j = react_1.useState(null), grabbedIndex = _j[0], setGrabbedIndex = _j[1]; var bind = react_2.useDrag(function (_a) { var originalIndex = _a.args[0], active = _a.active, _b = _a.movement, y = _b[1]; console.log(y); if (grabbedIndex !== null) { var curRow = utils_1.clamp(Math.round((grabbedIndex * HEIGHT_OF_COMPONENT + y) / HEIGHT_OF_COMPONENT), 0, data.length - 1); console.log(curRow); var newOrder = utils_1.swap(order.current[0], stringified(order.current[0]).indexOf(JSON.stringify(order.current[0][grabbedIndex])), stringified(order.current[0]).indexOf(JSON.stringify(order.current[0][curRow]))); api.start(fn(newOrder, active, originalIndex, curRow, y)); // Feed springs new style data, they'll animate the view without causing a single render if (stringified(order.current[0]).indexOf(JSON.stringify(order.current[0][grabbedIndex])) === stringified(order.current[0]).indexOf(JSON.stringify(order.current[0][curRow]))) { return; } else { if (data === newOrder) { return; } data.splice(0, data.length); data.push.apply(data, newOrder); } if (!active) { order.current[0] = newOrder; setGrabbedIndex(null); removeItems(path, [999999999])(); api.start(fn(newOrder, active, originalIndex, curRow, y)); } } }); var duplicateContent = function (index) { data.push(data[index]); removeItems(path, [999999999])(); }; return (react_1.default.createElement(react_spectrum_1.View, null, react_1.default.createElement("div", { style: { display: 'flex', flexDirection: 'column', height: HEIGHT_OF_COMPONENT * data.length, touchAction: 'none', transformOrigin: '50% 50% 0px', backgroundColor: 'red', position: 'relative', } }, springs.map(function (_a, index) { var zIndex = _a.zIndex, shadow = _a.shadow, y = _a.y, scale = _a.scale; return (react_1.default.createElement(web_1.animated.div, tslib_1.__assign({}, bind(index), { key: index, style: { zIndex: zIndex, boxShadow: shadow.to(function (s) { return "rgba(0, 0, 0, 0.15) 0px " + s + "px " + 2 * s + "px 0px"; }), y: y, scale: scale, width: '100%', touchAction: 'none', transformOrigin: '50% 50% 0px', position: 'absolute', }, height: HEIGHT_OF_COMPONENT + 'px' }), react_1.default.createElement(react_spectrum_1.Flex, { direction: 'row', alignItems: 'stretch', flex: 'auto inherit' }, react_1.default.createElement(SpectrumArrayModalItem_1.default, { expanded: isExpanded(index), handleExpand: onExpand, index: index, indexOfFittingSchema: indexOfFittingSchemaArray[index], path: path, removeItem: handleRemoveItem, renderers: renderers, schema: schema, uischema: uischema, uischemas: uischemas }), react_1.default.createElement("div", { ref: DragHandleRef, className: 'grabbable', onMouseDown: function () { return setGrabbedIndex(index); } }, react_1.default.createElement(DragHandle_1.default, { "aria-label": 'Drag and Drop Handle', size: 'L', alignSelf: 'center', width: '100%' })), react_1.default.createElement("p", { onClick: function () { return duplicateContent(index); } }, JSON.stringify(y))))); })), react_1.default.createElement(react_spectrum_1.Flex, { direction: 'row', justifyContent: 'space-between' }, react_1.default.createElement(react_spectrum_1.Heading, { level: 4 }, label), react_1.default.createElement(react_spectrum_1.Button, { alignSelf: 'center', onPress: react_1.useCallback(function () { setOpen(true); }, [open]), variant: 'primary' }, react_1.default.createElement(Add_1.default, { "aria-label": 'Add' })), react_1.default.createElement(react_spectrum_1.DialogContainer, { onDismiss: handleClose }, open && (react_1.default.createElement(react_spectrum_1.Dialog, null, react_1.default.createElement("div", { style: { gridColumn: '1 / -1' } }, react_1.default.createElement(react_spectrum_1.Heading, { margin: 'size-100' }, "Add a new item"), react_1.default.createElement(react_spectrum_1.Divider, null), usePickerInsteadOfListBox ? (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(react_spectrum_1.Picker, { "aria-label": 'Select', margin: 'size-100', onSelectionChange: handlePickerChange, selectedKey: String(selectedIndex), width: 'calc(100% - size-200)' }, oneOfRenderInfos.map(function (oneOfRenderInfo, oneOfIndex) { return (react_1.default.createElement(react_spectrum_1.Item, { key: oneOfIndex }, oneOfRenderInfo.label)); })))) : (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(react_spectrum_1.ListBox, { "aria-label": 'Select', items: oneOfRenderInfos, margin: 'size-100', onSelectionChange: function (selected) { return handleListBoxChange(selected); }, selectedKeys: String(selectedIndex), selectionMode: 'single', width: 'calc(100% - size-200)', maxHeight: 'size-2400' }, oneOfRenderInfos.map(function (oneOfRenderInfo, oneOfIndex) { return (react_1.default.createElement(react_spectrum_1.Item, { key: oneOfIndex }, oneOfRenderInfo.label)); }))))), react_1.default.createElement(react_spectrum_1.ButtonGroup, null, react_1.default.createElement(react_spectrum_1.Button, { variant: 'secondary', onPress: handleClose }, "Cancel"), react_1.default.createElement(react_spectrum_1.Button, { variant: 'cta', onPress: function () { return handleOnConfirm(handleClose, selectedIndex); }, autoFocus: true }, "Confirm")))))), react_1.default.createElement(react_spectrum_1.Flex, { direction: 'column', gap: 'size-100' }, data && (data === null || data === void 0 ? void 0 : data.length) ? (Array.from(Array(data === null || data === void 0 ? void 0 : data.length)).map(function (_, index) { var _a, _b, _c; utils_1.indexOfFittingSchemaObject[path + "itemQuantity"] = data === null || data === void 0 ? void 0 : data.length; return (react_1.default.createElement("div", { key: index, style: { opacity: 0 } }, react_1.default.createElement(react_spectrum_1.Flex, { key: index, direction: 'row', alignItems: 'stretch', flex: 'auto inherit' }, react_1.default.createElement(SpectrumArrayModalItem_1.default, { expanded: isExpanded(index), handleExpand: onExpand, index: index, indexOfFittingSchema: indexOfFittingSchemaArray[index], path: path, removeItem: handleRemoveItem, renderers: renderers, schema: schema, uischema: uischema, uischemas: uischemas }), react_1.default.createElement("div", { className: 'grabbable' }, react_1.default.createElement(DragHandle_1.default, { "aria-label": 'Drag and Drop Handle', size: 'L', alignSelf: 'center', width: '100%' })), ((_a = uischema.options) === null || _a === void 0 ? void 0 : _a.showSortButtons) ? (react_1.default.createElement(react_spectrum_1.Flex, { direction: ((_b = uischema.options) === null || _b === void 0 ? void 0 : _b.sortButtonDirection) === 'Horizontal' ? 'row' : 'column', marginTop: ((_c = uischema.options) === null || _c === void 0 ? void 0 : _c.sortButtonDirection) === 'Horizontal' ? 'size-225' : 'size-0' }, react_1.default.createElement(react_spectrum_1.TooltipTrigger, null, react_1.default.createElement(react_spectrum_1.ActionButton, { isQuiet: true, onPress: function () { return moveDnD(index, index - 1); }, "aria-label": "move-item-" + path + "." + index + "-up", marginX: 'size-10', isDisabled: index === 0 }, react_1.default.createElement(ArrowUp_1.default, { "aria-label": 'ArrowUp' })), react_1.default.createElement(react_spectrum_1.Tooltip, null, "Move upwards")), react_1.default.createElement(react_spectrum_1.TooltipTrigger, null, react_1.default.createElement(react_spectrum_1.ActionButton, { isQuiet: true, onPress: function () { return moveDnD(index, index + 2); }, "aria-label": "move-item-" + path + "." + index + "-down", marginX: 'size-10', isDisabled: index === utils_1.indexOfFittingSchemaObject[path + "itemQuantity"] - 1 }, react_1.default.createElement(ArrowDown_1.default, { "aria-label": 'ArrowDown' })), react_1.default.createElement(react_spectrum_1.Tooltip, null, "Move downwards")))) : null))); })) : (react_1.default.createElement(react_spectrum_1.Text, null, "No data"))))); }); //# sourceMappingURL=SpectrumArrayModalControl.js.map