@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.
Files changed (79) hide show
  1. package/dist/components/ps-data-table.d.ts +2 -1
  2. package/dist/components/ps-data-table.js +47 -11
  3. package/dist/components/ps-table-bulk-bar.js +3 -2
  4. package/dist/components/ps-table-column-picker.js +2 -1
  5. package/dist/components/ps-table-export-button.js +1 -1
  6. package/dist/components/ps-table-group-header.js +1 -1
  7. package/dist/components/ps-table-pagination.js +2 -2
  8. package/dist/components/ps-table-reorder-frame.js +15 -2
  9. package/dist/components/ps-table-reorder-handle.js +1 -1
  10. package/dist/components/ps-table-sort-header.js +2 -2
  11. package/dist/components/ps-table-sortable-row.d.ts +5 -1
  12. package/dist/components/ps-table-sortable-row.js +12 -4
  13. package/dist/components/ps-table-toolbar.js +2 -2
  14. package/dist/constants/ps-table-control-classes.d.ts +9 -0
  15. package/dist/constants/ps-table-control-classes.js +12 -0
  16. package/dist/constants/ps-table-drop-classes.d.ts +2 -0
  17. package/dist/constants/ps-table-drop-classes.js +8 -0
  18. package/dist/constants/ps-table-drop-placement.d.ts +6 -0
  19. package/dist/constants/ps-table-drop-placement.js +8 -0
  20. package/dist/constants/ps-table-pin-classes.d.ts +16 -0
  21. package/dist/constants/ps-table-pin-classes.js +19 -0
  22. package/dist/constants/table-breakpoint.d.ts +7 -0
  23. package/dist/constants/table-breakpoint.js +13 -0
  24. package/dist/esm/components/ps-data-table.js +48 -12
  25. package/dist/esm/components/ps-table-bulk-bar.js +3 -2
  26. package/dist/esm/components/ps-table-column-picker.js +2 -1
  27. package/dist/esm/components/ps-table-export-button.js +1 -1
  28. package/dist/esm/components/ps-table-group-header.js +1 -1
  29. package/dist/esm/components/ps-table-pagination.js +2 -2
  30. package/dist/esm/components/ps-table-reorder-frame.js +15 -2
  31. package/dist/esm/components/ps-table-reorder-handle.js +1 -1
  32. package/dist/esm/components/ps-table-sort-header.js +2 -2
  33. package/dist/esm/components/ps-table-sortable-row.js +12 -4
  34. package/dist/esm/components/ps-table-toolbar.js +2 -2
  35. package/dist/esm/constants/ps-table-control-classes.js +9 -0
  36. package/dist/esm/constants/ps-table-drop-classes.js +5 -0
  37. package/dist/esm/constants/ps-table-drop-placement.js +5 -0
  38. package/dist/esm/constants/ps-table-pin-classes.js +16 -0
  39. package/dist/esm/constants/table-breakpoint.js +10 -0
  40. package/dist/esm/hooks/use-ps-table-overflow.js +19 -0
  41. package/dist/esm/hooks/use-ps-table-reorder.js +89 -15
  42. package/dist/esm/index.js +10 -0
  43. package/dist/esm/interfaces/table-drop.js +1 -0
  44. package/dist/esm/interfaces/table-nesting-announcements.js +1 -0
  45. package/dist/esm/interfaces/table-overflow-edges.js +1 -0
  46. package/dist/esm/interfaces/table-pin-classes.js +1 -0
  47. package/dist/esm/interfaces/table-reorder-nesting-binding.js +1 -0
  48. package/dist/esm/interfaces/table-reorder-nesting.js +1 -0
  49. package/dist/esm/services/ps-table-overflow-service.js +11 -0
  50. package/dist/esm/services/ps-table-pin-service.js +22 -0
  51. package/dist/esm/services/ps-table-reorder-service.js +38 -1
  52. package/dist/hooks/use-ps-table-overflow.d.ts +6 -0
  53. package/dist/hooks/use-ps-table-overflow.js +23 -0
  54. package/dist/hooks/use-ps-table-reorder.d.ts +6 -2
  55. package/dist/hooks/use-ps-table-reorder.js +87 -13
  56. package/dist/index.d.ts +10 -0
  57. package/dist/index.js +10 -0
  58. package/dist/interfaces/table-column.d.ts +3 -0
  59. package/dist/interfaces/table-drop.d.ts +5 -0
  60. package/dist/interfaces/table-drop.js +2 -0
  61. package/dist/interfaces/table-nesting-announcements.d.ts +5 -0
  62. package/dist/interfaces/table-nesting-announcements.js +2 -0
  63. package/dist/interfaces/table-overflow-edges.d.ts +4 -0
  64. package/dist/interfaces/table-overflow-edges.js +2 -0
  65. package/dist/interfaces/table-pin-classes.d.ts +5 -0
  66. package/dist/interfaces/table-pin-classes.js +2 -0
  67. package/dist/interfaces/table-reorder-nesting-binding.d.ts +8 -0
  68. package/dist/interfaces/table-reorder-nesting-binding.js +2 -0
  69. package/dist/interfaces/table-reorder-nesting.d.ts +8 -0
  70. package/dist/interfaces/table-reorder-nesting.js +2 -0
  71. package/dist/interfaces/table-reorder-row-props.d.ts +3 -0
  72. package/dist/interfaces/table-reorder.d.ts +4 -2
  73. package/dist/services/ps-table-overflow-service.d.ts +6 -0
  74. package/dist/services/ps-table-overflow-service.js +15 -0
  75. package/dist/services/ps-table-pin-service.d.ts +5 -0
  76. package/dist/services/ps-table-pin-service.js +26 -0
  77. package/dist/services/ps-table-reorder-service.d.ts +11 -0
  78. package/dist/services/ps-table-reorder-service.js +38 -1
  79. 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,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) => ({ handleLabel: '', hasHandle: false, isDisabled: true, 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,6 @@
1
+ import type { PsTableOverflowEdges } from '../interfaces/table-overflow-edges';
2
+ export declare const usePsTableOverflow: (layoutKey: string) => {
3
+ edges: PsTableOverflowEdges;
4
+ ref: import("react").RefObject<HTMLDivElement>;
5
+ update: () => void;
6
+ };
@@ -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
- onReorder: (groupKey: string, orderedIds: string[]) => void;
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 usePsTableReorder = ({ announcements: texts, enabled, instructions, items, onReorder, }) => {
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 }) => over === null
32
- ? texts.cancelled(labelOf(String(active.id)))
33
- : texts.dropped(labelOf(String(active.id)), positionOf(String(over.id)), countOf(String(over.id))),
34
- onDragOver: ({ active, over }) => over === null
35
- ? undefined
36
- : texts.moved(labelOf(String(active.id)), positionOf(String(over.id)), countOf(String(over.id))),
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 handleDragEnd = ({ active, over }) => {
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
- if (over === null || active.id === over.id)
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 target = placements.get(String(over.id));
45
- if (placement === undefined || target === undefined || placement.runId !== target.runId)
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: () => setActiveId(null),
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,5 @@
1
+ import type { PsTableDropPlacement } from '../constants/ps-table-drop-placement';
2
+ export interface PsTableDrop {
3
+ overId: string;
4
+ placement: PsTableDropPlacement;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ export interface PsTableNestingAnnouncements {
2
+ after: (rowLabel: string, targetLabel: string) => string;
3
+ before: (rowLabel: string, targetLabel: string) => string;
4
+ into: (rowLabel: string, targetLabel: string) => string;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export interface PsTableOverflowEdges {
2
+ end: boolean;
3
+ start: boolean;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ export interface PsTableLeadingPinClasses {
2
+ first: string;
3
+ reorder: string;
4
+ select: string;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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: (row: RowData) => string;
10
+ groupKey?: (row: RowData) => string;
10
11
  instructions: string;
11
- onReorder: (groupKey: string, orderedIds: string[]) => void;
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
  }