@ynput/ayon-frontend-shared 0.2.16 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DetailsPanel.cjs.js +9 -10
- package/dist/DetailsPanel.cjs.js.map +1 -1
- package/dist/DetailsPanel.es.js +9 -10
- package/dist/DetailsPanel.es.js.map +1 -1
- package/dist/ProjectTreeTable.cjs.js +38 -34
- package/dist/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/ProjectTreeTable.es.js +20 -16
- package/dist/ProjectTreeTable.es.js.map +1 -1
- package/dist/_virtual/index.cjs10.js +4 -4
- package/dist/_virtual/index.cjs5.js +5 -3
- package/dist/_virtual/index.cjs5.js.map +1 -1
- package/dist/_virtual/index.cjs6.js +3 -5
- package/dist/_virtual/index.cjs6.js.map +1 -1
- package/dist/_virtual/index.cjs8.js +4 -4
- package/dist/_virtual/index.cjs9.js +4 -4
- package/dist/_virtual/index.es10.js +4 -4
- package/dist/_virtual/index.es5.js +5 -2
- package/dist/_virtual/index.es5.js.map +1 -1
- package/dist/_virtual/index.es6.js +2 -5
- package/dist/_virtual/index.es6.js.map +1 -1
- package/dist/_virtual/index.es8.js +4 -4
- package/dist/_virtual/index.es9.js +4 -4
- package/dist/index.cjs.js +6 -7
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +6 -7
- package/dist/index.es.js.map +1 -1
- package/dist/node_modules/graphql-request/build/legacy/helpers/analyzeDocument.cjs.js +1 -2
- package/dist/node_modules/graphql-request/build/legacy/helpers/analyzeDocument.cjs.js.map +1 -1
- package/dist/node_modules/graphql-request/build/legacy/helpers/analyzeDocument.es.js +1 -2
- package/dist/node_modules/graphql-request/build/legacy/helpers/analyzeDocument.es.js.map +1 -1
- package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +2 -2
- package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
- package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
- package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.cjs.js +1 -1
- package/dist/node_modules/rehype-prism-plus/dist/index.es.es.js +1 -1
- package/dist/node_modules/remove-accents/index.cjs.js +1 -1
- package/dist/node_modules/remove-accents/index.es.js +1 -1
- package/dist/node_modules/vfile/lib/index.cjs.js +1 -1
- package/dist/node_modules/vfile/lib/index.es.js +1 -1
- package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js +6 -7
- package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.cjs.js.map +1 -1
- package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js +6 -7
- package/dist/shared/src/components/EntityThumbnailUploader/EntityThumbnailUploader.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ColumnItem.cjs.js +2 -0
- package/dist/shared/src/components/ProjectTableSettings/ColumnItem.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ColumnItem.es.js +2 -0
- package/dist/shared/src/components/ProjectTableSettings/ColumnItem.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js +5 -1
- package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js +5 -1
- package/dist/shared/src/components/ProjectTableSettings/ColumnsSettings.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +21 -86
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +21 -86
- package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/SortableColumnItem.cjs.js +2 -0
- package/dist/shared/src/components/ProjectTableSettings/SortableColumnItem.cjs.js.map +1 -1
- package/dist/shared/src/components/ProjectTableSettings/SortableColumnItem.es.js +2 -0
- package/dist/shared/src/components/ProjectTableSettings/SortableColumnItem.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +6 -7
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +6 -7
- package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +6 -7
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +6 -7
- package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +6 -7
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +6 -7
- package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
- package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.cjs.js +27 -6
- package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.cjs.js.map +1 -1
- package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.es.js +27 -6
- package/dist/shared/src/components/SettingsPanel/SettingsPanelItemTemplate.es.js.map +1 -1
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +6 -7
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +6 -7
- package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +6 -7
- package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +6 -7
- package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +6 -7
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +6 -7
- package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +9 -10
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +9 -10
- package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +6 -7
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +6 -7
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +6 -7
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +6 -7
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +5 -6
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +5 -6
- package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +16 -9
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +16 -9
- package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +5 -7
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +5 -7
- package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.cjs.js +1 -174
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.es.js +2 -175
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.cjs.js +212 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.es.js +212 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/ColumnSettingsProvider.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js +1 -185
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js +2 -186
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js +191 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js +191 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableProvider.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsContext.cjs.js +1 -79
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsContext.es.js +2 -80
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsProvider.cjs.js +84 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsProvider.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsProvider.es.js +84 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectedRowsProvider.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.cjs.js +1 -277
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.es.js +2 -278
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsContext.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js +282 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js +282 -0
- package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +3 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +3 -2
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useEntitiesMap.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useEntitiesMap.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js +8 -175
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js +8 -175
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/{context/ProjectTableModulesContext.cjs.js → hooks/useProjectTableModules.cjs.js} +26 -48
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.cjs.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/{context/ProjectTableModulesContext.es.js → hooks/useProjectTableModules.es.js} +26 -48
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useProjectTableModules.es.js.map +1 -0
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +4 -3
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +4 -3
- package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js +8 -5
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js.map +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js +7 -4
- package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js.map +1 -1
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +7 -8
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +7 -8
- package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
- package/dist/shared/src/context/RemoteModulesContext.es.js +1 -1
- package/dist/shared/src/hooks/useLoadModule.cjs.js +3 -3
- package/dist/shared/src/hooks/useLoadModule.cjs.js.map +1 -1
- package/dist/shared/src/hooks/useLoadModule.es.js +3 -3
- package/dist/shared/src/hooks/useLoadModule.es.js.map +1 -1
- package/dist/types/components/ProjectTableSettings/ColumnItem.d.ts +1 -0
- package/dist/types/components/ProjectTableSettings/SortableColumnItem.d.ts +1 -0
- package/dist/types/components/SettingsPanel/SettingsPanelItemTemplate.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/components/GroupSettingsFallback.d.ts +9 -2
- package/dist/types/containers/ProjectTreeTable/context/ColumnSettingsContext.d.ts +16 -16
- package/dist/types/containers/ProjectTreeTable/context/ColumnSettingsProvider.d.ts +9 -0
- package/dist/types/containers/ProjectTreeTable/context/ProjectTableContext.d.ts +5 -61
- package/dist/types/containers/ProjectTreeTable/context/ProjectTableProvider.d.ts +59 -0
- package/dist/types/containers/ProjectTreeTable/context/SelectedRowsContext.d.ts +3 -8
- package/dist/types/containers/ProjectTreeTable/context/SelectedRowsProvider.d.ts +6 -0
- package/dist/types/containers/ProjectTreeTable/context/SelectionCellsContext.d.ts +2 -4
- package/dist/types/containers/ProjectTreeTable/context/SelectionCellsProvider.d.ts +4 -0
- package/dist/types/containers/ProjectTreeTable/context/index.d.ts +4 -2
- package/dist/types/containers/ProjectTreeTable/hooks/index.d.ts +1 -0
- package/dist/types/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.d.ts +1 -2
- package/dist/types/containers/ProjectTreeTable/hooks/useEntitiesMap.d.ts +1 -1
- package/dist/types/containers/ProjectTreeTable/hooks/useFetchOverviewData.d.ts +4 -3
- package/dist/types/containers/ProjectTreeTable/hooks/useGetGroupedFields.d.ts +1 -1
- package/dist/types/containers/ProjectTreeTable/{context/ProjectTableModulesContext.d.ts → hooks/useProjectTableModules.d.ts} +5 -12
- package/dist/types/containers/ProjectTreeTable/index.d.ts +1 -10
- package/dist/types/containers/ProjectTreeTable/types/overviewContext.d.ts +3 -3
- package/package.json +1 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.cjs.js.map +0 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableModulesContext.es.js.map +0 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableSelectionContext.cjs.js +0 -33
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableSelectionContext.cjs.js.map +0 -1
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableSelectionContext.es.js +0 -33
- package/dist/shared/src/containers/ProjectTreeTable/context/ProjectTableSelectionContext.es.js.map +0 -1
- package/dist/types/containers/ProjectTreeTable/context/ProjectTableSelectionContext.d.ts +0 -11
|
@@ -1,282 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { createContext, useContext, useState, useMemo, useRef, useCallback } from "react";
|
|
3
|
-
import { parseCellId, getCellId, BorderPosition, getBorderClasses } from "../utils/cellUtils.es.js";
|
|
4
|
-
import { DRAG_HANDLE_COLUMN_ID } from "../ProjectTreeTable.es.js";
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
5
2
|
const ROW_SELECTION_COLUMN_ID = "__row_selection__";
|
|
6
3
|
const SelectionCellsContext = createContext(void 0);
|
|
7
|
-
const SelectionCellsProvider = ({ children }) => {
|
|
8
|
-
const [selectedCells, setSelectedCells] = useState(/* @__PURE__ */ new Set());
|
|
9
|
-
const [focusedCellId, setFocusedCellId] = useState(null);
|
|
10
|
-
const [selectionInProgress, setSelectionInProgress] = useState(false);
|
|
11
|
-
const [anchorCell, setAnchorCell] = useState(null);
|
|
12
|
-
const [gridMap, setGridMap] = useState({
|
|
13
|
-
rowIdToIndex: /* @__PURE__ */ new Map(),
|
|
14
|
-
colIdToIndex: /* @__PURE__ */ new Map(),
|
|
15
|
-
indexToRowId: /* @__PURE__ */ new Map(),
|
|
16
|
-
indexToColId: /* @__PURE__ */ new Map()
|
|
17
|
-
});
|
|
18
|
-
const mapToString = (map) => {
|
|
19
|
-
return JSON.stringify(Array.from(map.entries()));
|
|
20
|
-
};
|
|
21
|
-
const stableGridMap = useMemo(
|
|
22
|
-
() => gridMap,
|
|
23
|
-
[
|
|
24
|
-
mapToString(gridMap.rowIdToIndex),
|
|
25
|
-
mapToString(gridMap.colIdToIndex),
|
|
26
|
-
mapToString(gridMap.indexToRowId),
|
|
27
|
-
mapToString(gridMap.indexToColId)
|
|
28
|
-
]
|
|
29
|
-
);
|
|
30
|
-
const initialCellSelected = useRef(false);
|
|
31
|
-
const selectedRows = useMemo(
|
|
32
|
-
() => Array.from(selectedCells).filter(
|
|
33
|
-
(cellId) => {
|
|
34
|
-
var _a, _b;
|
|
35
|
-
return ((_a = parseCellId(cellId)) == null ? void 0 : _a.colId) === ROW_SELECTION_COLUMN_ID && ((_b = parseCellId(cellId)) == null ? void 0 : _b.rowId);
|
|
36
|
-
}
|
|
37
|
-
).map((cellId) => {
|
|
38
|
-
var _a;
|
|
39
|
-
return (_a = parseCellId(cellId)) == null ? void 0 : _a.rowId;
|
|
40
|
-
}),
|
|
41
|
-
[selectedCells]
|
|
42
|
-
);
|
|
43
|
-
const registerGrid = useCallback((rows, columns) => {
|
|
44
|
-
const rowIdToIndex = /* @__PURE__ */ new Map();
|
|
45
|
-
const colIdToIndex = /* @__PURE__ */ new Map();
|
|
46
|
-
const indexToRowId = /* @__PURE__ */ new Map();
|
|
47
|
-
const indexToColId = /* @__PURE__ */ new Map();
|
|
48
|
-
rows.forEach((rowId, index) => {
|
|
49
|
-
rowIdToIndex.set(rowId, index);
|
|
50
|
-
indexToRowId.set(index, rowId);
|
|
51
|
-
});
|
|
52
|
-
columns.forEach((colId, index) => {
|
|
53
|
-
colIdToIndex.set(colId, index);
|
|
54
|
-
indexToColId.set(index, colId);
|
|
55
|
-
});
|
|
56
|
-
setGridMap({ rowIdToIndex, colIdToIndex, indexToRowId, indexToColId });
|
|
57
|
-
}, []);
|
|
58
|
-
const updateSelection = useCallback((selection, position) => {
|
|
59
|
-
setSelectedCells((prevSelectedCells) => {
|
|
60
|
-
let newSelection = new Set(selection);
|
|
61
|
-
if (position.colId !== ROW_SELECTION_COLUMN_ID && position.colId !== DRAG_HANDLE_COLUMN_ID) {
|
|
62
|
-
const rowSelection = Array.from(prevSelectedCells).filter(
|
|
63
|
-
(id) => {
|
|
64
|
-
var _a;
|
|
65
|
-
return ((_a = parseCellId(id)) == null ? void 0 : _a.colId) === ROW_SELECTION_COLUMN_ID;
|
|
66
|
-
}
|
|
67
|
-
);
|
|
68
|
-
if (rowSelection.length) {
|
|
69
|
-
newSelection = /* @__PURE__ */ new Set([...newSelection, ...rowSelection]);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return newSelection;
|
|
73
|
-
});
|
|
74
|
-
}, []);
|
|
75
|
-
const selectCellRange = useCallback(
|
|
76
|
-
(start, end, additive) => {
|
|
77
|
-
if (!additive) {
|
|
78
|
-
updateSelection(/* @__PURE__ */ new Set(), start);
|
|
79
|
-
}
|
|
80
|
-
const startRowIdx = stableGridMap.rowIdToIndex.get(start.rowId) ?? 0;
|
|
81
|
-
const startColIdx = stableGridMap.colIdToIndex.get(start.colId) ?? 0;
|
|
82
|
-
const endRowIdx = stableGridMap.rowIdToIndex.get(end.rowId) ?? 0;
|
|
83
|
-
const endColIdx = stableGridMap.colIdToIndex.get(end.colId) ?? 0;
|
|
84
|
-
const minRowIdx = Math.min(startRowIdx, endRowIdx);
|
|
85
|
-
const maxRowIdx = Math.max(startRowIdx, endRowIdx);
|
|
86
|
-
const minColIdx = Math.min(startColIdx, endColIdx);
|
|
87
|
-
const maxColIdx = Math.max(startColIdx, endColIdx);
|
|
88
|
-
const newSelection = new Set(additive ? selectedCells : []);
|
|
89
|
-
for (let r = minRowIdx; r <= maxRowIdx; r++) {
|
|
90
|
-
const rowId = stableGridMap.indexToRowId.get(r);
|
|
91
|
-
if (!rowId) continue;
|
|
92
|
-
for (let c = minColIdx; c <= maxColIdx; c++) {
|
|
93
|
-
const colId = stableGridMap.indexToColId.get(c);
|
|
94
|
-
if (!colId) continue;
|
|
95
|
-
newSelection.add(getCellId(rowId, colId));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
return newSelection;
|
|
99
|
-
},
|
|
100
|
-
[stableGridMap, selectedCells]
|
|
101
|
-
);
|
|
102
|
-
const startSelection = useCallback(
|
|
103
|
-
(cellId, additive) => {
|
|
104
|
-
const position = parseCellId(cellId);
|
|
105
|
-
if (!position) return;
|
|
106
|
-
setSelectionInProgress(true);
|
|
107
|
-
initialCellSelected.current = selectedCells.has(cellId);
|
|
108
|
-
if (additive) {
|
|
109
|
-
setSelectedCells((prev) => {
|
|
110
|
-
const newSelection = new Set(prev);
|
|
111
|
-
if (newSelection.has(cellId)) {
|
|
112
|
-
newSelection.delete(cellId);
|
|
113
|
-
if (focusedCellId === cellId) {
|
|
114
|
-
if (newSelection.size > 0) {
|
|
115
|
-
setFocusedCellId(Array.from(newSelection)[Array.from(newSelection).length - 1]);
|
|
116
|
-
} else {
|
|
117
|
-
setFocusedCellId(null);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
} else {
|
|
121
|
-
newSelection.add(cellId);
|
|
122
|
-
setFocusedCellId(cellId);
|
|
123
|
-
setAnchorCell(position);
|
|
124
|
-
}
|
|
125
|
-
return newSelection;
|
|
126
|
-
});
|
|
127
|
-
} else {
|
|
128
|
-
if (selectedCells.size === 1 && selectedCells.has(cellId) && [ROW_SELECTION_COLUMN_ID, "name"].includes(position.colId)) {
|
|
129
|
-
setSelectedCells(/* @__PURE__ */ new Set());
|
|
130
|
-
setAnchorCell(null);
|
|
131
|
-
setFocusedCellId(null);
|
|
132
|
-
} else {
|
|
133
|
-
updateSelection(/* @__PURE__ */ new Set([cellId]), position);
|
|
134
|
-
setAnchorCell(position);
|
|
135
|
-
setFocusedCellId(cellId);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
},
|
|
139
|
-
[selectedCells, focusedCellId]
|
|
140
|
-
);
|
|
141
|
-
const extendSelection = useCallback(
|
|
142
|
-
(cellId, isRowSelectionColumn) => {
|
|
143
|
-
if (!selectionInProgress || !anchorCell) return;
|
|
144
|
-
const currentPosition = parseCellId(cellId);
|
|
145
|
-
if (!currentPosition) return;
|
|
146
|
-
if (isRowSelectionColumn) {
|
|
147
|
-
setSelectedCells((prev) => {
|
|
148
|
-
const newSelection = new Set(prev);
|
|
149
|
-
const position = parseCellId(cellId);
|
|
150
|
-
if (!position) return newSelection;
|
|
151
|
-
if (initialCellSelected.current) {
|
|
152
|
-
newSelection.delete(cellId);
|
|
153
|
-
} else {
|
|
154
|
-
newSelection.add(cellId);
|
|
155
|
-
}
|
|
156
|
-
return newSelection;
|
|
157
|
-
});
|
|
158
|
-
} else {
|
|
159
|
-
const newSelection = selectCellRange(anchorCell, currentPosition, false);
|
|
160
|
-
updateSelection(newSelection, currentPosition);
|
|
161
|
-
}
|
|
162
|
-
},
|
|
163
|
-
[selectionInProgress, anchorCell, selectCellRange]
|
|
164
|
-
);
|
|
165
|
-
const endSelection = useCallback(() => {
|
|
166
|
-
setSelectionInProgress(false);
|
|
167
|
-
}, []);
|
|
168
|
-
const selectCell = useCallback(
|
|
169
|
-
(cellId, additive, range) => {
|
|
170
|
-
const position = parseCellId(cellId);
|
|
171
|
-
if (!position) return;
|
|
172
|
-
if (range && anchorCell) {
|
|
173
|
-
const newSelection = selectCellRange(anchorCell, position, additive);
|
|
174
|
-
updateSelection(newSelection, position);
|
|
175
|
-
} else if (additive) {
|
|
176
|
-
setSelectedCells((prev) => {
|
|
177
|
-
const newSelection = new Set(prev);
|
|
178
|
-
if (newSelection.has(cellId)) {
|
|
179
|
-
newSelection.delete(cellId);
|
|
180
|
-
} else {
|
|
181
|
-
newSelection.add(cellId);
|
|
182
|
-
}
|
|
183
|
-
return newSelection;
|
|
184
|
-
});
|
|
185
|
-
} else {
|
|
186
|
-
updateSelection(/* @__PURE__ */ new Set([cellId]), position);
|
|
187
|
-
setAnchorCell(position);
|
|
188
|
-
}
|
|
189
|
-
},
|
|
190
|
-
[anchorCell, selectCellRange]
|
|
191
|
-
);
|
|
192
|
-
const focusCell = useCallback((cellId) => {
|
|
193
|
-
setFocusedCellId(cellId);
|
|
194
|
-
}, []);
|
|
195
|
-
const clearSelection = useCallback(() => {
|
|
196
|
-
setSelectedCells(/* @__PURE__ */ new Set());
|
|
197
|
-
setAnchorCell(null);
|
|
198
|
-
setFocusedCellId(null);
|
|
199
|
-
}, []);
|
|
200
|
-
const isCellSelected = useCallback((cellId) => selectedCells.has(cellId), [selectedCells]);
|
|
201
|
-
const isCellFocused = useCallback((cellId) => cellId === focusedCellId, [focusedCellId]);
|
|
202
|
-
const getCellPositionFromId = useCallback((cellId) => parseCellId(cellId), []);
|
|
203
|
-
const getCellBorderClasses = useCallback(
|
|
204
|
-
(cellId) => {
|
|
205
|
-
if (!isCellSelected(cellId)) return [];
|
|
206
|
-
const position = parseCellId(cellId);
|
|
207
|
-
if (!position) return [];
|
|
208
|
-
const rowIndex = stableGridMap.rowIdToIndex.get(position.rowId);
|
|
209
|
-
const colIndex = stableGridMap.colIdToIndex.get(position.colId);
|
|
210
|
-
if (rowIndex === void 0 || colIndex === void 0) return [];
|
|
211
|
-
const top = stableGridMap.indexToRowId.get(rowIndex - 1);
|
|
212
|
-
const right = stableGridMap.indexToColId.get(colIndex + 1);
|
|
213
|
-
const bottom = stableGridMap.indexToRowId.get(rowIndex + 1);
|
|
214
|
-
const left = stableGridMap.indexToColId.get(colIndex - 1);
|
|
215
|
-
let borderPos = BorderPosition.None;
|
|
216
|
-
if (!top || !selectedCells.has(getCellId(top, position.colId))) {
|
|
217
|
-
borderPos |= BorderPosition.Top;
|
|
218
|
-
}
|
|
219
|
-
if (!right || !selectedCells.has(getCellId(position.rowId, right))) {
|
|
220
|
-
borderPos |= BorderPosition.Right;
|
|
221
|
-
}
|
|
222
|
-
if (!bottom || !selectedCells.has(getCellId(bottom, position.colId))) {
|
|
223
|
-
borderPos |= BorderPosition.Bottom;
|
|
224
|
-
}
|
|
225
|
-
if (!left || !selectedCells.has(getCellId(position.rowId, left))) {
|
|
226
|
-
borderPos |= BorderPosition.Left;
|
|
227
|
-
}
|
|
228
|
-
return getBorderClasses(borderPos);
|
|
229
|
-
},
|
|
230
|
-
[selectedCells, stableGridMap, isCellSelected]
|
|
231
|
-
);
|
|
232
|
-
const value = useMemo(
|
|
233
|
-
() => ({
|
|
234
|
-
selectedCells,
|
|
235
|
-
selectedRows,
|
|
236
|
-
focusedCellId,
|
|
237
|
-
selectionInProgress,
|
|
238
|
-
anchorCell,
|
|
239
|
-
gridMap: stableGridMap,
|
|
240
|
-
setSelectedCells,
|
|
241
|
-
setFocusedCellId,
|
|
242
|
-
setAnchorCell,
|
|
243
|
-
registerGrid,
|
|
244
|
-
selectCell,
|
|
245
|
-
startSelection,
|
|
246
|
-
extendSelection,
|
|
247
|
-
endSelection,
|
|
248
|
-
focusCell,
|
|
249
|
-
clearSelection,
|
|
250
|
-
isCellSelected,
|
|
251
|
-
isCellFocused,
|
|
252
|
-
getCellPositionFromId,
|
|
253
|
-
getCellBorderClasses
|
|
254
|
-
}),
|
|
255
|
-
[
|
|
256
|
-
selectedCells,
|
|
257
|
-
selectedRows,
|
|
258
|
-
focusedCellId,
|
|
259
|
-
selectionInProgress,
|
|
260
|
-
anchorCell,
|
|
261
|
-
stableGridMap,
|
|
262
|
-
setSelectedCells,
|
|
263
|
-
setFocusedCellId,
|
|
264
|
-
setAnchorCell,
|
|
265
|
-
registerGrid,
|
|
266
|
-
selectCell,
|
|
267
|
-
startSelection,
|
|
268
|
-
extendSelection,
|
|
269
|
-
endSelection,
|
|
270
|
-
focusCell,
|
|
271
|
-
clearSelection,
|
|
272
|
-
isCellSelected,
|
|
273
|
-
isCellFocused,
|
|
274
|
-
getCellPositionFromId,
|
|
275
|
-
getCellBorderClasses
|
|
276
|
-
]
|
|
277
|
-
);
|
|
278
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(SelectionCellsContext.Provider, { value, children });
|
|
279
|
-
};
|
|
280
4
|
const useSelectionCellsContext = () => {
|
|
281
5
|
const context = useContext(SelectionCellsContext);
|
|
282
6
|
if (context === void 0) {
|
|
@@ -286,7 +10,7 @@ const useSelectionCellsContext = () => {
|
|
|
286
10
|
};
|
|
287
11
|
export {
|
|
288
12
|
ROW_SELECTION_COLUMN_ID,
|
|
289
|
-
|
|
13
|
+
SelectionCellsContext,
|
|
290
14
|
useSelectionCellsContext
|
|
291
15
|
};
|
|
292
16
|
//# sourceMappingURL=SelectionCellsContext.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectionCellsContext.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/SelectionCellsContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useMemo,\n ReactNode,\n useRef,\n} from 'react'\nimport {\n CellId,\n RowId,\n ColId,\n CellPosition,\n getCellId,\n parseCellId,\n BorderPosition,\n getBorderClasses,\n} from '../utils/cellUtils'\nimport { DRAG_HANDLE_COLUMN_ID } from '../ProjectTreeTable'\n\nexport const ROW_SELECTION_COLUMN_ID = '__row_selection__' // ID for the row selection column\n\n// Cell range for selections\n\n// Structure to map row/column IDs to their positions in the grid\nexport interface GridMap {\n rowIdToIndex: Map<RowId, number>\n colIdToIndex: Map<ColId, number>\n indexToRowId: Map<number, RowId>\n indexToColId: Map<number, ColId>\n}\n\nexport interface SelectionCellsContextType {\n // Selected cells\n selectedCells: Set<CellId>\n // Focused cell (single cell that has focus)\n focusedCellId: CellId | null\n // Selection in progress state\n selectionInProgress: boolean\n // Anchor point for range selections\n anchorCell: CellPosition | null\n // Grid mapping for coordinate lookups\n gridMap: GridMap\n\n selectedRows: string[] // Array of selected row IDs\n\n // State setters\n setSelectedCells: React.Dispatch<React.SetStateAction<Set<CellId>>>\n setFocusedCellId: React.Dispatch<React.SetStateAction<CellId | null>>\n setAnchorCell: React.Dispatch<React.SetStateAction<CellPosition | null>>\n // Methods\n registerGrid: (rows: RowId[], columns: ColId[]) => void\n selectCell: (cellId: CellId, additive: boolean, range: boolean) => void\n startSelection: (cellId: CellId, additive: boolean) => void\n extendSelection: (cellId: CellId, isRowSelectionColumn?: boolean) => void\n endSelection: (cellId: CellId) => void\n focusCell: (cellId: CellId | null) => void\n clearSelection: () => void\n isCellSelected: (cellId: CellId) => boolean\n isCellFocused: (cellId: CellId) => boolean\n getCellPositionFromId: (cellId: CellId) => CellPosition | null\n getCellBorderClasses: (cellId: CellId) => string[]\n}\n\n// Create the context\nconst SelectionCellsContext = createContext<SelectionCellsContextType | undefined>(undefined)\n\nexport const SelectionCellsProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [selectedCells, setSelectedCells] = useState<Set<CellId>>(new Set())\n const [focusedCellId, setFocusedCellId] = useState<CellId | null>(null)\n const [selectionInProgress, setSelectionInProgress] = useState<boolean>(false)\n const [anchorCell, setAnchorCell] = useState<CellPosition | null>(null)\n const [gridMap, setGridMap] = useState<GridMap>({\n rowIdToIndex: new Map(),\n colIdToIndex: new Map(),\n indexToRowId: new Map(),\n indexToColId: new Map(),\n })\n const mapToString = (map: Map<any, any>) => {\n return JSON.stringify(Array.from(map.entries()))\n }\n\n const stableGridMap = useMemo(\n () => gridMap,\n [\n mapToString(gridMap.rowIdToIndex),\n mapToString(gridMap.colIdToIndex),\n mapToString(gridMap.indexToRowId),\n mapToString(gridMap.indexToColId),\n ],\n )\n // Track whether we're selecting or unselecting during drag\n const initialCellSelected = useRef<boolean>(false)\n\n const selectedRows = useMemo(\n () =>\n Array.from(selectedCells)\n .filter(\n (cellId) =>\n parseCellId(cellId)?.colId === ROW_SELECTION_COLUMN_ID && parseCellId(cellId)?.rowId,\n )\n .map((cellId) => parseCellId(cellId)?.rowId) as string[],\n [selectedCells],\n )\n\n // Register grid structure for range selections\n const registerGrid = useCallback((rows: RowId[], columns: ColId[]) => {\n const rowIdToIndex = new Map<RowId, number>()\n const colIdToIndex = new Map<ColId, number>()\n const indexToRowId = new Map<number, RowId>()\n const indexToColId = new Map<number, ColId>()\n\n rows.forEach((rowId, index) => {\n rowIdToIndex.set(rowId, index)\n indexToRowId.set(index, rowId)\n })\n\n columns.forEach((colId, index) => {\n colIdToIndex.set(colId, index)\n indexToColId.set(index, colId)\n })\n\n setGridMap({ rowIdToIndex, colIdToIndex, indexToRowId, indexToColId })\n }, [])\n\n // update the selection whilst properly handling the row-selection column\n const updateSelection = useCallback((selection: Set<CellId>, position: CellPosition) => {\n setSelectedCells((prevSelectedCells) => {\n let newSelection = new Set(selection)\n if (position.colId !== ROW_SELECTION_COLUMN_ID && position.colId !== DRAG_HANDLE_COLUMN_ID) {\n const rowSelection = Array.from(prevSelectedCells).filter(\n (id) => parseCellId(id)?.colId === ROW_SELECTION_COLUMN_ID,\n )\n if (rowSelection.length) {\n newSelection = new Set([...newSelection, ...rowSelection])\n }\n }\n return newSelection\n })\n }, [])\n\n // Select cells between two points in the grid\n const selectCellRange = useCallback(\n (start: CellPosition, end: CellPosition, additive: boolean): Set<CellId> => {\n if (!additive) {\n // Clear existing selection if not additive\n updateSelection(new Set(), start)\n }\n\n const startRowIdx = stableGridMap.rowIdToIndex.get(start.rowId) ?? 0\n const startColIdx = stableGridMap.colIdToIndex.get(start.colId) ?? 0\n const endRowIdx = stableGridMap.rowIdToIndex.get(end.rowId) ?? 0\n const endColIdx = stableGridMap.colIdToIndex.get(end.colId) ?? 0\n\n const minRowIdx = Math.min(startRowIdx, endRowIdx)\n const maxRowIdx = Math.max(startRowIdx, endRowIdx)\n const minColIdx = Math.min(startColIdx, endColIdx)\n const maxColIdx = Math.max(startColIdx, endColIdx)\n\n const newSelection = new Set(additive ? selectedCells : [])\n\n for (let r = minRowIdx; r <= maxRowIdx; r++) {\n const rowId = stableGridMap.indexToRowId.get(r)\n if (!rowId) continue\n\n for (let c = minColIdx; c <= maxColIdx; c++) {\n const colId = stableGridMap.indexToColId.get(c)\n if (!colId) continue\n\n newSelection.add(getCellId(rowId, colId))\n }\n }\n\n return newSelection\n },\n [stableGridMap, selectedCells],\n )\n\n // Start a selection operation\n const startSelection = useCallback(\n (cellId: CellId, additive: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n setSelectionInProgress(true)\n // Store whether the initial cell was selected to determine drag behavior\n initialCellSelected.current = selectedCells.has(cellId)\n\n if (additive) {\n // Toggle this cell in multi-select mode\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n // If this was the focused cell, set focus to another cell in the selection or null\n if (focusedCellId === cellId) {\n if (newSelection.size > 0) {\n setFocusedCellId(Array.from(newSelection)[Array.from(newSelection).length - 1])\n } else {\n setFocusedCellId(null)\n }\n }\n } else {\n newSelection.add(cellId)\n setFocusedCellId(cellId)\n setAnchorCell(position)\n }\n return newSelection\n })\n } else {\n // Single cell selection\n // If this cell is already the only selected cell, deselect it\n // and it is from name column\n if (\n selectedCells.size === 1 &&\n selectedCells.has(cellId) &&\n [ROW_SELECTION_COLUMN_ID, 'name'].includes(position.colId)\n ) {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n } else {\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n setFocusedCellId(cellId)\n }\n }\n },\n [selectedCells, focusedCellId],\n )\n\n // Extend the current selection during drag\n const extendSelection = useCallback(\n (cellId: CellId, isRowSelectionColumn?: boolean) => {\n if (!selectionInProgress || !anchorCell) return\n\n const currentPosition = parseCellId(cellId)\n if (!currentPosition) return\n\n if (isRowSelectionColumn) {\n // Handle row selection column differently during drag\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n const position = parseCellId(cellId)\n\n if (!position) return newSelection\n\n // We're either selecting or unselecting based on the initial cell's state\n if (initialCellSelected.current) {\n // If we started on a selected cell, we're removing cells during drag\n newSelection.delete(cellId)\n } else {\n // If we started on an unselected cell, we're adding cells during drag\n newSelection.add(cellId)\n }\n\n return newSelection\n })\n } else {\n // For normal cells, use the range selection behavior\n const newSelection = selectCellRange(anchorCell, currentPosition, false)\n updateSelection(newSelection, currentPosition)\n }\n },\n [selectionInProgress, anchorCell, selectCellRange],\n )\n\n // End a selection operation\n const endSelection = useCallback(() => {\n setSelectionInProgress(false)\n }, [])\n\n // Select a cell (click or programmatically)\n const selectCell = useCallback(\n (cellId: CellId, additive: boolean, range: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n if (range && anchorCell) {\n // Shift+click for range selection - select cells between anchor and current\n const newSelection = selectCellRange(anchorCell, position, additive)\n updateSelection(newSelection, position)\n } else if (additive) {\n // Ctrl/Cmd+click for toggling selection\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n } else {\n newSelection.add(cellId)\n }\n return newSelection\n })\n } else {\n // Normal click - select just this cell and set as new anchor\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n }\n },\n [anchorCell, selectCellRange],\n )\n\n // Focus a cell without changing selection\n const focusCell = useCallback((cellId: CellId | null) => {\n setFocusedCellId(cellId)\n }, [])\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n }, [])\n\n // Check if a cell is selected\n const isCellSelected = useCallback((cellId: CellId) => selectedCells.has(cellId), [selectedCells])\n\n // Check if a cell is focused\n const isCellFocused = useCallback((cellId: CellId) => cellId === focusedCellId, [focusedCellId])\n\n // Get position from cell ID - using shared utility\n const getCellPositionFromId = useCallback((cellId: CellId) => parseCellId(cellId), [])\n\n // Get border classes for a cell based on its selection state and neighbors\n const getCellBorderClasses = useCallback(\n (cellId: CellId): string[] => {\n if (!isCellSelected(cellId)) return []\n\n const position = parseCellId(cellId)\n if (!position) return []\n\n const rowIndex = stableGridMap.rowIdToIndex.get(position.rowId)\n const colIndex = stableGridMap.colIdToIndex.get(position.colId)\n\n if (rowIndex === undefined || colIndex === undefined) return []\n\n // Check if the cell's neighbors in all four directions are selected\n const top = stableGridMap.indexToRowId.get(rowIndex - 1)\n const right = stableGridMap.indexToColId.get(colIndex + 1)\n const bottom = stableGridMap.indexToRowId.get(rowIndex + 1)\n const left = stableGridMap.indexToColId.get(colIndex - 1)\n\n // Default to no borders\n let borderPos = BorderPosition.None\n\n // Top edge check: show border if we're at the top of the grid or the cell above is not selected\n if (!top || !selectedCells.has(getCellId(top, position.colId))) {\n borderPos |= BorderPosition.Top\n }\n\n // Right edge check: show border if we're at the right edge of the grid or the cell to the right is not selected\n if (!right || !selectedCells.has(getCellId(position.rowId, right))) {\n borderPos |= BorderPosition.Right\n }\n\n // Bottom edge check: show border if we're at the bottom of the grid or the cell below is not selected\n if (!bottom || !selectedCells.has(getCellId(bottom, position.colId))) {\n borderPos |= BorderPosition.Bottom\n }\n\n // Left edge check: show border if we're at the left edge of the grid or the cell to the left is not selected\n if (!left || !selectedCells.has(getCellId(position.rowId, left))) {\n borderPos |= BorderPosition.Left\n }\n\n return getBorderClasses(borderPos)\n },\n [selectedCells, stableGridMap, isCellSelected],\n )\n\n // Memoize context value to prevent unnecessary re-renders\n const value = useMemo(\n () => ({\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n gridMap: stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n }),\n [\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n ],\n )\n\n return <SelectionCellsContext.Provider value={value}>{children}</SelectionCellsContext.Provider>\n}\n\nexport const useSelectionCellsContext = (): SelectionCellsContextType => {\n const context = useContext(SelectionCellsContext)\n if (context === undefined) {\n throw new Error('useSelectionCellsContext must be used within a SelectionCellsProvider')\n }\n return context\n}\n"],"names":["jsx"],"mappings":";;;;AAqBO,MAAM,0BAA0B;AA6CvC,MAAM,wBAAwB,cAAqD,MAAS;AAErF,MAAM,yBAA4D,CAAC,EAAE,eAAe;AACzF,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAsB,oBAAI,KAAK;AACzE,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAwB,IAAI;AACtE,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAkB,KAAK;AAC7E,QAAM,CAAC,YAAY,aAAa,IAAI,SAA8B,IAAI;AACtE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB;AAAA,IAC9C,kCAAkB,IAAI;AAAA,IACtB,kCAAkB,IAAI;AAAA,IACtB,kCAAkB,IAAI;AAAA,IACtB,kCAAkB,IAAI;AAAA,EAAA,CACvB;AACK,QAAA,cAAc,CAAC,QAAuB;AAC1C,WAAO,KAAK,UAAU,MAAM,KAAK,IAAI,QAAA,CAAS,CAAC;AAAA,EACjD;AAEA,QAAM,gBAAgB;AAAA,IACpB,MAAM;AAAA,IACN;AAAA,MACE,YAAY,QAAQ,YAAY;AAAA,MAChC,YAAY,QAAQ,YAAY;AAAA,MAChC,YAAY,QAAQ,YAAY;AAAA,MAChC,YAAY,QAAQ,YAAY;AAAA,IAAA;AAAA,EAEpC;AAEM,QAAA,sBAAsB,OAAgB,KAAK;AAEjD,QAAM,eAAe;AAAA,IACnB,MACE,MAAM,KAAK,aAAa,EACrB;AAAA,MACC,CAAC;;AACC,kCAAY,MAAM,MAAlB,mBAAqB,WAAU,6BAA2B,iBAAY,MAAM,MAAlB,mBAAqB;AAAA;AAAA,IAAA,EAElF,IAAI,CAAC;;AAAW,+BAAY,MAAM,MAAlB,mBAAqB;AAAA,KAAK;AAAA,IAC/C,CAAC,aAAa;AAAA,EAChB;AAGA,QAAM,eAAe,YAAY,CAAC,MAAe,YAAqB;AAC9D,UAAA,mCAAmB,IAAmB;AACtC,UAAA,mCAAmB,IAAmB;AACtC,UAAA,mCAAmB,IAAmB;AACtC,UAAA,mCAAmB,IAAmB;AAEvC,SAAA,QAAQ,CAAC,OAAO,UAAU;AAChB,mBAAA,IAAI,OAAO,KAAK;AAChB,mBAAA,IAAI,OAAO,KAAK;AAAA,IAAA,CAC9B;AAEO,YAAA,QAAQ,CAAC,OAAO,UAAU;AACnB,mBAAA,IAAI,OAAO,KAAK;AAChB,mBAAA,IAAI,OAAO,KAAK;AAAA,IAAA,CAC9B;AAED,eAAW,EAAE,cAAc,cAAc,cAAc,cAAc;AAAA,EACvE,GAAG,EAAE;AAGL,QAAM,kBAAkB,YAAY,CAAC,WAAwB,aAA2B;AACtF,qBAAiB,CAAC,sBAAsB;AAClC,UAAA,eAAe,IAAI,IAAI,SAAS;AACpC,UAAI,SAAS,UAAU,2BAA2B,SAAS,UAAU,uBAAuB;AAC1F,cAAM,eAAe,MAAM,KAAK,iBAAiB,EAAE;AAAA,UACjD,CAAC,OAAO;;AAAA,sCAAY,EAAE,MAAd,mBAAiB,WAAU;AAAA;AAAA,QACrC;AACA,YAAI,aAAa,QAAQ;AACvB,6CAAmB,IAAI,CAAC,GAAG,cAAc,GAAG,YAAY,CAAC;AAAA,QAAA;AAAA,MAC3D;AAEK,aAAA;AAAA,IAAA,CACR;AAAA,EACH,GAAG,EAAE;AAGL,QAAM,kBAAkB;AAAA,IACtB,CAAC,OAAqB,KAAmB,aAAmC;AAC1E,UAAI,CAAC,UAAU;AAEG,wBAAA,oBAAI,IAAI,GAAG,KAAK;AAAA,MAAA;AAGlC,YAAM,cAAc,cAAc,aAAa,IAAI,MAAM,KAAK,KAAK;AACnE,YAAM,cAAc,cAAc,aAAa,IAAI,MAAM,KAAK,KAAK;AACnE,YAAM,YAAY,cAAc,aAAa,IAAI,IAAI,KAAK,KAAK;AAC/D,YAAM,YAAY,cAAc,aAAa,IAAI,IAAI,KAAK,KAAK;AAE/D,YAAM,YAAY,KAAK,IAAI,aAAa,SAAS;AACjD,YAAM,YAAY,KAAK,IAAI,aAAa,SAAS;AACjD,YAAM,YAAY,KAAK,IAAI,aAAa,SAAS;AACjD,YAAM,YAAY,KAAK,IAAI,aAAa,SAAS;AAEjD,YAAM,eAAe,IAAI,IAAI,WAAW,gBAAgB,CAAA,CAAE;AAE1D,eAAS,IAAI,WAAW,KAAK,WAAW,KAAK;AAC3C,cAAM,QAAQ,cAAc,aAAa,IAAI,CAAC;AAC9C,YAAI,CAAC,MAAO;AAEZ,iBAAS,IAAI,WAAW,KAAK,WAAW,KAAK;AAC3C,gBAAM,QAAQ,cAAc,aAAa,IAAI,CAAC;AAC9C,cAAI,CAAC,MAAO;AAEZ,uBAAa,IAAI,UAAU,OAAO,KAAK,CAAC;AAAA,QAAA;AAAA,MAC1C;AAGK,aAAA;AAAA,IACT;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,EAC/B;AAGA,QAAM,iBAAiB;AAAA,IACrB,CAAC,QAAgB,aAAsB;AAC/B,YAAA,WAAW,YAAY,MAAM;AACnC,UAAI,CAAC,SAAU;AAEf,6BAAuB,IAAI;AAEP,0BAAA,UAAU,cAAc,IAAI,MAAM;AAEtD,UAAI,UAAU;AAEZ,yBAAiB,CAAC,SAAS;AACnB,gBAAA,eAAe,IAAI,IAAI,IAAI;AAC7B,cAAA,aAAa,IAAI,MAAM,GAAG;AAC5B,yBAAa,OAAO,MAAM;AAE1B,gBAAI,kBAAkB,QAAQ;AACxB,kBAAA,aAAa,OAAO,GAAG;AACR,iCAAA,MAAM,KAAK,YAAY,EAAE,MAAM,KAAK,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,cAAA,OACzE;AACL,iCAAiB,IAAI;AAAA,cAAA;AAAA,YACvB;AAAA,UACF,OACK;AACL,yBAAa,IAAI,MAAM;AACvB,6BAAiB,MAAM;AACvB,0BAAc,QAAQ;AAAA,UAAA;AAEjB,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA,OACI;AAIL,YACE,cAAc,SAAS,KACvB,cAAc,IAAI,MAAM,KACxB,CAAC,yBAAyB,MAAM,EAAE,SAAS,SAAS,KAAK,GACzD;AACiB,2BAAA,oBAAI,KAAK;AAC1B,wBAAc,IAAI;AAClB,2BAAiB,IAAI;AAAA,QAAA,OAChB;AACL,8CAAoB,IAAI,CAAC,MAAM,CAAC,GAAG,QAAQ;AAC3C,wBAAc,QAAQ;AACtB,2BAAiB,MAAM;AAAA,QAAA;AAAA,MACzB;AAAA,IAEJ;AAAA,IACA,CAAC,eAAe,aAAa;AAAA,EAC/B;AAGA,QAAM,kBAAkB;AAAA,IACtB,CAAC,QAAgB,yBAAmC;AAC9C,UAAA,CAAC,uBAAuB,CAAC,WAAY;AAEnC,YAAA,kBAAkB,YAAY,MAAM;AAC1C,UAAI,CAAC,gBAAiB;AAEtB,UAAI,sBAAsB;AAExB,yBAAiB,CAAC,SAAS;AACnB,gBAAA,eAAe,IAAI,IAAI,IAAI;AAC3B,gBAAA,WAAW,YAAY,MAAM;AAE/B,cAAA,CAAC,SAAiB,QAAA;AAGtB,cAAI,oBAAoB,SAAS;AAE/B,yBAAa,OAAO,MAAM;AAAA,UAAA,OACrB;AAEL,yBAAa,IAAI,MAAM;AAAA,UAAA;AAGlB,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA,OACI;AAEL,cAAM,eAAe,gBAAgB,YAAY,iBAAiB,KAAK;AACvE,wBAAgB,cAAc,eAAe;AAAA,MAAA;AAAA,IAEjD;AAAA,IACA,CAAC,qBAAqB,YAAY,eAAe;AAAA,EACnD;AAGM,QAAA,eAAe,YAAY,MAAM;AACrC,2BAAuB,KAAK;AAAA,EAC9B,GAAG,EAAE;AAGL,QAAM,aAAa;AAAA,IACjB,CAAC,QAAgB,UAAmB,UAAmB;AAC/C,YAAA,WAAW,YAAY,MAAM;AACnC,UAAI,CAAC,SAAU;AAEf,UAAI,SAAS,YAAY;AAEvB,cAAM,eAAe,gBAAgB,YAAY,UAAU,QAAQ;AACnE,wBAAgB,cAAc,QAAQ;AAAA,iBAC7B,UAAU;AAEnB,yBAAiB,CAAC,SAAS;AACnB,gBAAA,eAAe,IAAI,IAAI,IAAI;AAC7B,cAAA,aAAa,IAAI,MAAM,GAAG;AAC5B,yBAAa,OAAO,MAAM;AAAA,UAAA,OACrB;AACL,yBAAa,IAAI,MAAM;AAAA,UAAA;AAElB,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA,OACI;AAEL,4CAAoB,IAAI,CAAC,MAAM,CAAC,GAAG,QAAQ;AAC3C,sBAAc,QAAQ;AAAA,MAAA;AAAA,IAE1B;AAAA,IACA,CAAC,YAAY,eAAe;AAAA,EAC9B;AAGM,QAAA,YAAY,YAAY,CAAC,WAA0B;AACvD,qBAAiB,MAAM;AAAA,EACzB,GAAG,EAAE;AAGC,QAAA,iBAAiB,YAAY,MAAM;AACtB,qBAAA,oBAAI,KAAK;AAC1B,kBAAc,IAAI;AAClB,qBAAiB,IAAI;AAAA,EACvB,GAAG,EAAE;AAGC,QAAA,iBAAiB,YAAY,CAAC,WAAmB,cAAc,IAAI,MAAM,GAAG,CAAC,aAAa,CAAC;AAG3F,QAAA,gBAAgB,YAAY,CAAC,WAAmB,WAAW,eAAe,CAAC,aAAa,CAAC;AAGzF,QAAA,wBAAwB,YAAY,CAAC,WAAmB,YAAY,MAAM,GAAG,EAAE;AAGrF,QAAM,uBAAuB;AAAA,IAC3B,CAAC,WAA6B;AAC5B,UAAI,CAAC,eAAe,MAAM,UAAU,CAAC;AAE/B,YAAA,WAAW,YAAY,MAAM;AAC/B,UAAA,CAAC,SAAU,QAAO,CAAC;AAEvB,YAAM,WAAW,cAAc,aAAa,IAAI,SAAS,KAAK;AAC9D,YAAM,WAAW,cAAc,aAAa,IAAI,SAAS,KAAK;AAE9D,UAAI,aAAa,UAAa,aAAa,eAAkB,CAAC;AAG9D,YAAM,MAAM,cAAc,aAAa,IAAI,WAAW,CAAC;AACvD,YAAM,QAAQ,cAAc,aAAa,IAAI,WAAW,CAAC;AACzD,YAAM,SAAS,cAAc,aAAa,IAAI,WAAW,CAAC;AAC1D,YAAM,OAAO,cAAc,aAAa,IAAI,WAAW,CAAC;AAGxD,UAAI,YAAY,eAAe;AAG3B,UAAA,CAAC,OAAO,CAAC,cAAc,IAAI,UAAU,KAAK,SAAS,KAAK,CAAC,GAAG;AAC9D,qBAAa,eAAe;AAAA,MAAA;AAI1B,UAAA,CAAC,SAAS,CAAC,cAAc,IAAI,UAAU,SAAS,OAAO,KAAK,CAAC,GAAG;AAClE,qBAAa,eAAe;AAAA,MAAA;AAI1B,UAAA,CAAC,UAAU,CAAC,cAAc,IAAI,UAAU,QAAQ,SAAS,KAAK,CAAC,GAAG;AACpE,qBAAa,eAAe;AAAA,MAAA;AAI1B,UAAA,CAAC,QAAQ,CAAC,cAAc,IAAI,UAAU,SAAS,OAAO,IAAI,CAAC,GAAG;AAChE,qBAAa,eAAe;AAAA,MAAA;AAG9B,aAAO,iBAAiB,SAAS;AAAA,IACnC;AAAA,IACA,CAAC,eAAe,eAAe,cAAc;AAAA,EAC/C;AAGA,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAQA,kCAAAA,IAAA,sBAAsB,UAAtB,EAA+B,OAAe,SAAS,CAAA;AACjE;AAEO,MAAM,2BAA2B,MAAiC;AACjE,QAAA,UAAU,WAAW,qBAAqB;AAChD,MAAI,YAAY,QAAW;AACnB,UAAA,IAAI,MAAM,uEAAuE;AAAA,EAAA;AAElF,SAAA;AACT;"}
|
|
1
|
+
{"version":3,"file":"SelectionCellsContext.es.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/SelectionCellsContext.ts"],"sourcesContent":["import React, { createContext, useContext } from 'react'\nimport {\n CellId,\n RowId,\n ColId,\n CellPosition,\n} from '../utils/cellUtils'\n\nexport const ROW_SELECTION_COLUMN_ID = '__row_selection__' // ID for the row selection column\n\n// Structure to map row/column IDs to their positions in the grid\nexport interface GridMap {\n rowIdToIndex: Map<RowId, number>\n colIdToIndex: Map<ColId, number>\n indexToRowId: Map<number, RowId>\n indexToColId: Map<number, ColId>\n}\n\nexport interface SelectionCellsContextType {\n // Selected cells\n selectedCells: Set<CellId>\n // Focused cell (single cell that has focus)\n focusedCellId: CellId | null\n // Selection in progress state\n selectionInProgress: boolean\n // Anchor point for range selections\n anchorCell: CellPosition | null\n // Grid mapping for coordinate lookups\n gridMap: GridMap\n\n selectedRows: string[] // Array of selected row IDs\n\n // State setters\n setSelectedCells: React.Dispatch<React.SetStateAction<Set<CellId>>>\n setFocusedCellId: React.Dispatch<React.SetStateAction<CellId | null>>\n setAnchorCell: React.Dispatch<React.SetStateAction<CellPosition | null>>\n // Methods\n registerGrid: (rows: RowId[], columns: ColId[]) => void\n selectCell: (cellId: CellId, additive: boolean, range: boolean) => void\n startSelection: (cellId: CellId, additive: boolean) => void\n extendSelection: (cellId: CellId, isRowSelectionColumn?: boolean) => void\n endSelection: (cellId: CellId) => void\n focusCell: (cellId: CellId | null) => void\n clearSelection: () => void\n isCellSelected: (cellId: CellId) => boolean\n isCellFocused: (cellId: CellId) => boolean\n getCellPositionFromId: (cellId: CellId) => CellPosition | null\n getCellBorderClasses: (cellId: CellId) => string[]\n}\n\n// Create the context\nexport const SelectionCellsContext = createContext<SelectionCellsContextType | undefined>(undefined)\n\nexport const useSelectionCellsContext = (): SelectionCellsContextType => {\n const context = useContext(SelectionCellsContext)\n if (context === undefined) {\n throw new Error('useSelectionCellsContext must be used within a SelectionCellsProvider')\n }\n return context\n}\n"],"names":[],"mappings":";AAQO,MAAM,0BAA0B;AA2C1B,MAAA,wBAAwB,cAAqD,MAAS;AAE5F,MAAM,2BAA2B,MAAiC;AACjE,QAAA,UAAU,WAAW,qBAAqB;AAChD,MAAI,YAAY,QAAW;AACnB,UAAA,IAAI,MAAM,uEAAuE;AAAA,EAAA;AAElF,SAAA;AACT;"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("../../../../../_virtual/jsx-runtime.cjs.js");
|
|
4
|
+
const React = require("react");
|
|
5
|
+
const cellUtils = require("../utils/cellUtils.cjs.js");
|
|
6
|
+
const ProjectTreeTable = require("../ProjectTreeTable.cjs.js");
|
|
7
|
+
const SelectionCellsContext = require("./SelectionCellsContext.cjs.js");
|
|
8
|
+
const SelectionCellsProvider = ({ children }) => {
|
|
9
|
+
const [selectedCells, setSelectedCells] = React.useState(/* @__PURE__ */ new Set());
|
|
10
|
+
const [focusedCellId, setFocusedCellId] = React.useState(null);
|
|
11
|
+
const [selectionInProgress, setSelectionInProgress] = React.useState(false);
|
|
12
|
+
const [anchorCell, setAnchorCell] = React.useState(null);
|
|
13
|
+
const [gridMap, setGridMap] = React.useState({
|
|
14
|
+
rowIdToIndex: /* @__PURE__ */ new Map(),
|
|
15
|
+
colIdToIndex: /* @__PURE__ */ new Map(),
|
|
16
|
+
indexToRowId: /* @__PURE__ */ new Map(),
|
|
17
|
+
indexToColId: /* @__PURE__ */ new Map()
|
|
18
|
+
});
|
|
19
|
+
const mapToString = (map) => {
|
|
20
|
+
return JSON.stringify(Array.from(map.entries()));
|
|
21
|
+
};
|
|
22
|
+
const stableGridMap = React.useMemo(
|
|
23
|
+
() => gridMap,
|
|
24
|
+
[
|
|
25
|
+
mapToString(gridMap.rowIdToIndex),
|
|
26
|
+
mapToString(gridMap.colIdToIndex),
|
|
27
|
+
mapToString(gridMap.indexToRowId),
|
|
28
|
+
mapToString(gridMap.indexToColId)
|
|
29
|
+
]
|
|
30
|
+
);
|
|
31
|
+
const initialCellSelected = React.useRef(false);
|
|
32
|
+
const selectedRows = React.useMemo(
|
|
33
|
+
() => Array.from(selectedCells).filter(
|
|
34
|
+
(cellId) => {
|
|
35
|
+
var _a, _b;
|
|
36
|
+
return ((_a = cellUtils.parseCellId(cellId)) == null ? void 0 : _a.colId) === SelectionCellsContext.ROW_SELECTION_COLUMN_ID && ((_b = cellUtils.parseCellId(cellId)) == null ? void 0 : _b.rowId);
|
|
37
|
+
}
|
|
38
|
+
).map((cellId) => {
|
|
39
|
+
var _a;
|
|
40
|
+
return (_a = cellUtils.parseCellId(cellId)) == null ? void 0 : _a.rowId;
|
|
41
|
+
}),
|
|
42
|
+
[selectedCells]
|
|
43
|
+
);
|
|
44
|
+
const registerGrid = React.useCallback((rows, columns) => {
|
|
45
|
+
const rowIdToIndex = /* @__PURE__ */ new Map();
|
|
46
|
+
const colIdToIndex = /* @__PURE__ */ new Map();
|
|
47
|
+
const indexToRowId = /* @__PURE__ */ new Map();
|
|
48
|
+
const indexToColId = /* @__PURE__ */ new Map();
|
|
49
|
+
rows.forEach((rowId, index) => {
|
|
50
|
+
rowIdToIndex.set(rowId, index);
|
|
51
|
+
indexToRowId.set(index, rowId);
|
|
52
|
+
});
|
|
53
|
+
columns.forEach((colId, index) => {
|
|
54
|
+
colIdToIndex.set(colId, index);
|
|
55
|
+
indexToColId.set(index, colId);
|
|
56
|
+
});
|
|
57
|
+
setGridMap({ rowIdToIndex, colIdToIndex, indexToRowId, indexToColId });
|
|
58
|
+
}, []);
|
|
59
|
+
const updateSelection = React.useCallback((selection, position) => {
|
|
60
|
+
setSelectedCells((prevSelectedCells) => {
|
|
61
|
+
let newSelection = new Set(selection);
|
|
62
|
+
if (position.colId !== SelectionCellsContext.ROW_SELECTION_COLUMN_ID && position.colId !== ProjectTreeTable.DRAG_HANDLE_COLUMN_ID) {
|
|
63
|
+
const rowSelection = Array.from(prevSelectedCells).filter(
|
|
64
|
+
(id) => {
|
|
65
|
+
var _a;
|
|
66
|
+
return ((_a = cellUtils.parseCellId(id)) == null ? void 0 : _a.colId) === SelectionCellsContext.ROW_SELECTION_COLUMN_ID;
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
if (rowSelection.length) {
|
|
70
|
+
newSelection = /* @__PURE__ */ new Set([...newSelection, ...rowSelection]);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return newSelection;
|
|
74
|
+
});
|
|
75
|
+
}, []);
|
|
76
|
+
const selectCellRange = React.useCallback(
|
|
77
|
+
(start, end, additive) => {
|
|
78
|
+
if (!additive) {
|
|
79
|
+
updateSelection(/* @__PURE__ */ new Set(), start);
|
|
80
|
+
}
|
|
81
|
+
const startRowIdx = stableGridMap.rowIdToIndex.get(start.rowId) ?? 0;
|
|
82
|
+
const startColIdx = stableGridMap.colIdToIndex.get(start.colId) ?? 0;
|
|
83
|
+
const endRowIdx = stableGridMap.rowIdToIndex.get(end.rowId) ?? 0;
|
|
84
|
+
const endColIdx = stableGridMap.colIdToIndex.get(end.colId) ?? 0;
|
|
85
|
+
const minRowIdx = Math.min(startRowIdx, endRowIdx);
|
|
86
|
+
const maxRowIdx = Math.max(startRowIdx, endRowIdx);
|
|
87
|
+
const minColIdx = Math.min(startColIdx, endColIdx);
|
|
88
|
+
const maxColIdx = Math.max(startColIdx, endColIdx);
|
|
89
|
+
const newSelection = new Set(additive ? selectedCells : []);
|
|
90
|
+
for (let r = minRowIdx; r <= maxRowIdx; r++) {
|
|
91
|
+
const rowId = stableGridMap.indexToRowId.get(r);
|
|
92
|
+
if (!rowId) continue;
|
|
93
|
+
for (let c = minColIdx; c <= maxColIdx; c++) {
|
|
94
|
+
const colId = stableGridMap.indexToColId.get(c);
|
|
95
|
+
if (!colId) continue;
|
|
96
|
+
newSelection.add(cellUtils.getCellId(rowId, colId));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return newSelection;
|
|
100
|
+
},
|
|
101
|
+
[stableGridMap, selectedCells, updateSelection]
|
|
102
|
+
);
|
|
103
|
+
const startSelection = React.useCallback(
|
|
104
|
+
(cellId, additive) => {
|
|
105
|
+
const position = cellUtils.parseCellId(cellId);
|
|
106
|
+
if (!position) return;
|
|
107
|
+
setSelectionInProgress(true);
|
|
108
|
+
initialCellSelected.current = selectedCells.has(cellId);
|
|
109
|
+
if (additive) {
|
|
110
|
+
setSelectedCells((prev) => {
|
|
111
|
+
const newSelection = new Set(prev);
|
|
112
|
+
if (newSelection.has(cellId)) {
|
|
113
|
+
newSelection.delete(cellId);
|
|
114
|
+
if (focusedCellId === cellId) {
|
|
115
|
+
if (newSelection.size > 0) {
|
|
116
|
+
setFocusedCellId(Array.from(newSelection)[Array.from(newSelection).length - 1]);
|
|
117
|
+
} else {
|
|
118
|
+
setFocusedCellId(null);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
} else {
|
|
122
|
+
newSelection.add(cellId);
|
|
123
|
+
setFocusedCellId(cellId);
|
|
124
|
+
setAnchorCell(position);
|
|
125
|
+
}
|
|
126
|
+
return newSelection;
|
|
127
|
+
});
|
|
128
|
+
} else {
|
|
129
|
+
if (selectedCells.size === 1 && selectedCells.has(cellId) && [SelectionCellsContext.ROW_SELECTION_COLUMN_ID, "name"].includes(position.colId)) {
|
|
130
|
+
setSelectedCells(/* @__PURE__ */ new Set());
|
|
131
|
+
setAnchorCell(null);
|
|
132
|
+
setFocusedCellId(null);
|
|
133
|
+
} else {
|
|
134
|
+
updateSelection(/* @__PURE__ */ new Set([cellId]), position);
|
|
135
|
+
setAnchorCell(position);
|
|
136
|
+
setFocusedCellId(cellId);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
[selectedCells, focusedCellId, updateSelection]
|
|
141
|
+
);
|
|
142
|
+
const extendSelection = React.useCallback(
|
|
143
|
+
(cellId, isRowSelectionColumn) => {
|
|
144
|
+
if (!selectionInProgress || !anchorCell) return;
|
|
145
|
+
const currentPosition = cellUtils.parseCellId(cellId);
|
|
146
|
+
if (!currentPosition) return;
|
|
147
|
+
if (isRowSelectionColumn) {
|
|
148
|
+
setSelectedCells((prev) => {
|
|
149
|
+
const newSelection = new Set(prev);
|
|
150
|
+
const position = cellUtils.parseCellId(cellId);
|
|
151
|
+
if (!position) return newSelection;
|
|
152
|
+
if (initialCellSelected.current) {
|
|
153
|
+
newSelection.delete(cellId);
|
|
154
|
+
} else {
|
|
155
|
+
newSelection.add(cellId);
|
|
156
|
+
}
|
|
157
|
+
return newSelection;
|
|
158
|
+
});
|
|
159
|
+
} else {
|
|
160
|
+
const newSelection = selectCellRange(anchorCell, currentPosition, false);
|
|
161
|
+
updateSelection(newSelection, currentPosition);
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
[selectionInProgress, anchorCell, selectCellRange, updateSelection]
|
|
165
|
+
);
|
|
166
|
+
const endSelection = React.useCallback(() => {
|
|
167
|
+
setSelectionInProgress(false);
|
|
168
|
+
}, []);
|
|
169
|
+
const selectCell = React.useCallback(
|
|
170
|
+
(cellId, additive, range) => {
|
|
171
|
+
const position = cellUtils.parseCellId(cellId);
|
|
172
|
+
if (!position) return;
|
|
173
|
+
if (range && anchorCell) {
|
|
174
|
+
const newSelection = selectCellRange(anchorCell, position, additive);
|
|
175
|
+
updateSelection(newSelection, position);
|
|
176
|
+
} else if (additive) {
|
|
177
|
+
setSelectedCells((prev) => {
|
|
178
|
+
const newSelection = new Set(prev);
|
|
179
|
+
if (newSelection.has(cellId)) {
|
|
180
|
+
newSelection.delete(cellId);
|
|
181
|
+
} else {
|
|
182
|
+
newSelection.add(cellId);
|
|
183
|
+
}
|
|
184
|
+
return newSelection;
|
|
185
|
+
});
|
|
186
|
+
} else {
|
|
187
|
+
updateSelection(/* @__PURE__ */ new Set([cellId]), position);
|
|
188
|
+
setAnchorCell(position);
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
[anchorCell, selectCellRange, updateSelection]
|
|
192
|
+
);
|
|
193
|
+
const focusCell = React.useCallback((cellId) => {
|
|
194
|
+
setFocusedCellId(cellId);
|
|
195
|
+
}, []);
|
|
196
|
+
const clearSelection = React.useCallback(() => {
|
|
197
|
+
setSelectedCells(/* @__PURE__ */ new Set());
|
|
198
|
+
setAnchorCell(null);
|
|
199
|
+
setFocusedCellId(null);
|
|
200
|
+
}, []);
|
|
201
|
+
const isCellSelected = React.useCallback((cellId) => selectedCells.has(cellId), [selectedCells]);
|
|
202
|
+
const isCellFocused = React.useCallback((cellId) => cellId === focusedCellId, [focusedCellId]);
|
|
203
|
+
const getCellPositionFromId = React.useCallback((cellId) => cellUtils.parseCellId(cellId), []);
|
|
204
|
+
const getCellBorderClasses = React.useCallback(
|
|
205
|
+
(cellId) => {
|
|
206
|
+
if (!isCellSelected(cellId)) return [];
|
|
207
|
+
const position = cellUtils.parseCellId(cellId);
|
|
208
|
+
if (!position) return [];
|
|
209
|
+
const rowIndex = stableGridMap.rowIdToIndex.get(position.rowId);
|
|
210
|
+
const colIndex = stableGridMap.colIdToIndex.get(position.colId);
|
|
211
|
+
if (rowIndex === void 0 || colIndex === void 0) return [];
|
|
212
|
+
const top = stableGridMap.indexToRowId.get(rowIndex - 1);
|
|
213
|
+
const right = stableGridMap.indexToColId.get(colIndex + 1);
|
|
214
|
+
const bottom = stableGridMap.indexToRowId.get(rowIndex + 1);
|
|
215
|
+
const left = stableGridMap.indexToColId.get(colIndex - 1);
|
|
216
|
+
let borderPos = cellUtils.BorderPosition.None;
|
|
217
|
+
if (!top || !selectedCells.has(cellUtils.getCellId(top, position.colId))) {
|
|
218
|
+
borderPos |= cellUtils.BorderPosition.Top;
|
|
219
|
+
}
|
|
220
|
+
if (!right || !selectedCells.has(cellUtils.getCellId(position.rowId, right))) {
|
|
221
|
+
borderPos |= cellUtils.BorderPosition.Right;
|
|
222
|
+
}
|
|
223
|
+
if (!bottom || !selectedCells.has(cellUtils.getCellId(bottom, position.colId))) {
|
|
224
|
+
borderPos |= cellUtils.BorderPosition.Bottom;
|
|
225
|
+
}
|
|
226
|
+
if (!left || !selectedCells.has(cellUtils.getCellId(position.rowId, left))) {
|
|
227
|
+
borderPos |= cellUtils.BorderPosition.Left;
|
|
228
|
+
}
|
|
229
|
+
return cellUtils.getBorderClasses(borderPos);
|
|
230
|
+
},
|
|
231
|
+
[selectedCells, stableGridMap, isCellSelected]
|
|
232
|
+
);
|
|
233
|
+
const value = React.useMemo(
|
|
234
|
+
() => ({
|
|
235
|
+
selectedCells,
|
|
236
|
+
selectedRows,
|
|
237
|
+
focusedCellId,
|
|
238
|
+
selectionInProgress,
|
|
239
|
+
anchorCell,
|
|
240
|
+
gridMap: stableGridMap,
|
|
241
|
+
setSelectedCells,
|
|
242
|
+
setFocusedCellId,
|
|
243
|
+
setAnchorCell,
|
|
244
|
+
registerGrid,
|
|
245
|
+
selectCell,
|
|
246
|
+
startSelection,
|
|
247
|
+
extendSelection,
|
|
248
|
+
endSelection,
|
|
249
|
+
focusCell,
|
|
250
|
+
clearSelection,
|
|
251
|
+
isCellSelected,
|
|
252
|
+
isCellFocused,
|
|
253
|
+
getCellPositionFromId,
|
|
254
|
+
getCellBorderClasses
|
|
255
|
+
}),
|
|
256
|
+
[
|
|
257
|
+
selectedCells,
|
|
258
|
+
selectedRows,
|
|
259
|
+
focusedCellId,
|
|
260
|
+
selectionInProgress,
|
|
261
|
+
anchorCell,
|
|
262
|
+
stableGridMap,
|
|
263
|
+
setSelectedCells,
|
|
264
|
+
setFocusedCellId,
|
|
265
|
+
setAnchorCell,
|
|
266
|
+
registerGrid,
|
|
267
|
+
selectCell,
|
|
268
|
+
startSelection,
|
|
269
|
+
extendSelection,
|
|
270
|
+
endSelection,
|
|
271
|
+
focusCell,
|
|
272
|
+
clearSelection,
|
|
273
|
+
isCellSelected,
|
|
274
|
+
isCellFocused,
|
|
275
|
+
getCellPositionFromId,
|
|
276
|
+
getCellBorderClasses
|
|
277
|
+
]
|
|
278
|
+
);
|
|
279
|
+
return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(SelectionCellsContext.SelectionCellsContext.Provider, { value, children });
|
|
280
|
+
};
|
|
281
|
+
exports.SelectionCellsProvider = SelectionCellsProvider;
|
|
282
|
+
//# sourceMappingURL=SelectionCellsProvider.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionCellsProvider.cjs.js","sources":["../../../../../../src/containers/ProjectTreeTable/context/SelectionCellsProvider.tsx"],"sourcesContent":["import React, { useState, useCallback, useMemo, ReactNode, useRef } from 'react'\nimport {\n CellId,\n RowId,\n ColId,\n CellPosition,\n getCellId,\n parseCellId,\n BorderPosition,\n getBorderClasses,\n} from '../utils/cellUtils'\nimport { DRAG_HANDLE_COLUMN_ID } from '../ProjectTreeTable'\nimport { SelectionCellsContext, GridMap, ROW_SELECTION_COLUMN_ID } from './SelectionCellsContext'\n\nexport const SelectionCellsProvider: React.FC<{ children: ReactNode }> = ({ children }) => {\n const [selectedCells, setSelectedCells] = useState<Set<CellId>>(new Set())\n const [focusedCellId, setFocusedCellId] = useState<CellId | null>(null)\n const [selectionInProgress, setSelectionInProgress] = useState<boolean>(false)\n const [anchorCell, setAnchorCell] = useState<CellPosition | null>(null)\n const [gridMap, setGridMap] = useState<GridMap>({\n rowIdToIndex: new Map(),\n colIdToIndex: new Map(),\n indexToRowId: new Map(),\n indexToColId: new Map(),\n })\n const mapToString = (map: Map<any, any>) => {\n return JSON.stringify(Array.from(map.entries()))\n }\n\n const stableGridMap = useMemo(\n () => gridMap,\n [\n mapToString(gridMap.rowIdToIndex),\n mapToString(gridMap.colIdToIndex),\n mapToString(gridMap.indexToRowId),\n mapToString(gridMap.indexToColId),\n ],\n )\n // Track whether we're selecting or unselecting during drag\n const initialCellSelected = useRef<boolean>(false)\n\n const selectedRows = useMemo(\n () =>\n Array.from(selectedCells)\n .filter(\n (cellId) =>\n parseCellId(cellId)?.colId === ROW_SELECTION_COLUMN_ID && parseCellId(cellId)?.rowId,\n )\n .map((cellId) => parseCellId(cellId)?.rowId) as string[],\n [selectedCells],\n )\n\n // Register grid structure for range selections\n const registerGrid = useCallback((rows: RowId[], columns: ColId[]) => {\n const rowIdToIndex = new Map<RowId, number>()\n const colIdToIndex = new Map<ColId, number>()\n const indexToRowId = new Map<number, RowId>()\n const indexToColId = new Map<number, ColId>()\n\n rows.forEach((rowId, index) => {\n rowIdToIndex.set(rowId, index)\n indexToRowId.set(index, rowId)\n })\n\n columns.forEach((colId, index) => {\n colIdToIndex.set(colId, index)\n indexToColId.set(index, colId)\n })\n\n setGridMap({ rowIdToIndex, colIdToIndex, indexToRowId, indexToColId })\n }, [])\n\n // update the selection whilst properly handling the row-selection column\n const updateSelection = useCallback((selection: Set<CellId>, position: CellPosition) => {\n setSelectedCells((prevSelectedCells) => {\n let newSelection = new Set(selection)\n if (position.colId !== ROW_SELECTION_COLUMN_ID && position.colId !== DRAG_HANDLE_COLUMN_ID) {\n const rowSelection = Array.from(prevSelectedCells).filter(\n (id) => parseCellId(id)?.colId === ROW_SELECTION_COLUMN_ID,\n )\n if (rowSelection.length) {\n newSelection = new Set([...newSelection, ...rowSelection])\n }\n }\n return newSelection\n })\n }, [])\n\n // Select cells between two points in the grid\n const selectCellRange = useCallback(\n (start: CellPosition, end: CellPosition, additive: boolean): Set<CellId> => {\n if (!additive) {\n // Clear existing selection if not additive\n updateSelection(new Set(), start)\n }\n\n const startRowIdx = stableGridMap.rowIdToIndex.get(start.rowId) ?? 0\n const startColIdx = stableGridMap.colIdToIndex.get(start.colId) ?? 0\n const endRowIdx = stableGridMap.rowIdToIndex.get(end.rowId) ?? 0\n const endColIdx = stableGridMap.colIdToIndex.get(end.colId) ?? 0\n\n const minRowIdx = Math.min(startRowIdx, endRowIdx)\n const maxRowIdx = Math.max(startRowIdx, endRowIdx)\n const minColIdx = Math.min(startColIdx, endColIdx)\n const maxColIdx = Math.max(startColIdx, endColIdx)\n\n const newSelection = new Set(additive ? selectedCells : [])\n\n for (let r = minRowIdx; r <= maxRowIdx; r++) {\n const rowId = stableGridMap.indexToRowId.get(r)\n if (!rowId) continue\n\n for (let c = minColIdx; c <= maxColIdx; c++) {\n const colId = stableGridMap.indexToColId.get(c)\n if (!colId) continue\n\n newSelection.add(getCellId(rowId, colId))\n }\n }\n\n return newSelection\n },\n [stableGridMap, selectedCells, updateSelection],\n )\n\n // Start a selection operation\n const startSelection = useCallback(\n (cellId: CellId, additive: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n setSelectionInProgress(true)\n // Store whether the initial cell was selected to determine drag behavior\n initialCellSelected.current = selectedCells.has(cellId)\n\n if (additive) {\n // Toggle this cell in multi-select mode\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n // If this was the focused cell, set focus to another cell in the selection or null\n if (focusedCellId === cellId) {\n if (newSelection.size > 0) {\n setFocusedCellId(Array.from(newSelection)[Array.from(newSelection).length - 1])\n } else {\n setFocusedCellId(null)\n }\n }\n } else {\n newSelection.add(cellId)\n setFocusedCellId(cellId)\n setAnchorCell(position)\n }\n return newSelection\n })\n } else {\n // Single cell selection\n // If this cell is already the only selected cell, deselect it\n // and it is from name column\n if (\n selectedCells.size === 1 &&\n selectedCells.has(cellId) &&\n [ROW_SELECTION_COLUMN_ID, 'name'].includes(position.colId)\n ) {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n } else {\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n setFocusedCellId(cellId)\n }\n }\n },\n [selectedCells, focusedCellId, updateSelection],\n )\n\n // Extend the current selection during drag\n const extendSelection = useCallback(\n (cellId: CellId, isRowSelectionColumn?: boolean) => {\n if (!selectionInProgress || !anchorCell) return\n\n const currentPosition = parseCellId(cellId)\n if (!currentPosition) return\n\n if (isRowSelectionColumn) {\n // Handle row selection column differently during drag\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n const position = parseCellId(cellId)\n\n if (!position) return newSelection\n\n // We're either selecting or unselecting based on the initial cell's state\n if (initialCellSelected.current) {\n // If we started on a selected cell, we're removing cells during drag\n newSelection.delete(cellId)\n } else {\n // If we started on an unselected cell, we're adding cells during drag\n newSelection.add(cellId)\n }\n\n return newSelection\n })\n } else {\n // For normal cells, use the range selection behavior\n const newSelection = selectCellRange(anchorCell, currentPosition, false)\n updateSelection(newSelection, currentPosition)\n }\n },\n [selectionInProgress, anchorCell, selectCellRange, updateSelection],\n )\n\n // End a selection operation\n const endSelection = useCallback(() => {\n setSelectionInProgress(false)\n }, [])\n\n // Select a cell (click or programmatically)\n const selectCell = useCallback(\n (cellId: CellId, additive: boolean, range: boolean) => {\n const position = parseCellId(cellId)\n if (!position) return\n\n if (range && anchorCell) {\n // Shift+click for range selection - select cells between anchor and current\n const newSelection = selectCellRange(anchorCell, position, additive)\n updateSelection(newSelection, position)\n } else if (additive) {\n // Ctrl/Cmd+click for toggling selection\n setSelectedCells((prev) => {\n const newSelection = new Set(prev)\n if (newSelection.has(cellId)) {\n newSelection.delete(cellId)\n } else {\n newSelection.add(cellId)\n }\n return newSelection\n })\n } else {\n // Normal click - select just this cell and set as new anchor\n updateSelection(new Set([cellId]), position)\n setAnchorCell(position)\n }\n },\n [anchorCell, selectCellRange, updateSelection],\n )\n\n // Focus a cell without changing selection\n const focusCell = useCallback((cellId: CellId | null) => {\n setFocusedCellId(cellId)\n }, [])\n\n // Clear all selections\n const clearSelection = useCallback(() => {\n setSelectedCells(new Set())\n setAnchorCell(null)\n setFocusedCellId(null)\n }, [])\n\n // Check if a cell is selected\n const isCellSelected = useCallback((cellId: CellId) => selectedCells.has(cellId), [selectedCells])\n\n // Check if a cell is focused\n const isCellFocused = useCallback((cellId: CellId) => cellId === focusedCellId, [focusedCellId])\n\n // Get position from cell ID - using shared utility\n const getCellPositionFromId = useCallback((cellId: CellId) => parseCellId(cellId), [])\n\n // Get border classes for a cell based on its selection state and neighbors\n const getCellBorderClasses = useCallback(\n (cellId: CellId): string[] => {\n if (!isCellSelected(cellId)) return []\n\n const position = parseCellId(cellId)\n if (!position) return []\n\n const rowIndex = stableGridMap.rowIdToIndex.get(position.rowId)\n const colIndex = stableGridMap.colIdToIndex.get(position.colId)\n\n if (rowIndex === undefined || colIndex === undefined) return []\n\n // Check if the cell's neighbors in all four directions are selected\n const top = stableGridMap.indexToRowId.get(rowIndex - 1)\n const right = stableGridMap.indexToColId.get(colIndex + 1)\n const bottom = stableGridMap.indexToRowId.get(rowIndex + 1)\n const left = stableGridMap.indexToColId.get(colIndex - 1)\n\n // Default to no borders\n let borderPos = BorderPosition.None\n\n // Top edge check: show border if we're at the top of the grid or the cell above is not selected\n if (!top || !selectedCells.has(getCellId(top, position.colId))) {\n borderPos |= BorderPosition.Top\n }\n\n // Right edge check: show border if we're at the right edge of the grid or the cell to the right is not selected\n if (!right || !selectedCells.has(getCellId(position.rowId, right))) {\n borderPos |= BorderPosition.Right\n }\n\n // Bottom edge check: show border if we're at the bottom of the grid or the cell below is not selected\n if (!bottom || !selectedCells.has(getCellId(bottom, position.colId))) {\n borderPos |= BorderPosition.Bottom\n }\n\n // Left edge check: show border if we're at the left edge of the grid or the cell to the left is not selected\n if (!left || !selectedCells.has(getCellId(position.rowId, left))) {\n borderPos |= BorderPosition.Left\n }\n\n return getBorderClasses(borderPos)\n },\n [selectedCells, stableGridMap, isCellSelected],\n )\n\n // Memoize context value to prevent unnecessary re-renders\n const value = useMemo(\n () => ({\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n gridMap: stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n }),\n [\n selectedCells,\n selectedRows,\n focusedCellId,\n selectionInProgress,\n anchorCell,\n stableGridMap,\n setSelectedCells,\n setFocusedCellId,\n setAnchorCell,\n registerGrid,\n selectCell,\n startSelection,\n extendSelection,\n endSelection,\n focusCell,\n clearSelection,\n isCellSelected,\n isCellFocused,\n getCellPositionFromId,\n getCellBorderClasses,\n ],\n )\n\n return <SelectionCellsContext.Provider value={value}>{children}</SelectionCellsContext.Provider>\n}\n"],"names":["useState","useMemo","useRef","parseCellId","ROW_SELECTION_COLUMN_ID","useCallback","DRAG_HANDLE_COLUMN_ID","getCellId","BorderPosition","getBorderClasses","jsx","SelectionCellsContext"],"mappings":"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"}
|