@harbour-enterprises/superdoc 0.24.0 → 0.25.0-next.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.
Files changed (34) hide show
  1. package/dist/chunks/{PdfViewer-BiHh3x6b.es.js → PdfViewer-BEbvklge.es.js} +1 -1
  2. package/dist/chunks/{PdfViewer-qk_hITc5.cjs → PdfViewer-CvksDDwi.cjs} +1 -1
  3. package/dist/chunks/{index-aMnFs35I.es.js → index-B9Ad3j3k.es.js} +166 -76
  4. package/dist/chunks/{index-Di6nG2sc.cjs → index-Bf3lSVG2.cjs} +166 -76
  5. package/dist/chunks/{super-editor.es-Dz7y81Yr.es.js → super-editor.es--RpCOiR4.es.js} +157 -15
  6. package/dist/chunks/{super-editor.es-BKZvTraR.cjs → super-editor.es-Bh07I_ue.cjs} +157 -15
  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-CyBtLJFF.js} +116 -16
  18. package/dist/super-editor/chunks/{toolbar-DMobfM6u.js → toolbar-1Ejr8Exl.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.es.js +66 -21
  27. package/dist/super-editor/toolbar.es.js +2 -2
  28. package/dist/super-editor.cjs +1 -1
  29. package/dist/super-editor.es.js +1 -1
  30. package/dist/superdoc.cjs +2 -2
  31. package/dist/superdoc.es.js +2 -2
  32. package/dist/superdoc.umd.js +321 -89
  33. package/dist/superdoc.umd.js.map +1 -1
  34. package/package.json +1 -1
@@ -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
  /**
@@ -52546,7 +52546,8 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
52546
52546
  customUpdatedFiles: {},
52547
52547
  isHeaderFooterChanged: false,
52548
52548
  isCustomXmlChanged: false,
52549
- focusTarget: null
52549
+ focusTarget: null,
52550
+ permissionResolver: null
52550
52551
  });
52551
52552
  __privateMethod$1(this, _Editor_instances, initContainerElement_fn).call(this, options);
52552
52553
  __privateMethod$1(this, _Editor_instances, checkHeadless_fn).call(this, options);
@@ -53308,7 +53309,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
53308
53309
  * @returns {Object | void} Migration results
53309
53310
  */
53310
53311
  processCollaborationMigrations() {
53311
- console.debug("[checkVersionMigrations] Current editor version", "0.23.0");
53312
+ console.debug("[checkVersionMigrations] Current editor version", "0.24.0");
53312
53313
  if (!this.options.ydoc) return;
53313
53314
  const metaMap = this.options.ydoc.getMap("meta");
53314
53315
  let docVersion = metaMap.get("version");
@@ -67304,11 +67305,105 @@ const TrackFormat = Mark2.create({
67304
67305
  return ["span", Attribute2.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];
67305
67306
  }
67306
67307
  });
67308
+ const PERMISSION_MAP = {
67309
+ accept: {
67310
+ own: "RESOLVE_OWN",
67311
+ other: "RESOLVE_OTHER"
67312
+ },
67313
+ reject: {
67314
+ own: "REJECT_OWN",
67315
+ other: "REJECT_OTHER"
67316
+ }
67317
+ };
67318
+ const buildKey = (change) => {
67319
+ const id = change.mark?.attrs?.id ?? `${change.from}-${change.to}`;
67320
+ return `${id}:${change.mark?.type?.name ?? "unknown"}`;
67321
+ };
67322
+ const mergeChange = (bucket, change) => {
67323
+ const key2 = buildKey(change);
67324
+ const existing = bucket.get(key2);
67325
+ if (existing) {
67326
+ existing.from = Math.min(existing.from, change.from);
67327
+ existing.to = Math.max(existing.to, change.to);
67328
+ existing.segments.push({ from: change.from, to: change.to });
67329
+ } else {
67330
+ bucket.set(key2, {
67331
+ id: change.mark?.attrs?.id ?? null,
67332
+ type: change.mark?.type?.name ?? null,
67333
+ attrs: { ...change.mark?.attrs ?? {} },
67334
+ from: change.from,
67335
+ to: change.to,
67336
+ segments: [{ from: change.from, to: change.to }]
67337
+ });
67338
+ }
67339
+ };
67340
+ const collectTrackedChanges = ({ state: state2, from: from2, to }) => {
67341
+ if (!state2) return [];
67342
+ const collapsed = from2 === to;
67343
+ const changes = getTrackChanges(state2);
67344
+ if (!changes?.length) return [];
67345
+ const bucket = /* @__PURE__ */ new Map();
67346
+ changes.forEach((change) => {
67347
+ const overlaps = collapsed ? change.from <= from2 && change.to >= from2 : change.from < to && change.to > from2;
67348
+ if (!overlaps) return;
67349
+ mergeChange(bucket, change);
67350
+ });
67351
+ return Array.from(bucket.values());
67352
+ };
67353
+ const derivePermissionKey = ({ action, isOwn }) => {
67354
+ const mapping = PERMISSION_MAP[action];
67355
+ if (!mapping) return null;
67356
+ return isOwn ? mapping.own : mapping.other;
67357
+ };
67358
+ const resolveChanges = (editor) => {
67359
+ if (!editor) return { role: "editor", isInternal: false, currentUser: null, resolver: null };
67360
+ const role = editor.options?.role ?? "editor";
67361
+ const isInternal = Boolean(editor.options?.isInternal);
67362
+ const currentUser = editor.options?.user ?? null;
67363
+ const resolver = editor.options?.permissionResolver;
67364
+ return { role, isInternal, currentUser, resolver };
67365
+ };
67366
+ const isTrackedChangeActionAllowed = ({ editor, action, trackedChanges }) => {
67367
+ if (!trackedChanges?.length) return true;
67368
+ const { role, isInternal, currentUser, resolver } = resolveChanges(editor);
67369
+ if (typeof resolver !== "function") return true;
67370
+ const currentEmail = currentUser?.email ?? null;
67371
+ return trackedChanges.every((change) => {
67372
+ const authorEmail = change.attrs?.authorEmail ?? null;
67373
+ const isOwn = Boolean(currentEmail && authorEmail && currentEmail === authorEmail);
67374
+ const permission = derivePermissionKey({ action, isOwn });
67375
+ if (!permission) return true;
67376
+ const payload = {
67377
+ permission,
67378
+ role,
67379
+ isInternal,
67380
+ trackedChange: {
67381
+ id: change.id,
67382
+ type: change.type,
67383
+ attrs: change.attrs,
67384
+ from: change.from,
67385
+ to: change.to,
67386
+ segments: change.segments,
67387
+ commentId: change.id
67388
+ },
67389
+ comment: change.comment ?? null
67390
+ };
67391
+ return resolver(payload) !== false;
67392
+ });
67393
+ };
67394
+ const collectTrackedChangesForContext = ({ state: state2, pos, trackedChangeId }) => {
67395
+ if (pos == null) return [];
67396
+ const changes = collectTrackedChanges({ state: state2, from: pos, to: pos });
67397
+ if (!trackedChangeId) return changes;
67398
+ return changes.filter((change) => change.id === trackedChangeId);
67399
+ };
67307
67400
  const TrackChanges = Extension.create({
67308
67401
  name: "trackChanges",
67309
67402
  addCommands() {
67310
67403
  return {
67311
- acceptTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch }) => {
67404
+ acceptTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch, editor }) => {
67405
+ const trackedChanges = collectTrackedChanges({ state: state2, from: from2, to });
67406
+ if (!isTrackedChangeActionAllowed({ editor, action: "accept", trackedChanges })) return false;
67312
67407
  let { tr, doc: doc2 } = state2;
67313
67408
  tr.setMeta("acceptReject", true);
67314
67409
  const map22 = new Mapping();
@@ -67346,7 +67441,9 @@ const TrackChanges = Extension.create({
67346
67441
  }
67347
67442
  return true;
67348
67443
  },
67349
- rejectTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch }) => {
67444
+ rejectTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch, editor }) => {
67445
+ const trackedChanges = collectTrackedChanges({ state: state2, from: from2, to });
67446
+ if (!isTrackedChangeActionAllowed({ editor, action: "reject", trackedChanges })) return false;
67350
67447
  const { tr, doc: doc2 } = state2;
67351
67448
  tr.setMeta("acceptReject", true);
67352
67449
  const map22 = new Mapping();
@@ -83769,7 +83866,7 @@ var __accessCheck = (obj, member, msg2) => member.has(obj) || __typeError("Canno
83769
83866
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
83770
83867
  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
83868
  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;
83869
+ var _SuperToolbar_instances, initToolbarGroups_fn, _interceptedCommands, makeToolbarItems_fn, initDefaultFonts_fn, updateHighlightColors_fn, deactivateAll_fn, updateToolbarHistory_fn, enrichTrackedChanges_fn, runCommandWithArgumentOnly_fn;
83773
83870
  var eventemitter3 = { exports: {} };
83774
83871
  var hasRequiredEventemitter3;
83775
83872
  function requireEventemitter3() {
@@ -83821,7 +83918,7 @@ function requireEventemitter3() {
83821
83918
  var evt = prefix2 ? prefix2 + event : event, handlers2 = this._events[evt];
83822
83919
  if (!handlers2) return [];
83823
83920
  if (handlers2.fn) return [handlers2.fn];
83824
- for (var i2 = 0, l22 = handlers2.length, ee = new Array(l22); i2 < l22; i2++) {
83921
+ for (var i2 = 0, l3 = handlers2.length, ee = new Array(l3); i2 < l3; i2++) {
83825
83922
  ee[i2] = handlers2[i2].fn;
83826
83923
  }
83827
83924
  return ee;
@@ -84977,18 +85074,18 @@ const _sfc_main$7 = {
84977
85074
  }, [
84978
85075
  (openBlock(), createElementBlock(Fragment$1, null, renderList(5, (i2) => {
84979
85076
  return openBlock(), createElementBlock(Fragment$1, { key: i2 }, [
84980
- (openBlock(), createElementBlock(Fragment$1, null, renderList(5, (n2) => {
85077
+ (openBlock(), createElementBlock(Fragment$1, null, renderList(5, (n) => {
84981
85078
  return createBaseVNode("div", {
84982
85079
  class: "toolbar-table-grid__item",
84983
- key: `${i2}_${n2}`,
84984
- "data-cols": n2,
85080
+ key: `${i2}_${n}`,
85081
+ "data-cols": n,
84985
85082
  "data-rows": i2,
84986
85083
  "data-item": "true",
84987
85084
  ref_for: true,
84988
85085
  ref_key: "tableGridItems",
84989
85086
  ref: tableGridItems,
84990
- onKeydown: withModifiers((event) => handleKeyDown2(event, n2, i2), ["prevent"]),
84991
- onClick: withModifiers(($event) => handleClick2({ cols: n2, rows: i2 }), ["stop", "prevent"])
85087
+ onKeydown: withModifiers((event) => handleKeyDown2(event, n, i2), ["prevent"]),
85088
+ onClick: withModifiers(($event) => handleClick2({ cols: n, rows: i2 }), ["stop", "prevent"])
84992
85089
  }, null, 40, _hoisted_1$6);
84993
85090
  }), 64))
84994
85091
  ], 64);
@@ -86723,10 +86820,31 @@ class SuperToolbar extends EventEmitter2 {
86723
86820
  __privateMethod(this, _SuperToolbar_instances, deactivateAll_fn).call(this);
86724
86821
  return;
86725
86822
  }
86823
+ const { state: state2 } = this.activeEditor;
86824
+ const selection = state2.selection;
86825
+ const selectionTrackedChanges = __privateMethod(this, _SuperToolbar_instances, enrichTrackedChanges_fn).call(this, collectTrackedChanges({ state: state2, from: selection.from, to: selection.to }));
86826
+ const hasTrackedChanges = selectionTrackedChanges.length > 0;
86827
+ const hasValidSelection = hasTrackedChanges;
86828
+ const canAcceptTrackedChanges = hasValidSelection && isTrackedChangeActionAllowed({
86829
+ editor: this.activeEditor,
86830
+ action: "accept",
86831
+ trackedChanges: selectionTrackedChanges
86832
+ });
86833
+ const canRejectTrackedChanges = hasValidSelection && isTrackedChangeActionAllowed({
86834
+ editor: this.activeEditor,
86835
+ action: "reject",
86836
+ trackedChanges: selectionTrackedChanges
86837
+ });
86726
86838
  const marks = getActiveFormatting(this.activeEditor);
86727
86839
  const inTable = isInTable$1(this.activeEditor.state);
86728
86840
  this.toolbarItems.forEach((item) => {
86729
86841
  item.resetDisabled();
86842
+ if (item.name.value === "acceptTrackedChangeBySelection") {
86843
+ item.setDisabled(!canAcceptTrackedChanges);
86844
+ }
86845
+ if (item.name.value === "rejectTrackedChangeOnSelection") {
86846
+ item.setDisabled(!canRejectTrackedChanges);
86847
+ }
86730
86848
  if (item.name.value === "linkedStyles") {
86731
86849
  if (this.activeEditor && !getQuickFormatList(this.activeEditor).length) {
86732
86850
  return item.deactivate();
@@ -86899,6 +87017,19 @@ updateToolbarHistory_fn = function() {
86899
87017
  this.redoDepth = redoDepth(this.activeEditor.state);
86900
87018
  }
86901
87019
  };
87020
+ enrichTrackedChanges_fn = function(trackedChanges = []) {
87021
+ if (!trackedChanges?.length) return trackedChanges;
87022
+ const store = this.superdoc?.commentsStore;
87023
+ if (!store?.getComment) return trackedChanges;
87024
+ return trackedChanges.map((change) => {
87025
+ const commentId = change.id;
87026
+ if (!commentId) return change;
87027
+ const storeComment = store.getComment(commentId);
87028
+ if (!storeComment) return change;
87029
+ const comment = typeof storeComment.getValues === "function" ? storeComment.getValues() : storeComment;
87030
+ return { ...change, comment };
87031
+ });
87032
+ };
86902
87033
  runCommandWithArgumentOnly_fn = function({ item, argument, noArgumentCallback = false }, callback) {
86903
87034
  if (!argument || !this.activeEditor) return;
86904
87035
  let command2 = item.command;
@@ -87303,6 +87434,7 @@ async function getEditorContext(editor, event) {
87303
87434
  state2.selection.$head.marks().forEach((mark) => activeMarks.push(mark.type.name));
87304
87435
  }
87305
87436
  const isTrackedChange = activeMarks.includes("trackInsert") || activeMarks.includes("trackDelete") || activeMarks.includes("trackFormat");
87437
+ const trackedChanges = event ? collectTrackedChangesForContext({ state: state2, pos, trackedChangeId }) : collectTrackedChanges({ state: state2, from: from2, to });
87306
87438
  const cursorCoords = pos ? view.coordsAtPos(pos) : null;
87307
87439
  const cursorPosition = cursorCoords ? {
87308
87440
  x: cursorCoords.left,
@@ -87336,7 +87468,9 @@ async function getEditorContext(editor, event) {
87336
87468
  event,
87337
87469
  trigger: event ? "click" : "slash",
87338
87470
  // Editor reference for advanced use cases
87339
- editor
87471
+ editor,
87472
+ // Tracked change metadata
87473
+ trackedChanges
87340
87474
  };
87341
87475
  return context;
87342
87476
  }
@@ -87433,6 +87567,14 @@ const shouldShowItem = (item, context) => {
87433
87567
  }
87434
87568
  }
87435
87569
  };
87570
+ const canPerformTrackedChange = (context, action) => {
87571
+ if (!context?.editor) return true;
87572
+ return isTrackedChangeActionAllowed({
87573
+ editor: context.editor,
87574
+ action,
87575
+ trackedChanges: context.trackedChanges ?? []
87576
+ });
87577
+ };
87436
87578
  function getItems(context, customItems = [], includeDefaultItems = true) {
87437
87579
  const { selectedText, editor } = context;
87438
87580
  if (arguments.length === 1 && editor?.options?.slashMenuConfig) {
@@ -87490,7 +87632,7 @@ function getItems(context, customItems = [], includeDefaultItems = true) {
87490
87632
  },
87491
87633
  showWhen: (context2) => {
87492
87634
  const { trigger: trigger2, isTrackedChange } = context2;
87493
- return trigger2 === TRIGGERS.click && isTrackedChange;
87635
+ return trigger2 === TRIGGERS.click && isTrackedChange && canPerformTrackedChange(context2, "accept");
87494
87636
  }
87495
87637
  },
87496
87638
  {
@@ -87507,7 +87649,7 @@ function getItems(context, customItems = [], includeDefaultItems = true) {
87507
87649
  },
87508
87650
  showWhen: (context2) => {
87509
87651
  const { trigger: trigger2, isTrackedChange } = context2;
87510
- return trigger2 === TRIGGERS.click && isTrackedChange;
87652
+ return trigger2 === TRIGGERS.click && isTrackedChange && canPerformTrackedChange(context2, "reject");
87511
87653
  }
87512
87654
  }
87513
87655
  ]
@@ -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
  /**
@@ -52563,7 +52563,8 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
52563
52563
  customUpdatedFiles: {},
52564
52564
  isHeaderFooterChanged: false,
52565
52565
  isCustomXmlChanged: false,
52566
- focusTarget: null
52566
+ focusTarget: null,
52567
+ permissionResolver: null
52567
52568
  });
52568
52569
  __privateMethod$1(this, _Editor_instances, initContainerElement_fn).call(this, options);
52569
52570
  __privateMethod$1(this, _Editor_instances, checkHeadless_fn).call(this, options);
@@ -53325,7 +53326,7 @@ const _Editor = class _Editor2 extends EventEmitter$1 {
53325
53326
  * @returns {Object | void} Migration results
53326
53327
  */
53327
53328
  processCollaborationMigrations() {
53328
- console.debug("[checkVersionMigrations] Current editor version", "0.23.0");
53329
+ console.debug("[checkVersionMigrations] Current editor version", "0.24.0");
53329
53330
  if (!this.options.ydoc) return;
53330
53331
  const metaMap = this.options.ydoc.getMap("meta");
53331
53332
  let docVersion = metaMap.get("version");
@@ -67321,11 +67322,105 @@ const TrackFormat = Mark2.create({
67321
67322
  return ["span", Attribute2.mergeAttributes(this.options.htmlAttributes, htmlAttributes), 0];
67322
67323
  }
67323
67324
  });
67325
+ const PERMISSION_MAP = {
67326
+ accept: {
67327
+ own: "RESOLVE_OWN",
67328
+ other: "RESOLVE_OTHER"
67329
+ },
67330
+ reject: {
67331
+ own: "REJECT_OWN",
67332
+ other: "REJECT_OTHER"
67333
+ }
67334
+ };
67335
+ const buildKey = (change) => {
67336
+ const id = change.mark?.attrs?.id ?? `${change.from}-${change.to}`;
67337
+ return `${id}:${change.mark?.type?.name ?? "unknown"}`;
67338
+ };
67339
+ const mergeChange = (bucket, change) => {
67340
+ const key2 = buildKey(change);
67341
+ const existing = bucket.get(key2);
67342
+ if (existing) {
67343
+ existing.from = Math.min(existing.from, change.from);
67344
+ existing.to = Math.max(existing.to, change.to);
67345
+ existing.segments.push({ from: change.from, to: change.to });
67346
+ } else {
67347
+ bucket.set(key2, {
67348
+ id: change.mark?.attrs?.id ?? null,
67349
+ type: change.mark?.type?.name ?? null,
67350
+ attrs: { ...change.mark?.attrs ?? {} },
67351
+ from: change.from,
67352
+ to: change.to,
67353
+ segments: [{ from: change.from, to: change.to }]
67354
+ });
67355
+ }
67356
+ };
67357
+ const collectTrackedChanges = ({ state: state2, from: from2, to }) => {
67358
+ if (!state2) return [];
67359
+ const collapsed = from2 === to;
67360
+ const changes = getTrackChanges(state2);
67361
+ if (!changes?.length) return [];
67362
+ const bucket = /* @__PURE__ */ new Map();
67363
+ changes.forEach((change) => {
67364
+ const overlaps = collapsed ? change.from <= from2 && change.to >= from2 : change.from < to && change.to > from2;
67365
+ if (!overlaps) return;
67366
+ mergeChange(bucket, change);
67367
+ });
67368
+ return Array.from(bucket.values());
67369
+ };
67370
+ const derivePermissionKey = ({ action, isOwn }) => {
67371
+ const mapping = PERMISSION_MAP[action];
67372
+ if (!mapping) return null;
67373
+ return isOwn ? mapping.own : mapping.other;
67374
+ };
67375
+ const resolveChanges = (editor) => {
67376
+ if (!editor) return { role: "editor", isInternal: false, currentUser: null, resolver: null };
67377
+ const role = editor.options?.role ?? "editor";
67378
+ const isInternal = Boolean(editor.options?.isInternal);
67379
+ const currentUser = editor.options?.user ?? null;
67380
+ const resolver = editor.options?.permissionResolver;
67381
+ return { role, isInternal, currentUser, resolver };
67382
+ };
67383
+ const isTrackedChangeActionAllowed = ({ editor, action, trackedChanges }) => {
67384
+ if (!trackedChanges?.length) return true;
67385
+ const { role, isInternal, currentUser, resolver } = resolveChanges(editor);
67386
+ if (typeof resolver !== "function") return true;
67387
+ const currentEmail = currentUser?.email ?? null;
67388
+ return trackedChanges.every((change) => {
67389
+ const authorEmail = change.attrs?.authorEmail ?? null;
67390
+ const isOwn = Boolean(currentEmail && authorEmail && currentEmail === authorEmail);
67391
+ const permission = derivePermissionKey({ action, isOwn });
67392
+ if (!permission) return true;
67393
+ const payload = {
67394
+ permission,
67395
+ role,
67396
+ isInternal,
67397
+ trackedChange: {
67398
+ id: change.id,
67399
+ type: change.type,
67400
+ attrs: change.attrs,
67401
+ from: change.from,
67402
+ to: change.to,
67403
+ segments: change.segments,
67404
+ commentId: change.id
67405
+ },
67406
+ comment: change.comment ?? null
67407
+ };
67408
+ return resolver(payload) !== false;
67409
+ });
67410
+ };
67411
+ const collectTrackedChangesForContext = ({ state: state2, pos, trackedChangeId }) => {
67412
+ if (pos == null) return [];
67413
+ const changes = collectTrackedChanges({ state: state2, from: pos, to: pos });
67414
+ if (!trackedChangeId) return changes;
67415
+ return changes.filter((change) => change.id === trackedChangeId);
67416
+ };
67324
67417
  const TrackChanges = Extension.create({
67325
67418
  name: "trackChanges",
67326
67419
  addCommands() {
67327
67420
  return {
67328
- acceptTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch }) => {
67421
+ acceptTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch, editor }) => {
67422
+ const trackedChanges = collectTrackedChanges({ state: state2, from: from2, to });
67423
+ if (!isTrackedChangeActionAllowed({ editor, action: "accept", trackedChanges })) return false;
67329
67424
  let { tr, doc: doc2 } = state2;
67330
67425
  tr.setMeta("acceptReject", true);
67331
67426
  const map22 = new Mapping();
@@ -67363,7 +67458,9 @@ const TrackChanges = Extension.create({
67363
67458
  }
67364
67459
  return true;
67365
67460
  },
67366
- rejectTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch }) => {
67461
+ rejectTrackedChangesBetween: (from2, to) => ({ state: state2, dispatch, editor }) => {
67462
+ const trackedChanges = collectTrackedChanges({ state: state2, from: from2, to });
67463
+ if (!isTrackedChangeActionAllowed({ editor, action: "reject", trackedChanges })) return false;
67367
67464
  const { tr, doc: doc2 } = state2;
67368
67465
  tr.setMeta("acceptReject", true);
67369
67466
  const map22 = new Mapping();
@@ -83786,7 +83883,7 @@ var __accessCheck = (obj, member, msg2) => member.has(obj) || __typeError("Canno
83786
83883
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
83787
83884
  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
83885
  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;
83886
+ var _SuperToolbar_instances, initToolbarGroups_fn, _interceptedCommands, makeToolbarItems_fn, initDefaultFonts_fn, updateHighlightColors_fn, deactivateAll_fn, updateToolbarHistory_fn, enrichTrackedChanges_fn, runCommandWithArgumentOnly_fn;
83790
83887
  var eventemitter3 = { exports: {} };
83791
83888
  var hasRequiredEventemitter3;
83792
83889
  function requireEventemitter3() {
@@ -83838,7 +83935,7 @@ function requireEventemitter3() {
83838
83935
  var evt = prefix2 ? prefix2 + event : event, handlers2 = this._events[evt];
83839
83936
  if (!handlers2) return [];
83840
83937
  if (handlers2.fn) return [handlers2.fn];
83841
- for (var i2 = 0, l22 = handlers2.length, ee = new Array(l22); i2 < l22; i2++) {
83938
+ for (var i2 = 0, l3 = handlers2.length, ee = new Array(l3); i2 < l3; i2++) {
83842
83939
  ee[i2] = handlers2[i2].fn;
83843
83940
  }
83844
83941
  return ee;
@@ -84994,18 +85091,18 @@ const _sfc_main$7 = {
84994
85091
  }, [
84995
85092
  (vue.openBlock(), vue.createElementBlock(vue.Fragment, null, vue.renderList(5, (i2) => {
84996
85093
  return vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: i2 }, [
84997
- (vue.openBlock(), vue.createElementBlock(vue.Fragment, null, vue.renderList(5, (n2) => {
85094
+ (vue.openBlock(), vue.createElementBlock(vue.Fragment, null, vue.renderList(5, (n) => {
84998
85095
  return vue.createBaseVNode("div", {
84999
85096
  class: "toolbar-table-grid__item",
85000
- key: `${i2}_${n2}`,
85001
- "data-cols": n2,
85097
+ key: `${i2}_${n}`,
85098
+ "data-cols": n,
85002
85099
  "data-rows": i2,
85003
85100
  "data-item": "true",
85004
85101
  ref_for: true,
85005
85102
  ref_key: "tableGridItems",
85006
85103
  ref: tableGridItems,
85007
- onKeydown: vue.withModifiers((event) => handleKeyDown2(event, n2, i2), ["prevent"]),
85008
- onClick: vue.withModifiers(($event) => handleClick2({ cols: n2, rows: i2 }), ["stop", "prevent"])
85104
+ onKeydown: vue.withModifiers((event) => handleKeyDown2(event, n, i2), ["prevent"]),
85105
+ onClick: vue.withModifiers(($event) => handleClick2({ cols: n, rows: i2 }), ["stop", "prevent"])
85009
85106
  }, null, 40, _hoisted_1$6);
85010
85107
  }), 64))
85011
85108
  ], 64);
@@ -86740,10 +86837,31 @@ class SuperToolbar extends EventEmitter2 {
86740
86837
  __privateMethod(this, _SuperToolbar_instances, deactivateAll_fn).call(this);
86741
86838
  return;
86742
86839
  }
86840
+ const { state: state2 } = this.activeEditor;
86841
+ const selection = state2.selection;
86842
+ const selectionTrackedChanges = __privateMethod(this, _SuperToolbar_instances, enrichTrackedChanges_fn).call(this, collectTrackedChanges({ state: state2, from: selection.from, to: selection.to }));
86843
+ const hasTrackedChanges = selectionTrackedChanges.length > 0;
86844
+ const hasValidSelection = hasTrackedChanges;
86845
+ const canAcceptTrackedChanges = hasValidSelection && isTrackedChangeActionAllowed({
86846
+ editor: this.activeEditor,
86847
+ action: "accept",
86848
+ trackedChanges: selectionTrackedChanges
86849
+ });
86850
+ const canRejectTrackedChanges = hasValidSelection && isTrackedChangeActionAllowed({
86851
+ editor: this.activeEditor,
86852
+ action: "reject",
86853
+ trackedChanges: selectionTrackedChanges
86854
+ });
86743
86855
  const marks = getActiveFormatting(this.activeEditor);
86744
86856
  const inTable = isInTable$1(this.activeEditor.state);
86745
86857
  this.toolbarItems.forEach((item) => {
86746
86858
  item.resetDisabled();
86859
+ if (item.name.value === "acceptTrackedChangeBySelection") {
86860
+ item.setDisabled(!canAcceptTrackedChanges);
86861
+ }
86862
+ if (item.name.value === "rejectTrackedChangeOnSelection") {
86863
+ item.setDisabled(!canRejectTrackedChanges);
86864
+ }
86747
86865
  if (item.name.value === "linkedStyles") {
86748
86866
  if (this.activeEditor && !getQuickFormatList(this.activeEditor).length) {
86749
86867
  return item.deactivate();
@@ -86916,6 +87034,19 @@ updateToolbarHistory_fn = function() {
86916
87034
  this.redoDepth = redoDepth(this.activeEditor.state);
86917
87035
  }
86918
87036
  };
87037
+ enrichTrackedChanges_fn = function(trackedChanges = []) {
87038
+ if (!trackedChanges?.length) return trackedChanges;
87039
+ const store = this.superdoc?.commentsStore;
87040
+ if (!store?.getComment) return trackedChanges;
87041
+ return trackedChanges.map((change) => {
87042
+ const commentId = change.id;
87043
+ if (!commentId) return change;
87044
+ const storeComment = store.getComment(commentId);
87045
+ if (!storeComment) return change;
87046
+ const comment = typeof storeComment.getValues === "function" ? storeComment.getValues() : storeComment;
87047
+ return { ...change, comment };
87048
+ });
87049
+ };
86919
87050
  runCommandWithArgumentOnly_fn = function({ item, argument, noArgumentCallback = false }, callback) {
86920
87051
  if (!argument || !this.activeEditor) return;
86921
87052
  let command2 = item.command;
@@ -87320,6 +87451,7 @@ async function getEditorContext(editor, event) {
87320
87451
  state2.selection.$head.marks().forEach((mark) => activeMarks.push(mark.type.name));
87321
87452
  }
87322
87453
  const isTrackedChange = activeMarks.includes("trackInsert") || activeMarks.includes("trackDelete") || activeMarks.includes("trackFormat");
87454
+ const trackedChanges = event ? collectTrackedChangesForContext({ state: state2, pos, trackedChangeId }) : collectTrackedChanges({ state: state2, from: from2, to });
87323
87455
  const cursorCoords = pos ? view.coordsAtPos(pos) : null;
87324
87456
  const cursorPosition = cursorCoords ? {
87325
87457
  x: cursorCoords.left,
@@ -87353,7 +87485,9 @@ async function getEditorContext(editor, event) {
87353
87485
  event,
87354
87486
  trigger: event ? "click" : "slash",
87355
87487
  // Editor reference for advanced use cases
87356
- editor
87488
+ editor,
87489
+ // Tracked change metadata
87490
+ trackedChanges
87357
87491
  };
87358
87492
  return context;
87359
87493
  }
@@ -87450,6 +87584,14 @@ const shouldShowItem = (item, context) => {
87450
87584
  }
87451
87585
  }
87452
87586
  };
87587
+ const canPerformTrackedChange = (context, action) => {
87588
+ if (!context?.editor) return true;
87589
+ return isTrackedChangeActionAllowed({
87590
+ editor: context.editor,
87591
+ action,
87592
+ trackedChanges: context.trackedChanges ?? []
87593
+ });
87594
+ };
87453
87595
  function getItems(context, customItems = [], includeDefaultItems = true) {
87454
87596
  const { selectedText, editor } = context;
87455
87597
  if (arguments.length === 1 && editor?.options?.slashMenuConfig) {
@@ -87507,7 +87649,7 @@ function getItems(context, customItems = [], includeDefaultItems = true) {
87507
87649
  },
87508
87650
  showWhen: (context2) => {
87509
87651
  const { trigger: trigger2, isTrackedChange } = context2;
87510
- return trigger2 === TRIGGERS.click && isTrackedChange;
87652
+ return trigger2 === TRIGGERS.click && isTrackedChange && canPerformTrackedChange(context2, "accept");
87511
87653
  }
87512
87654
  },
87513
87655
  {
@@ -87524,7 +87666,7 @@ function getItems(context, customItems = [], includeDefaultItems = true) {
87524
87666
  },
87525
87667
  showWhen: (context2) => {
87526
87668
  const { trigger: trigger2, isTrackedChange } = context2;
87527
- return trigger2 === TRIGGERS.click && isTrackedChange;
87669
+ return trigger2 === TRIGGERS.click && isTrackedChange && canPerformTrackedChange(context2, "reject");
87528
87670
  }
87529
87671
  }
87530
87672
  ]
@@ -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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"}
@@ -10,5 +10,11 @@ export const PERMISSIONS: Readonly<{
10
10
  UPLOAD_VERSION: "UPLOAD_VERSION";
11
11
  VERSION_HISTORY: "VERSION_HISTORY";
12
12
  }>;
13
- export function isAllowed(permission: string, role: string, isInternal: boolean): boolean;
13
+ export function isAllowed(permission: string, role: string, isInternal: boolean, context?: {
14
+ comment?: any;
15
+ superdoc?: any;
16
+ currentUser?: any;
17
+ permissionResolver?: Function;
18
+ trackedChange?: any;
19
+ }): boolean;
14
20
  //# sourceMappingURL=permissions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/core/collaboration/permissions.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA2DI,0FAGN"}
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/core/collaboration/permissions.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAkFI,2FAPJ;IAAyB,OAAO;IACP,QAAQ;IACR,WAAW;IACT,kBAAkB;IACpB,aAAa;CACtC,WAoBF"}