@antv/s2-react-components
Version:
React components for S2
59 lines • 3.65 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Dimension = void 0;
const tslib_1 = require("tslib");
const s2_1 = require("@antv/s2");
const antd_1 = require("antd");
const classnames_1 = tslib_1.__importDefault(require("classnames"));
const react_1 = tslib_1.__importDefault(require("react"));
const react_beautiful_dnd_1 = require("react-beautiful-dnd");
const item_1 = require("../item");
const util_1 = require("../util");
require("./index.less");
const CLASS_NAME_PREFIX = 'dimension';
/**
* 解决 react 18 with strict mode 下的拖动报错问题
* https://github.com/atlassian/react-beautiful-dnd/issues/2399#issuecomment-1175638194
*/
const useAfterAnimationFrame = () => {
const [enabled, setEnabled] = react_1.default.useState(false);
react_1.default.useEffect(() => {
const animation = requestAnimationFrame(() => setEnabled(true));
return () => {
cancelAnimationFrame(animation);
setEnabled(false);
};
}, []);
return enabled;
};
exports.Dimension = react_1.default.memo((props) => {
const { fieldType, crossRows = false, selectable = false, expandable = false, expandText = (0, s2_1.i18n)('展开子项'), allowEmpty = true, items = [], droppableType, text, icon: Icon } = props, rest = tslib_1.__rest(props, ["fieldType", "crossRows", "selectable", "expandable", "expandText", "allowEmpty", "items", "droppableType", "text", "icon"]);
const [expandChildren, setExpandChildren] = react_1.default.useState(true);
const enabled = useAfterAnimationFrame();
if (!enabled) {
return null;
}
const onUpdateExpand = (event) => {
setExpandChildren(event.target.checked);
};
// 开启不允许为空后,如果当前有且仅有一个item时,需要禁用拖动
const isDragDisabled = !allowEmpty && items.length === 1;
return (react_1.default.createElement("div", { className: (0, classnames_1.default)((0, util_1.getSwitcherClassName)(CLASS_NAME_PREFIX), {
'long-dimension': crossRows,
}) },
react_1.default.createElement("div", { className: (0, util_1.getSwitcherClassName)(CLASS_NAME_PREFIX, 'header') },
react_1.default.createElement("div", { className: "title" },
react_1.default.createElement(Icon, null),
" ",
react_1.default.createElement("span", null, text)),
expandable && (react_1.default.createElement("div", { className: 'expand-option' },
react_1.default.createElement(antd_1.Checkbox, { checked: expandChildren, onChange: onUpdateExpand }, expandText)))),
react_1.default.createElement(react_beautiful_dnd_1.Droppable, { droppableId: fieldType, type: droppableType }, (provided, snapshot) => (react_1.default.createElement("div", Object.assign({ ref: provided.innerRef }, provided.droppableProps, { className: (0, classnames_1.default)((0, util_1.getSwitcherClassName)(CLASS_NAME_PREFIX, 'items'), {
[(0, util_1.getSwitcherClassName)(CLASS_NAME_PREFIX, 'items-highlight')]: snapshot.isDraggingOver,
[(0, util_1.getSwitcherClassName)(CLASS_NAME_PREFIX, 'long-items')]: crossRows,
}) }),
items.map((item, index) => (react_1.default.createElement(item_1.DimensionItem, Object.assign({ key: item.id, index: index, fieldType: fieldType, item: item, expandable: expandable, expandChildren: expandChildren, selectable: selectable, isDragDisabled: isDragDisabled }, rest)))),
provided.placeholder)))));
});
exports.Dimension.displayName = 'Dimension';
//# sourceMappingURL=index.js.map