UNPKG

@workday/canvas-kit-react

Version:

The parent module that contains all Workday Canvas Kit React components

99 lines (98 loc) 3.99 kB
"use strict"; 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 }; });