@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.
@@ -1693,6 +1693,7 @@ var SHEET_MUTATIONS = {
1693
1693
  "sheet.mutation.insert-sheet": covered("sheet", "index", "sheet"),
1694
1694
  "sheet.mutation.remove-sheet": covered("sheet", "sheetIndex", "sheetsLeft"),
1695
1695
  "sheet.mutation.set-worksheet-order": covered("sheet", "fromOrder", "toOrder"),
1696
+ "sheet.mutation.reorder-range": covered("sort", "range", "order"),
1696
1697
  // ── never travels ────────────────────────────────────────────────────────────────────────────────
1697
1698
  "formula.mutation.set-formula-calculation-start": never(FORMULA_RESULT),
1698
1699
  "formula.mutation.set-trigger-formula-calculation-start": never(FORMULA_RESULT),
@@ -1726,7 +1727,6 @@ var SHEET_MUTATIONS = {
1726
1727
  "thread-comment.mutation.resolve-comment": never(UNIVER_COMMENTS),
1727
1728
  "thread-comment.mutation.delete-comment": never(UNIVER_COMMENTS),
1728
1729
  // ── barriers: X (no transform yet, design §10) ───────────────────────────────────────────────────
1729
- "sheet.mutation.reorder-range": barrier("X", "sort: a permutation, not transformed yet"),
1730
1730
  "sheet.mutation.move-range": barrier("X", "cut-paste carries the sender's cell matrices"),
1731
1731
  "sheet.mutation.set-worksheet-hidden": barrier("X", "sheet-level setting: not in C5a"),
1732
1732
  "sheet.mutation.set-tab-color": barrier("X", "sheet-level setting: not in C5a"),
@@ -2169,7 +2169,8 @@ var ID = {
2169
2169
  colCount: "sheet.mutation.set-worksheet-column-count",
2170
2170
  insertSheet: "sheet.mutation.insert-sheet",
2171
2171
  removeSheet: "sheet.mutation.remove-sheet",
2172
- sheetOrder: "sheet.mutation.set-worksheet-order"
2172
+ sheetOrder: "sheet.mutation.set-worksheet-order",
2173
+ sort: "sheet.mutation.reorder-range"
2173
2174
  };
2174
2175
  var PAIR_BARRIERS = {};
2175
2176
  var pairKey = (a, b) => a < b ? `${a}|${b}` : `${b}|${a}`;
@@ -2966,6 +2967,119 @@ function inlineSheetStyles(sheet, styleOf) {
2966
2967
  }
2967
2968
  return out;
2968
2969
  }
2970
+ var isSort = (m) => m.id === ID.sort;
2971
+ function sortOf(m) {
2972
+ const P = /* @__PURE__ */ new Map();
2973
+ for (const [t, src] of Object.entries(m.params.order ?? {})) P.set(Number(t), Number(src));
2974
+ return { range: { ...m.params.range }, P };
2975
+ }
2976
+ var sortQ = (o) => new Map([...o.P].map(([t, s0]) => [s0, t]));
2977
+ function buildSort(template, o) {
2978
+ const order = {};
2979
+ for (const [t, s0] of [...o.P].sort((a, b) => a[0] - b[0])) if (t !== s0) order[t] = s0;
2980
+ if (!Object.keys(order).length || o.range.startRow > o.range.endRow || o.range.startColumn > o.range.endColumn) return [];
2981
+ return [{ id: template.id, params: { ...template.params, range: o.range, order } }];
2982
+ }
2983
+ var inSortCols = (o, c) => c >= o.range.startColumn && c <= o.range.endColumn;
2984
+ function sortThrough(o, st) {
2985
+ const r = o.range;
2986
+ if (st.axis === "col") {
2987
+ if (st.op.kind === "move") {
2988
+ const { from, count, to } = st.op;
2989
+ const touches = !(from + count - 1 < r.startColumn || from > r.endColumn) || to > r.startColumn && to <= r.endColumn;
2990
+ if (touches) return null;
2991
+ const spans3 = spanThrough(st.op, r.startColumn, r.endColumn);
2992
+ return spans3.length === 1 ? { range: { ...r, startColumn: spans3[0][0], endColumn: spans3[0][1] }, P: o.P } : null;
2993
+ }
2994
+ const spans2 = spanThrough(st.op, r.startColumn, r.endColumn);
2995
+ if (!spans2.length) return { range: { ...r, startColumn: 1, endColumn: 0 }, P: /* @__PURE__ */ new Map() };
2996
+ return { range: { ...r, startColumn: spans2[0][0], endColumn: spans2[spans2.length - 1][1] }, P: o.P };
2997
+ }
2998
+ const op = st.op;
2999
+ if (op.kind === "move") {
3000
+ const touches = !(op.from + op.count - 1 < r.startRow || op.from > r.endRow) || op.to > r.startRow && op.to <= r.endRow;
3001
+ if (touches) return null;
3002
+ }
3003
+ if (op.kind === "insert" || op.kind === "move") {
3004
+ const P2 = /* @__PURE__ */ new Map();
3005
+ for (const [t, s0] of o.P) P2.set(mapIndex(op, t), mapIndex(op, s0));
3006
+ const spans2 = spanThrough(op, r.startRow, r.endRow);
3007
+ return { range: { ...r, startRow: spans2[0][0], endRow: spans2[spans2.length - 1][1] }, P: P2 };
3008
+ }
3009
+ const removed = (i) => i >= op.start && i < op.start + op.count;
3010
+ const Q = sortQ(o);
3011
+ const goneTargets = [];
3012
+ for (let i = op.start; i < op.start + op.count; i++) goneTargets.push(Q.get(i) ?? i);
3013
+ goneTargets.sort((a, b) => a - b);
3014
+ const compact = (t) => t - goneTargets.filter((g) => g < t).length;
3015
+ const P = /* @__PURE__ */ new Map();
3016
+ for (const [t, s0] of o.P) if (!removed(s0)) P.set(compact(t), mapIndex(op, s0));
3017
+ const spans = spanThrough(op, r.startRow, r.endRow);
3018
+ if (!spans.length) return { range: { ...r, startRow: 1, endRow: 0 }, P: /* @__PURE__ */ new Map() };
3019
+ return { range: { ...r, startRow: spans[0][0], endRow: spans[spans.length - 1][1] }, P };
3020
+ }
3021
+ function sortPair(x, y, sx, sy) {
3022
+ const xs = isSort(x);
3023
+ const ys = isSort(y);
3024
+ if (!xs && !ys) return null;
3025
+ if (xs && ys) {
3026
+ const a = sortOf(x).range;
3027
+ const b = sortOf(y).range;
3028
+ const overlap = a.startRow <= b.endRow && b.startRow <= a.endRow && a.startColumn <= b.endColumn && b.startColumn <= a.endColumn;
3029
+ return overlap ? barrier2("two sorts of overlapping ranges at once") : ok([x]);
3030
+ }
3031
+ if (xs) {
3032
+ if (sy) {
3033
+ const t = sortThrough(sortOf(x), sy);
3034
+ return t ? ok(buildSort(x, t)) : barrier2("a row or column move through a sorted range");
3035
+ }
3036
+ return ok([x]);
3037
+ }
3038
+ const o = sortOf(y);
3039
+ const Q = sortQ(o);
3040
+ const moved = (r) => r >= o.range.startRow && r <= o.range.endRow && Q.has(r);
3041
+ if (sx) {
3042
+ if (sx.axis === "col") return sx.op.kind === "move" && !sortThrough(o, sx) ? barrier2("a column move through a sorted range") : ok([x]);
3043
+ if (sx.op.kind === "insert") return ok([x]);
3044
+ if (sx.op.kind === "move") return sortThrough(o, sx) ? ok([x]) : barrier2("a row move through a sorted range");
3045
+ const rows = [];
3046
+ let partial = false;
3047
+ for (let i = sx.op.start; i < sx.op.start + sx.op.count; i++) {
3048
+ if (moved(i)) partial = true;
3049
+ rows.push(Q.get(i) ?? i);
3050
+ }
3051
+ if (partial) return barrier2("a row remove against a concurrent sort of those rows");
3052
+ return ok([x]);
3053
+ }
3054
+ if (x.id === ID.values) {
3055
+ const out = {};
3056
+ let changed = false;
3057
+ forEachCell(cellsOf(x), (r, c, v) => {
3058
+ if (inSortCols(o, c) && moved(r)) {
3059
+ putCell(out, Q.get(r), c, v);
3060
+ changed = true;
3061
+ } else putCell(out, r, c, v);
3062
+ });
3063
+ return changed ? ok([cellsMutation(x, out)]) : ok([x]);
3064
+ }
3065
+ if (isNumfmt(x)) {
3066
+ const parts = nfParts(x).map((p) => {
3067
+ const ranges = [];
3068
+ for (const rc of p.ranges) {
3069
+ 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) };
3070
+ if (inner.startRow > inner.endRow || inner.startColumn > inner.endColumn) {
3071
+ ranges.push(rc);
3072
+ continue;
3073
+ }
3074
+ ranges.push(...rectMinus(rc, inner));
3075
+ for (let r = inner.startRow; r <= inner.endRow; r++) ranges.push({ ...inner, startRow: Q.get(r) ?? r, endRow: Q.get(r) ?? r });
3076
+ }
3077
+ return { ...p, ranges };
3078
+ });
3079
+ return ok(nfBuild(x, parts));
3080
+ }
3081
+ return ok([x]);
3082
+ }
2969
3083
  function familyOf(id) {
2970
3084
  const e = SHEET_MUTATIONS[id];
2971
3085
  return e && e.kind === "covered" ? e.family : "";
@@ -2991,6 +3105,8 @@ function transformMutation(x, y, side) {
2991
3105
  const fy = familyOf(y.id);
2992
3106
  const sy = structuralOf(y);
2993
3107
  const sx = structuralOf(x);
3108
+ const sortp = sortPair(x, y, sx, sy);
3109
+ if (sortp) return sortp;
2994
3110
  const cp = countPair(x, y, sy);
2995
3111
  if (cp) return cp;
2996
3112
  const np = numfmtPair(x, y, side, sx, sy);
@@ -3697,6 +3813,11 @@ function univerSheetsOtPort(o) {
3697
3813
  return { m, inverse: [{ id: "sheet.mutation.remove-col", params: { subUnitId: sheet, range: json(params.range) } }] };
3698
3814
  case ADD_MERGE:
3699
3815
  return { m, inverse: [{ id: REMOVE_MERGE, params: { subUnitId: sheet, ranges: json(params.ranges) } }] };
3816
+ case "sheet.mutation.reorder-range": {
3817
+ const order = {};
3818
+ for (const [t, src] of Object.entries(params.order ?? {})) order[String(src)] = Number(t);
3819
+ return { m, inverse: [{ id: info.id, params: { subUnitId: sheet, range: json(params.range), order } }] };
3820
+ }
3700
3821
  case SHEET_NAME:
3701
3822
  return { m, inverse: before2.name !== void 0 ? [{ id: SHEET_NAME, params: { subUnitId: sheet, name: before2.name } }] : void 0 };
3702
3823
  default: