@ai-matrx/office 0.8.21 → 0.8.22

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.
@@ -1766,6 +1766,7 @@ var SHEET_MUTATIONS = {
1766
1766
  "sheet.mutation.insert-sheet": covered("sheet", "index", "sheet"),
1767
1767
  "sheet.mutation.remove-sheet": covered("sheet", "sheetIndex", "sheetsLeft"),
1768
1768
  "sheet.mutation.set-worksheet-order": covered("sheet", "fromOrder", "toOrder"),
1769
+ "sheet.mutation.reorder-range": covered("sort", "range", "order"),
1769
1770
  // ── never travels ────────────────────────────────────────────────────────────────────────────────
1770
1771
  "formula.mutation.set-formula-calculation-start": never(FORMULA_RESULT),
1771
1772
  "formula.mutation.set-trigger-formula-calculation-start": never(FORMULA_RESULT),
@@ -1799,7 +1800,6 @@ var SHEET_MUTATIONS = {
1799
1800
  "thread-comment.mutation.resolve-comment": never(UNIVER_COMMENTS),
1800
1801
  "thread-comment.mutation.delete-comment": never(UNIVER_COMMENTS),
1801
1802
  // ── barriers: X (no transform yet, design §10) ───────────────────────────────────────────────────
1802
- "sheet.mutation.reorder-range": barrier("X", "sort: a permutation, not transformed yet"),
1803
1803
  "sheet.mutation.move-range": barrier("X", "cut-paste carries the sender's cell matrices"),
1804
1804
  "sheet.mutation.set-worksheet-hidden": barrier("X", "sheet-level setting: not in C5a"),
1805
1805
  "sheet.mutation.set-tab-color": barrier("X", "sheet-level setting: not in C5a"),
@@ -2233,7 +2233,8 @@ var ID = {
2233
2233
  colCount: "sheet.mutation.set-worksheet-column-count",
2234
2234
  insertSheet: "sheet.mutation.insert-sheet",
2235
2235
  removeSheet: "sheet.mutation.remove-sheet",
2236
- sheetOrder: "sheet.mutation.set-worksheet-order"
2236
+ sheetOrder: "sheet.mutation.set-worksheet-order",
2237
+ sort: "sheet.mutation.reorder-range"
2237
2238
  };
2238
2239
  var PAIR_BARRIERS = {};
2239
2240
  var pairKey = (a, b) => a < b ? `${a}|${b}` : `${b}|${a}`;
@@ -3030,6 +3031,119 @@ function inlineSheetStyles(sheet, styleOf) {
3030
3031
  }
3031
3032
  return out;
3032
3033
  }
3034
+ var isSort = (m) => m.id === ID.sort;
3035
+ function sortOf(m) {
3036
+ const P = /* @__PURE__ */ new Map();
3037
+ for (const [t, src] of Object.entries(m.params.order ?? {})) P.set(Number(t), Number(src));
3038
+ return { range: { ...m.params.range }, P };
3039
+ }
3040
+ var sortQ = (o) => new Map([...o.P].map(([t, s0]) => [s0, t]));
3041
+ function buildSort(template, o) {
3042
+ const order = {};
3043
+ for (const [t, s0] of [...o.P].sort((a, b) => a[0] - b[0])) if (t !== s0) order[t] = s0;
3044
+ if (!Object.keys(order).length || o.range.startRow > o.range.endRow || o.range.startColumn > o.range.endColumn) return [];
3045
+ return [{ id: template.id, params: { ...template.params, range: o.range, order } }];
3046
+ }
3047
+ var inSortCols = (o, c) => c >= o.range.startColumn && c <= o.range.endColumn;
3048
+ function sortThrough(o, st) {
3049
+ const r = o.range;
3050
+ if (st.axis === "col") {
3051
+ if (st.op.kind === "move") {
3052
+ const { from, count, to } = st.op;
3053
+ const touches = !(from + count - 1 < r.startColumn || from > r.endColumn) || to > r.startColumn && to <= r.endColumn;
3054
+ if (touches) return null;
3055
+ const spans3 = spanThrough(st.op, r.startColumn, r.endColumn);
3056
+ return spans3.length === 1 ? { range: { ...r, startColumn: spans3[0][0], endColumn: spans3[0][1] }, P: o.P } : null;
3057
+ }
3058
+ const spans2 = spanThrough(st.op, r.startColumn, r.endColumn);
3059
+ if (!spans2.length) return { range: { ...r, startColumn: 1, endColumn: 0 }, P: /* @__PURE__ */ new Map() };
3060
+ return { range: { ...r, startColumn: spans2[0][0], endColumn: spans2[spans2.length - 1][1] }, P: o.P };
3061
+ }
3062
+ const op = st.op;
3063
+ if (op.kind === "move") {
3064
+ const touches = !(op.from + op.count - 1 < r.startRow || op.from > r.endRow) || op.to > r.startRow && op.to <= r.endRow;
3065
+ if (touches) return null;
3066
+ }
3067
+ if (op.kind === "insert" || op.kind === "move") {
3068
+ const P2 = /* @__PURE__ */ new Map();
3069
+ for (const [t, s0] of o.P) P2.set(mapIndex(op, t), mapIndex(op, s0));
3070
+ const spans2 = spanThrough(op, r.startRow, r.endRow);
3071
+ return { range: { ...r, startRow: spans2[0][0], endRow: spans2[spans2.length - 1][1] }, P: P2 };
3072
+ }
3073
+ const removed = (i) => i >= op.start && i < op.start + op.count;
3074
+ const Q = sortQ(o);
3075
+ const goneTargets = [];
3076
+ for (let i = op.start; i < op.start + op.count; i++) goneTargets.push(Q.get(i) ?? i);
3077
+ goneTargets.sort((a, b) => a - b);
3078
+ const compact = (t) => t - goneTargets.filter((g) => g < t).length;
3079
+ const P = /* @__PURE__ */ new Map();
3080
+ for (const [t, s0] of o.P) if (!removed(s0)) P.set(compact(t), mapIndex(op, s0));
3081
+ const spans = spanThrough(op, r.startRow, r.endRow);
3082
+ if (!spans.length) return { range: { ...r, startRow: 1, endRow: 0 }, P: /* @__PURE__ */ new Map() };
3083
+ return { range: { ...r, startRow: spans[0][0], endRow: spans[spans.length - 1][1] }, P };
3084
+ }
3085
+ function sortPair(x, y, sx, sy) {
3086
+ const xs = isSort(x);
3087
+ const ys = isSort(y);
3088
+ if (!xs && !ys) return null;
3089
+ if (xs && ys) {
3090
+ const a = sortOf(x).range;
3091
+ const b = sortOf(y).range;
3092
+ const overlap = a.startRow <= b.endRow && b.startRow <= a.endRow && a.startColumn <= b.endColumn && b.startColumn <= a.endColumn;
3093
+ return overlap ? barrier2("two sorts of overlapping ranges at once") : ok([x]);
3094
+ }
3095
+ if (xs) {
3096
+ if (sy) {
3097
+ const t = sortThrough(sortOf(x), sy);
3098
+ return t ? ok(buildSort(x, t)) : barrier2("a row or column move through a sorted range");
3099
+ }
3100
+ return ok([x]);
3101
+ }
3102
+ const o = sortOf(y);
3103
+ const Q = sortQ(o);
3104
+ const moved = (r) => r >= o.range.startRow && r <= o.range.endRow && Q.has(r);
3105
+ if (sx) {
3106
+ if (sx.axis === "col") return sx.op.kind === "move" && !sortThrough(o, sx) ? barrier2("a column move through a sorted range") : ok([x]);
3107
+ if (sx.op.kind === "insert") return ok([x]);
3108
+ if (sx.op.kind === "move") return sortThrough(o, sx) ? ok([x]) : barrier2("a row move through a sorted range");
3109
+ const rows = [];
3110
+ let partial = false;
3111
+ for (let i = sx.op.start; i < sx.op.start + sx.op.count; i++) {
3112
+ if (moved(i)) partial = true;
3113
+ rows.push(Q.get(i) ?? i);
3114
+ }
3115
+ if (partial) return barrier2("a row remove against a concurrent sort of those rows");
3116
+ return ok([x]);
3117
+ }
3118
+ if (x.id === ID.values) {
3119
+ const out = {};
3120
+ let changed = false;
3121
+ forEachCell(cellsOf(x), (r, c, v) => {
3122
+ if (inSortCols(o, c) && moved(r)) {
3123
+ putCell(out, Q.get(r), c, v);
3124
+ changed = true;
3125
+ } else putCell(out, r, c, v);
3126
+ });
3127
+ return changed ? ok([cellsMutation(x, out)]) : ok([x]);
3128
+ }
3129
+ if (isNumfmt(x)) {
3130
+ const parts = nfParts(x).map((p) => {
3131
+ const ranges = [];
3132
+ for (const rc of p.ranges) {
3133
+ const inner = { ...rc, startRow: Math.max(rc.startRow, o.range.startRow), endRow: Math.min(rc.endRow, o.range.endRow), startColumn: Math.max(rc.startColumn, o.range.startColumn), endColumn: Math.min(rc.endColumn, o.range.endColumn) };
3134
+ if (inner.startRow > inner.endRow || inner.startColumn > inner.endColumn) {
3135
+ ranges.push(rc);
3136
+ continue;
3137
+ }
3138
+ ranges.push(...rectMinus(rc, inner));
3139
+ for (let r = inner.startRow; r <= inner.endRow; r++) ranges.push({ ...inner, startRow: Q.get(r) ?? r, endRow: Q.get(r) ?? r });
3140
+ }
3141
+ return { ...p, ranges };
3142
+ });
3143
+ return ok(nfBuild(x, parts));
3144
+ }
3145
+ return ok([x]);
3146
+ }
3033
3147
  function familyOf(id) {
3034
3148
  const e = SHEET_MUTATIONS[id];
3035
3149
  return e && e.kind === "covered" ? e.family : "";
@@ -3055,6 +3169,8 @@ function transformMutation(x, y, side) {
3055
3169
  const fy = familyOf(y.id);
3056
3170
  const sy = structuralOf(y);
3057
3171
  const sx = structuralOf(x);
3172
+ const sortp = sortPair(x, y, sx, sy);
3173
+ if (sortp) return sortp;
3058
3174
  const cp = countPair(x, y, sy);
3059
3175
  if (cp) return cp;
3060
3176
  const np = numfmtPair(x, y, side, sx, sy);
@@ -3761,6 +3877,11 @@ function univerSheetsOtPort(o) {
3761
3877
  return { m, inverse: [{ id: "sheet.mutation.remove-col", params: { subUnitId: sheet, range: json(params.range) } }] };
3762
3878
  case ADD_MERGE:
3763
3879
  return { m, inverse: [{ id: REMOVE_MERGE, params: { subUnitId: sheet, ranges: json(params.ranges) } }] };
3880
+ case "sheet.mutation.reorder-range": {
3881
+ const order = {};
3882
+ for (const [t, src] of Object.entries(params.order ?? {})) order[String(src)] = Number(t);
3883
+ return { m, inverse: [{ id: info.id, params: { subUnitId: sheet, range: json(params.range), order } }] };
3884
+ }
3764
3885
  case SHEET_NAME:
3765
3886
  return { m, inverse: before2.name !== void 0 ? [{ id: SHEET_NAME, params: { subUnitId: sheet, name: before2.name } }] : void 0 };
3766
3887
  default: