@pallasoft/ps-table-components 1.22.1 → 1.23.0
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/components/ps-data-table.d.ts +2 -1
- package/dist/components/ps-data-table.js +47 -11
- package/dist/components/ps-table-bulk-bar.js +3 -2
- package/dist/components/ps-table-column-picker.js +2 -1
- package/dist/components/ps-table-export-button.js +1 -1
- package/dist/components/ps-table-group-header.js +1 -1
- package/dist/components/ps-table-pagination.js +2 -2
- package/dist/components/ps-table-reorder-frame.js +15 -2
- package/dist/components/ps-table-reorder-handle.js +1 -1
- package/dist/components/ps-table-sort-header.js +2 -2
- package/dist/components/ps-table-sortable-row.d.ts +5 -1
- package/dist/components/ps-table-sortable-row.js +12 -4
- package/dist/components/ps-table-toolbar.js +2 -2
- package/dist/constants/ps-table-control-classes.d.ts +9 -0
- package/dist/constants/ps-table-control-classes.js +12 -0
- package/dist/constants/ps-table-drop-classes.d.ts +2 -0
- package/dist/constants/ps-table-drop-classes.js +8 -0
- package/dist/constants/ps-table-drop-placement.d.ts +6 -0
- package/dist/constants/ps-table-drop-placement.js +8 -0
- package/dist/constants/ps-table-pin-classes.d.ts +16 -0
- package/dist/constants/ps-table-pin-classes.js +19 -0
- package/dist/constants/table-breakpoint.d.ts +7 -0
- package/dist/constants/table-breakpoint.js +13 -0
- package/dist/esm/components/ps-data-table.js +48 -12
- package/dist/esm/components/ps-table-bulk-bar.js +3 -2
- package/dist/esm/components/ps-table-column-picker.js +2 -1
- package/dist/esm/components/ps-table-export-button.js +1 -1
- package/dist/esm/components/ps-table-group-header.js +1 -1
- package/dist/esm/components/ps-table-pagination.js +2 -2
- package/dist/esm/components/ps-table-reorder-frame.js +15 -2
- package/dist/esm/components/ps-table-reorder-handle.js +1 -1
- package/dist/esm/components/ps-table-sort-header.js +2 -2
- package/dist/esm/components/ps-table-sortable-row.js +12 -4
- package/dist/esm/components/ps-table-toolbar.js +2 -2
- package/dist/esm/constants/ps-table-control-classes.js +9 -0
- package/dist/esm/constants/ps-table-drop-classes.js +5 -0
- package/dist/esm/constants/ps-table-drop-placement.js +5 -0
- package/dist/esm/constants/ps-table-pin-classes.js +16 -0
- package/dist/esm/constants/table-breakpoint.js +10 -0
- package/dist/esm/hooks/use-ps-table-overflow.js +19 -0
- package/dist/esm/hooks/use-ps-table-reorder.js +89 -15
- package/dist/esm/index.js +10 -0
- package/dist/esm/interfaces/table-drop.js +1 -0
- package/dist/esm/interfaces/table-nesting-announcements.js +1 -0
- package/dist/esm/interfaces/table-overflow-edges.js +1 -0
- package/dist/esm/interfaces/table-pin-classes.js +1 -0
- package/dist/esm/interfaces/table-reorder-nesting-binding.js +1 -0
- package/dist/esm/interfaces/table-reorder-nesting.js +1 -0
- package/dist/esm/services/ps-table-overflow-service.js +11 -0
- package/dist/esm/services/ps-table-pin-service.js +22 -0
- package/dist/esm/services/ps-table-reorder-service.js +38 -1
- package/dist/hooks/use-ps-table-overflow.d.ts +6 -0
- package/dist/hooks/use-ps-table-overflow.js +23 -0
- package/dist/hooks/use-ps-table-reorder.d.ts +6 -2
- package/dist/hooks/use-ps-table-reorder.js +87 -13
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/interfaces/table-column.d.ts +3 -0
- package/dist/interfaces/table-drop.d.ts +5 -0
- package/dist/interfaces/table-drop.js +2 -0
- package/dist/interfaces/table-nesting-announcements.d.ts +5 -0
- package/dist/interfaces/table-nesting-announcements.js +2 -0
- package/dist/interfaces/table-overflow-edges.d.ts +4 -0
- package/dist/interfaces/table-overflow-edges.js +2 -0
- package/dist/interfaces/table-pin-classes.d.ts +5 -0
- package/dist/interfaces/table-pin-classes.js +2 -0
- package/dist/interfaces/table-reorder-nesting-binding.d.ts +8 -0
- package/dist/interfaces/table-reorder-nesting-binding.js +2 -0
- package/dist/interfaces/table-reorder-nesting.d.ts +8 -0
- package/dist/interfaces/table-reorder-nesting.js +2 -0
- package/dist/interfaces/table-reorder-row-props.d.ts +3 -0
- package/dist/interfaces/table-reorder.d.ts +4 -2
- package/dist/services/ps-table-overflow-service.d.ts +6 -0
- package/dist/services/ps-table-overflow-service.js +15 -0
- package/dist/services/ps-table-pin-service.d.ts +5 -0
- package/dist/services/ps-table-pin-service.js +26 -0
- package/dist/services/ps-table-reorder-service.d.ts +11 -0
- package/dist/services/ps-table-reorder-service.js +38 -1
- package/package.json +2 -2
package/dist/esm/index.js
CHANGED
|
@@ -3,7 +3,9 @@ export * from './components/ps-streamed-rows';
|
|
|
3
3
|
export * from './components/ps-table-stream-status';
|
|
4
4
|
export * from './components/ps-table-group-header';
|
|
5
5
|
export * from './components/ps-table-pagination';
|
|
6
|
+
export * from './constants/table-breakpoint';
|
|
6
7
|
export * from './constants/table-card-role';
|
|
8
|
+
export * from './constants/ps-table-pin-classes';
|
|
7
9
|
export * from './constants/table-column-size';
|
|
8
10
|
export * from './constants/table-filter-kind';
|
|
9
11
|
export * from './interfaces/table-column';
|
|
@@ -27,6 +29,11 @@ export * from './services/ps-table-group-service';
|
|
|
27
29
|
export * from './services/ps-table-query-service';
|
|
28
30
|
export * from './services/ps-table-search-service';
|
|
29
31
|
export * from './services/ps-table-scroll-service';
|
|
32
|
+
export * from './services/ps-table-pin-service';
|
|
33
|
+
export * from './services/ps-table-overflow-service';
|
|
34
|
+
export * from './hooks/use-ps-table-overflow';
|
|
35
|
+
export * from './interfaces/table-pin-classes';
|
|
36
|
+
export * from './interfaces/table-overflow-edges';
|
|
30
37
|
export * from './services/ps-table-stream-service';
|
|
31
38
|
export * from './components/ps-table-export-button';
|
|
32
39
|
export * from './constants/ps-table-download-config';
|
|
@@ -36,4 +43,7 @@ export * from './hooks/use-ps-table-page';
|
|
|
36
43
|
export * from './interfaces/ps-table-page-state';
|
|
37
44
|
export * from './interfaces/table-reorder';
|
|
38
45
|
export * from './interfaces/table-reorder-announcements';
|
|
46
|
+
export * from './interfaces/table-reorder-nesting';
|
|
47
|
+
export * from './interfaces/table-nesting-announcements';
|
|
48
|
+
export * from './constants/ps-table-drop-placement';
|
|
39
49
|
export * from './services/ps-table-reorder-service';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export class PsTableOverflowService {
|
|
2
|
+
static edges(scrollLeft, clientWidth, scrollWidth) {
|
|
3
|
+
const start = Math.abs(scrollLeft) > 0.5;
|
|
4
|
+
const end = scrollWidth - clientWidth - Math.abs(scrollLeft) > 0.5;
|
|
5
|
+
return { end, start };
|
|
6
|
+
}
|
|
7
|
+
static isSame(current, next) {
|
|
8
|
+
return current.end === next.end && current.start === next.start;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
PsTableOverflowService.none = { end: false, start: false };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { PsTablePinClasses } from '../constants/ps-table-pin-classes';
|
|
2
|
+
export class PsTablePinService {
|
|
3
|
+
static leading(isPinned, hasReorder, isSelectable) {
|
|
4
|
+
if (!isPinned)
|
|
5
|
+
return { first: '', reorder: '', select: '' };
|
|
6
|
+
const firstOffset = hasReorder && isSelectable
|
|
7
|
+
? PsTablePinClasses.first.both
|
|
8
|
+
: hasReorder
|
|
9
|
+
? PsTablePinClasses.first.reorder
|
|
10
|
+
: isSelectable
|
|
11
|
+
? PsTablePinClasses.first.select
|
|
12
|
+
: PsTablePinClasses.first.none;
|
|
13
|
+
return {
|
|
14
|
+
first: `${PsTablePinClasses.cell} ${PsTablePinClasses.edge} ${firstOffset}`,
|
|
15
|
+
reorder: `${PsTablePinClasses.cell} ${PsTablePinClasses.reorder}`,
|
|
16
|
+
select: `${PsTablePinClasses.cell} ${hasReorder ? PsTablePinClasses.select.withReorder : PsTablePinClasses.select.alone}`,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
static end(isPinned) {
|
|
20
|
+
return isPinned ? PsTablePinClasses.end : '';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { PsTableDropPlacement } from '../constants/ps-table-drop-placement';
|
|
1
2
|
export class PsTableReorderService {
|
|
2
3
|
static runs(items, getKey, getId) {
|
|
3
4
|
const runs = [];
|
|
@@ -32,11 +33,47 @@ export class PsTableReorderService {
|
|
|
32
33
|
next.splice(to, 0, moved);
|
|
33
34
|
return next;
|
|
34
35
|
}
|
|
36
|
+
static pointerY(event, deltaY) {
|
|
37
|
+
if (event instanceof MouseEvent)
|
|
38
|
+
return event.clientY + deltaY;
|
|
39
|
+
if (typeof TouchEvent !== 'undefined' &&
|
|
40
|
+
event instanceof TouchEvent &&
|
|
41
|
+
event.touches.length > 0)
|
|
42
|
+
return event.touches[0].clientY + deltaY;
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
static dropPlacement(pointerY, rect, fallback, isAllowed) {
|
|
46
|
+
const allowed = PsTableReorderService.candidates(pointerY, rect, fallback).find(isAllowed);
|
|
47
|
+
return allowed === undefined ? null : allowed;
|
|
48
|
+
}
|
|
49
|
+
static candidates(pointerY, rect, fallback) {
|
|
50
|
+
if (pointerY === null || rect.height <= 0)
|
|
51
|
+
return [fallback];
|
|
52
|
+
const ratio = (pointerY - rect.top) / rect.height;
|
|
53
|
+
if (ratio < PsTableReorderService.edgeRatio)
|
|
54
|
+
return [PsTableDropPlacement.before, PsTableDropPlacement.into];
|
|
55
|
+
if (ratio > 1 - PsTableReorderService.edgeRatio)
|
|
56
|
+
return [PsTableDropPlacement.after, PsTableDropPlacement.into];
|
|
57
|
+
return [
|
|
58
|
+
PsTableDropPlacement.into,
|
|
59
|
+
ratio < 0.5 ? PsTableDropPlacement.before : PsTableDropPlacement.after,
|
|
60
|
+
];
|
|
61
|
+
}
|
|
35
62
|
}
|
|
63
|
+
PsTableReorderService.edgeRatio = 0.25;
|
|
64
|
+
PsTableReorderService.treeKey = 'tree';
|
|
36
65
|
PsTableReorderService.plain = {
|
|
37
66
|
Row: 'tr',
|
|
38
67
|
isActive: false,
|
|
39
|
-
rowProps: (rowId) => ({
|
|
68
|
+
rowProps: (rowId) => ({
|
|
69
|
+
dropPlacement: null,
|
|
70
|
+
handleLabel: '',
|
|
71
|
+
hasHandle: false,
|
|
72
|
+
isDisabled: true,
|
|
73
|
+
isDropTarget: false,
|
|
74
|
+
rowId,
|
|
75
|
+
}),
|
|
40
76
|
run: (_runId, _ids, children) => children,
|
|
41
77
|
};
|
|
78
|
+
PsTableReorderService.still = () => null;
|
|
42
79
|
PsTableReorderService.lockToVerticalAxis = ({ transform }) => ({ ...transform, x: 0 });
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.usePsTableOverflow = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const ps_table_overflow_service_1 = require("../services/ps-table-overflow-service");
|
|
6
|
+
const usePsTableOverflow = (layoutKey) => {
|
|
7
|
+
const ref = (0, react_1.useRef)(null);
|
|
8
|
+
const [edges, setEdges] = (0, react_1.useState)(ps_table_overflow_service_1.PsTableOverflowService.none);
|
|
9
|
+
const update = (0, react_1.useCallback)(() => {
|
|
10
|
+
const element = ref.current;
|
|
11
|
+
if (element === null)
|
|
12
|
+
return;
|
|
13
|
+
const next = ps_table_overflow_service_1.PsTableOverflowService.edges(element.scrollLeft, element.clientWidth, element.scrollWidth);
|
|
14
|
+
setEdges((current) => (ps_table_overflow_service_1.PsTableOverflowService.isSame(current, next) ? current : next));
|
|
15
|
+
}, []);
|
|
16
|
+
(0, react_1.useEffect)(() => {
|
|
17
|
+
update();
|
|
18
|
+
window.addEventListener('resize', update);
|
|
19
|
+
return () => window.removeEventListener('resize', update);
|
|
20
|
+
}, [layoutKey, update]);
|
|
21
|
+
return { edges, ref, update };
|
|
22
|
+
};
|
|
23
|
+
exports.usePsTableOverflow = usePsTableOverflow;
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
import { type DndContextProps } from '@dnd-kit/core';
|
|
2
|
+
import type { PsTableDrop } from '../interfaces/table-drop';
|
|
2
3
|
import type { PsTableReorderAnnouncements } from '../interfaces/table-reorder-announcements';
|
|
3
4
|
import type { PsTableReorderItem } from '../interfaces/table-reorder-item';
|
|
5
|
+
import type { PsTableReorderNestingBinding } from '../interfaces/table-reorder-nesting-binding';
|
|
4
6
|
import type { PsTableReorderPlacement } from '../interfaces/table-reorder-placement';
|
|
5
7
|
export interface UsePsTableReorderInput {
|
|
6
8
|
announcements: PsTableReorderAnnouncements;
|
|
7
9
|
enabled: boolean;
|
|
8
10
|
instructions: string;
|
|
9
11
|
items: PsTableReorderItem[];
|
|
10
|
-
|
|
12
|
+
nesting?: PsTableReorderNestingBinding;
|
|
13
|
+
onReorder?: (groupKey: string, orderedIds: string[]) => void;
|
|
11
14
|
}
|
|
12
15
|
export interface PsTableReorderState {
|
|
13
16
|
activeId: string | null;
|
|
14
17
|
activeRunId: string | null;
|
|
15
18
|
contextProps: Omit<DndContextProps, 'children'>;
|
|
19
|
+
drop: PsTableDrop | null;
|
|
16
20
|
placements: Map<string, PsTableReorderPlacement>;
|
|
17
21
|
}
|
|
18
|
-
export declare const usePsTableReorder: ({ announcements: texts, enabled, instructions, items, onReorder, }: UsePsTableReorderInput) => PsTableReorderState;
|
|
22
|
+
export declare const usePsTableReorder: ({ announcements: texts, enabled, instructions, items, nesting, onReorder, }: UsePsTableReorderInput) => PsTableReorderState;
|
|
@@ -4,9 +4,16 @@ exports.usePsTableReorder = void 0;
|
|
|
4
4
|
const react_1 = require("react");
|
|
5
5
|
const core_1 = require("@dnd-kit/core");
|
|
6
6
|
const ps_core_components_1 = require("@pallasoft/ps-core-components");
|
|
7
|
+
const ps_table_drop_placement_1 = require("../constants/ps-table-drop-placement");
|
|
7
8
|
const ps_table_reorder_service_1 = require("../services/ps-table-reorder-service");
|
|
8
|
-
const
|
|
9
|
+
const pointerThenCenter = (args) => {
|
|
10
|
+
const within = (0, core_1.pointerWithin)(args);
|
|
11
|
+
return within.length > 0 ? within : (0, core_1.closestCenter)(args);
|
|
12
|
+
};
|
|
13
|
+
const usePsTableReorder = ({ announcements: texts, enabled, instructions, items, nesting, onReorder, }) => {
|
|
9
14
|
const [activeId, setActiveId] = (0, react_1.useState)(null);
|
|
15
|
+
const [drop, setDrop] = (0, react_1.useState)(null);
|
|
16
|
+
const dropRef = (0, react_1.useRef)(null);
|
|
10
17
|
const sensors = (0, ps_core_components_1.usePsDragSensors)();
|
|
11
18
|
const runs = (0, react_1.useMemo)(() => enabled
|
|
12
19
|
? ps_table_reorder_service_1.PsTableReorderService.runs(items, (item) => item.groupKey, (item) => item.id)
|
|
@@ -14,6 +21,7 @@ const usePsTableReorder = ({ announcements: texts, enabled, instructions, items,
|
|
|
14
21
|
const placements = (0, react_1.useMemo)(() => ps_table_reorder_service_1.PsTableReorderService.placements(runs, (item) => item.id), [runs]);
|
|
15
22
|
const activePlacement = activeId === null ? undefined : placements.get(activeId);
|
|
16
23
|
const itemById = (0, react_1.useMemo)(() => new Map(items.map((item) => [item.id, item])), [items]);
|
|
24
|
+
const indexById = (0, react_1.useMemo)(() => new Map(items.map((item, index) => [item.id, index])), [items]);
|
|
17
25
|
const labelOf = (id) => {
|
|
18
26
|
const item = itemById.get(id);
|
|
19
27
|
return item === undefined ? id : item.label;
|
|
@@ -26,23 +34,83 @@ const usePsTableReorder = ({ announcements: texts, enabled, instructions, items,
|
|
|
26
34
|
const placement = placements.get(id);
|
|
27
35
|
return placement === undefined ? 0 : placement.size;
|
|
28
36
|
};
|
|
37
|
+
const edgeFor = (activeKey, overId) => {
|
|
38
|
+
const activeIndex = indexById.get(activeKey);
|
|
39
|
+
const overIndex = indexById.get(overId);
|
|
40
|
+
return activeIndex !== undefined && overIndex !== undefined && activeIndex < overIndex
|
|
41
|
+
? ps_table_drop_placement_1.PsTableDropPlacement.after
|
|
42
|
+
: ps_table_drop_placement_1.PsTableDropPlacement.before;
|
|
43
|
+
};
|
|
44
|
+
const resolveDrop = (event) => {
|
|
45
|
+
if (nesting === undefined || event.over === null || event.over.id === event.active.id)
|
|
46
|
+
return null;
|
|
47
|
+
const activeKey = String(event.active.id);
|
|
48
|
+
const overId = String(event.over.id);
|
|
49
|
+
const placement = ps_table_reorder_service_1.PsTableReorderService.dropPlacement(ps_table_reorder_service_1.PsTableReorderService.pointerY(event.activatorEvent, event.delta.y), event.over.rect, edgeFor(activeKey, overId), (candidate) => nesting.canDrop(activeKey, overId, candidate));
|
|
50
|
+
return placement === null ? null : { overId, placement };
|
|
51
|
+
};
|
|
52
|
+
const announcedDrop = (activeKey, overId) => {
|
|
53
|
+
if (nesting === undefined)
|
|
54
|
+
return null;
|
|
55
|
+
const known = dropRef.current;
|
|
56
|
+
if (known !== null && known.overId === overId)
|
|
57
|
+
return known;
|
|
58
|
+
const placement = edgeFor(activeKey, overId);
|
|
59
|
+
return nesting.canDrop(activeKey, overId, placement) ? { overId, placement } : null;
|
|
60
|
+
};
|
|
61
|
+
const describeDrop = (active, target) => nesting === undefined
|
|
62
|
+
? undefined
|
|
63
|
+
: nesting.announcements[target.placement](labelOf(active), labelOf(target.overId));
|
|
29
64
|
const announcements = {
|
|
30
65
|
onDragCancel: ({ active }) => texts.cancelled(labelOf(String(active.id))),
|
|
31
|
-
onDragEnd: ({ active, over }) =>
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
66
|
+
onDragEnd: ({ active, over }) => {
|
|
67
|
+
if (nesting !== undefined) {
|
|
68
|
+
const target = over === null ? null : announcedDrop(String(active.id), String(over.id));
|
|
69
|
+
return target === null
|
|
70
|
+
? texts.cancelled(labelOf(String(active.id)))
|
|
71
|
+
: describeDrop(String(active.id), target);
|
|
72
|
+
}
|
|
73
|
+
return over === null
|
|
74
|
+
? texts.cancelled(labelOf(String(active.id)))
|
|
75
|
+
: texts.dropped(labelOf(String(active.id)), positionOf(String(over.id)), countOf(String(over.id)));
|
|
76
|
+
},
|
|
77
|
+
onDragOver: ({ active, over }) => {
|
|
78
|
+
if (over === null)
|
|
79
|
+
return undefined;
|
|
80
|
+
if (nesting !== undefined) {
|
|
81
|
+
const target = announcedDrop(String(active.id), String(over.id));
|
|
82
|
+
return target === null ? undefined : describeDrop(String(active.id), target);
|
|
83
|
+
}
|
|
84
|
+
return texts.moved(labelOf(String(active.id)), positionOf(String(over.id)), countOf(String(over.id)));
|
|
85
|
+
},
|
|
37
86
|
onDragStart: ({ active }) => texts.lifted(labelOf(String(active.id)), positionOf(String(active.id)), countOf(String(active.id))),
|
|
38
87
|
};
|
|
39
|
-
const
|
|
88
|
+
const handleDragMove = (event) => {
|
|
89
|
+
const next = resolveDrop(event);
|
|
90
|
+
dropRef.current = next;
|
|
91
|
+
setDrop((current) => current !== null &&
|
|
92
|
+
next !== null &&
|
|
93
|
+
current.overId === next.overId &&
|
|
94
|
+
current.placement === next.placement
|
|
95
|
+
? current
|
|
96
|
+
: next);
|
|
97
|
+
};
|
|
98
|
+
const handleDragEnd = (event) => {
|
|
99
|
+
const { active, over } = event;
|
|
100
|
+
const target = resolveDrop(event);
|
|
40
101
|
setActiveId(null);
|
|
41
|
-
|
|
102
|
+
setDrop(null);
|
|
103
|
+
dropRef.current = null;
|
|
104
|
+
if (nesting !== undefined) {
|
|
105
|
+
if (target !== null)
|
|
106
|
+
nesting.onMove(String(active.id), target.overId, target.placement);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (over === null || active.id === over.id || onReorder === undefined)
|
|
42
110
|
return;
|
|
43
111
|
const placement = placements.get(String(active.id));
|
|
44
|
-
const
|
|
45
|
-
if (placement === undefined ||
|
|
112
|
+
const sibling = placements.get(String(over.id));
|
|
113
|
+
if (placement === undefined || sibling === undefined || placement.runId !== sibling.runId)
|
|
46
114
|
return;
|
|
47
115
|
const run = runs.find((candidate) => candidate.id === placement.runId);
|
|
48
116
|
if (run === undefined)
|
|
@@ -54,13 +122,19 @@ const usePsTableReorder = ({ announcements: texts, enabled, instructions, items,
|
|
|
54
122
|
activeRunId: activePlacement === undefined ? null : activePlacement.runId,
|
|
55
123
|
contextProps: {
|
|
56
124
|
accessibility: { announcements, screenReaderInstructions: { draggable: instructions } },
|
|
57
|
-
collisionDetection: core_1.closestCenter,
|
|
125
|
+
collisionDetection: nesting === undefined ? core_1.closestCenter : pointerThenCenter,
|
|
58
126
|
modifiers: [ps_table_reorder_service_1.PsTableReorderService.lockToVerticalAxis],
|
|
59
|
-
onDragCancel: () =>
|
|
127
|
+
onDragCancel: () => {
|
|
128
|
+
setActiveId(null);
|
|
129
|
+
setDrop(null);
|
|
130
|
+
dropRef.current = null;
|
|
131
|
+
},
|
|
60
132
|
onDragEnd: handleDragEnd,
|
|
133
|
+
onDragMove: nesting === undefined ? undefined : handleDragMove,
|
|
61
134
|
onDragStart: ({ active }) => setActiveId(String(active.id)),
|
|
62
135
|
sensors,
|
|
63
136
|
},
|
|
137
|
+
drop,
|
|
64
138
|
placements,
|
|
65
139
|
};
|
|
66
140
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ export * from './components/ps-streamed-rows';
|
|
|
3
3
|
export * from './components/ps-table-stream-status';
|
|
4
4
|
export * from './components/ps-table-group-header';
|
|
5
5
|
export * from './components/ps-table-pagination';
|
|
6
|
+
export * from './constants/table-breakpoint';
|
|
6
7
|
export * from './constants/table-card-role';
|
|
8
|
+
export * from './constants/ps-table-pin-classes';
|
|
7
9
|
export * from './constants/table-column-size';
|
|
8
10
|
export * from './constants/table-filter-kind';
|
|
9
11
|
export * from './interfaces/table-column';
|
|
@@ -27,6 +29,11 @@ export * from './services/ps-table-group-service';
|
|
|
27
29
|
export * from './services/ps-table-query-service';
|
|
28
30
|
export * from './services/ps-table-search-service';
|
|
29
31
|
export * from './services/ps-table-scroll-service';
|
|
32
|
+
export * from './services/ps-table-pin-service';
|
|
33
|
+
export * from './services/ps-table-overflow-service';
|
|
34
|
+
export * from './hooks/use-ps-table-overflow';
|
|
35
|
+
export * from './interfaces/table-pin-classes';
|
|
36
|
+
export * from './interfaces/table-overflow-edges';
|
|
30
37
|
export * from './services/ps-table-stream-service';
|
|
31
38
|
export * from './components/ps-table-export-button';
|
|
32
39
|
export * from './constants/ps-table-download-config';
|
|
@@ -36,4 +43,7 @@ export * from './hooks/use-ps-table-page';
|
|
|
36
43
|
export * from './interfaces/ps-table-page-state';
|
|
37
44
|
export * from './interfaces/table-reorder';
|
|
38
45
|
export * from './interfaces/table-reorder-announcements';
|
|
46
|
+
export * from './interfaces/table-reorder-nesting';
|
|
47
|
+
export * from './interfaces/table-nesting-announcements';
|
|
48
|
+
export * from './constants/ps-table-drop-placement';
|
|
39
49
|
export * from './services/ps-table-reorder-service';
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,9 @@ __exportStar(require("./components/ps-streamed-rows"), exports);
|
|
|
19
19
|
__exportStar(require("./components/ps-table-stream-status"), exports);
|
|
20
20
|
__exportStar(require("./components/ps-table-group-header"), exports);
|
|
21
21
|
__exportStar(require("./components/ps-table-pagination"), exports);
|
|
22
|
+
__exportStar(require("./constants/table-breakpoint"), exports);
|
|
22
23
|
__exportStar(require("./constants/table-card-role"), exports);
|
|
24
|
+
__exportStar(require("./constants/ps-table-pin-classes"), exports);
|
|
23
25
|
__exportStar(require("./constants/table-column-size"), exports);
|
|
24
26
|
__exportStar(require("./constants/table-filter-kind"), exports);
|
|
25
27
|
__exportStar(require("./interfaces/table-column"), exports);
|
|
@@ -43,6 +45,11 @@ __exportStar(require("./services/ps-table-group-service"), exports);
|
|
|
43
45
|
__exportStar(require("./services/ps-table-query-service"), exports);
|
|
44
46
|
__exportStar(require("./services/ps-table-search-service"), exports);
|
|
45
47
|
__exportStar(require("./services/ps-table-scroll-service"), exports);
|
|
48
|
+
__exportStar(require("./services/ps-table-pin-service"), exports);
|
|
49
|
+
__exportStar(require("./services/ps-table-overflow-service"), exports);
|
|
50
|
+
__exportStar(require("./hooks/use-ps-table-overflow"), exports);
|
|
51
|
+
__exportStar(require("./interfaces/table-pin-classes"), exports);
|
|
52
|
+
__exportStar(require("./interfaces/table-overflow-edges"), exports);
|
|
46
53
|
__exportStar(require("./services/ps-table-stream-service"), exports);
|
|
47
54
|
__exportStar(require("./components/ps-table-export-button"), exports);
|
|
48
55
|
__exportStar(require("./constants/ps-table-download-config"), exports);
|
|
@@ -52,4 +59,7 @@ __exportStar(require("./hooks/use-ps-table-page"), exports);
|
|
|
52
59
|
__exportStar(require("./interfaces/ps-table-page-state"), exports);
|
|
53
60
|
__exportStar(require("./interfaces/table-reorder"), exports);
|
|
54
61
|
__exportStar(require("./interfaces/table-reorder-announcements"), exports);
|
|
62
|
+
__exportStar(require("./interfaces/table-reorder-nesting"), exports);
|
|
63
|
+
__exportStar(require("./interfaces/table-nesting-announcements"), exports);
|
|
64
|
+
__exportStar(require("./constants/ps-table-drop-placement"), exports);
|
|
55
65
|
__exportStar(require("./services/ps-table-reorder-service"), exports);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
|
+
import type { PsTableBreakpoint } from '../constants/table-breakpoint';
|
|
2
3
|
import type { PsTableCardRole } from '../constants/table-card-role';
|
|
3
4
|
import type { PsTableColumnSize } from '../constants/table-column-size';
|
|
4
5
|
import type { PsTableColumnFilter } from './table-column-filter';
|
|
@@ -9,10 +10,12 @@ export interface PsTableColumn<RowData> {
|
|
|
9
10
|
cardRole?: PsTableCardRole;
|
|
10
11
|
filter?: PsTableColumnFilter<RowData>;
|
|
11
12
|
footer?: ReactNode;
|
|
13
|
+
hideBelow?: PsTableBreakpoint;
|
|
12
14
|
hideOnCards?: boolean;
|
|
13
15
|
id: string;
|
|
14
16
|
label: string;
|
|
15
17
|
minWidth?: string;
|
|
18
|
+
pinEnd?: boolean;
|
|
16
19
|
render: (row: RowData) => ReactNode;
|
|
17
20
|
size?: PsTableColumnSize;
|
|
18
21
|
sortValue?: (row: RowData) => string | number | null;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PsTableDropPlacement } from '../constants/ps-table-drop-placement';
|
|
2
|
+
import type { PsTableNestingAnnouncements } from './table-nesting-announcements';
|
|
3
|
+
export interface PsTableReorderNestingBinding {
|
|
4
|
+
announcements: PsTableNestingAnnouncements;
|
|
5
|
+
canDrag: (id: string) => boolean;
|
|
6
|
+
canDrop: (activeId: string, targetId: string, placement: PsTableDropPlacement) => boolean;
|
|
7
|
+
onMove: (activeId: string, targetId: string, placement: PsTableDropPlacement) => void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PsTableDropPlacement } from '../constants/ps-table-drop-placement';
|
|
2
|
+
import type { PsTableNestingAnnouncements } from './table-nesting-announcements';
|
|
3
|
+
export interface PsTableReorderNesting<RowData> {
|
|
4
|
+
announcements: PsTableNestingAnnouncements;
|
|
5
|
+
canDrag: (row: RowData) => boolean;
|
|
6
|
+
canDrop: (active: RowData, target: RowData, placement: PsTableDropPlacement) => boolean;
|
|
7
|
+
onMove: (active: RowData, target: RowData, placement: PsTableDropPlacement) => void;
|
|
8
|
+
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import type { PsTableDropPlacement } from '../constants/ps-table-drop-placement';
|
|
1
2
|
export interface PsTableReorderRowProps {
|
|
3
|
+
dropPlacement: PsTableDropPlacement | null;
|
|
2
4
|
handleLabel: string;
|
|
3
5
|
hasHandle: boolean;
|
|
4
6
|
isDisabled: boolean;
|
|
7
|
+
isDropTarget: boolean;
|
|
5
8
|
rowId: string;
|
|
6
9
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { PsTableReorderAnnouncements } from './table-reorder-announcements';
|
|
2
|
+
import type { PsTableReorderNesting } from './table-reorder-nesting';
|
|
2
3
|
export interface PsTableReorder<RowData> {
|
|
3
4
|
announcements: PsTableReorderAnnouncements;
|
|
4
5
|
cardsReason?: string;
|
|
@@ -6,7 +7,8 @@ export interface PsTableReorder<RowData> {
|
|
|
6
7
|
disabledReason?: string;
|
|
7
8
|
enabled: boolean;
|
|
8
9
|
getHandleLabel: (rowLabel: string) => string;
|
|
9
|
-
groupKey
|
|
10
|
+
groupKey?: (row: RowData) => string;
|
|
10
11
|
instructions: string;
|
|
11
|
-
|
|
12
|
+
nesting?: PsTableReorderNesting<RowData>;
|
|
13
|
+
onReorder?: (groupKey: string, orderedIds: string[]) => void;
|
|
12
14
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PsTableOverflowEdges } from '../interfaces/table-overflow-edges';
|
|
2
|
+
export declare class PsTableOverflowService {
|
|
3
|
+
static readonly none: PsTableOverflowEdges;
|
|
4
|
+
static edges(scrollLeft: number, clientWidth: number, scrollWidth: number): PsTableOverflowEdges;
|
|
5
|
+
static isSame(current: PsTableOverflowEdges, next: PsTableOverflowEdges): boolean;
|
|
6
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PsTableOverflowService = void 0;
|
|
4
|
+
class PsTableOverflowService {
|
|
5
|
+
static edges(scrollLeft, clientWidth, scrollWidth) {
|
|
6
|
+
const start = Math.abs(scrollLeft) > 0.5;
|
|
7
|
+
const end = scrollWidth - clientWidth - Math.abs(scrollLeft) > 0.5;
|
|
8
|
+
return { end, start };
|
|
9
|
+
}
|
|
10
|
+
static isSame(current, next) {
|
|
11
|
+
return current.end === next.end && current.start === next.start;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.PsTableOverflowService = PsTableOverflowService;
|
|
15
|
+
PsTableOverflowService.none = { end: false, start: false };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { PsTableLeadingPinClasses } from '../interfaces/table-pin-classes';
|
|
2
|
+
export declare class PsTablePinService {
|
|
3
|
+
static leading(isPinned: boolean, hasReorder: boolean, isSelectable: boolean): PsTableLeadingPinClasses;
|
|
4
|
+
static end(isPinned: boolean): string;
|
|
5
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PsTablePinService = void 0;
|
|
4
|
+
const ps_table_pin_classes_1 = require("../constants/ps-table-pin-classes");
|
|
5
|
+
class PsTablePinService {
|
|
6
|
+
static leading(isPinned, hasReorder, isSelectable) {
|
|
7
|
+
if (!isPinned)
|
|
8
|
+
return { first: '', reorder: '', select: '' };
|
|
9
|
+
const firstOffset = hasReorder && isSelectable
|
|
10
|
+
? ps_table_pin_classes_1.PsTablePinClasses.first.both
|
|
11
|
+
: hasReorder
|
|
12
|
+
? ps_table_pin_classes_1.PsTablePinClasses.first.reorder
|
|
13
|
+
: isSelectable
|
|
14
|
+
? ps_table_pin_classes_1.PsTablePinClasses.first.select
|
|
15
|
+
: ps_table_pin_classes_1.PsTablePinClasses.first.none;
|
|
16
|
+
return {
|
|
17
|
+
first: `${ps_table_pin_classes_1.PsTablePinClasses.cell} ${ps_table_pin_classes_1.PsTablePinClasses.edge} ${firstOffset}`,
|
|
18
|
+
reorder: `${ps_table_pin_classes_1.PsTablePinClasses.cell} ${ps_table_pin_classes_1.PsTablePinClasses.reorder}`,
|
|
19
|
+
select: `${ps_table_pin_classes_1.PsTablePinClasses.cell} ${hasReorder ? ps_table_pin_classes_1.PsTablePinClasses.select.withReorder : ps_table_pin_classes_1.PsTablePinClasses.select.alone}`,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
static end(isPinned) {
|
|
23
|
+
return isPinned ? ps_table_pin_classes_1.PsTablePinClasses.end : '';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.PsTablePinService = PsTablePinService;
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import type { Modifier } from '@dnd-kit/core';
|
|
2
|
+
import type { SortingStrategy } from '@dnd-kit/sortable';
|
|
3
|
+
import { PsTableDropPlacement } from '../constants/ps-table-drop-placement';
|
|
2
4
|
import type { PsTableReorderApi } from '../interfaces/table-reorder-api';
|
|
3
5
|
import type { PsTableReorderPlacement } from '../interfaces/table-reorder-placement';
|
|
4
6
|
import type { PsTableReorderRun } from '../interfaces/table-reorder-run';
|
|
5
7
|
export declare class PsTableReorderService {
|
|
8
|
+
static readonly edgeRatio = 0.25;
|
|
9
|
+
static readonly treeKey = "tree";
|
|
6
10
|
static readonly plain: PsTableReorderApi;
|
|
7
11
|
static runs<Item>(items: Item[], getKey: (item: Item) => string, getId: (item: Item) => string): PsTableReorderRun<Item>[];
|
|
8
12
|
static placements<Item>(runs: PsTableReorderRun<Item>[], getId: (item: Item) => string): Map<string, PsTableReorderPlacement>;
|
|
9
13
|
static move(ids: string[], activeId: string, overId: string): string[];
|
|
14
|
+
static pointerY(event: Event | null, deltaY: number): number | null;
|
|
15
|
+
static dropPlacement(pointerY: number | null, rect: {
|
|
16
|
+
height: number;
|
|
17
|
+
top: number;
|
|
18
|
+
}, fallback: PsTableDropPlacement, isAllowed: (placement: PsTableDropPlacement) => boolean): PsTableDropPlacement | null;
|
|
19
|
+
private static candidates;
|
|
20
|
+
static readonly still: SortingStrategy;
|
|
10
21
|
static readonly lockToVerticalAxis: Modifier;
|
|
11
22
|
}
|