@ai-matrx/office 0.8.34 → 0.8.36
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/CHANGELOG.md +19 -1
- package/dist/collab-sheets-transform.cjs +103 -6
- package/dist/collab-sheets-transform.cjs.map +1 -1
- package/dist/collab-sheets-transform.d.cts +2 -2
- package/dist/collab-sheets-transform.d.ts +2 -2
- package/dist/collab-sheets-transform.js +103 -6
- package/dist/collab-sheets-transform.js.map +1 -1
- package/dist/sheets-comment-anchors.cjs.map +1 -1
- package/dist/sheets-comment-anchors.d.cts +15 -0
- package/dist/sheets-comment-anchors.d.ts +15 -0
- package/dist/sheets-comment-anchors.js.map +1 -1
- package/dist/univer-collab.cjs +124 -8
- package/dist/univer-collab.cjs.map +1 -1
- package/dist/univer-collab.d.cts +18 -2
- package/dist/univer-collab.d.ts +18 -2
- package/dist/univer-collab.js +124 -8
- package/dist/univer-collab.js.map +1 -1
- package/package.json +4 -4
|
@@ -45,7 +45,7 @@ interface SheetRange {
|
|
|
45
45
|
* column width, worksheet name. C5b: formula text in cells (`f`, array `ref`) and defined names. Shared
|
|
46
46
|
* formulas (`si`) stay barriers (see transform.ts cellBarrier); ranged resources are C5c.
|
|
47
47
|
*/
|
|
48
|
-
type SheetFamily = "cell" | "structure" | "merge" | "size" | "name" | "defname" | "numfmt" | "count" | "sheet" | "sort" | "anchor" | "cf" | "dv" | "filter";
|
|
48
|
+
type SheetFamily = "cell" | "structure" | "merge" | "size" | "name" | "defname" | "numfmt" | "count" | "sheet" | "sort" | "anchor" | "cf" | "dv" | "filter" | "note";
|
|
49
49
|
interface CoveredEntry {
|
|
50
50
|
readonly kind: "covered";
|
|
51
51
|
readonly family: SheetFamily;
|
|
@@ -103,7 +103,7 @@ declare function mapIndex(op: AxisOp, i: number): number | null;
|
|
|
103
103
|
*/
|
|
104
104
|
declare function transformAxis(x: AxisOp, y: AxisOp, side: Side): AxisOp[] | null;
|
|
105
105
|
|
|
106
|
-
declare const SHEET_TRANSFORMER_VERSION = "
|
|
106
|
+
declare const SHEET_TRANSFORMER_VERSION = "c5f-1";
|
|
107
107
|
/**
|
|
108
108
|
* Pairs the fuzz proved divergent (or that have no transform yet), as unordered mutation-id pairs, with the
|
|
109
109
|
* failing seed. Each returns a Barrier until it has its own correct transform under a new proto.
|
|
@@ -45,7 +45,7 @@ interface SheetRange {
|
|
|
45
45
|
* column width, worksheet name. C5b: formula text in cells (`f`, array `ref`) and defined names. Shared
|
|
46
46
|
* formulas (`si`) stay barriers (see transform.ts cellBarrier); ranged resources are C5c.
|
|
47
47
|
*/
|
|
48
|
-
type SheetFamily = "cell" | "structure" | "merge" | "size" | "name" | "defname" | "numfmt" | "count" | "sheet" | "sort" | "anchor" | "cf" | "dv" | "filter";
|
|
48
|
+
type SheetFamily = "cell" | "structure" | "merge" | "size" | "name" | "defname" | "numfmt" | "count" | "sheet" | "sort" | "anchor" | "cf" | "dv" | "filter" | "note";
|
|
49
49
|
interface CoveredEntry {
|
|
50
50
|
readonly kind: "covered";
|
|
51
51
|
readonly family: SheetFamily;
|
|
@@ -103,7 +103,7 @@ declare function mapIndex(op: AxisOp, i: number): number | null;
|
|
|
103
103
|
*/
|
|
104
104
|
declare function transformAxis(x: AxisOp, y: AxisOp, side: Side): AxisOp[] | null;
|
|
105
105
|
|
|
106
|
-
declare const SHEET_TRANSFORMER_VERSION = "
|
|
106
|
+
declare const SHEET_TRANSFORMER_VERSION = "c5f-1";
|
|
107
107
|
/**
|
|
108
108
|
* Pairs the fuzz proved divergent (or that have no transform yet), as unordered mutation-id pairs, with the
|
|
109
109
|
* failing seed. Each returns a Barrier until it has its own correct transform under a new proto.
|
|
@@ -110,6 +110,10 @@ var SHEET_MUTATIONS = {
|
|
|
110
110
|
"data-validation.mutation.updateRule": covered("dv", "ruleId", "payload", "source", "derived"),
|
|
111
111
|
"data-validation.mutation.removeRule": covered("dv", "ruleId", "source", "derived"),
|
|
112
112
|
"sheet.mutation.set-filter-range": covered("filter", "range", "derived"),
|
|
113
|
+
// C5f: Univer's cell notes, keyed by note id, anchored to one cell (their transform: comment-anchor-transform.ts)
|
|
114
|
+
"sheet.mutation.update-note": covered("note", "sheetId", "row", "col", "note", "silent", "derived"),
|
|
115
|
+
"sheet.mutation.remove-note": covered("note", "sheetId", "noteId", "row", "col", "silent", "derived"),
|
|
116
|
+
"sheet.mutation.update-note-position": covered("note", "sheetId", "noteId", "row", "col", "newPosition", "silent", "derived"),
|
|
113
117
|
"sheet.mutation.set-filter-criteria": covered("filter", "col", "criteria", "reCalc", "derived"),
|
|
114
118
|
"sheet.mutation.remove-filter": covered("filter", "derived"),
|
|
115
119
|
"sheet.mutation.add-table": barrier("C5c", RESOURCE),
|
|
@@ -122,9 +126,6 @@ var SHEET_MUTATIONS = {
|
|
|
122
126
|
"sheets.mutation.update-hyper-link": barrier("C5c", RESOURCE),
|
|
123
127
|
"sheets.mutation.update-hyper-link-ref": barrier("C5c", RESOURCE),
|
|
124
128
|
"sheets.mutation.update-rich-hyper-link": barrier("C5c", RESOURCE),
|
|
125
|
-
"sheet.mutation.update-note": barrier("C5c", RESOURCE),
|
|
126
|
-
"sheet.mutation.remove-note": barrier("C5c", RESOURCE),
|
|
127
|
-
"sheet.mutation.update-note-position": barrier("C5c", RESOURCE),
|
|
128
129
|
"sheet.mutation.set-drawing-apply": barrier("C5c", RESOURCE),
|
|
129
130
|
"sheet.mutation.set-worksheet-background-image": barrier("C5c", RESOURCE),
|
|
130
131
|
"sheet.mutation.add-range-theme": barrier("C5c", RESOURCE),
|
|
@@ -545,7 +546,88 @@ var label = (m) => {
|
|
|
545
546
|
const c = cellOf(m);
|
|
546
547
|
return `${String(m.params.subUnitId ?? "")}!${c ? sheetCellName(c) : "?"} comment`;
|
|
547
548
|
};
|
|
549
|
+
var UPDATE_NOTE = "sheet.mutation.update-note";
|
|
550
|
+
var REMOVE_NOTE = "sheet.mutation.remove-note";
|
|
551
|
+
var UPDATE_NOTE_POSITION = "sheet.mutation.update-note-position";
|
|
552
|
+
var NOTE_IDS = /* @__PURE__ */ new Set([UPDATE_NOTE, REMOVE_NOTE, UPDATE_NOTE_POSITION]);
|
|
553
|
+
var isNoteMutation = (id) => NOTE_IDS.has(id);
|
|
554
|
+
var cellAt = (row, col) => typeof row === "number" && typeof col === "number" ? { row, col } : null;
|
|
555
|
+
function noteRef(m) {
|
|
556
|
+
const p = m.params;
|
|
557
|
+
const sheet = String(p.sheetId ?? "");
|
|
558
|
+
if (m.id === UPDATE_NOTE) return { role: "write", sheet, id: p.note?.id ? String(p.note.id) : null, cell: cellAt(p.row, p.col) };
|
|
559
|
+
if (m.id === UPDATE_NOTE_POSITION) return { role: "move", sheet, id: p.noteId ? String(p.noteId) : null, cell: cellAt(p.newPosition?.row, p.newPosition?.col) };
|
|
560
|
+
return { role: "remove", sheet, id: p.noteId ? String(p.noteId) : null, cell: p.noteId ? null : cellAt(p.row, p.col) };
|
|
561
|
+
}
|
|
562
|
+
var noteDerived = (m) => m.params.derived === true;
|
|
563
|
+
var noteLabel = (n) => `${n.sheet}!${n.cell ? sheetCellName(n.cell) : "?"} note`;
|
|
564
|
+
var tellNote = (m, n) => noteDerived(m) ? [] : [noteLabel(n)];
|
|
565
|
+
var noteBarrier = (reason) => ({ barrier: true, reason: `note: ${reason}` });
|
|
566
|
+
var removeNoteOf = (sheet, id) => ({ id: REMOVE_NOTE, params: { sheetId: sheet, noteId: id, derived: true } });
|
|
567
|
+
var moveNoteTo = (sheet, id, cell) => ({
|
|
568
|
+
id: UPDATE_NOTE_POSITION,
|
|
569
|
+
params: { sheetId: sheet, noteId: id, newPosition: { row: cell.row, col: cell.col }, derived: true }
|
|
570
|
+
});
|
|
571
|
+
var onSheet = (m, sheet) => String(m.params.subUnitId ?? "") === sheet;
|
|
572
|
+
function transformCellNote(x, y, side) {
|
|
573
|
+
const xn = isNoteMutation(x.id);
|
|
574
|
+
const yn = isNoteMutation(y.id);
|
|
575
|
+
if (!xn && !yn) return null;
|
|
576
|
+
if (!xn) {
|
|
577
|
+
const n2 = noteRef(y);
|
|
578
|
+
if (n2.role === "remove" || !n2.cell || !onSheet(x, n2.sheet)) return ok([x]);
|
|
579
|
+
if (x.id === REMOVE_SHEET) return n2.id ? ok([removeNoteOf(n2.sheet, n2.id), x]) : ok([x]);
|
|
580
|
+
if (!structuralAxisOp(x.id, x.params)) return ok([x]);
|
|
581
|
+
if (!n2.id) return noteBarrier("a note without an id against a row or column change");
|
|
582
|
+
const moved = moveSheetAnchorCell(n2.cell, n2.sheet, x.id, x.params);
|
|
583
|
+
if (!moved) return ok([x, removeNoteOf(n2.sheet, n2.id)]);
|
|
584
|
+
return moved === n2.cell ? ok([x]) : ok([x, moveNoteTo(n2.sheet, n2.id, moved)]);
|
|
585
|
+
}
|
|
586
|
+
const n = noteRef(x);
|
|
587
|
+
if (!yn) {
|
|
588
|
+
if (!onSheet(y, n.sheet)) return ok([x]);
|
|
589
|
+
if (y.id === REMOVE_SHEET) return ok([], [], tellNote(x, n));
|
|
590
|
+
if (!structuralAxisOp(y.id, y.params)) return ok([x]);
|
|
591
|
+
if (n.role === "write" && !n.id) return noteBarrier("a note without an id against a row or column change");
|
|
592
|
+
const p = x.params;
|
|
593
|
+
const from = cellAt(p.row, p.col);
|
|
594
|
+
const fromMoved = from ? moveSheetAnchorCell(from, n.sheet, y.id, y.params) : null;
|
|
595
|
+
if (n.role === "remove") {
|
|
596
|
+
if (n.id) return ok([x]);
|
|
597
|
+
return fromMoved ? ok([{ id: x.id, params: { ...p, row: fromMoved.row, col: fromMoved.col } }]) : ok([]);
|
|
598
|
+
}
|
|
599
|
+
const moved = n.cell ? moveSheetAnchorCell(n.cell, n.sheet, y.id, y.params) : null;
|
|
600
|
+
if (n.role === "write") {
|
|
601
|
+
if (!moved) return ok([], [], tellNote(x, n));
|
|
602
|
+
return ok([moved === n.cell ? x : { id: x.id, params: { ...p, row: moved.row, col: moved.col } }]);
|
|
603
|
+
}
|
|
604
|
+
if (!moved) return n.id ? ok([removeNoteOf(n.sheet, n.id)], [], tellNote(x, n)) : ok([], [], tellNote(x, n));
|
|
605
|
+
const params = { ...p, newPosition: { ...p.newPosition, row: moved.row, col: moved.col } };
|
|
606
|
+
if (fromMoved) Object.assign(params, { row: fromMoved.row, col: fromMoved.col });
|
|
607
|
+
return ok([{ id: x.id, params }]);
|
|
608
|
+
}
|
|
609
|
+
const m = noteRef(y);
|
|
610
|
+
if (n.sheet !== m.sheet) return ok([x]);
|
|
611
|
+
if (!n.id || !m.id) return noteBarrier("a note change addressed by cell against another note change on its sheet");
|
|
612
|
+
if (n.id !== m.id) {
|
|
613
|
+
const sameCell = n.cell && m.cell && n.cell.row === m.cell.row && n.cell.col === m.cell.col;
|
|
614
|
+
return sameCell ? noteBarrier("two notes written to one cell at once") : ok([x]);
|
|
615
|
+
}
|
|
616
|
+
if (n.role === "remove") return ok([x]);
|
|
617
|
+
if (m.role === "remove") return ok([], [], tellNote(x, n));
|
|
618
|
+
if (n.role === "write" && m.role === "move") {
|
|
619
|
+
return m.cell ? ok([{ id: x.id, params: { ...x.params, row: m.cell.row, col: m.cell.col } }]) : ok([x]);
|
|
620
|
+
}
|
|
621
|
+
if (n.role === "move" && m.role === "write") return ok([x]);
|
|
622
|
+
const dx = noteDerived(x);
|
|
623
|
+
const dy = noteDerived(y);
|
|
624
|
+
if (dx && dy) return ok([x]);
|
|
625
|
+
const xWins = dx !== dy ? !dx : side === "left";
|
|
626
|
+
return xWins ? ok([x], tellNote(y, m)) : ok([], [], tellNote(x, n));
|
|
627
|
+
}
|
|
548
628
|
function transformCommentAnchor(x, y, side) {
|
|
629
|
+
const note = transformCellNote(x, y, side);
|
|
630
|
+
if (note) return note;
|
|
549
631
|
const xa = x.id === SET_SHEET_COMMENT_ANCHOR;
|
|
550
632
|
const ya = y.id === SET_SHEET_COMMENT_ANCHOR;
|
|
551
633
|
if (!xa && !ya) return null;
|
|
@@ -666,7 +748,7 @@ registerRangedResource({
|
|
|
666
748
|
});
|
|
667
749
|
|
|
668
750
|
// src/collab/sheets/transform/transform.ts
|
|
669
|
-
var SHEET_TRANSFORMER_VERSION = "
|
|
751
|
+
var SHEET_TRANSFORMER_VERSION = "c5f-1";
|
|
670
752
|
var ID = {
|
|
671
753
|
values: "sheet.mutation.set-range-values",
|
|
672
754
|
insertRow: "sheet.mutation.insert-row",
|
|
@@ -755,6 +837,21 @@ function buildStructural(template, axis, op) {
|
|
|
755
837
|
const start = op.kind === "insert" ? op.at : op.start;
|
|
756
838
|
return { id: template.id, params: { ...p, range: { ...p.range, [a0]: start, [a1]: start + op.count - 1 } } };
|
|
757
839
|
}
|
|
840
|
+
function crossThrough(x, sy) {
|
|
841
|
+
const [a0, a1] = S(sy.axis);
|
|
842
|
+
const p = x.params;
|
|
843
|
+
const params = { ...p };
|
|
844
|
+
for (const k of ["range", "sourceRange", "targetRange"]) {
|
|
845
|
+
const r = p[k];
|
|
846
|
+
if (!r || typeof r[a0] !== "number" || typeof r[a1] !== "number") continue;
|
|
847
|
+
const spans = spanThrough(sy.op, r[a0], r[a1]);
|
|
848
|
+
if (!spans.length) continue;
|
|
849
|
+
const lo = r[a0] === 0 ? 0 : Math.min(...spans.map(([l]) => l));
|
|
850
|
+
const hi = Math.max(...spans.map(([, h]) => h));
|
|
851
|
+
params[k] = { ...r, [a0]: lo, [a1]: hi };
|
|
852
|
+
}
|
|
853
|
+
return { id: x.id, params };
|
|
854
|
+
}
|
|
758
855
|
function univerMutationInfo(axis, op) {
|
|
759
856
|
const FULL2 = { startRow: 0, endRow: Number.MAX_SAFE_INTEGER, startColumn: 0, endColumn: Number.MAX_SAFE_INTEGER };
|
|
760
857
|
const start = op.kind === "insert" ? op.at : op.start;
|
|
@@ -1478,7 +1575,7 @@ function annotateSheetOpsInOrder(group, sheetOrder) {
|
|
|
1478
1575
|
let structural = false;
|
|
1479
1576
|
return group.map((m0) => {
|
|
1480
1577
|
if (structuralOf(m0)) structural = true;
|
|
1481
|
-
const m = structural && rangedSpecOf(m0.id) && !isDerived(m0) ? { id: m0.id, params: { ...m0.params, derived: true } } : m0;
|
|
1578
|
+
const m = structural && (rangedSpecOf(m0.id) || isNoteMutation(m0.id)) && !isDerived(m0) ? { id: m0.id, params: { ...m0.params, derived: true } } : m0;
|
|
1482
1579
|
if (m.id === ID.insertSheet) {
|
|
1483
1580
|
const index = typeof m.params.index === "number" ? Math.min(m.params.index, order.length) : order.length;
|
|
1484
1581
|
order.splice(index, 0, sheetIdOf(m));
|
|
@@ -1725,7 +1822,7 @@ function transformMutation(x, y, side) {
|
|
|
1725
1822
|
const np = numfmtPair(x, y, side, sx, sy);
|
|
1726
1823
|
if (np) return np;
|
|
1727
1824
|
if (sx && sy) {
|
|
1728
|
-
if (sx.axis !== sy.axis) return ok2([x]);
|
|
1825
|
+
if (sx.axis !== sy.axis) return ok2([crossThrough(x, sy)]);
|
|
1729
1826
|
const out = transformAxis(sx.op, sy.op, side);
|
|
1730
1827
|
if (!out) return barrier2(`${x.id} over ${y.id}: moved blocks overlap in part, or the block would split`);
|
|
1731
1828
|
const dropped = out.length === 0 && sx.op.kind === "move" ? [`${sheetOf(x)}: moved ${sx.axis}s`] : [];
|