@harbour-enterprises/superdoc 0.24.0 → 0.25.0-next.2

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 (35) hide show
  1. package/dist/chunks/{PdfViewer-qk_hITc5.cjs → PdfViewer-CEc5ST9t.cjs} +1 -1
  2. package/dist/chunks/{PdfViewer-BiHh3x6b.es.js → PdfViewer-CoEXViCu.es.js} +1 -1
  3. package/dist/chunks/{index-Di6nG2sc.cjs → index-ChgYIPZ8.cjs} +166 -76
  4. package/dist/chunks/{index-aMnFs35I.es.js → index-DtXgSPMT.es.js} +166 -76
  5. package/dist/chunks/{super-editor.es-BKZvTraR.cjs → super-editor.es-B-E_YaLO.cjs} +163 -18
  6. package/dist/chunks/{super-editor.es-Dz7y81Yr.es.js → super-editor.es-BePxEtE8.es.js} +163 -18
  7. package/dist/core/SuperDoc.d.ts +20 -0
  8. package/dist/core/SuperDoc.d.ts.map +1 -1
  9. package/dist/core/collaboration/permissions.d.ts +7 -1
  10. package/dist/core/collaboration/permissions.d.ts.map +1 -1
  11. package/dist/core/types/index.d.ts +23 -1
  12. package/dist/core/types/index.d.ts.map +1 -1
  13. package/dist/style.css +55 -55
  14. package/dist/super-editor/ai-writer.es.js +2 -2
  15. package/dist/super-editor/chunks/{converter-CI3WqmGV.js → converter-gSy6s2VK.js} +1 -1
  16. package/dist/super-editor/chunks/{docx-zipper-D4fk50d9.js → docx-zipper-CceGxV02.js} +1 -1
  17. package/dist/super-editor/chunks/{editor-DC6pZVp1.js → editor-yaef8OIs.js} +122 -19
  18. package/dist/super-editor/chunks/{toolbar-DMobfM6u.js → toolbar-Dc5uyyIp.js} +2 -2
  19. package/dist/super-editor/converter.es.js +1 -1
  20. package/dist/super-editor/docx-zipper.es.js +2 -2
  21. package/dist/super-editor/editor.es.js +3 -3
  22. package/dist/super-editor/file-zipper.es.js +1 -1
  23. package/dist/super-editor/super-editor/src/components/slash-menu/tests/testHelpers.d.ts +1 -0
  24. package/dist/super-editor/super-editor/src/core/Editor.d.ts +18 -0
  25. package/dist/super-editor/super-editor/src/extensions/track-changes/permission-helpers.d.ts +110 -0
  26. package/dist/super-editor/super-editor/src/extensions/track-changes/trackChangesHelpers/markDeletion.d.ts +1 -1
  27. package/dist/super-editor/super-editor.es.js +66 -21
  28. package/dist/super-editor/toolbar.es.js +2 -2
  29. package/dist/super-editor.cjs +1 -1
  30. package/dist/super-editor.es.js +1 -1
  31. package/dist/superdoc.cjs +2 -2
  32. package/dist/superdoc.es.js +2 -2
  33. package/dist/superdoc.umd.js +327 -92
  34. package/dist/superdoc.umd.js.map +1 -1
  35. package/package.json +1 -1
@@ -35141,7 +35141,7 @@ const _SuperConverter = class _SuperConverter2 {
35141
35141
  static getStoredSuperdocVersion(docx) {
35142
35142
  return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
35143
35143
  }
35144
- static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "0.23.0") {
35144
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "0.24.0") {
35145
35145
  return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
35146
35146
  }
35147
35147
  /**
@@ -49354,7 +49354,7 @@ const markInsertion = ({ tr, from: from2, to, user, date }) => {
49354
49354
  });
49355
49355
  return insertionMark;
49356
49356
  };
49357
- const markDeletion = ({ tr, from: from2, to, user, date }) => {
49357
+ const markDeletion = ({ tr, from: from2, to, user, date, id: providedId }) => {
49358
49358
  let trackedMark = findTrackedMarkBetween({
49359
49359
  tr,
49360
49360
  from: from2,
@@ -49363,7 +49363,9 @@ const markDeletion = ({ tr, from: from2, to, user, date }) => {
49363
49363
  attrs: { authorEmail: user.email }
49364
49364
  });
49365
49365
  let id;
49366
- if (trackedMark) {
49366
+ if (providedId) {
49367
+ id = providedId;
49368
+ } else if (trackedMark) {
49367
49369
  id = trackedMark.mark.attrs.id;
49368
49370
  } else {
49369
49371
  id = v4();
@@ -50635,7 +50637,8 @@ const replaceStep = ({ state: state2, tr, step, newTr, map: map22, user, date, o
50635
50637
  from: step.from,
50636
50638
  to: step.to,
50637
50639
  user,
50638
- date
50640
+ date,
50641
+ id: meta.insertedMark?.attrs?.id
50639
50642
  });
50640
50643
  meta.deletionNodes = deletionNodes;
50641
50644
  meta.deletionMark = deletionMark2;
@@ -52563,7 +52566,8 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
52563
52566
  customUpdatedFiles: {},
52564
52567
  isHeaderFooterChanged: false,
52565
52568
  isCustomXmlChanged: false,
52566
- focusTarget: null
52569
+ focusTarget: null,
52570
+ permissionResolver: null
52567
52571
  });
52568
52572
  __privateMethod$1(this, _Editor_instances, initContainerElement_fn).call(this, options);
52569
52573
  __privateMethod$1(this, _Editor_instances, checkHeadless_fn).call(this, options);
@@ -53325,7 +53329,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
53325
53329
  * @returns {Object | void} Migration results
53326
53330
  */
53327
53331
  processCollaborationMigrations() {
53328
- console.debug("[checkVersionMigrations] Current editor version", "0.23.0");
53332
+ console.debug("[checkVersionMigrations] Current editor version", "0.24.0");
53329
53333
  if (!this.options.ydoc) return;
53330
53334
  const metaMap = this.options.ydoc.getMap("meta");
53331
53335
  let docVersion = metaMap.get("version");
@@ -67321,11 +67325,105 @@ const TrackFormat = Mark2.create({
67321
67325
  return ["span", Attribute2.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];
67322
67326
  }
67323
67327
  });
67328
+ const PERMISSION_MAP = {
67329
+ accept: {
67330
+ own: "RESOLVE_OWN",
67331
+ other: "RESOLVE_OTHER"
67332
+ },
67333
+ reject: {
67334
+ own: "REJECT_OWN",
67335
+ other: "REJECT_OTHER"
67336
+ }
67337
+ };
67338
+ const buildKey = (change) => {
67339
+ const id = change.mark?.attrs?.id ?? `${change.from}-${change.to}`;
67340
+ return `${id}:${change.mark?.type?.name ?? "unknown"}`;
67341
+ };
67342
+ const mergeChange = (bucket, change) => {
67343
+ const key2 = buildKey(change);
67344
+ const existing = bucket.get(key2);
67345
+ if (existing) {
67346
+ existing.from = Math.min(existing.from, change.from);
67347
+ existing.to = Math.max(existing.to, change.to);
67348
+ existing.segments.push({ from: change.from, to: change.to });
67349
+ } else {
67350
+ bucket.set(key2, {
67351
+ id: change.mark?.attrs?.id ?? null,
67352
+ type: change.mark?.type?.name ?? null,
67353
+ attrs: { ...change.mark?.attrs ?? {} },
67354
+ from: change.from,
67355
+ to: change.to,
67356
+ segments: [{ from: change.from, to: change.to }]
67357
+ });
67358
+ }
67359
+ };
67360
+ const collectTrackedChanges = ({ state: state2, from: from2, to }) => {
67361
+ if (!state2) return [];
67362
+ const collapsed = from2 === to;
67363
+ const changes = getTrackChanges(state2);
67364
+ if (!changes?.length) return [];
67365
+ const bucket = /* @__PURE__ */ new Map();
67366
+ changes.forEach((change) => {
67367
+ const overlaps = collapsed ? change.from <= from2 && change.to >= from2 : change.from < to && change.to > from2;
67368
+ if (!overlaps) return;
67369
+ mergeChange(bucket, change);
67370
+ });
67371
+ return Array.from(bucket.values());
67372
+ };
67373
+ const derivePermissionKey = ({ action, isOwn }) => {
67374
+ const mapping = PERMISSION_MAP[action];
67375
+ if (!mapping) return null;
67376
+ return isOwn ? mapping.own : mapping.other;
67377
+ };
67378
+ const resolveChanges = (editor) => {
67379
+ if (!editor) return { role: "editor", isInternal: false, currentUser: null, resolver: null };
67380
+ const role = editor.options?.role ?? "editor";
67381
+ const isInternal = Boolean(editor.options?.isInternal);
67382
+ const currentUser = editor.options?.user ?? null;
67383
+ const resolver = editor.options?.permissionResolver;
67384
+ return { role, isInternal, currentUser, resolver };
67385
+ };
67386
+ const isTrackedChangeActionAllowed = ({ editor, action, trackedChanges }) => {
67387
+ if (!trackedChanges?.length) return true;
67388
+ const { role, isInternal, currentUser, resolver } = resolveChanges(editor);
67389
+ if (typeof resolver !== "function") return true;
67390
+ const currentEmail = currentUser?.email ?? null;
67391
+ return trackedChanges.every((change) => {
67392
+ const authorEmail = change.attrs?.authorEmail ?? null;
67393
+ const isOwn = Boolean(currentEmail && authorEmail && currentEmail === authorEmail);
67394
+ const permission = derivePermissionKey({ action, isOwn });
67395
+ if (!permission) return true;
67396
+ const payload = {
67397
+ permission,
67398
+ role,
67399
+ isInternal,
67400
+ trackedChange: {
67401
+ id: change.id,
67402
+ type: change.type,
67403
+ attrs: change.attrs,
67404
+ from: change.from,
67405
+ to: change.to,
67406
+ segments: change.segments,
67407
+ commentId: change.id
67408
+ },
67409
+ comment: change.comment ?? null
67410
+ };
67411
+ return resolver(payload) !== false;
67412
+ });
67413
+ };
67414
+ const collectTrackedChangesForContext = ({ state: state2, pos, trackedChangeId }) => {
67415
+ if (pos == null) return [];
67416
+ const changes = collectTrackedChanges({ state: state2, from: pos, to: pos });
67417
+ if (!trackedChangeId) return changes;
67418
+ return changes.filter((change) => change.id === trackedChangeId);
67419
+ };
67324
67420
  const TrackChanges = Extension.create({
67325
67421
  name: "trackChanges",
67326
67422
  addCommands() {
67327
67423
  return {
67328
- acceptTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch }) => {
67424
+ acceptTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch, editor }) => {
67425
+ const trackedChanges = collectTrackedChanges({ state: state2, from: from2, to });
67426
+ if (!isTrackedChangeActionAllowed({ editor, action: "accept", trackedChanges })) return false;
67329
67427
  let { tr, doc: doc2 } = state2;
67330
67428
  tr.setMeta("acceptReject", true);
67331
67429
  const map22 = new Mapping();
@@ -67363,7 +67461,9 @@ const TrackChanges = Extension.create({
67363
67461
  }
67364
67462
  return true;
67365
67463
  },
67366
- rejectTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch }) => {
67464
+ rejectTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch, editor }) => {
67465
+ const trackedChanges = collectTrackedChanges({ state: state2, from: from2, to });
67466
+ if (!isTrackedChangeActionAllowed({ editor, action: "reject", trackedChanges })) return false;
67367
67467
  const { tr, doc: doc2 } = state2;
67368
67468
  tr.setMeta("acceptReject", true);
67369
67469
  const map22 = new Mapping();
@@ -83786,7 +83886,7 @@ var __accessCheck = (obj, member, msg2) => member.has(obj) || __typeError("Canno
83786
83886
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
83787
83887
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
83788
83888
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
83789
- var _SuperToolbar_instances, initToolbarGroups_fn, _interceptedCommands, makeToolbarItems_fn, initDefaultFonts_fn, updateHighlightColors_fn, deactivateAll_fn, updateToolbarHistory_fn, runCommandWithArgumentOnly_fn;
83889
+ var _SuperToolbar_instances, initToolbarGroups_fn, _interceptedCommands, makeToolbarItems_fn, initDefaultFonts_fn, updateHighlightColors_fn, deactivateAll_fn, updateToolbarHistory_fn, enrichTrackedChanges_fn, runCommandWithArgumentOnly_fn;
83790
83890
  var eventemitter3 = { exports: {} };
83791
83891
  var hasRequiredEventemitter3;
83792
83892
  function requireEventemitter3() {
@@ -83838,7 +83938,7 @@ function requireEventemitter3() {
83838
83938
  var evt = prefix2 ? prefix2 + event : event, handlers2 = this._events[evt];
83839
83939
  if (!handlers2) return [];
83840
83940
  if (handlers2.fn) return [handlers2.fn];
83841
- for (var i2 = 0, l22 = handlers2.length, ee = new Array(l22); i2 < l22; i2++) {
83941
+ for (var i2 = 0, l3 = handlers2.length, ee = new Array(l3); i2 < l3; i2++) {
83842
83942
  ee[i2] = handlers2[i2].fn;
83843
83943
  }
83844
83944
  return ee;
@@ -84994,18 +85094,18 @@ const _sfc_main$7 = {
84994
85094
  }, [
84995
85095
  (vue.openBlock(), vue.createElementBlock(vue.Fragment, null, vue.renderList(5, (i2) => {
84996
85096
  return vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: i2 }, [
84997
- (vue.openBlock(), vue.createElementBlock(vue.Fragment, null, vue.renderList(5, (n2) => {
85097
+ (vue.openBlock(), vue.createElementBlock(vue.Fragment, null, vue.renderList(5, (n) => {
84998
85098
  return vue.createBaseVNode("div", {
84999
85099
  class: "toolbar-table-grid__item",
85000
- key: `${i2}_${n2}`,
85001
- "data-cols": n2,
85100
+ key: `${i2}_${n}`,
85101
+ "data-cols": n,
85002
85102
  "data-rows": i2,
85003
85103
  "data-item": "true",
85004
85104
  ref_for: true,
85005
85105
  ref_key: "tableGridItems",
85006
85106
  ref: tableGridItems,
85007
- onKeydown: vue.withModifiers((event) => handleKeyDown2(event, n2, i2), ["prevent"]),
85008
- onClick: vue.withModifiers(($event) => handleClick2({ cols: n2, rows: i2 }), ["stop", "prevent"])
85107
+ onKeydown: vue.withModifiers((event) => handleKeyDown2(event, n, i2), ["prevent"]),
85108
+ onClick: vue.withModifiers(($event) => handleClick2({ cols: n, rows: i2 }), ["stop", "prevent"])
85009
85109
  }, null, 40, _hoisted_1$6);
85010
85110
  }), 64))
85011
85111
  ], 64);
@@ -86740,10 +86840,31 @@ class SuperToolbar extends EventEmitter2 {
86740
86840
  __privateMethod(this, _SuperToolbar_instances, deactivateAll_fn).call(this);
86741
86841
  return;
86742
86842
  }
86843
+ const { state: state2 } = this.activeEditor;
86844
+ const selection = state2.selection;
86845
+ const selectionTrackedChanges = __privateMethod(this, _SuperToolbar_instances, enrichTrackedChanges_fn).call(this, collectTrackedChanges({ state: state2, from: selection.from, to: selection.to }));
86846
+ const hasTrackedChanges = selectionTrackedChanges.length > 0;
86847
+ const hasValidSelection = hasTrackedChanges;
86848
+ const canAcceptTrackedChanges = hasValidSelection && isTrackedChangeActionAllowed({
86849
+ editor: this.activeEditor,
86850
+ action: "accept",
86851
+ trackedChanges: selectionTrackedChanges
86852
+ });
86853
+ const canRejectTrackedChanges = hasValidSelection && isTrackedChangeActionAllowed({
86854
+ editor: this.activeEditor,
86855
+ action: "reject",
86856
+ trackedChanges: selectionTrackedChanges
86857
+ });
86743
86858
  const marks = getActiveFormatting(this.activeEditor);
86744
86859
  const inTable = isInTable$1(this.activeEditor.state);
86745
86860
  this.toolbarItems.forEach((item) => {
86746
86861
  item.resetDisabled();
86862
+ if (item.name.value === "acceptTrackedChangeBySelection") {
86863
+ item.setDisabled(!canAcceptTrackedChanges);
86864
+ }
86865
+ if (item.name.value === "rejectTrackedChangeOnSelection") {
86866
+ item.setDisabled(!canRejectTrackedChanges);
86867
+ }
86747
86868
  if (item.name.value === "linkedStyles") {
86748
86869
  if (this.activeEditor && !getQuickFormatList(this.activeEditor).length) {
86749
86870
  return item.deactivate();
@@ -86916,6 +87037,19 @@ updateToolbarHistory_fn = function() {
86916
87037
  this.redoDepth = redoDepth(this.activeEditor.state);
86917
87038
  }
86918
87039
  };
87040
+ enrichTrackedChanges_fn = function(trackedChanges = []) {
87041
+ if (!trackedChanges?.length) return trackedChanges;
87042
+ const store = this.superdoc?.commentsStore;
87043
+ if (!store?.getComment) return trackedChanges;
87044
+ return trackedChanges.map((change) => {
87045
+ const commentId = change.id;
87046
+ if (!commentId) return change;
87047
+ const storeComment = store.getComment(commentId);
87048
+ if (!storeComment) return change;
87049
+ const comment = typeof storeComment.getValues === "function" ? storeComment.getValues() : storeComment;
87050
+ return { ...change, comment };
87051
+ });
87052
+ };
86919
87053
  runCommandWithArgumentOnly_fn = function({ item, argument, noArgumentCallback = false }, callback) {
86920
87054
  if (!argument || !this.activeEditor) return;
86921
87055
  let command2 = item.command;
@@ -87320,6 +87454,7 @@ async function getEditorContext(editor, event) {
87320
87454
  state2.selection.$head.marks().forEach((mark) => activeMarks.push(mark.type.name));
87321
87455
  }
87322
87456
  const isTrackedChange = activeMarks.includes("trackInsert") || activeMarks.includes("trackDelete") || activeMarks.includes("trackFormat");
87457
+ const trackedChanges = event ? collectTrackedChangesForContext({ state: state2, pos, trackedChangeId }) : collectTrackedChanges({ state: state2, from: from2, to });
87323
87458
  const cursorCoords = pos ? view.coordsAtPos(pos) : null;
87324
87459
  const cursorPosition = cursorCoords ? {
87325
87460
  x: cursorCoords.left,
@@ -87353,7 +87488,9 @@ async function getEditorContext(editor, event) {
87353
87488
  event,
87354
87489
  trigger: event ? "click" : "slash",
87355
87490
  // Editor reference for advanced use cases
87356
- editor
87491
+ editor,
87492
+ // Tracked change metadata
87493
+ trackedChanges
87357
87494
  };
87358
87495
  return context;
87359
87496
  }
@@ -87450,6 +87587,14 @@ const shouldShowItem = (item, context) => {
87450
87587
  }
87451
87588
  }
87452
87589
  };
87590
+ const canPerformTrackedChange = (context, action) => {
87591
+ if (!context?.editor) return true;
87592
+ return isTrackedChangeActionAllowed({
87593
+ editor: context.editor,
87594
+ action,
87595
+ trackedChanges: context.trackedChanges ?? []
87596
+ });
87597
+ };
87453
87598
  function getItems(context, customItems = [], includeDefaultItems = true) {
87454
87599
  const { selectedText, editor } = context;
87455
87600
  if (arguments.length === 1 && editor?.options?.slashMenuConfig) {
@@ -87507,7 +87652,7 @@ function getItems(context, customItems = [], includeDefaultItems = true) {
87507
87652
  },
87508
87653
  showWhen: (context2) => {
87509
87654
  const { trigger: trigger2, isTrackedChange } = context2;
87510
- return trigger2 === TRIGGERS.click && isTrackedChange;
87655
+ return trigger2 === TRIGGERS.click && isTrackedChange && canPerformTrackedChange(context2, "accept");
87511
87656
  }
87512
87657
  },
87513
87658
  {
@@ -87524,7 +87669,7 @@ function getItems(context, customItems = [], includeDefaultItems = true) {
87524
87669
  },
87525
87670
  showWhen: (context2) => {
87526
87671
  const { trigger: trigger2, isTrackedChange } = context2;
87527
- return trigger2 === TRIGGERS.click && isTrackedChange;
87672
+ return trigger2 === TRIGGERS.click && isTrackedChange && canPerformTrackedChange(context2, "reject");
87528
87673
  }
87529
87674
  }
87530
87675
  ]
@@ -35124,7 +35124,7 @@ const _SuperConverter = class _SuperConverter2 {
35124
35124
  static getStoredSuperdocVersion(docx) {
35125
35125
  return _SuperConverter2.getStoredCustomProperty(docx, "SuperdocVersion");
35126
35126
  }
35127
- static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "0.23.0") {
35127
+ static setStoredSuperdocVersion(docx = this.convertedXml, version2 = "0.24.0") {
35128
35128
  return _SuperConverter2.setStoredCustomProperty(docx, "SuperdocVersion", version2, false);
35129
35129
  }
35130
35130
  /**
@@ -49337,7 +49337,7 @@ const markInsertion = ({ tr, from: from2, to, user, date }) => {
49337
49337
  });
49338
49338
  return insertionMark;
49339
49339
  };
49340
- const markDeletion = ({ tr, from: from2, to, user, date }) => {
49340
+ const markDeletion = ({ tr, from: from2, to, user, date, id: providedId }) => {
49341
49341
  let trackedMark = findTrackedMarkBetween({
49342
49342
  tr,
49343
49343
  from: from2,
@@ -49346,7 +49346,9 @@ const markDeletion = ({ tr, from: from2, to, user, date }) => {
49346
49346
  attrs: { authorEmail: user.email }
49347
49347
  });
49348
49348
  let id;
49349
- if (trackedMark) {
49349
+ if (providedId) {
49350
+ id = providedId;
49351
+ } else if (trackedMark) {
49350
49352
  id = trackedMark.mark.attrs.id;
49351
49353
  } else {
49352
49354
  id = v4();
@@ -50618,7 +50620,8 @@ const replaceStep = ({ state: state2, tr, step, newTr, map: map22, user, date, o
50618
50620
  from: step.from,
50619
50621
  to: step.to,
50620
50622
  user,
50621
- date
50623
+ date,
50624
+ id: meta.insertedMark?.attrs?.id
50622
50625
  });
50623
50626
  meta.deletionNodes = deletionNodes;
50624
50627
  meta.deletionMark = deletionMark2;
@@ -52546,7 +52549,8 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
52546
52549
  customUpdatedFiles: {},
52547
52550
  isHeaderFooterChanged: false,
52548
52551
  isCustomXmlChanged: false,
52549
- focusTarget: null
52552
+ focusTarget: null,
52553
+ permissionResolver: null
52550
52554
  });
52551
52555
  __privateMethod$1(this, _Editor_instances, initContainerElement_fn).call(this, options);
52552
52556
  __privateMethod$1(this, _Editor_instances, checkHeadless_fn).call(this, options);
@@ -53308,7 +53312,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
53308
53312
  * @returns {Object | void} Migration results
53309
53313
  */
53310
53314
  processCollaborationMigrations() {
53311
- console.debug("[checkVersionMigrations] Current editor version", "0.23.0");
53315
+ console.debug("[checkVersionMigrations] Current editor version", "0.24.0");
53312
53316
  if (!this.options.ydoc) return;
53313
53317
  const metaMap = this.options.ydoc.getMap("meta");
53314
53318
  let docVersion = metaMap.get("version");
@@ -67304,11 +67308,105 @@ const TrackFormat = Mark2.create({
67304
67308
  return ["span", Attribute2.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];
67305
67309
  }
67306
67310
  });
67311
+ const PERMISSION_MAP = {
67312
+ accept: {
67313
+ own: "RESOLVE_OWN",
67314
+ other: "RESOLVE_OTHER"
67315
+ },
67316
+ reject: {
67317
+ own: "REJECT_OWN",
67318
+ other: "REJECT_OTHER"
67319
+ }
67320
+ };
67321
+ const buildKey = (change) => {
67322
+ const id = change.mark?.attrs?.id ?? `${change.from}-${change.to}`;
67323
+ return `${id}:${change.mark?.type?.name ?? "unknown"}`;
67324
+ };
67325
+ const mergeChange = (bucket, change) => {
67326
+ const key2 = buildKey(change);
67327
+ const existing = bucket.get(key2);
67328
+ if (existing) {
67329
+ existing.from = Math.min(existing.from, change.from);
67330
+ existing.to = Math.max(existing.to, change.to);
67331
+ existing.segments.push({ from: change.from, to: change.to });
67332
+ } else {
67333
+ bucket.set(key2, {
67334
+ id: change.mark?.attrs?.id ?? null,
67335
+ type: change.mark?.type?.name ?? null,
67336
+ attrs: { ...change.mark?.attrs ?? {} },
67337
+ from: change.from,
67338
+ to: change.to,
67339
+ segments: [{ from: change.from, to: change.to }]
67340
+ });
67341
+ }
67342
+ };
67343
+ const collectTrackedChanges = ({ state: state2, from: from2, to }) => {
67344
+ if (!state2) return [];
67345
+ const collapsed = from2 === to;
67346
+ const changes = getTrackChanges(state2);
67347
+ if (!changes?.length) return [];
67348
+ const bucket = /* @__PURE__ */ new Map();
67349
+ changes.forEach((change) => {
67350
+ const overlaps = collapsed ? change.from <= from2 && change.to >= from2 : change.from < to && change.to > from2;
67351
+ if (!overlaps) return;
67352
+ mergeChange(bucket, change);
67353
+ });
67354
+ return Array.from(bucket.values());
67355
+ };
67356
+ const derivePermissionKey = ({ action, isOwn }) => {
67357
+ const mapping = PERMISSION_MAP[action];
67358
+ if (!mapping) return null;
67359
+ return isOwn ? mapping.own : mapping.other;
67360
+ };
67361
+ const resolveChanges = (editor) => {
67362
+ if (!editor) return { role: "editor", isInternal: false, currentUser: null, resolver: null };
67363
+ const role = editor.options?.role ?? "editor";
67364
+ const isInternal = Boolean(editor.options?.isInternal);
67365
+ const currentUser = editor.options?.user ?? null;
67366
+ const resolver = editor.options?.permissionResolver;
67367
+ return { role, isInternal, currentUser, resolver };
67368
+ };
67369
+ const isTrackedChangeActionAllowed = ({ editor, action, trackedChanges }) => {
67370
+ if (!trackedChanges?.length) return true;
67371
+ const { role, isInternal, currentUser, resolver } = resolveChanges(editor);
67372
+ if (typeof resolver !== "function") return true;
67373
+ const currentEmail = currentUser?.email ?? null;
67374
+ return trackedChanges.every((change) => {
67375
+ const authorEmail = change.attrs?.authorEmail ?? null;
67376
+ const isOwn = Boolean(currentEmail && authorEmail && currentEmail === authorEmail);
67377
+ const permission = derivePermissionKey({ action, isOwn });
67378
+ if (!permission) return true;
67379
+ const payload = {
67380
+ permission,
67381
+ role,
67382
+ isInternal,
67383
+ trackedChange: {
67384
+ id: change.id,
67385
+ type: change.type,
67386
+ attrs: change.attrs,
67387
+ from: change.from,
67388
+ to: change.to,
67389
+ segments: change.segments,
67390
+ commentId: change.id
67391
+ },
67392
+ comment: change.comment ?? null
67393
+ };
67394
+ return resolver(payload) !== false;
67395
+ });
67396
+ };
67397
+ const collectTrackedChangesForContext = ({ state: state2, pos, trackedChangeId }) => {
67398
+ if (pos == null) return [];
67399
+ const changes = collectTrackedChanges({ state: state2, from: pos, to: pos });
67400
+ if (!trackedChangeId) return changes;
67401
+ return changes.filter((change) => change.id === trackedChangeId);
67402
+ };
67307
67403
  const TrackChanges = Extension.create({
67308
67404
  name: "trackChanges",
67309
67405
  addCommands() {
67310
67406
  return {
67311
- acceptTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch }) => {
67407
+ acceptTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch, editor }) => {
67408
+ const trackedChanges = collectTrackedChanges({ state: state2, from: from2, to });
67409
+ if (!isTrackedChangeActionAllowed({ editor, action: "accept", trackedChanges })) return false;
67312
67410
  let { tr, doc: doc2 } = state2;
67313
67411
  tr.setMeta("acceptReject", true);
67314
67412
  const map22 = new Mapping();
@@ -67346,7 +67444,9 @@ const TrackChanges = Extension.create({
67346
67444
  }
67347
67445
  return true;
67348
67446
  },
67349
- rejectTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch }) => {
67447
+ rejectTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch, editor }) => {
67448
+ const trackedChanges = collectTrackedChanges({ state: state2, from: from2, to });
67449
+ if (!isTrackedChangeActionAllowed({ editor, action: "reject", trackedChanges })) return false;
67350
67450
  const { tr, doc: doc2 } = state2;
67351
67451
  tr.setMeta("acceptReject", true);
67352
67452
  const map22 = new Mapping();
@@ -83769,7 +83869,7 @@ var __accessCheck = (obj, member, msg2) => member.has(obj) || __typeError("Canno
83769
83869
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
83770
83870
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
83771
83871
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
83772
- var _SuperToolbar_instances, initToolbarGroups_fn, _interceptedCommands, makeToolbarItems_fn, initDefaultFonts_fn, updateHighlightColors_fn, deactivateAll_fn, updateToolbarHistory_fn, runCommandWithArgumentOnly_fn;
83872
+ var _SuperToolbar_instances, initToolbarGroups_fn, _interceptedCommands, makeToolbarItems_fn, initDefaultFonts_fn, updateHighlightColors_fn, deactivateAll_fn, updateToolbarHistory_fn, enrichTrackedChanges_fn, runCommandWithArgumentOnly_fn;
83773
83873
  var eventemitter3 = { exports: {} };
83774
83874
  var hasRequiredEventemitter3;
83775
83875
  function requireEventemitter3() {
@@ -83821,7 +83921,7 @@ function requireEventemitter3() {
83821
83921
  var evt = prefix2 ? prefix2 + event : event, handlers2 = this._events[evt];
83822
83922
  if (!handlers2) return [];
83823
83923
  if (handlers2.fn) return [handlers2.fn];
83824
- for (var i2 = 0, l22 = handlers2.length, ee = new Array(l22); i2 < l22; i2++) {
83924
+ for (var i2 = 0, l3 = handlers2.length, ee = new Array(l3); i2 < l3; i2++) {
83825
83925
  ee[i2] = handlers2[i2].fn;
83826
83926
  }
83827
83927
  return ee;
@@ -84977,18 +85077,18 @@ const _sfc_main$7 = {
84977
85077
  }, [
84978
85078
  (openBlock(), createElementBlock(Fragment$1, null, renderList(5, (i2) => {
84979
85079
  return openBlock(), createElementBlock(Fragment$1, { key: i2 }, [
84980
- (openBlock(), createElementBlock(Fragment$1, null, renderList(5, (n2) => {
85080
+ (openBlock(), createElementBlock(Fragment$1, null, renderList(5, (n) => {
84981
85081
  return createBaseVNode("div", {
84982
85082
  class: "toolbar-table-grid__item",
84983
- key: `${i2}_${n2}`,
84984
- "data-cols": n2,
85083
+ key: `${i2}_${n}`,
85084
+ "data-cols": n,
84985
85085
  "data-rows": i2,
84986
85086
  "data-item": "true",
84987
85087
  ref_for: true,
84988
85088
  ref_key: "tableGridItems",
84989
85089
  ref: tableGridItems,
84990
- onKeydown: withModifiers((event) => handleKeyDown2(event, n2, i2), ["prevent"]),
84991
- onClick: withModifiers(($event) => handleClick2({ cols: n2, rows: i2 }), ["stop", "prevent"])
85090
+ onKeydown: withModifiers((event) => handleKeyDown2(event, n, i2), ["prevent"]),
85091
+ onClick: withModifiers(($event) => handleClick2({ cols: n, rows: i2 }), ["stop", "prevent"])
84992
85092
  }, null, 40, _hoisted_1$6);
84993
85093
  }), 64))
84994
85094
  ], 64);
@@ -86723,10 +86823,31 @@ class SuperToolbar extends EventEmitter2 {
86723
86823
  __privateMethod(this, _SuperToolbar_instances, deactivateAll_fn).call(this);
86724
86824
  return;
86725
86825
  }
86826
+ const { state: state2 } = this.activeEditor;
86827
+ const selection = state2.selection;
86828
+ const selectionTrackedChanges = __privateMethod(this, _SuperToolbar_instances, enrichTrackedChanges_fn).call(this, collectTrackedChanges({ state: state2, from: selection.from, to: selection.to }));
86829
+ const hasTrackedChanges = selectionTrackedChanges.length > 0;
86830
+ const hasValidSelection = hasTrackedChanges;
86831
+ const canAcceptTrackedChanges = hasValidSelection && isTrackedChangeActionAllowed({
86832
+ editor: this.activeEditor,
86833
+ action: "accept",
86834
+ trackedChanges: selectionTrackedChanges
86835
+ });
86836
+ const canRejectTrackedChanges = hasValidSelection && isTrackedChangeActionAllowed({
86837
+ editor: this.activeEditor,
86838
+ action: "reject",
86839
+ trackedChanges: selectionTrackedChanges
86840
+ });
86726
86841
  const marks = getActiveFormatting(this.activeEditor);
86727
86842
  const inTable = isInTable$1(this.activeEditor.state);
86728
86843
  this.toolbarItems.forEach((item) => {
86729
86844
  item.resetDisabled();
86845
+ if (item.name.value === "acceptTrackedChangeBySelection") {
86846
+ item.setDisabled(!canAcceptTrackedChanges);
86847
+ }
86848
+ if (item.name.value === "rejectTrackedChangeOnSelection") {
86849
+ item.setDisabled(!canRejectTrackedChanges);
86850
+ }
86730
86851
  if (item.name.value === "linkedStyles") {
86731
86852
  if (this.activeEditor && !getQuickFormatList(this.activeEditor).length) {
86732
86853
  return item.deactivate();
@@ -86899,6 +87020,19 @@ updateToolbarHistory_fn = function() {
86899
87020
  this.redoDepth = redoDepth(this.activeEditor.state);
86900
87021
  }
86901
87022
  };
87023
+ enrichTrackedChanges_fn = function(trackedChanges = []) {
87024
+ if (!trackedChanges?.length) return trackedChanges;
87025
+ const store = this.superdoc?.commentsStore;
87026
+ if (!store?.getComment) return trackedChanges;
87027
+ return trackedChanges.map((change) => {
87028
+ const commentId = change.id;
87029
+ if (!commentId) return change;
87030
+ const storeComment = store.getComment(commentId);
87031
+ if (!storeComment) return change;
87032
+ const comment = typeof storeComment.getValues === "function" ? storeComment.getValues() : storeComment;
87033
+ return { ...change, comment };
87034
+ });
87035
+ };
86902
87036
  runCommandWithArgumentOnly_fn = function({ item, argument, noArgumentCallback = false }, callback) {
86903
87037
  if (!argument || !this.activeEditor) return;
86904
87038
  let command2 = item.command;
@@ -87303,6 +87437,7 @@ async function getEditorContext(editor, event) {
87303
87437
  state2.selection.$head.marks().forEach((mark) => activeMarks.push(mark.type.name));
87304
87438
  }
87305
87439
  const isTrackedChange = activeMarks.includes("trackInsert") || activeMarks.includes("trackDelete") || activeMarks.includes("trackFormat");
87440
+ const trackedChanges = event ? collectTrackedChangesForContext({ state: state2, pos, trackedChangeId }) : collectTrackedChanges({ state: state2, from: from2, to });
87306
87441
  const cursorCoords = pos ? view.coordsAtPos(pos) : null;
87307
87442
  const cursorPosition = cursorCoords ? {
87308
87443
  x: cursorCoords.left,
@@ -87336,7 +87471,9 @@ async function getEditorContext(editor, event) {
87336
87471
  event,
87337
87472
  trigger: event ? "click" : "slash",
87338
87473
  // Editor reference for advanced use cases
87339
- editor
87474
+ editor,
87475
+ // Tracked change metadata
87476
+ trackedChanges
87340
87477
  };
87341
87478
  return context;
87342
87479
  }
@@ -87433,6 +87570,14 @@ const shouldShowItem = (item, context) => {
87433
87570
  }
87434
87571
  }
87435
87572
  };
87573
+ const canPerformTrackedChange = (context, action) => {
87574
+ if (!context?.editor) return true;
87575
+ return isTrackedChangeActionAllowed({
87576
+ editor: context.editor,
87577
+ action,
87578
+ trackedChanges: context.trackedChanges ?? []
87579
+ });
87580
+ };
87436
87581
  function getItems(context, customItems = [], includeDefaultItems = true) {
87437
87582
  const { selectedText, editor } = context;
87438
87583
  if (arguments.length === 1 && editor?.options?.slashMenuConfig) {
@@ -87490,7 +87635,7 @@ function getItems(context, customItems = [], includeDefaultItems = true) {
87490
87635
  },
87491
87636
  showWhen: (context2) => {
87492
87637
  const { trigger: trigger2, isTrackedChange } = context2;
87493
- return trigger2 === TRIGGERS.click && isTrackedChange;
87638
+ return trigger2 === TRIGGERS.click && isTrackedChange && canPerformTrackedChange(context2, "accept");
87494
87639
  }
87495
87640
  },
87496
87641
  {
@@ -87507,7 +87652,7 @@ function getItems(context, customItems = [], includeDefaultItems = true) {
87507
87652
  },
87508
87653
  showWhen: (context2) => {
87509
87654
  const { trigger: trigger2, isTrackedChange } = context2;
87510
- return trigger2 === TRIGGERS.click && isTrackedChange;
87655
+ return trigger2 === TRIGGERS.click && isTrackedChange && canPerformTrackedChange(context2, "reject");
87511
87656
  }
87512
87657
  }
87513
87658
  ]
@@ -134,6 +134,26 @@ export class SuperDoc extends EventEmitter<string | symbol, any> {
134
134
  * @returns {void}
135
135
  */
136
136
  togglePagination(): void;
137
+ /**
138
+ * Determine whether the current configuration allows a given permission.
139
+ * Used by downstream consumers (toolbar, context menu, commands) to keep
140
+ * tracked-change affordances consistent with customer overrides.
141
+ *
142
+ * @param {Object} params
143
+ * @param {string} params.permission Permission key to evaluate
144
+ * @param {string} [params.role=this.config.role] Role to evaluate against
145
+ * @param {boolean} [params.isInternal=this.config.isInternal] Internal/external flag
146
+ * @param {Object|null} [params.comment] Comment object (if already resolved)
147
+ * @param {Object|null} [params.trackedChange] Tracked change metadata (id, attrs, etc.)
148
+ * @returns {boolean}
149
+ */
150
+ canPerformPermission({ permission, role, isInternal, comment, trackedChange, }?: {
151
+ permission: string;
152
+ role?: string;
153
+ isInternal?: boolean;
154
+ comment?: any | null;
155
+ trackedChange?: any | null;
156
+ }): boolean;
137
157
  toolbarElement: any;
138
158
  toolbar: SuperToolbar;
139
159
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"SuperDoc.d.ts","sourceRoot":"","sources":["../../src/core/SuperDoc.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SuperDoc.d.ts","sourceRoot":"","sources":["../../src/core/SuperDoc.js"],"names":[],"mappings":"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"}