@mskcc/carbon-react
Version:
Carbon react components for the MSKCC DSM
210 lines (201 loc) • 6.08 kB
JavaScript
/**
* MSKCC 2021, 2024
*/
;
Object.defineProperty(exports, '__esModule', { value: true });
var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
var React = require('react');
var PropTypes = require('prop-types');
var isEqual = require('lodash.isequal');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
var isEqual__default = /*#__PURE__*/_interopDefaultLegacy(isEqual);
function callOnChangeHandler(_ref) {
let {
isControlled,
isMounted,
onChangeHandlerControlled,
onChangeHandlerUncontrolled,
selectedItems
} = _ref;
if (isControlled) {
if (isMounted && onChangeHandlerControlled) {
onChangeHandlerControlled({
selectedItems
});
}
} else {
onChangeHandlerUncontrolled(selectedItems);
}
}
function useSelection(_ref2) {
let {
disabled,
onChange,
initialSelectedItems = [],
selectedItems: controlledItems
} = _ref2;
const isMounted = React.useRef(false);
const savedOnChange = React.useRef(onChange);
const [uncontrolledItems, setUncontrolledItems] = React.useState(initialSelectedItems);
const isControlled = !!controlledItems;
const selectedItems = isControlled ? controlledItems : uncontrolledItems;
const onItemChange = React.useCallback(item => {
if (disabled) {
return;
}
let selectedIndex;
selectedItems.forEach((selectedItem, index) => {
if (isEqual__default["default"](selectedItem, item)) {
selectedIndex = index;
}
});
let newSelectedItems;
if (selectedIndex === undefined) {
newSelectedItems = selectedItems.concat(item);
callOnChangeHandler({
isControlled,
isMounted: isMounted.current,
onChangeHandlerControlled: savedOnChange.current,
onChangeHandlerUncontrolled: setUncontrolledItems,
selectedItems: newSelectedItems
});
return;
}
newSelectedItems = removeAtIndex(selectedItems, selectedIndex);
callOnChangeHandler({
isControlled,
isMounted: isMounted.current,
onChangeHandlerControlled: savedOnChange.current,
onChangeHandlerUncontrolled: setUncontrolledItems,
selectedItems: newSelectedItems
});
}, [disabled, isControlled, selectedItems]);
const clearSelection = React.useCallback(() => {
if (disabled) {
return;
}
callOnChangeHandler({
isControlled,
isMounted: isMounted.current,
onChangeHandlerControlled: savedOnChange.current,
onChangeHandlerUncontrolled: setUncontrolledItems,
selectedItems: []
});
}, [disabled, isControlled]);
React.useEffect(() => {
savedOnChange.current = onChange;
}, [onChange]);
React.useEffect(() => {
if (isMounted.current && savedOnChange.current && !isControlled) {
savedOnChange.current({
selectedItems
});
}
}, [isControlled, selectedItems]);
React.useEffect(() => {
isMounted.current = true;
return () => {
isMounted.current = false;
};
}, []);
return {
selectedItems,
onItemChange,
clearSelection
};
}
class Selection extends React__default["default"].Component {
constructor(props) {
super(props);
_rollupPluginBabelHelpers.defineProperty(this, "internalSetState", (stateToSet, callback) => this.setState(stateToSet, () => {
if (callback) {
callback();
}
if (this.props.onChange) {
this.props.onChange(this.state);
}
}));
_rollupPluginBabelHelpers.defineProperty(this, "handleClearSelection", () => {
if (this.props.disabled) {
return;
}
this.internalSetState({
selectedItems: []
});
});
_rollupPluginBabelHelpers.defineProperty(this, "handleSelectItem", item => {
this.internalSetState(state => ({
selectedItems: state.selectedItems.concat(item)
}));
});
_rollupPluginBabelHelpers.defineProperty(this, "handleRemoveItem", index => {
this.internalSetState(state => ({
selectedItems: removeAtIndex(state.selectedItems, index)
}));
});
_rollupPluginBabelHelpers.defineProperty(this, "handleOnItemChange", item => {
if (this.props.disabled) {
return;
}
const {
selectedItems
} = this.state;
let selectedIndex;
selectedItems.forEach((selectedItem, index) => {
if (isEqual__default["default"](selectedItem, item)) {
selectedIndex = index;
}
});
if (selectedIndex === undefined) {
this.handleSelectItem(item);
return;
}
this.handleRemoveItem(selectedIndex);
});
this.state = {
selectedItems: props.initialSelectedItems
};
}
render() {
const {
children,
render
} = this.props;
const {
selectedItems
} = this.state;
const renderProps = {
selectedItems,
onItemChange: this.handleOnItemChange,
clearSelection: this.handleClearSelection
};
if (render !== undefined) {
return render(renderProps);
}
if (children !== undefined) {
return children(renderProps);
}
return null;
}
}
// Generic utility for safely removing an element at a given index from an
// array.
_rollupPluginBabelHelpers.defineProperty(Selection, "propTypes", {
children: PropTypes__default["default"].func,
disabled: PropTypes__default["default"].bool,
initialSelectedItems: PropTypes__default["default"].array.isRequired,
onChange: PropTypes__default["default"].func,
render: PropTypes__default["default"].func
});
_rollupPluginBabelHelpers.defineProperty(Selection, "defaultProps", {
initialSelectedItems: []
});
const removeAtIndex = (array, index) => {
const result = array.slice();
result.splice(index, 1);
return result;
};
exports["default"] = Selection;
exports.useSelection = useSelection;