@unlev/exeq 0.3.0 → 0.3.1

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/index.d.mts CHANGED
@@ -136,7 +136,9 @@ interface PdfViewerProps {
136
136
  onDropField?: (page: number, x: number, y: number, fieldType: FieldType) => void;
137
137
  /** Move multiple fields as a group. Called with dx/dy in percentage units. */
138
138
  onGroupMove?: (ids: string[], dx: number, dy: number) => void;
139
- /** Called when a drag/resize operation ends (for undo history snapshots). */
139
+ /** Called when a drag/resize operation starts (for undo history batching). */
140
+ onMoveStart?: () => void;
141
+ /** Called when a drag/resize operation ends (for undo history commit). */
140
142
  onMoveEnd?: () => void;
141
143
  mode: 'designer' | 'signer';
142
144
  currentSigner?: string;
@@ -145,7 +147,7 @@ interface PdfViewerProps {
145
147
  /** Called with field IDs inside a drag-selection rectangle */
146
148
  onMarqueeSelect?: (ids: string[]) => void;
147
149
  }
148
- declare function PdfViewer({ pages, fields, selectedFieldIds, onSelectField, onFieldMove, onFieldResize, onPageClick, onDropField, onGroupMove, onMoveEnd, mode, currentSigner, renderFieldContent, zoom, onMarqueeSelect, }: PdfViewerProps): react_jsx_runtime.JSX.Element;
150
+ declare function PdfViewer({ pages, fields, selectedFieldIds, onSelectField, onFieldMove, onFieldResize, onPageClick, onDropField, onGroupMove, onMoveStart, onMoveEnd, mode, currentSigner, renderFieldContent, zoom, onMarqueeSelect, }: PdfViewerProps): react_jsx_runtime.JSX.Element;
149
151
 
150
152
  interface SignatureCanvasProps {
151
153
  width?: number;
package/dist/index.d.ts CHANGED
@@ -136,7 +136,9 @@ interface PdfViewerProps {
136
136
  onDropField?: (page: number, x: number, y: number, fieldType: FieldType) => void;
137
137
  /** Move multiple fields as a group. Called with dx/dy in percentage units. */
138
138
  onGroupMove?: (ids: string[], dx: number, dy: number) => void;
139
- /** Called when a drag/resize operation ends (for undo history snapshots). */
139
+ /** Called when a drag/resize operation starts (for undo history batching). */
140
+ onMoveStart?: () => void;
141
+ /** Called when a drag/resize operation ends (for undo history commit). */
140
142
  onMoveEnd?: () => void;
141
143
  mode: 'designer' | 'signer';
142
144
  currentSigner?: string;
@@ -145,7 +147,7 @@ interface PdfViewerProps {
145
147
  /** Called with field IDs inside a drag-selection rectangle */
146
148
  onMarqueeSelect?: (ids: string[]) => void;
147
149
  }
148
- declare function PdfViewer({ pages, fields, selectedFieldIds, onSelectField, onFieldMove, onFieldResize, onPageClick, onDropField, onGroupMove, onMoveEnd, mode, currentSigner, renderFieldContent, zoom, onMarqueeSelect, }: PdfViewerProps): react_jsx_runtime.JSX.Element;
150
+ declare function PdfViewer({ pages, fields, selectedFieldIds, onSelectField, onFieldMove, onFieldResize, onPageClick, onDropField, onGroupMove, onMoveStart, onMoveEnd, mode, currentSigner, renderFieldContent, zoom, onMarqueeSelect, }: PdfViewerProps): react_jsx_runtime.JSX.Element;
149
151
 
150
152
  interface SignatureCanvasProps {
151
153
  width?: number;
package/dist/index.js CHANGED
@@ -222,6 +222,7 @@ function PdfViewer({
222
222
  onPageClick,
223
223
  onDropField,
224
224
  onGroupMove,
225
+ onMoveStart,
225
226
  onMoveEnd,
226
227
  mode,
227
228
  currentSigner,
@@ -331,6 +332,7 @@ function PdfViewer({
331
332
  onMove: onFieldMove,
332
333
  onResize: onFieldResize,
333
334
  onGroupMove: selectedFieldIds.size > 1 && selectedFieldIds.has(field.id) ? onGroupMove : void 0,
335
+ onMoveStart,
334
336
  onMoveEnd,
335
337
  otherFields: mode === "designer" ? pageFields.filter((f) => f.id !== field.id && !selectedFieldIds.has(f.id)) : void 0,
336
338
  setGuides: mode === "designer" ? setGuides : void 0,
@@ -420,6 +422,7 @@ function FieldOverlayItem({
420
422
  onMove,
421
423
  onResize,
422
424
  onGroupMove,
425
+ onMoveStart,
423
426
  onMoveEnd,
424
427
  otherFields,
425
428
  setGuides,
@@ -449,6 +452,7 @@ function FieldOverlayItem({
449
452
  onSelect(e);
450
453
  }
451
454
  if (field.locked) return;
455
+ onMoveStart?.();
452
456
  const pageEl = overlayRef.current?.closest(".pdf-page");
453
457
  if (!pageEl) return;
454
458
  didDragRef.current = false;
@@ -497,11 +501,12 @@ function FieldOverlayItem({
497
501
  };
498
502
  window.addEventListener("mousemove", handleMouseMove);
499
503
  window.addEventListener("mouseup", handleMouseUp);
500
- }, [field, mode, onMove, onSelect, isMultiSelected, onGroupMove, onMoveEnd, selectedIds, otherFields, setGuides, pageIndex]);
504
+ }, [field, mode, onMove, onSelect, isMultiSelected, onGroupMove, onMoveStart, onMoveEnd, selectedIds, otherFields, setGuides, pageIndex]);
501
505
  const handleResizeMouseDown = (0, import_react.useCallback)((e) => {
502
506
  if (mode !== "designer" || !onResize || field.locked) return;
503
507
  e.preventDefault();
504
508
  e.stopPropagation();
509
+ onMoveStart?.();
505
510
  const pageEl = overlayRef.current?.closest(".pdf-page");
506
511
  if (!pageEl) return;
507
512
  resizeStartRef.current = {
@@ -527,7 +532,7 @@ function FieldOverlayItem({
527
532
  };
528
533
  window.addEventListener("mousemove", handleMouseMove);
529
534
  window.addEventListener("mouseup", handleMouseUp);
530
- }, [field, mode, onResize, onMoveEnd]);
535
+ }, [field, mode, onResize, onMoveStart, onMoveEnd]);
531
536
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
532
537
  "div",
533
538
  {
@@ -1088,13 +1093,13 @@ function useHistory(initialState, maxHistory = 50) {
1088
1093
  present: initialState,
1089
1094
  future: []
1090
1095
  });
1091
- const skipRef = (0, import_react4.useRef)(false);
1096
+ const batchRef = (0, import_react4.useRef)(false);
1097
+ const batchStartRef = (0, import_react4.useRef)(null);
1092
1098
  const set = (0, import_react4.useCallback)((updater) => {
1093
1099
  setState((prev) => {
1094
1100
  const newPresent = typeof updater === "function" ? updater(prev.present) : updater;
1095
1101
  if (newPresent === prev.present) return prev;
1096
- if (skipRef.current) {
1097
- skipRef.current = false;
1102
+ if (batchRef.current) {
1098
1103
  return { ...prev, present: newPresent };
1099
1104
  }
1100
1105
  return {
@@ -1105,15 +1110,31 @@ function useHistory(initialState, maxHistory = 50) {
1105
1110
  });
1106
1111
  }, [maxHistory]);
1107
1112
  const setWithoutHistory = (0, import_react4.useCallback)((updater) => {
1108
- skipRef.current = true;
1109
- set(updater);
1110
- }, [set]);
1111
- const snapshot = (0, import_react4.useCallback)(() => {
1112
- setState((prev) => ({
1113
- past: [...prev.past.slice(-maxHistory), prev.present],
1114
- present: prev.present,
1115
- future: []
1116
- }));
1113
+ setState((prev) => {
1114
+ const newPresent = typeof updater === "function" ? updater(prev.present) : updater;
1115
+ if (newPresent === prev.present) return prev;
1116
+ return { ...prev, present: newPresent };
1117
+ });
1118
+ }, []);
1119
+ const beginBatch = (0, import_react4.useCallback)(() => {
1120
+ batchRef.current = true;
1121
+ setState((prev) => {
1122
+ batchStartRef.current = prev.present;
1123
+ return prev;
1124
+ });
1125
+ }, []);
1126
+ const commitBatch = (0, import_react4.useCallback)(() => {
1127
+ batchRef.current = false;
1128
+ setState((prev) => {
1129
+ const startState = batchStartRef.current;
1130
+ batchStartRef.current = null;
1131
+ if (!startState || startState === prev.present) return prev;
1132
+ return {
1133
+ past: [...prev.past.slice(-maxHistory), startState],
1134
+ present: prev.present,
1135
+ future: []
1136
+ };
1137
+ });
1117
1138
  }, [maxHistory]);
1118
1139
  const undo = (0, import_react4.useCallback)(() => {
1119
1140
  setState((prev) => {
@@ -1141,7 +1162,8 @@ function useHistory(initialState, maxHistory = 50) {
1141
1162
  state: state.present,
1142
1163
  set,
1143
1164
  setWithoutHistory,
1144
- snapshot,
1165
+ beginBatch,
1166
+ commitBatch,
1145
1167
  undo,
1146
1168
  redo,
1147
1169
  canUndo: state.past.length > 0,
@@ -1180,7 +1202,7 @@ function DesignerView({
1180
1202
  ] }) });
1181
1203
  }
1182
1204
  const [pages, setPages] = (0, import_react5.useState)([]);
1183
- const { state: fields, set: setFields, setWithoutHistory: setFieldsSilent, snapshot: snapshotFields, undo: undoFields, redo: redoFields, canUndo, canRedo } = useHistory(initialTemplate?.fields ?? []);
1205
+ const { state: fields, set: setFields, setWithoutHistory: setFieldsSilent, beginBatch, commitBatch, undo: undoFields, redo: redoFields, canUndo, canRedo } = useHistory(initialTemplate?.fields ?? []);
1184
1206
  const [selectedFieldIds, setSelectedFieldIds] = (0, import_react5.useState)(/* @__PURE__ */ new Set());
1185
1207
  const [signerRoles, setSignerRoles] = (0, import_react5.useState)(initialTemplate?.signerRoles ?? [...DEFAULT_SIGNER_ROLES]);
1186
1208
  const [activeRole, setActiveRole] = (0, import_react5.useState)("Sender");
@@ -1765,7 +1787,8 @@ function DesignerView({
1765
1787
  onFieldMove: handleFieldMove,
1766
1788
  onFieldResize: handleFieldResize,
1767
1789
  onGroupMove: handleGroupMove,
1768
- onMoveEnd: snapshotFields,
1790
+ onMoveStart: beginBatch,
1791
+ onMoveEnd: commitBatch,
1769
1792
  onPageClick: handlePageClick,
1770
1793
  onDropField: handleDropOnPage,
1771
1794
  onMarqueeSelect: (ids) => setSelectedFieldIds(new Set(ids)),