@workday/canvas-kit-react
Version:
The parent module that contains all Workday Canvas Kit React components
99 lines (98 loc) • 3.99 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useSelectionListModel = exports.multiSelectionManager = exports.singleSelectionManager = exports.isSelected = void 0;
const react_1 = __importDefault(require("react"));
const common_1 = require("@workday/canvas-kit-react/common");
const useCursorListModel_1 = require("./useCursorListModel");
const isSelected = (id, { selectedIds, unselectedIds }) => {
if (selectedIds === 'all') {
return !unselectedIds.includes(id);
}
return selectedIds.includes(id);
};
exports.isSelected = isSelected;
exports.singleSelectionManager = {
select(id) {
return { selectedIds: [id], unselectedIds: [] };
},
};
exports.multiSelectionManager = {
select(id, { selectedIds, unselectedIds }) {
if (selectedIds === 'all') {
// If we have all selected, start adding/removing from `unselectedIds`
const existingKey = unselectedIds.includes(id);
return {
selectedIds: 'all',
unselectedIds: existingKey
? unselectedIds.filter(key => key !== id)
: unselectedIds.concat(id),
};
}
else {
const existingKey = selectedIds.includes(id);
return {
selectedIds: existingKey ? selectedIds.filter(key => key !== id) : selectedIds.concat(id),
unselectedIds: [],
};
}
},
};
exports.useSelectionListModel = (0, common_1.createModelHook)({
defaultConfig: {
...useCursorListModel_1.useCursorListModel.defaultConfig,
initialSelectedIds: [],
initialUnselectedIds: [],
selection: exports.singleSelectionManager,
},
requiredConfig: useCursorListModel_1.useCursorListModel.requiredConfig,
contextOverride: useCursorListModel_1.useCursorListModel.Context,
})(config => {
const cursor = (0, useCursorListModel_1.useCursorListModel)(config);
const [selectedIds, setSelectedIds] = react_1.default.useState(config.initialSelectedIds);
const [unselectedIds, setUnselectedIds] = react_1.default.useState(config.initialUnselectedIds);
const selection = config.selection;
const state = { ...cursor.state, selectedIds, unselectedIds };
const events = {
...cursor.events,
/** Select a specific item by its identifier. */
select(data) {
const { selectedIds, unselectedIds } = selection.select(data.id, state);
setSelectedIds(selectedIds);
setUnselectedIds(unselectedIds);
},
/**
* Select all items. This will set `selectedIds` to `'all'` and remove all `unselectedIds`.
* This is especially useful for virtual lists where not all items are loaded in memory.
*/
selectAll() {
setSelectedIds('all');
},
/**
* Unselect all items.
*/
unselectAll() {
setSelectedIds([]);
},
/**
* Should be used with care and can be used to keep a model in sync with external controlled
* inputs.
*/
setSelectedIds(ids) {
setSelectedIds(ids);
},
/**
* The `remove` event can be called by Behavior Hooks based on user interaction. The `onRemove`
* can be added to the model config to signal the user wishes to remove the item in the list.
* The `remove` event requires the dynamic API where `items` are passed to the model. It is up
* to you to remove the item from the list. Focus redirection should be automatically managed,
* if necessary.
*/
remove(data) {
// nothing to do here. It is a signal event
},
};
return { ...cursor, state, events, selection };
});
;