@w100n/documents 0.15.0 → 0.16.0
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/dist/Compare-M57FG4R3.js +96 -0
- package/dist/Compare-M57FG4R3.js.map +1 -0
- package/dist/{SheetView-72KXS4DM.js → SheetView-EFBSMY7K.js} +6 -4
- package/dist/{SheetView-72KXS4DM.js.map → SheetView-EFBSMY7K.js.map} +1 -1
- package/dist/{TextEditor-NSICFE6U.js → TextEditor-MGCSGGGA.js} +128 -43
- package/dist/TextEditor-MGCSGGGA.js.map +1 -0
- package/dist/{chunk-Z7UNJ4ND.js → chunk-2L3TK7UF.js} +87 -411
- package/dist/chunk-2L3TK7UF.js.map +1 -0
- package/dist/{chunk-OXC4PUOC.js → chunk-3OLRFIHQ.js} +2 -2
- package/dist/chunk-EQLBYW42.js +458 -0
- package/dist/chunk-EQLBYW42.js.map +1 -0
- package/dist/chunk-RKV3N6OS.js +1011 -0
- package/dist/chunk-RKV3N6OS.js.map +1 -0
- package/dist/{chunk-M4OQG3EN.js → chunk-ZAVXCH7V.js} +55 -1034
- package/dist/chunk-ZAVXCH7V.js.map +1 -0
- package/dist/collab.cjs +350 -202
- package/dist/collab.cjs.map +1 -1
- package/dist/collab.js +4 -2
- package/dist/index.cjs +935 -602
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +135 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +19 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/TextEditor-NSICFE6U.js.map +0 -1
- package/dist/chunk-M4OQG3EN.js.map +0 -1
- package/dist/chunk-Z7UNJ4ND.js.map +0 -1
- /package/dist/{chunk-OXC4PUOC.js.map → chunk-3OLRFIHQ.js.map} +0 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import {
|
|
3
|
+
useLoad
|
|
4
|
+
} from "./chunk-QDH7EZAF.js";
|
|
5
|
+
import {
|
|
6
|
+
fromMarkdown
|
|
7
|
+
} from "./chunk-EQLBYW42.js";
|
|
8
|
+
import {
|
|
9
|
+
diff,
|
|
10
|
+
readDocx
|
|
11
|
+
} from "./chunk-ZAVXCH7V.js";
|
|
12
|
+
|
|
13
|
+
// src/Compare.tsx
|
|
14
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
|
+
var words = (text) => text.split(/(\s+)/).filter(Boolean);
|
|
16
|
+
function blocks(node, out = []) {
|
|
17
|
+
if (node.type === "paragraph" || node.type === "heading") {
|
|
18
|
+
const text = (node.content ?? []).map((n) => n.type === "text" ? n.text : n.type === "hardBreak" ? "\n" : n.type === "math" ? ` ${n.attrs?.latex} ` : "").join("").trim();
|
|
19
|
+
if (text) out.push(text);
|
|
20
|
+
} else node.content?.forEach((n) => blocks(n, out));
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
async function textOf(kind, bytes) {
|
|
24
|
+
return blocks(kind === "docx" ? (await readDocx(bytes)).doc : fromMarkdown(new TextDecoder().decode(bytes)).doc);
|
|
25
|
+
}
|
|
26
|
+
function inside(a, b) {
|
|
27
|
+
const x = words(a), y = words(b);
|
|
28
|
+
const map = diff(x, y);
|
|
29
|
+
const out = [];
|
|
30
|
+
const push = (text, op) => {
|
|
31
|
+
const last = out[out.length - 1];
|
|
32
|
+
if (last?.op === op) last.text += text;
|
|
33
|
+
else out.push({ text, op });
|
|
34
|
+
};
|
|
35
|
+
let i = 0;
|
|
36
|
+
map.forEach((from, j) => {
|
|
37
|
+
if (from < 0) {
|
|
38
|
+
const next = map.findIndex((n, at) => at > j && n >= 0);
|
|
39
|
+
while (i < (next < 0 ? x.length : map[next])) push(x[i++], "-");
|
|
40
|
+
return push(y[j], "+");
|
|
41
|
+
}
|
|
42
|
+
while (i < from) push(x[i++], "-");
|
|
43
|
+
push(y[j], "=");
|
|
44
|
+
i = from + 1;
|
|
45
|
+
});
|
|
46
|
+
while (i < x.length) push(x[i++], "-");
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
var alike = (a, b) => {
|
|
50
|
+
const x = a.split(/\s+/).filter(Boolean), y = b.split(/\s+/).filter(Boolean);
|
|
51
|
+
return diff(x, y).filter((n) => n >= 0).length / Math.max(x.length, y.length, 1);
|
|
52
|
+
};
|
|
53
|
+
function changes(before, after) {
|
|
54
|
+
const map = diff(before, after);
|
|
55
|
+
const rows = [];
|
|
56
|
+
let gone = [];
|
|
57
|
+
const drop = (n) => {
|
|
58
|
+
gone.slice(0, n).forEach((text) => rows.push({ op: "-", parts: [{ text, op: "-" }] }));
|
|
59
|
+
gone = gone.slice(n);
|
|
60
|
+
};
|
|
61
|
+
let i = 0;
|
|
62
|
+
map.forEach((from, j) => {
|
|
63
|
+
if (from >= 0) {
|
|
64
|
+
while (i < from) gone.push(before[i++]);
|
|
65
|
+
drop(gone.length);
|
|
66
|
+
rows.push({ op: "=", parts: [{ text: after[j], op: "=" }] });
|
|
67
|
+
i = from + 1;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const next = map.findIndex((n, at) => at > j && n >= 0);
|
|
71
|
+
while (i < (next < 0 ? before.length : map[next])) gone.push(before[i++]);
|
|
72
|
+
const k = gone.findIndex((old) => alike(old, after[j]) >= 0.4);
|
|
73
|
+
if (k < 0) return rows.push({ op: "+", parts: [{ text: after[j], op: "+" }] });
|
|
74
|
+
drop(k);
|
|
75
|
+
rows.push({ op: "~", parts: inside(gone.shift(), after[j]) });
|
|
76
|
+
});
|
|
77
|
+
while (i < before.length) gone.push(before[i++]);
|
|
78
|
+
drop(gone.length);
|
|
79
|
+
return rows;
|
|
80
|
+
}
|
|
81
|
+
function Compare({ host, documentId, kind, older, t }) {
|
|
82
|
+
const rows = useLoad(async (signal) => changes(await textOf(kind, older), await textOf(kind, await host.content(documentId, null, { signal }))), [host, documentId, older]);
|
|
83
|
+
if (rows.error) return /* @__PURE__ */ jsx("div", { className: "w100n-docs-empty", children: t.failed });
|
|
84
|
+
if (!rows.data) return /* @__PURE__ */ jsx("div", { className: "w100n-docs-empty", children: t.loading });
|
|
85
|
+
const added = rows.data.filter((r) => r.op === "+").length, removed = rows.data.filter((r) => r.op === "-").length, edited = rows.data.filter((r) => r.op === "~").length;
|
|
86
|
+
return /* @__PURE__ */ jsx("div", { className: "w100n-docs-scroll", children: /* @__PURE__ */ jsxs("div", { className: "w100n-docs-page w100n-compare", children: [
|
|
87
|
+
/* @__PURE__ */ jsx("p", { className: "w100n-compare-sum", children: added + removed + edited ? t.changeCount.replace("{added}", String(added)).replace("{edited}", String(edited)).replace("{removed}", String(removed)) : t.noChanges }),
|
|
88
|
+
rows.data.map((r, i) => /* @__PURE__ */ jsx("p", { "data-op": r.op, children: r.parts.map((p, k) => p.op === "=" ? p.text : p.op === "+" ? /* @__PURE__ */ jsx("ins", { children: p.text }, k) : /* @__PURE__ */ jsx("del", { children: p.text }, k)) }, i))
|
|
89
|
+
] }) });
|
|
90
|
+
}
|
|
91
|
+
export {
|
|
92
|
+
changes,
|
|
93
|
+
Compare as default,
|
|
94
|
+
textOf
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=Compare-M57FG4R3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Compare.tsx"],"sourcesContent":["import type { JSONContent } from '@tiptap/core';\nimport { readDocx } from './docx';\nimport { diff } from './docx/diff';\nimport { fromMarkdown } from './editor/markdown';\nimport type { Text } from './text';\nimport type { DocumentsHost } from './types';\nimport { useLoad } from './useLoad';\n\ntype Part = { text: string; op: '=' | '+' | '-' };\nexport type Row = { op: '=' | '+' | '-' | '~'; parts: Part[] };\n\nconst words = (text: string) => text.split(/(\\s+)/).filter(Boolean);\n\nfunction blocks(node: JSONContent, out: string[] = []): string[] {\n if (node.type === 'paragraph' || node.type === 'heading') {\n const text = (node.content ?? []).map(n => n.type === 'text' ? n.text : n.type === 'hardBreak' ? '\\n' : n.type === 'math' ? ` ${n.attrs?.latex} ` : '').join('').trim();\n if (text) out.push(text);\n } else node.content?.forEach(n => blocks(n, out));\n return out;\n}\n\nexport async function textOf(kind: 'docx' | 'markdown', bytes: ArrayBuffer): Promise<string[]> {\n return blocks(kind === 'docx' ? (await readDocx(bytes)).doc : fromMarkdown(new TextDecoder().decode(bytes)).doc);\n}\n\nfunction inside(a: string, b: string): Part[] {\n const x = words(a), y = words(b);\n const map = diff(x, y);\n const out: Part[] = [];\n const push = (text: string, op: Part['op']) => {\n const last = out[out.length - 1];\n if (last?.op === op) last.text += text;\n else out.push({ text, op });\n };\n let i = 0;\n map.forEach((from, j) => {\n if (from < 0) {\n const next = map.findIndex((n, at) => at > j && n >= 0);\n while (i < (next < 0 ? x.length : map[next])) push(x[i++], '-');\n return push(y[j], '+');\n }\n while (i < from) push(x[i++], '-');\n push(y[j], '=');\n i = from + 1;\n });\n while (i < x.length) push(x[i++], '-');\n return out;\n}\n\nconst alike = (a: string, b: string) => {\n const x = a.split(/\\s+/).filter(Boolean), y = b.split(/\\s+/).filter(Boolean);\n return diff(x, y).filter(n => n >= 0).length / Math.max(x.length, y.length, 1);\n};\n\nexport function changes(before: string[], after: string[]): Row[] {\n const map = diff(before, after);\n const rows: Row[] = [];\n let gone: string[] = [];\n const drop = (n: number) => {\n gone.slice(0, n).forEach(text => rows.push({ op: '-', parts: [{ text, op: '-' }] }));\n gone = gone.slice(n);\n };\n let i = 0;\n map.forEach((from, j) => {\n if (from >= 0) {\n while (i < from) gone.push(before[i++]);\n drop(gone.length);\n rows.push({ op: '=', parts: [{ text: after[j], op: '=' }] });\n i = from + 1;\n return;\n }\n const next = map.findIndex((n, at) => at > j && n >= 0);\n while (i < (next < 0 ? before.length : map[next])) gone.push(before[i++]);\n const k = gone.findIndex(old => alike(old, after[j]) >= 0.4);\n if (k < 0) return rows.push({ op: '+', parts: [{ text: after[j], op: '+' }] });\n drop(k);\n rows.push({ op: '~', parts: inside(gone.shift()!, after[j]) });\n });\n while (i < before.length) gone.push(before[i++]);\n drop(gone.length);\n return rows;\n}\n\nexport default function Compare({ host, documentId, kind, older, t }: { host: DocumentsHost; documentId: string; kind: 'docx' | 'markdown'; older: ArrayBuffer; t: Text }) {\n const rows = useLoad(async signal => changes(await textOf(kind, older), await textOf(kind, await host.content(documentId, null, { signal }))), [host, documentId, older]);\n if (rows.error) return <div className=\"w100n-docs-empty\">{t.failed}</div>;\n if (!rows.data) return <div className=\"w100n-docs-empty\">{t.loading}</div>;\n const added = rows.data.filter(r => r.op === '+').length, removed = rows.data.filter(r => r.op === '-').length, edited = rows.data.filter(r => r.op === '~').length;\n return <div className=\"w100n-docs-scroll\">\n <div className=\"w100n-docs-page w100n-compare\">\n <p className=\"w100n-compare-sum\">{added + removed + edited ? t.changeCount.replace('{added}', String(added)).replace('{edited}', String(edited)).replace('{removed}', String(removed)) : t.noChanges}</p>\n {rows.data.map((r, i) => <p key={i} data-op={r.op}>{r.parts.map((p, k) => p.op === '=' ? p.text : p.op === '+' ? <ins key={k}>{p.text}</ins> : <del key={k}>{p.text}</del>)}</p>)}\n </div>\n </div>;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import {
|
|
3
3
|
useLive
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-3OLRFIHQ.js";
|
|
5
5
|
import {
|
|
6
6
|
SheetRefusal,
|
|
7
7
|
build,
|
|
@@ -25,12 +25,14 @@ import {
|
|
|
25
25
|
strip,
|
|
26
26
|
worksheets,
|
|
27
27
|
writeSheet
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-2L3TK7UF.js";
|
|
29
|
+
import "./chunk-EQLBYW42.js";
|
|
29
30
|
import {
|
|
30
31
|
rove,
|
|
31
32
|
useRestore
|
|
32
33
|
} from "./chunk-TDP6OJET.js";
|
|
33
|
-
import "./chunk-
|
|
34
|
+
import "./chunk-RKV3N6OS.js";
|
|
35
|
+
import "./chunk-ZAVXCH7V.js";
|
|
34
36
|
import {
|
|
35
37
|
span
|
|
36
38
|
} from "./chunk-ISOOUYLI.js";
|
|
@@ -966,4 +968,4 @@ export {
|
|
|
966
968
|
readSheet,
|
|
967
969
|
writeSheet
|
|
968
970
|
};
|
|
969
|
-
//# sourceMappingURL=SheetView-
|
|
971
|
+
//# sourceMappingURL=SheetView-EFBSMY7K.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sheets/SheetView.tsx","../src/sheets/bind.ts","../src/sheets/engine.ts"],"sourcesContent":["import { useEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode } from 'react';\nimport {\n ArrowDownAZ, ArrowDownZA, Baseline, DecimalsArrowLeft, DecimalsArrowRight, Euro, Percent, Sigma, BetweenHorizontalEnd, BetweenHorizontalStart, BetweenVerticalEnd, BetweenVerticalStart, Bold, ChevronDown, Funnel, Grid2x2,\n Italic, PaintBucket, PanelBottom, Redo2, Save, Search, Snowflake, Square, SquareDashed, StickyNote, Strikethrough, TableCellsMerge, TableCellsSplit, TableColumnsSplit,\n TableRowsSplit, TextAlignCenter, TextAlignEnd, TextAlignStart, TextWrap, Underline, Undo2, WifiOff, type LucideIcon,\n} from 'lucide-react';\nimport { CellValueType, type BorderStyleTypes, type BorderType } from '@univerjs/core';\nimport type { FUniver } from '@univerjs/core/facade';\nimport { useLive } from '../editor/live';\nimport { rove, useRestore } from '../focus';\nimport type { DocumentsHost, Language, Rights } from '../types';\nimport type { Guard } from '../Unsaved';\nimport { bind } from './bind';\nimport { readSheet, writeSheet } from './book';\nimport { snapshot, track } from './engine';\nimport type { Mark } from './grid';\nimport { rebase, SheetRefusal, type SheetModel } from './model';\nimport { span } from './refs';\nimport { build, extras } from './shared';\nimport { sheetTexts } from './text';\nimport { worksheets } from './xlsx';\nimport './sheets.css';\n\nexport { readSheet, writeSheet };\n\nexport const decimals = (pattern: string, step: number) => {\n const p = pattern === 'General' ? '0' : pattern;\n const next = Math.max(0, (/0(?:\\.(0+))?/.exec(p)?.[1]?.length ?? 0) + step);\n return p.replace(/0(?:\\.0+)?/, `0${next ? `.${'0'.repeat(next)}` : ''}`);\n};\n\nconst letters = (c: number) => {\n let s = '';\n for (let n = c + 1; n > 0; n = Math.floor((n - 1) / 26)) s = String.fromCharCode(65 + (n - 1) % 26) + s;\n return s;\n};\n\nexport function autoSum(r: { startRow: number; endRow: number; startColumn: number; endColumn: number }, numeric: (row: number, col: number) => boolean) {\n if (r.startRow !== r.endRow || r.startColumn !== r.endColumn) {\n return Array.from({ length: r.endColumn - r.startColumn + 1 }, (_, i) => {\n const col = r.startColumn + i;\n return { row: r.endRow + 1, col, f: `=SUM(${letters(col)}${r.startRow + 1}:${letters(col)}${r.endRow + 1})` };\n });\n }\n let top = r.startRow;\n while (top > 0 && numeric(top - 1, r.startColumn)) top--;\n if (top < r.startRow) return [{ row: r.startRow, col: r.startColumn, f: `=SUM(${letters(r.startColumn)}${top + 1}:${letters(r.startColumn)}${r.startRow})` }];\n let left = r.startColumn;\n while (left > 0 && numeric(r.startRow, left - 1)) left--;\n return left < r.startColumn ? [{ row: r.startRow, col: r.startColumn, f: `=SUM(${letters(left)}${r.startRow + 1}:${letters(r.startColumn - 1)}${r.startRow + 1})` }] : [];\n}\n\ntype Look = { bl: boolean; it: boolean; ul: boolean; st: boolean; ht: number; tb: boolean; merged: boolean; n: string; cl: string; bg: string };\ntype Live = { api: FUniver; model: SheetModel; original: ArrayBuffer; changes: number; marks?: { show: (list: Mark[]) => void; dispose: () => void } };\n\nexport function SheetView({ bytes, name, kind, rights, language, theme, onChange, onSaveRequest, guard, host, together, documentId = '', onSaved }: {\n bytes: ArrayBuffer; name: string; kind: 'xlsx' | 'csv'; rights: Rights; language: Language; theme: 'light' | 'dark';\n onChange?: (dirty: boolean) => void; onSaveRequest?: (bytes: ArrayBuffer, note: string) => Promise<unknown>; guard?: Guard;\n host?: DocumentsHost; together?: boolean; documentId?: string; onSaved?: () => void;\n}) {\n const t = sheetTexts[language];\n const box = useRef<HTMLDivElement>(null);\n const live = useRef<Live | null>(null);\n const room = useLive(together ? host : undefined, documentId, kind, bytes, undefined, language, rights.edit && !!onSaveRequest, onSaved);\n const shared = room?.ready ? room.wire : null;\n const waiting = !!room && !shared && !room.late && !room.denied;\n const [phase, setPhase] = useState<'loading' | 'ready' | 'failed'>('loading');\n const [attempt, setAttempt] = useState(0);\n const [dirty, setDirty] = useState(false);\n const [saving, setSaving] = useState<'idle' | 'busy' | 'done' | 'failed'>('idle');\n const [refusal, setRefusal] = useState<SheetRefusal | null>(null);\n const [pop, setPop] = useState<'text' | 'fill' | 'border' | 'format' | 'freeze' | null>(null);\n const [look, setLook] = useState<Look | null>(null);\n const edit = rights.edit && !!onSaveRequest && (!room || (!!shared && !room.readonly));\n const notes = !edit && rights.comment && !!onSaveRequest && !room;\n\n useEffect(() => {\n if (waiting) return;\n let gone = false;\n let stop = () => {};\n let model: SheetModel;\n let moved = false;\n const change = () => { moved = true; };\n try {\n model = shared ? extras(shared.doc, build(shared.doc)) : readSheet(bytes, kind);\n } catch {\n setPhase('failed');\n return;\n }\n shared?.doc.on('update', change);\n setPhase('loading');\n setDirty(false);\n const families = new Set([model.book.defaultStyle, ...Object.values(model.book.styles)].map(s => typeof s === 'object' ? s?.ff : null).filter(Boolean));\n const fonts = Promise.race([Promise.all([...families].flatMap(f => ['', 'bold ', 'italic '].map(w => document.fonts.load(`${w}11pt \"${f}\"`).catch(() => [])))), new Promise(r => setTimeout(r, 800))]);\n Promise.all([import('./grid'), fonts]).then(([{ grid, marks }]) => {\n if (gone) return;\n shared?.doc.off('update', change);\n if (shared && moved) model = extras(shared.doc, build(shared.doc));\n if (kind === 'csv') model.book.sheets.s1.name = name.replace(/\\.[^.]+$/, '') || 'Sheet1';\n const host = box.current!.appendChild(document.createElement('div'));\n host.className = 'w100n-sheet-host';\n const view = grid(host, language, edit);\n const { univer, univerAPI: api } = view;\n const wb = api.createWorkbook(model.book);\n if (model.active) wb.setActiveSheet(model.active);\n if (!edit) wb.setEditable(false);\n const state: Live = { api, model, original: bytes, changes: 0 };\n const untrack = track(api, model, { view: true, comment: notes, edit }, () => {\n state.changes++;\n if (state.changes === 1 && !shared) {\n setDirty(true);\n onChange?.(true);\n }\n });\n const unbind = shared ? bind(api, univer.__getInjector(), shared.doc, model, edit) : () => {};\n const people = shared?.link.awareness;\n if (shared) {\n people?.setLocalStateField('user', shared.user);\n state.marks = marks(view);\n }\n let frame = 0;\n let last = '';\n const refresh = () => {\n frame = 0;\n const range = api.getActiveWorkbook()?.getActiveRange();\n if (!range) return;\n const s = range.getCellStyleData() ?? {};\n const here = { sheet: range.getSheetId(), range: span(range.getRange()) };\n if (people && JSON.stringify(here) !== last) {\n last = JSON.stringify(here);\n people.setLocalStateField('selection', here);\n }\n setLook({ bl: s.bl === 1, it: s.it === 1, ul: !!s.ul?.s, st: !!s.st?.s, ht: s.ht ?? 0, tb: s.tb === 3, merged: range.isMerged() || range.isPartOfMerge(), n: s.n?.pattern ?? 'General', cl: s.cl?.rgb ?? '', bg: s.bg?.rgb ?? '' });\n };\n const later = () => { if (!frame) frame = requestAnimationFrame(refresh); };\n const selection = wb.onSelectionChange(later);\n const commands = api.addEvent(api.Event.CommandExecuted, later);\n live.current = state;\n stop = () => {\n unbind();\n state.marks?.dispose();\n untrack();\n selection.dispose();\n commands.dispose();\n cancelAnimationFrame(frame);\n host.hidden = true;\n setTimeout(() => { univer.dispose(); host.remove(); });\n };\n setPhase('ready');\n }).catch(() => { if (!gone) setPhase('failed'); });\n return () => { gone = true; shared?.doc.off('update', change); stop(); live.current = null; };\n }, [bytes, kind, attempt, shared, waiting]);\n\n useEffect(() => {\n live.current?.marks?.show((room?.people ?? []).flatMap(p => !p.me && p.selection ? [{ ...p.selection, color: p.color }] : []));\n }, [room?.people, phase]);\n\n useEffect(() => { live.current?.api.setLocale(language === 'pl' ? 'plPL' : 'enUS'); }, [language]);\n const pending = room ? room.pending : dirty;\n const unsent = room ? room.unsynced && edit : dirty;\n useEffect(() => {\n if (!unsent) return;\n const stop = (e: BeforeUnloadEvent) => e.preventDefault();\n window.addEventListener('beforeunload', stop);\n return () => window.removeEventListener('beforeunload', stop);\n }, [unsent]);\n\n const save = async () => {\n const l = live.current;\n if (room) {\n if (!l || !edit || !room.online || !room.pending || saving === 'busy') return false;\n setSaving('busy');\n setRefusal(null);\n await l.api.getFormula().onCalculationResultApplied(5000).catch(() => {});\n const ok = await room.save();\n setSaving(ok ? 'done' : 'failed');\n return ok;\n }\n if (!l || !onSaveRequest || saving === 'busy') return false;\n setSaving('busy');\n setRefusal(null);\n const seen = l.changes;\n try {\n const model = snapshot(l.api, l.model);\n const out = writeSheet(l.original, model, kind);\n await onSaveRequest(out, t.editedNote);\n const ids = kind === 'csv' ? [] : worksheets(out);\n rebase(l.model, model.lines, Object.fromEntries(model.book.sheetOrder.map((sid, i) => [sid, ids[i] ?? i + 1])));\n l.original = out;\n if (l.changes === seen) {\n l.changes = 0;\n setDirty(false);\n onChange?.(false);\n }\n setSaving('done');\n return true;\n } catch (e) {\n setRefusal(e instanceof SheetRefusal ? e : null);\n setSaving('failed');\n return false;\n }\n };\n\n useEffect(() => {\n if (!guard || room || !dirty) return;\n guard.current = save;\n return () => { guard.current = null; };\n });\n\n useRestore(pop !== null);\n\n const api = () => live.current?.api;\n const run = (id: string, params?: object) => { void api()?.executeCommand(id, params); setPop(null); };\n const range = () => api()?.getActiveWorkbook()?.getActiveRange();\n const sheet = () => api()?.getActiveWorkbook()?.getActiveSheet();\n const keys = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 's') {\n e.preventDefault();\n e.stopPropagation();\n if (edit || notes) void save();\n }\n if (e.key === 'Escape' && pop) {\n e.stopPropagation();\n setPop(null);\n }\n };\n const tool = (Icon: LucideIcon, label: string, onClick: () => void, pressed?: boolean) =>\n <button type=\"button\" aria-label={label} title={label} aria-pressed={pressed} disabled={phase !== 'ready'} onClick={onClick}><Icon aria-hidden /></button>;\n const gap = <span className=\"w100n-sheet-gap\" />;\n const anchor = (key: NonNullable<typeof pop>, trigger: ReactNode, body: ReactNode) => <span className=\"w100n-sheet-anchor\">\n {trigger}\n {pop === key && <span className=\"w100n-sheet-pop\" role=\"dialog\">{body}</span>}\n </span>;\n const opener = (key: NonNullable<typeof pop>, Icon: LucideIcon, label: string, bar?: string) =>\n <button type=\"button\" aria-label={label} title={label} aria-expanded={pop === key} disabled={phase !== 'ready'} onClick={() => setPop(pop === key ? null : key)}>\n <Icon aria-hidden />{bar !== undefined && <i className=\"w100n-sheet-bar\" style={{ background: bar || 'currentColor' }} />}\n </button>;\n const currency = language === 'pl' ? '#,##0.00 \"zł\"' : language === 'uk' ? '#,##0.00 \"₴\"' : '\"$\"#,##0.00';\n const formats: [string, string][] = [[t.general, 'General'], [t.number, '#,##0.00'], [t.percent, '0.00%'], [t.currency, currency], [`${t.currency} €`, '#,##0.00 \"€\"'],\n [t.date, language === 'en' ? 'mm/dd/yyyy' : 'dd.mm.yyyy'], [t.time, 'hh:mm'], [t.text, '@']];\n const places = (step: number) => range()?.setNumberFormat(decimals(look?.n ?? 'General', step));\n const sum = () => {\n const r = range()?.getRange();\n const ws = sheet();\n const numeric = (row: number, c: number) => ws?.getRange(row, c).getCellData()?.t === CellValueType.NUMBER;\n if (r && ws) for (const x of autoSum(r, numeric)) ws.getRange(x.row, x.col).setValue({ f: x.f });\n };\n const shown = formats.find(([, p]) => p === look?.n)?.[0] ?? (look && look.n !== 'General' ? look.n : t.general);\n const border = (type: string) => {\n range()?.setBorder(type as BorderType, (type === 'none' ? 0 : 1) as BorderStyleTypes, '#000000');\n setPop(null);\n };\n const lines = (rows: boolean) => {\n const r = range()?.getRange();\n const ws = sheet();\n if (!r || !ws) return;\n if (rows) ws.deleteRows(r.startRow, r.endRow - r.startRow + 1);\n else ws.deleteColumns(r.startColumn, r.endColumn - r.startColumn + 1);\n };\n const swatches = (list: string[], pick: (c: string) => void, none: string, reset: () => void, current: string) => <span className=\"w100n-sheet-swatches\">\n {list.map((c, i) => <button key={i} type=\"button\" aria-label={c} aria-pressed={current.toLowerCase() === c} onClick={() => pick(c)}><i style={{ background: c }} /></button>)}\n <button type=\"button\" className=\"w100n-sheet-none\" onClick={reset}>{none}</button>\n </span>;\n\n return <div className=\"w100n-sheet\" data-theme={theme} onKeyDownCapture={keys}>\n <div className=\"w100n-sheet-ribbon\" role=\"toolbar\" aria-label={t.tools} onKeyDown={rove} onPointerDown={e => { if ((e.target as HTMLElement).closest('button')) e.preventDefault(); }}>\n <div className=\"w100n-sheet-tools\">\n {edit && <>\n {tool(Undo2, t.undo, () => void api()?.undo())}\n {tool(Redo2, t.redo, () => void api()?.redo())}\n {gap}\n {anchor('format', <button type=\"button\" className=\"w100n-sheet-picker\" aria-label={t.format} title={t.format} aria-expanded={pop === 'format'} disabled={phase !== 'ready'}\n onClick={() => setPop(pop === 'format' ? null : 'format')}><span>{shown}</span><ChevronDown aria-hidden /></button>,\n <span className=\"w100n-sheet-list\">{formats.map(([label, pattern], i) => <button key={i} type=\"button\" aria-selected={look?.n === pattern}\n onClick={() => { range()?.setNumberFormat(pattern); setPop(null); }}>{label}<small>{pattern === 'General' ? '' : pattern}</small></button>)}</span>)}\n {tool(Euro, t.asCurrency, () => range()?.setNumberFormat('#,##0.00 \"€\"'), look?.n === '#,##0.00 \"€\"')}\n {tool(Percent, t.asPercent, () => range()?.setNumberFormat('0.00%'), look?.n === '0.00%')}\n {tool(DecimalsArrowLeft, t.fewerDecimals, () => places(-1))}\n {tool(DecimalsArrowRight, t.moreDecimals, () => places(1))}\n {gap}\n {tool(Bold, t.bold, () => run('sheet.command.set-range-bold'), look?.bl)}\n {tool(Italic, t.italic, () => run('sheet.command.set-range-italic'), look?.it)}\n {tool(Underline, t.underline, () => run('sheet.command.set-range-underline'), look?.ul)}\n {tool(Strikethrough, t.strike, () => run('sheet.command.set-range-stroke'), look?.st)}\n {anchor('text', opener('text', Baseline, t.textColour, look?.cl ?? ''),\n swatches(['#0f172a', '#475569', '#dc2626', '#ea580c', '#ca8a04', '#16a34a', '#0891b2', '#2563eb', '#7c3aed', '#db2777'],\n c => run('sheet.command.set-range-text-color', { value: c }), t.automatic, () => run('sheet.command.reset-range-text-color'), look?.cl ?? ''))}\n {anchor('fill', opener('fill', PaintBucket, t.fill, look?.bg ?? ''),\n swatches(['#fee2e2', '#ffedd5', '#fef9c3', '#dcfce7', '#cffafe', '#dbeafe', '#ede9fe', '#fce7f3', '#f1f5f9', '#cbd5e1'],\n c => run('sheet.command.set-background-color', { value: c }), t.noFill, () => run('sheet.command.reset-background-color'), look?.bg ?? ''))}\n {anchor('border', opener('border', Grid2x2, t.borders),\n <span className=\"w100n-sheet-list\">{([[Grid2x2, t.borderAll, 'all'], [Square, t.borderOuter, 'outside'], [PanelBottom, t.borderBottom, 'bottom'], [SquareDashed, t.borderNone, 'none']] as const)\n .map(([Icon, label, type]) => <button key={type} type=\"button\" onClick={() => border(type)}><Icon aria-hidden />{label}</button>)}</span>)}\n {gap}\n {tool(TextAlignStart, t.alignLeft, () => run('sheet.command.set-horizontal-text-align', { value: 1 }), look?.ht === 1)}\n {tool(TextAlignCenter, t.alignCenter, () => run('sheet.command.set-horizontal-text-align', { value: 2 }), look?.ht === 2)}\n {tool(TextAlignEnd, t.alignRight, () => run('sheet.command.set-horizontal-text-align', { value: 3 }), look?.ht === 3)}\n {tool(TextWrap, t.wrap, () => run('sheet.command.set-text-wrap', { value: look?.tb ? 1 : 3 }), look?.tb)}\n {look?.merged ? tool(TableCellsSplit, t.unmerge, () => run('sheet.command.remove-worksheet-merge'), true) : tool(TableCellsMerge, t.merge, () => run('sheet.command.add-worksheet-merge-all'))}\n {gap}\n {tool(BetweenHorizontalStart, t.rowAbove, () => run('sheet.command.insert-row-before'))}\n {tool(BetweenHorizontalEnd, t.rowBelow, () => run('sheet.command.insert-row-after'))}\n {tool(BetweenVerticalStart, t.columnLeft, () => run('sheet.command.insert-col-before'))}\n {tool(BetweenVerticalEnd, t.columnRight, () => run('sheet.command.insert-col-after'))}\n {tool(TableRowsSplit, t.deleteRows, () => lines(true))}\n {tool(TableColumnsSplit, t.deleteColumns, () => lines(false))}\n {anchor('freeze', opener('freeze', Snowflake, t.freeze),\n <span className=\"w100n-sheet-list\">\n <button type=\"button\" onClick={() => { sheet()?.setFrozenRows(1); setPop(null); }}>{t.freezeRow}</button>\n <button type=\"button\" onClick={() => { sheet()?.setFrozenColumns(1); setPop(null); }}>{t.freezeColumn}</button>\n <button type=\"button\" onClick={() => run('sheet.command.set-selection-frozen')}>{t.freezeHere}</button>\n <button type=\"button\" onClick={() => { sheet()?.cancelFreeze(); setPop(null); }}>{t.freezeNone}</button>\n </span>)}\n {gap}\n {tool(Sigma, t.sum, sum)}\n {tool(ArrowDownAZ, t.sortUp, () => run('sheet.command.sort-range-asc'))}\n {tool(ArrowDownZA, t.sortDown, () => run('sheet.command.sort-range-desc'))}\n {!room && tool(Funnel, t.filter, () => run('sheet.command.smart-toggle-filter'))}\n {gap}\n </>}\n {(edit || notes) && tool(StickyNote, t.note, () => run('sheet.operation.add-note-popup'))}\n {tool(Search, t.find, () => run('ui.operation.open-find-dialog'))}\n </div>\n <span className=\"w100n-sheet-end\">\n {room && (room.ready ? !room.online : room.late || room.denied) && <span className=\"w100n-text-live\" title={room.denied ? undefined : t.offlineHint}><WifiOff aria-hidden />{room.denied ? t.liveOff : t.offline}</span>}\n {room && room.people.length > 0 && <span className=\"w100n-text-people\" role=\"group\" aria-label={t.people}>\n {room.people.map(p => <span key={p.id} className=\"w100n-text-face\" title={p.me ? `${p.name} (${t.you})` : p.name} style={{ '--face': p.color } as CSSProperties}>\n {p.avatarUrl ? <img src={p.avatarUrl} alt=\"\" /> : p.name.split(/\\s+/).map(w => w[0]).join('').slice(0, 2).toUpperCase()}\n </span>)}\n </span>}\n {!edit && <span className=\"w100n-docs-badge\">{notes ? t.notesOnly : t.viewOnly}</span>}\n {saving === 'failed' && <span className=\"w100n-sheet-muted\" role=\"alert\">{refusal ? t.refused[refusal.code].replace('{sheet}', refusal.sheet) : t.saveFailed}</span>}\n {(edit || notes) && <button type=\"button\" className=\"w100n-docs-action\" disabled={!pending || saving === 'busy' || phase !== 'ready' || (!!room && !room.online)} onClick={() => void save()}>\n <Save aria-hidden />{saving === 'busy' ? t.saving : !pending && saving === 'done' ? t.saved : t.save}\n </button>}\n </span>\n </div>\n <div className=\"w100n-sheet-stage\" onPointerDown={() => setPop(null)}>\n <div ref={box} className=\"w100n-sheet-grid\" />\n {phase !== 'ready' && <div className=\"w100n-sheet-cover\">\n {phase === 'loading' ? <span>{t.loading}</span> : <span>{t.failed}<button type=\"button\" className=\"w100n-docs-action\" onClick={() => setAttempt(n => n + 1)}>{t.retry}</button></span>}\n </div>}\n </div>\n </div>;\n}\n\nexport default SheetView;\n","import { ICommandService, IUndoRedoService, IUniverInstanceService, mergeWorksheetSnapshotWithDefault, type ICellData, type Injector, type IRange, type IStyleData, type Workbook } from '@univerjs/core';\nimport type { FUniver } from '@univerjs/core/facade';\nimport { SheetLazyExecuteScheduleService } from '@univerjs/sheets';\nimport * as Y from 'yjs';\nimport { quiet } from './engine';\nimport type { SheetModel } from './model';\nimport { canon, fnv, made, notesOf, parts, pieces, props, sheetOf, spot, strip, type Cell, type Col, type Row } from './shared';\n\ntype Matrix<T> = Record<number, Record<number, T>>;\ntype Params = {\n unitId?: string; subUnitId?: string; sheetId?: string; index?: number; toOrder?: number; sheet?: { id: string };\n range?: IRange; sourceRange?: IRange; targetRange?: IRange; ranges?: IRange[]; cellValue?: Matrix<unknown>;\n rowData?: Record<number, unknown>; columnData?: Record<number, unknown>; from?: { subUnitId: string; value: Matrix<unknown> }; to?: { subUnitId: string; value: Matrix<unknown> };\n};\ntype Touch = { rows: Y.YArrayEvent<string>['changes']['delta'] | null; cols: Y.YArrayEvent<string>['changes']['delta'] | null; cells: Set<string>; rowData: Set<string>; colData: Set<string>; marks: boolean; props: Set<string> };\n\nconst setters = [\n ['name', 'sheet.mutation.set-worksheet-name', 'name', ''], ['hidden', 'sheet.mutation.set-worksheet-hidden', 'hidden', 0], ['tabColor', 'sheet.mutation.set-tab-color', 'color', ''],\n ['showGridlines', 'sheet.mutation.toggle-gridlines', 'showGridlines', 1], ['rightToLeft', 'sheet.mutation.set-worksheet-right-to-left', 'rightToLeft', 0],\n ['freeze', 'sheet.mutation.set-frozen', '', { startRow: -1, startColumn: -1, xSplit: 0, ySplit: 0 }],\n] as const;\n\nconst closed = /\\.command\\.(.*filter-(range|criteria)|.*toggle-filter|.*sheet-filter|.*data-?validation.*|.*defined-name|.*protection)$/i;\n\nexport function bind(api: FUniver, injector: Injector, doc: Y.Doc, model: SheetModel, edit: boolean) {\n const unit = model.book.id;\n const wb = injector.get(IUniverInstanceService).getUnit<Workbook>(unit)!;\n const { order, sheets, styles, values } = parts(doc);\n const lines = model.lines;\n const me = {};\n let open = true;\n const looks = wb.getStyles();\n const commands = injector.get(ICommandService);\n const run = (id: string, params: object) => commands.hasCommand(id) && commands.syncExecuteCommand(id, { unitId: unit, ...params }, { fromCollab: true });\n const ws = (sid: string) => wb.getSheetBySheetId(sid)!;\n const at = new Map<string, { rows: Map<string, number>; cols: Map<string, number> }>();\n const index = (sid: string) => at.get(sid) ?? at.set(sid, { rows: new Map(lines[sid].rows.map((id, i) => [id, i])), cols: new Map(lines[sid].cols.map((id, i) => [id, i])) }).get(sid)!;\n const live = (sid: string | undefined): sid is string => !!sid && !!lines[sid] && sheets.has(sid) && !!wb.getSheetBySheetId(sid);\n\n const look = (s: ICellData['s']) => {\n const style = typeof s === 'string' ? looks.get(s) : s;\n if (!style || !Object.keys(style).length) return undefined;\n const text = canon(style);\n if (typeof s === 'string' && styles.has(s) && canon(styles.get(s)) === text) return s;\n const id = `y${fnv(new TextEncoder().encode(text)).toString(36)}`;\n if (!styles.has(id)) styles.set(id, style as IStyleData);\n return id;\n };\n\n const cellOf = (sid: string, r: number, c: number): Cell | null => {\n const raw = ws(sid).getCellRaw(r, c);\n if (!raw) return null;\n const f = raw.f || (raw.si ? api.getWorkbook(unit)!.getSheetBySheetId(sid)!.getRange(r, c).getFormula() : '');\n const out: Cell = f ? { f } : strip({ v: raw.v, t: raw.t });\n if (raw.p) out.p = raw.p;\n const s = look(raw.s);\n if (s) out.s = s;\n return Object.keys(out).length ? out : null;\n };\n\n const put = (sid: string, r: number, c: number) => {\n const row = lines[sid].rows[r], col = lines[sid].cols[c];\n if (row === undefined || col === undefined) return;\n const { cells } = pieces(sheets.get(sid)!);\n const key = spot(row, col);\n const next = cellOf(sid, r, c), was = cells.get(key);\n if (canon(next) === canon(was)) return;\n if (next) cells.set(key, next);\n else cells.delete(key);\n if (next?.f !== was?.f) values.delete(`${sid}:${key}`);\n };\n\n const each = (m: Matrix<unknown> | undefined, fn: (r: number, c: number) => void) => {\n for (const [r, line] of Object.entries(m ?? {})) for (const c of Object.keys(line ?? {})) fn(+r, +c);\n };\n\n const putRow = (sid: string, r: number) => {\n const id = lines[sid].rows[r];\n const raw = ws(sid).getRowManager().getRow(r);\n const { rowData } = pieces(sheets.get(sid)!);\n const next = raw ? strip<Row>({ h: raw.h, hd: raw.hd || undefined, ia: raw.ia, s: look(raw.s) }) : {};\n if (id === undefined || canon(next) === canon(rowData.get(id) ?? {})) return;\n if (Object.keys(next).length) rowData.set(id, next);\n else rowData.delete(id);\n };\n\n const putCol = (sid: string, c: number) => {\n const id = lines[sid].cols[c];\n const raw = ws(sid).getColumnManager().getColumn(c);\n const { colData } = pieces(sheets.get(sid)!);\n const next = raw ? strip<Col>({ w: raw.w, hd: raw.hd || undefined, s: look(raw.s) }) : {};\n if (id === undefined || canon(next) === canon(colData.get(id) ?? {})) return;\n if (Object.keys(next).length) colData.set(id, next);\n else colData.delete(id);\n };\n\n const merges = (sid: string) => {\n const l = lines[sid];\n const { merges: kept } = pieces(sheets.get(sid)!);\n const want = new Set(ws(sid).getMergeData().map(b => [l.rows[b.startRow], l.cols[b.startColumn], l.rows[b.endRow], l.cols[b.endColumn]].join(':')));\n for (const k of [...kept.keys()]) if (!want.has(k)) kept.delete(k);\n for (const k of want) if (!kept.has(k)) kept.set(k, 1);\n };\n\n const notes = (sid: string) => {\n const l = lines[sid];\n const { notes: kept } = pieces(sheets.get(sid)!);\n const want = new Map(api.getWorkbook(unit)!.getSheetBySheetId(sid)!.getNotes().map(n => [spot(l.rows[n.row], l.cols[n.col]), { note: n.note, width: n.width, height: n.height }]));\n for (const k of [...kept.keys()]) if (!want.has(k)) kept.delete(k);\n for (const [k, n] of want) if (canon(kept.get(k)) !== canon(n)) kept.set(k, n);\n };\n\n const prop = (sid: string, name: typeof props[number]) => {\n const m = sheets.get(sid)!;\n const empty = setters.find(x => x[0] === name)![3];\n const now = ws(sid).getConfig()[name] ?? empty;\n if (canon(m.get(name) ?? empty) === canon(now)) return;\n if (canon(now) === canon(empty)) m.delete(name);\n else m.set(name, now);\n };\n\n const fit = (list: Y.Array<string>, now: string[]) => {\n if (list.length > now.length) list.delete(now.length, list.length - now.length);\n else if (list.length < now.length) list.push(now.slice(list.length));\n };\n\n const resync = (sid: string) => {\n const l = lines[sid];\n const { cells } = pieces(sheets.get(sid)!);\n const seen = new Set<string>();\n ws(sid).getCellMatrix().forValue((r, c) => {\n put(sid, r, c);\n seen.add(spot(l.rows[r], l.cols[c]));\n });\n const { rows, cols } = index(sid);\n for (const k of [...cells.keys()]) if (!seen.has(k) && rows.has(k.split(':')[0]) && cols.has(k.split(':')[1])) cells.delete(k);\n l.rows.forEach((_, r) => putRow(sid, r));\n l.cols.forEach((_, c) => putCol(sid, c));\n merges(sid);\n notes(sid);\n props.forEach(name => prop(sid, name));\n };\n\n const write = (id: string, p: Params) => {\n const sid = p.subUnitId ?? p.sheetId;\n if (id === 'sheet.mutation.insert-sheet' && p.sheet && lines[p.sheet.id]) {\n const added = p.sheet.id;\n sheets.set(added, made(ws(added).getConfig(), lines[added]));\n order.insert(Math.min(p.index ?? order.length, order.length), [added]);\n return resync(added);\n }\n if (id === 'sheet.mutation.remove-sheet' && sid) {\n at.delete(sid);\n sheets.delete(sid);\n const i = order.toArray().indexOf(sid);\n if (i >= 0) order.delete(i, 1);\n return;\n }\n if (id === 'sheet.mutation.set-worksheet-order' && sid) {\n const i = order.toArray().indexOf(sid);\n if (i >= 0) order.delete(i, 1);\n return order.insert(Math.min(p.toOrder ?? 0, order.length), [sid]);\n }\n if (id === 'sheet.mutation.move-range' && p.from && p.to) {\n if (live(p.from.subUnitId)) each(p.from.value, (r, c) => put(p.from!.subUnitId, r, c));\n if (live(p.to.subUnitId)) each(p.to.value, (r, c) => put(p.to!.subUnitId, r, c));\n return;\n }\n if (!live(sid)) return;\n const { rows, cols } = pieces(sheets.get(sid)!);\n const l = lines[sid];\n const count = (r: IRange, row: boolean) => row ? r.endRow - r.startRow + 1 : r.endColumn - r.startColumn + 1;\n const shift = (list: Y.Array<string>, from: number, n: number, to: number) => {\n const ids = list.slice(from, from + n);\n list.delete(from, n);\n list.insert(to > from ? to - n : to, ids);\n at.delete(sid);\n };\n switch (id) {\n case 'sheet.mutation.set-range-values': return each(p.cellValue, (r, c) => put(sid, r, c));\n case 'sheet.mutation.reorder-range':\n for (let r = p.range!.startRow; r <= p.range!.endRow; r++) for (let c = p.range!.startColumn; c <= p.range!.endColumn; c++) put(sid, r, c);\n return;\n case 'sheet.mutation.insert-row':\n rows.insert(p.range!.startRow, l.rows.slice(p.range!.startRow, p.range!.endRow + 1));\n at.delete(sid);\n for (let r = p.range!.startRow; r <= p.range!.endRow; r++) putRow(sid, r);\n return;\n case 'sheet.mutation.insert-col':\n cols.insert(p.range!.startColumn, l.cols.slice(p.range!.startColumn, p.range!.endColumn + 1));\n at.delete(sid);\n for (let c = p.range!.startColumn; c <= p.range!.endColumn; c++) putCol(sid, c);\n return;\n case 'sheet.mutation.remove-rows':\n at.delete(sid);\n return rows.delete(p.range!.startRow, count(p.range!, true));\n case 'sheet.mutation.remove-col':\n at.delete(sid);\n return cols.delete(p.range!.startColumn, count(p.range!, false));\n case 'sheet.mutation.move-rows': return shift(rows, p.sourceRange!.startRow, count(p.sourceRange!, true), p.targetRange!.startRow);\n case 'sheet.mutation.move-columns': return shift(cols, p.sourceRange!.startColumn, count(p.sourceRange!, false), p.targetRange!.startColumn);\n case 'sheet.mutation.set-worksheet-row-count':\n at.delete(sid);\n return fit(rows, l.rows);\n case 'sheet.mutation.set-worksheet-column-count':\n at.delete(sid);\n return fit(cols, l.cols);\n case 'sheet.mutation.set-worksheet-row-height':\n case 'sheet.mutation.set-worksheet-row-is-auto-height':\n case 'sheet.mutation.set-row-hidden':\n case 'sheet.mutation.set-row-visible':\n for (const r of p.ranges ?? []) for (let i = r.startRow; i <= r.endRow; i++) putRow(sid, i);\n return;\n case 'sheet.mutation.set-worksheet-col-width':\n case 'sheet.mutation.set-col-hidden':\n case 'sheet.mutation.set-col-visible':\n for (const r of p.ranges ?? []) for (let i = r.startColumn; i <= r.endColumn; i++) putCol(sid, i);\n return;\n case 'sheet.mutation.set-row-data': return Object.keys(p.rowData ?? {}).forEach(r => putRow(sid, +r));\n case 'sheet.mutation.set-col-data': return Object.keys(p.columnData ?? {}).forEach(c => putCol(sid, +c));\n case 'sheet.mutation.add-worksheet-merge':\n case 'sheet.mutation.remove-worksheet-merge': return merges(sid);\n case 'sheet.mutation.update-note':\n case 'sheet.mutation.remove-note':\n case 'sheet.mutation.update-note-position': return notes(sid);\n default: {\n const setter = setters.find(x => x[1] === id);\n if (setter) prop(sid, setter[0]);\n else if (!quiet.has(id)) resync(sid);\n }\n }\n };\n\n const computed = (p: Params) => {\n const sid = p.subUnitId;\n if (!live(sid)) return;\n each(p.cellValue, (r, c) => {\n const raw = ws(sid).getCellRaw(r, c);\n const row = lines[sid].rows[r], col = lines[sid].cols[c];\n if ((!raw?.f && !raw?.si) || row === undefined || col === undefined) return;\n const key = `${sid}:${spot(row, col)}`, next = { v: raw.v ?? null, t: raw.t ?? null };\n if (canon(values.get(key)) !== canon(next)) values.set(key, next);\n });\n };\n\n const refuse = api.addEvent(api.Event.BeforeCommandExecute, e => {\n if (edit && e.type === 0 && closed.test(e.id)) e.cancel = true;\n });\n\n const local = api.addEvent(api.Event.CommandExecuted, e => {\n const p = (e.params ?? {}) as Params;\n if (e.type !== 2 || p.unitId !== unit || e.options?.fromCollab || !edit) return;\n if (e.options?.onlyLocal) {\n if (e.options.applyFormulaCalculationResult) doc.transact(() => computed(p), me);\n return;\n }\n doc.transact(() => write(e.id, p), me);\n });\n\n const lazy = commands.onMutationExecutedForCollab((e, options) => {\n if (!edit || !options?.syncOnly || e.id !== 'sheet.mutation.copy-worksheet-end') return;\n const sid = (e.params as Params).subUnitId!;\n const wait = () => open && (injector.get(SheetLazyExecuteScheduleService).hasPendingTasks() ? setTimeout(wait, 100) : live(sid) && doc.transact(() => resync(sid), me));\n wait();\n });\n\n const full = (sid: string, key: string, x: Cell | undefined): ICellData | null => {\n if (!x) return null;\n const kept = x.f ? values.get(`${sid}:${key}`) : undefined;\n return { v: (x.f ? kept?.v : x.v) ?? null, t: (x.f ? kept?.t : x.t) ?? undefined, f: x.f ?? null, si: null, p: x.p ?? null, s: x.s ? styles.get(x.s) ?? null : null };\n };\n\n const cellsTo = (sid: string, keys: Iterable<string>) => {\n const { cells } = pieces(sheets.get(sid)!);\n const { rows, cols } = index(sid);\n const cellValue: Matrix<ICellData | null> = {};\n for (const key of keys) {\n const [row, col] = key.split(':');\n const r = rows.get(row), c = cols.get(col);\n if (r !== undefined && c !== undefined) (cellValue[r] ??= {})[c] = full(sid, key, cells.get(key));\n }\n if (Object.keys(cellValue).length) run('sheet.mutation.set-range-values', { subUnitId: sid, cellValue, isOverrideStyle: true });\n };\n\n const linesTo = (sid: string, ids: Iterable<string>, row: boolean) => {\n const { rowData, colData } = pieces(sheets.get(sid)!);\n const map = row ? index(sid).rows : index(sid).cols;\n const info: Record<number, object | null> = {}, sizes: Record<number, number> = {};\n const ranges: IRange[] = [];\n for (const id of ids) {\n const i = map.get(id);\n if (i === undefined) continue;\n const x = (row ? rowData : colData).get(id) as (Row & Col) | undefined;\n const s = x?.s ? styles.get(x.s) : undefined;\n info[i] = x ? row ? { h: x.h, hd: x.hd, ia: x.ia, s } : { w: x.w, hd: x.hd, s } : null;\n const size = row ? x?.h : x?.w;\n if (size !== undefined) sizes[i] = size;\n ranges.push({ startRow: row ? i : 0, endRow: row ? i : 0, startColumn: row ? 0 : i, endColumn: row ? 0 : i });\n }\n if (!ranges.length) return;\n if (row) {\n run('sheet.mutation.set-row-data', { subUnitId: sid, rowData: info });\n run('sheet.mutation.set-worksheet-row-height', { subUnitId: sid, ranges, rowHeight: sizes });\n } else {\n run('sheet.mutation.set-col-data', { subUnitId: sid, columnData: info });\n run('sheet.mutation.set-worksheet-col-width', { subUnitId: sid, ranges, colWidth: sizes });\n }\n };\n\n const mergesTo = (sid: string) => {\n const { merges: kept } = pieces(sheets.get(sid)!);\n const { rows, cols } = index(sid);\n const want = [...kept.keys()].map(k => k.split(':')).map(([r0, c0, r1, c1]) => ({ startRow: rows.get(r0)!, startColumn: cols.get(c0)!, endRow: rows.get(r1)!, endColumn: cols.get(c1)! }))\n .filter(b => [b.startRow, b.startColumn, b.endRow, b.endColumn].every(n => n !== undefined));\n const has = ws(sid).getMergeData().map(b => ({ startRow: b.startRow, startColumn: b.startColumn, endRow: b.endRow, endColumn: b.endColumn }));\n const gone = has.filter(b => !want.some(w => canon(w) === canon(b))), added = want.filter(w => !has.some(b => canon(w) === canon(b)));\n if (gone.length) run('sheet.mutation.remove-worksheet-merge', { subUnitId: sid, ranges: gone });\n if (added.length) run('sheet.mutation.add-worksheet-merge', { subUnitId: sid, ranges: added });\n };\n\n const notesTo = (sid: string) => {\n const want = notesOf(sheets.get(sid)!, lines[sid]);\n const shown = api.getWorkbook(unit)!.getSheetBySheetId(sid)!.getNotes();\n for (const n of shown) if (!want.some(w => w.row === n.row && w.col === n.col)) run('sheet.mutation.remove-note', { sheetId: sid, noteId: n.id, row: n.row, col: n.col });\n for (const w of want) {\n const n = shown.find(x => x.row === w.row && x.col === w.col);\n if (!n || n.note !== w.note || n.width !== w.width || n.height !== w.height) run('sheet.mutation.update-note', { sheetId: sid, row: w.row, col: w.col, note: { note: w.note, width: w.width, height: w.height } });\n }\n };\n\n const shape = () => {\n const want = [...new Set(order.toArray())].filter(sid => sheets.has(sid));\n for (const sheet of wb.getSheets()) {\n const sid = sheet.getSheetId();\n if (want.includes(sid)) continue;\n if (wb.getActiveSheet().getSheetId() === sid) {\n const other = want.find(x => wb.getSheetBySheetId(x));\n if (other) api.syncExecuteCommand('sheet.operation.set-worksheet-active', { unitId: unit, subUnitId: other });\n }\n run('sheet.mutation.remove-sheet', { subUnitId: sid });\n delete lines[sid];\n at.delete(sid);\n }\n want.forEach((sid, i) => {\n if (wb.getSheetBySheetId(sid)) return;\n const { rows, cols } = pieces(sheets.get(sid)!);\n lines[sid] = { rows: rows.toArray(), cols: cols.toArray() };\n run('sheet.mutation.insert-sheet', { index: Math.min(i, wb.getSheets().length), sheet: mergeWorksheetSnapshotWithDefault(sheetOf(doc, sid, lines[sid])), styles: styles.toJSON() });\n notesTo(sid);\n });\n want.forEach((sid, i) => {\n const now = wb.getSheetOrders().indexOf(sid);\n if (now >= 0 && now !== i) run('sheet.mutation.set-worksheet-order', { subUnitId: sid, fromOrder: now, toOrder: i });\n });\n };\n\n const move = (sid: string, delta: Touch['rows'], row: boolean) => {\n const added = new Set<string>();\n if (!delta) return added;\n const list = row ? lines[sid].rows : lines[sid].cols;\n let i = 0;\n for (const d of delta) {\n if (d.retain) i += d.retain;\n if (d.delete) {\n const end = i + d.delete - 1;\n if (row) run('sheet.mutation.remove-rows', { subUnitId: sid, range: { startRow: i, endRow: end, startColumn: 0, endColumn: lines[sid].cols.length - 1, rangeType: 1 } });\n else run('sheet.mutation.remove-col', { subUnitId: sid, range: { startRow: 0, endRow: lines[sid].rows.length - 1, startColumn: i, endColumn: end, rangeType: 2 } });\n list.splice(i, d.delete);\n }\n if (d.insert) {\n const ids = d.insert as string[];\n const end = i + ids.length - 1;\n if (row) run('sheet.mutation.insert-row', { subUnitId: sid, range: { startRow: i, endRow: end, startColumn: 0, endColumn: lines[sid].cols.length - 1 } });\n else run('sheet.mutation.insert-col', { subUnitId: sid, range: { startRow: 0, endRow: lines[sid].rows.length - 1, startColumn: i, endColumn: end } });\n list.splice(i, 0, ...ids);\n ids.forEach(id => added.add(id));\n i += ids.length;\n }\n }\n at.delete(sid);\n return added;\n };\n\n const remote = (events: Y.YEvent<Y.AbstractType<unknown>>[], tr: Y.Transaction) => {\n if (tr.origin === me) return;\n const touched = new Map<string, Touch>();\n let reshaped = false;\n for (const e of events) {\n const t = e.target;\n if (t === sheets || t === order) {\n reshaped = true;\n continue;\n }\n const owner = t.parent === sheets ? t : t.parent?.parent === sheets ? t.parent : null;\n const sid = owner && [...sheets.entries()].find(([, m]) => m === owner)?.[0];\n if (!owner || !sid) continue;\n if (!touched.has(sid)) touched.set(sid, { rows: null, cols: null, cells: new Set(), rowData: new Set(), colData: new Set(), marks: false, props: new Set() });\n const s = touched.get(sid)!;\n const m = owner as Y.Map<unknown>;\n const keys = [...e.changes.keys.keys()];\n if (t === owner) keys.forEach(k => s.props.add(k));\n else if (t === m.get('rows')) s.rows = e.changes.delta;\n else if (t === m.get('cols')) s.cols = e.changes.delta;\n else if (t === m.get('cells')) keys.forEach(k => s.cells.add(k));\n else if (t === m.get('rowData')) keys.forEach(k => s.rowData.add(k));\n else if (t === m.get('colData')) keys.forEach(k => s.colData.add(k));\n else s.marks = true;\n }\n let structural = false;\n if (reshaped) {\n const before = wb.getSheets().length;\n shape();\n structural = before !== wb.getSheets().length;\n }\n for (const [sid, s] of touched) {\n if (!live(sid)) continue;\n const rows = move(sid, s.rows, true), cols = move(sid, s.cols, false);\n if (s.rows || s.cols) structural = true;\n for (const [name, id, key, empty] of setters) if (s.props.has(name)) {\n const v = sheets.get(sid)!.get(name) ?? empty;\n run(id, { subUnitId: sid, ...(key ? { [key]: v } : v as object) });\n }\n const keys = new Set(s.cells);\n if (rows.size || cols.size) for (const k of pieces(sheets.get(sid)!).cells.keys()) if (rows.has(k.split(':')[0]) || cols.has(k.split(':')[1])) keys.add(k);\n linesTo(sid, new Set([...s.rowData, ...rows]), true);\n linesTo(sid, new Set([...s.colData, ...cols]), false);\n cellsTo(sid, keys);\n if (s.marks || s.rows || s.cols) {\n mergesTo(sid);\n notesTo(sid);\n }\n }\n if (structural) injector.get(IUndoRedoService).clearUndoRedo(unit);\n };\n\n parts(doc).book.observeDeep(remote);\n return () => {\n open = false;\n refuse.dispose();\n local.dispose();\n lazy.dispose();\n parts(doc).book.unobserveDeep(remote);\n };\n}\n","import type { IRange, IWorksheetData } from '@univerjs/core';\nimport type { FUniver } from '@univerjs/core/facade';\nimport type { FWorkbook } from '@univerjs/sheets/facade';\nimport type { Rights } from '../types';\nimport { fresh, insert, move, resize, type SheetModel } from './model';\n\nexport const quiet = new Set(['sheet.mutation.set-worksheet-row-auto-height', 'sheet.mutation.mark-dirty-filter-change', 'sheet.mutation.re-calc-filter',\n 'sheet.mutation.toggle-note-popup', 'sheet.mutation.update-note-position', 'sheet.mutation.empty', 'sheet.mutation.set-zoom-ratio']);\n\nconst mutation = 2;\n\ntype Params = { unitId?: string; subUnitId?: string; range?: IRange; sourceRange?: IRange; targetRange?: IRange; rowCount?: number; columnCount?: number; sheet?: IWorksheetData };\n\nexport const allowed = (rights: Rights, id: string) => rights.edit || quiet.has(id) || (rights.comment && /\\.(update|remove|delete)-note$|note-popup$/.test(id));\n\nexport function track(api: FUniver, model: SheetModel, rights: Rights, onDirty: () => void) {\n const lines = model.lines;\n const ours = (p: unknown) => (p as Params | undefined)?.unitId === model.book.id;\n const before = api.addEvent(api.Event.BeforeCommandExecute, e => {\n if (e.type !== mutation || e.options?.onlyLocal || e.options?.fromCollab || !ours(e.params)) return;\n if (!allowed(rights, e.id)) e.cancel = true;\n });\n const after = api.addEvent(api.Event.CommandExecuted, e => {\n if (e.type !== mutation || e.options?.onlyLocal || e.options?.fromCollab || !ours(e.params)) return;\n const p = (e.params ?? {}) as Params;\n const l = p.subUnitId ? lines[p.subUnitId] : undefined;\n const span = (r: IRange | undefined, rows: boolean) => r ? rows ? r.endRow - r.startRow + 1 : r.endColumn - r.startColumn + 1 : 0;\n if (e.id === 'sheet.mutation.insert-sheet' && p.sheet) {\n lines[p.sheet.id] = { rows: Array.from({ length: p.sheet.rowCount ?? 1000 }, () => fresh('n')), cols: Array.from({ length: p.sheet.columnCount ?? 26 }, () => fresh('n')) };\n } else if (e.id === 'sheet.mutation.remove-sheet' && p.subUnitId) delete lines[p.subUnitId];\n else if (l) {\n if (e.id === 'sheet.mutation.insert-row') insert(l.rows, p.range!.startRow, span(p.range, true), 'n');\n else if (e.id === 'sheet.mutation.remove-rows') l.rows.splice(p.range!.startRow, span(p.range, true));\n else if (e.id === 'sheet.mutation.move-rows') move(l.rows, p.sourceRange!.startRow, span(p.sourceRange, true), p.targetRange!.startRow);\n else if (e.id === 'sheet.mutation.insert-col') insert(l.cols, p.range!.startColumn, span(p.range, false), 'n');\n else if (e.id === 'sheet.mutation.remove-col') l.cols.splice(p.range!.startColumn, span(p.range, false));\n else if (e.id === 'sheet.mutation.move-columns') move(l.cols, p.sourceRange!.startColumn, span(p.sourceRange, false), p.targetRange!.startColumn);\n else if (e.id === 'sheet.mutation.set-worksheet-row-count' && p.rowCount) resize(l.rows, p.rowCount, 'n');\n else if (e.id === 'sheet.mutation.set-worksheet-column-count' && p.columnCount) resize(l.cols, p.columnCount, 'n');\n }\n if (!quiet.has(e.id)) onDirty();\n });\n return () => { before.dispose(); after.dispose(); };\n}\n\nexport function snapshot(api: FUniver, model: SheetModel): SheetModel {\n const wb: FWorkbook = api.getActiveWorkbook()!;\n const book = wb.save();\n const lines = Object.fromEntries(book.sheetOrder.map(sid => {\n const l = model.lines[sid] ?? { rows: [], cols: [] };\n const sheet = book.sheets[sid];\n const rows = [...l.rows], cols = [...l.cols];\n resize(rows, sheet.rowCount ?? rows.length, 'n');\n resize(cols, sheet.columnCount ?? cols.length, 'n');\n return [sid, { rows, cols }];\n }));\n return { ...model, book, lines, active: wb.getActiveSheet().getSheetId() };\n}\n"],"mappings":"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","names":["span","move","m","host","api","range"]}
|
|
1
|
+
{"version":3,"sources":["../src/sheets/SheetView.tsx","../src/sheets/bind.ts","../src/sheets/engine.ts"],"sourcesContent":["import { useEffect, useRef, useState, type CSSProperties, type KeyboardEvent, type ReactNode } from 'react';\nimport {\n ArrowDownAZ, ArrowDownZA, Baseline, DecimalsArrowLeft, DecimalsArrowRight, Euro, Percent, Sigma, BetweenHorizontalEnd, BetweenHorizontalStart, BetweenVerticalEnd, BetweenVerticalStart, Bold, ChevronDown, Funnel, Grid2x2,\n Italic, PaintBucket, PanelBottom, Redo2, Save, Search, Snowflake, Square, SquareDashed, StickyNote, Strikethrough, TableCellsMerge, TableCellsSplit, TableColumnsSplit,\n TableRowsSplit, TextAlignCenter, TextAlignEnd, TextAlignStart, TextWrap, Underline, Undo2, WifiOff, type LucideIcon,\n} from 'lucide-react';\nimport { CellValueType, type BorderStyleTypes, type BorderType } from '@univerjs/core';\nimport type { FUniver } from '@univerjs/core/facade';\nimport { useLive } from '../editor/live';\nimport { rove, useRestore } from '../focus';\nimport type { DocumentsHost, Language, Rights } from '../types';\nimport type { Guard } from '../Unsaved';\nimport { bind } from './bind';\nimport { readSheet, writeSheet } from './book';\nimport { snapshot, track } from './engine';\nimport type { Mark } from './grid';\nimport { rebase, SheetRefusal, type SheetModel } from './model';\nimport { span } from './refs';\nimport { build, extras } from './shared';\nimport { sheetTexts } from './text';\nimport { worksheets } from './xlsx';\nimport './sheets.css';\n\nexport { readSheet, writeSheet };\n\nexport const decimals = (pattern: string, step: number) => {\n const p = pattern === 'General' ? '0' : pattern;\n const next = Math.max(0, (/0(?:\\.(0+))?/.exec(p)?.[1]?.length ?? 0) + step);\n return p.replace(/0(?:\\.0+)?/, `0${next ? `.${'0'.repeat(next)}` : ''}`);\n};\n\nconst letters = (c: number) => {\n let s = '';\n for (let n = c + 1; n > 0; n = Math.floor((n - 1) / 26)) s = String.fromCharCode(65 + (n - 1) % 26) + s;\n return s;\n};\n\nexport function autoSum(r: { startRow: number; endRow: number; startColumn: number; endColumn: number }, numeric: (row: number, col: number) => boolean) {\n if (r.startRow !== r.endRow || r.startColumn !== r.endColumn) {\n return Array.from({ length: r.endColumn - r.startColumn + 1 }, (_, i) => {\n const col = r.startColumn + i;\n return { row: r.endRow + 1, col, f: `=SUM(${letters(col)}${r.startRow + 1}:${letters(col)}${r.endRow + 1})` };\n });\n }\n let top = r.startRow;\n while (top > 0 && numeric(top - 1, r.startColumn)) top--;\n if (top < r.startRow) return [{ row: r.startRow, col: r.startColumn, f: `=SUM(${letters(r.startColumn)}${top + 1}:${letters(r.startColumn)}${r.startRow})` }];\n let left = r.startColumn;\n while (left > 0 && numeric(r.startRow, left - 1)) left--;\n return left < r.startColumn ? [{ row: r.startRow, col: r.startColumn, f: `=SUM(${letters(left)}${r.startRow + 1}:${letters(r.startColumn - 1)}${r.startRow + 1})` }] : [];\n}\n\ntype Look = { bl: boolean; it: boolean; ul: boolean; st: boolean; ht: number; tb: boolean; merged: boolean; n: string; cl: string; bg: string };\ntype Live = { api: FUniver; model: SheetModel; original: ArrayBuffer; changes: number; marks?: { show: (list: Mark[]) => void; dispose: () => void } };\n\nexport function SheetView({ bytes, name, kind, rights, language, theme, onChange, onSaveRequest, guard, host, together, documentId = '', onSaved }: {\n bytes: ArrayBuffer; name: string; kind: 'xlsx' | 'csv'; rights: Rights; language: Language; theme: 'light' | 'dark';\n onChange?: (dirty: boolean) => void; onSaveRequest?: (bytes: ArrayBuffer, note: string) => Promise<unknown>; guard?: Guard;\n host?: DocumentsHost; together?: boolean; documentId?: string; onSaved?: () => void;\n}) {\n const t = sheetTexts[language];\n const box = useRef<HTMLDivElement>(null);\n const live = useRef<Live | null>(null);\n const room = useLive(together ? host : undefined, documentId, kind, bytes, undefined, language, rights.edit && !!onSaveRequest, onSaved);\n const shared = room?.ready ? room.wire : null;\n const waiting = !!room && !shared && !room.late && !room.denied;\n const [phase, setPhase] = useState<'loading' | 'ready' | 'failed'>('loading');\n const [attempt, setAttempt] = useState(0);\n const [dirty, setDirty] = useState(false);\n const [saving, setSaving] = useState<'idle' | 'busy' | 'done' | 'failed'>('idle');\n const [refusal, setRefusal] = useState<SheetRefusal | null>(null);\n const [pop, setPop] = useState<'text' | 'fill' | 'border' | 'format' | 'freeze' | null>(null);\n const [look, setLook] = useState<Look | null>(null);\n const edit = rights.edit && !!onSaveRequest && (!room || (!!shared && !room.readonly));\n const notes = !edit && rights.comment && !!onSaveRequest && !room;\n\n useEffect(() => {\n if (waiting) return;\n let gone = false;\n let stop = () => {};\n let model: SheetModel;\n let moved = false;\n const change = () => { moved = true; };\n try {\n model = shared ? extras(shared.doc, build(shared.doc)) : readSheet(bytes, kind);\n } catch {\n setPhase('failed');\n return;\n }\n shared?.doc.on('update', change);\n setPhase('loading');\n setDirty(false);\n const families = new Set([model.book.defaultStyle, ...Object.values(model.book.styles)].map(s => typeof s === 'object' ? s?.ff : null).filter(Boolean));\n const fonts = Promise.race([Promise.all([...families].flatMap(f => ['', 'bold ', 'italic '].map(w => document.fonts.load(`${w}11pt \"${f}\"`).catch(() => [])))), new Promise(r => setTimeout(r, 800))]);\n Promise.all([import('./grid'), fonts]).then(([{ grid, marks }]) => {\n if (gone) return;\n shared?.doc.off('update', change);\n if (shared && moved) model = extras(shared.doc, build(shared.doc));\n if (kind === 'csv') model.book.sheets.s1.name = name.replace(/\\.[^.]+$/, '') || 'Sheet1';\n const host = box.current!.appendChild(document.createElement('div'));\n host.className = 'w100n-sheet-host';\n const view = grid(host, language, edit);\n const { univer, univerAPI: api } = view;\n const wb = api.createWorkbook(model.book);\n if (model.active) wb.setActiveSheet(model.active);\n if (!edit) wb.setEditable(false);\n const state: Live = { api, model, original: bytes, changes: 0 };\n const untrack = track(api, model, { view: true, comment: notes, edit }, () => {\n state.changes++;\n if (state.changes === 1 && !shared) {\n setDirty(true);\n onChange?.(true);\n }\n });\n const unbind = shared ? bind(api, univer.__getInjector(), shared.doc, model, edit) : () => {};\n const people = shared?.link.awareness;\n if (shared) {\n people?.setLocalStateField('user', shared.user);\n state.marks = marks(view);\n }\n let frame = 0;\n let last = '';\n const refresh = () => {\n frame = 0;\n const range = api.getActiveWorkbook()?.getActiveRange();\n if (!range) return;\n const s = range.getCellStyleData() ?? {};\n const here = { sheet: range.getSheetId(), range: span(range.getRange()) };\n if (people && JSON.stringify(here) !== last) {\n last = JSON.stringify(here);\n people.setLocalStateField('selection', here);\n }\n setLook({ bl: s.bl === 1, it: s.it === 1, ul: !!s.ul?.s, st: !!s.st?.s, ht: s.ht ?? 0, tb: s.tb === 3, merged: range.isMerged() || range.isPartOfMerge(), n: s.n?.pattern ?? 'General', cl: s.cl?.rgb ?? '', bg: s.bg?.rgb ?? '' });\n };\n const later = () => { if (!frame) frame = requestAnimationFrame(refresh); };\n const selection = wb.onSelectionChange(later);\n const commands = api.addEvent(api.Event.CommandExecuted, later);\n live.current = state;\n stop = () => {\n unbind();\n state.marks?.dispose();\n untrack();\n selection.dispose();\n commands.dispose();\n cancelAnimationFrame(frame);\n host.hidden = true;\n setTimeout(() => { univer.dispose(); host.remove(); });\n };\n setPhase('ready');\n }).catch(() => { if (!gone) setPhase('failed'); });\n return () => { gone = true; shared?.doc.off('update', change); stop(); live.current = null; };\n }, [bytes, kind, attempt, shared, waiting]);\n\n useEffect(() => {\n live.current?.marks?.show((room?.people ?? []).flatMap(p => !p.me && p.selection ? [{ ...p.selection, color: p.color }] : []));\n }, [room?.people, phase]);\n\n useEffect(() => { live.current?.api.setLocale(language === 'pl' ? 'plPL' : 'enUS'); }, [language]);\n const pending = room ? room.pending : dirty;\n const unsent = room ? room.unsynced && edit : dirty;\n useEffect(() => {\n if (!unsent) return;\n const stop = (e: BeforeUnloadEvent) => e.preventDefault();\n window.addEventListener('beforeunload', stop);\n return () => window.removeEventListener('beforeunload', stop);\n }, [unsent]);\n\n const save = async () => {\n const l = live.current;\n if (room) {\n if (!l || !edit || !room.online || !room.pending || saving === 'busy') return false;\n setSaving('busy');\n setRefusal(null);\n await l.api.getFormula().onCalculationResultApplied(5000).catch(() => {});\n const ok = await room.save();\n setSaving(ok ? 'done' : 'failed');\n return ok;\n }\n if (!l || !onSaveRequest || saving === 'busy') return false;\n setSaving('busy');\n setRefusal(null);\n const seen = l.changes;\n try {\n const model = snapshot(l.api, l.model);\n const out = writeSheet(l.original, model, kind);\n await onSaveRequest(out, t.editedNote);\n const ids = kind === 'csv' ? [] : worksheets(out);\n rebase(l.model, model.lines, Object.fromEntries(model.book.sheetOrder.map((sid, i) => [sid, ids[i] ?? i + 1])));\n l.original = out;\n if (l.changes === seen) {\n l.changes = 0;\n setDirty(false);\n onChange?.(false);\n }\n setSaving('done');\n return true;\n } catch (e) {\n setRefusal(e instanceof SheetRefusal ? e : null);\n setSaving('failed');\n return false;\n }\n };\n\n useEffect(() => {\n if (!guard || room || !dirty) return;\n guard.current = save;\n return () => { guard.current = null; };\n });\n\n useRestore(pop !== null);\n\n const api = () => live.current?.api;\n const run = (id: string, params?: object) => { void api()?.executeCommand(id, params); setPop(null); };\n const range = () => api()?.getActiveWorkbook()?.getActiveRange();\n const sheet = () => api()?.getActiveWorkbook()?.getActiveSheet();\n const keys = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 's') {\n e.preventDefault();\n e.stopPropagation();\n if (edit || notes) void save();\n }\n if (e.key === 'Escape' && pop) {\n e.stopPropagation();\n setPop(null);\n }\n };\n const tool = (Icon: LucideIcon, label: string, onClick: () => void, pressed?: boolean) =>\n <button type=\"button\" aria-label={label} title={label} aria-pressed={pressed} disabled={phase !== 'ready'} onClick={onClick}><Icon aria-hidden /></button>;\n const gap = <span className=\"w100n-sheet-gap\" />;\n const anchor = (key: NonNullable<typeof pop>, trigger: ReactNode, body: ReactNode) => <span className=\"w100n-sheet-anchor\">\n {trigger}\n {pop === key && <span className=\"w100n-sheet-pop\" role=\"dialog\">{body}</span>}\n </span>;\n const opener = (key: NonNullable<typeof pop>, Icon: LucideIcon, label: string, bar?: string) =>\n <button type=\"button\" aria-label={label} title={label} aria-expanded={pop === key} disabled={phase !== 'ready'} onClick={() => setPop(pop === key ? null : key)}>\n <Icon aria-hidden />{bar !== undefined && <i className=\"w100n-sheet-bar\" style={{ background: bar || 'currentColor' }} />}\n </button>;\n const currency = language === 'pl' ? '#,##0.00 \"zł\"' : language === 'uk' ? '#,##0.00 \"₴\"' : '\"$\"#,##0.00';\n const formats: [string, string][] = [[t.general, 'General'], [t.number, '#,##0.00'], [t.percent, '0.00%'], [t.currency, currency], [`${t.currency} €`, '#,##0.00 \"€\"'],\n [t.date, language === 'en' ? 'mm/dd/yyyy' : 'dd.mm.yyyy'], [t.time, 'hh:mm'], [t.text, '@']];\n const places = (step: number) => range()?.setNumberFormat(decimals(look?.n ?? 'General', step));\n const sum = () => {\n const r = range()?.getRange();\n const ws = sheet();\n const numeric = (row: number, c: number) => ws?.getRange(row, c).getCellData()?.t === CellValueType.NUMBER;\n if (r && ws) for (const x of autoSum(r, numeric)) ws.getRange(x.row, x.col).setValue({ f: x.f });\n };\n const shown = formats.find(([, p]) => p === look?.n)?.[0] ?? (look && look.n !== 'General' ? look.n : t.general);\n const border = (type: string) => {\n range()?.setBorder(type as BorderType, (type === 'none' ? 0 : 1) as BorderStyleTypes, '#000000');\n setPop(null);\n };\n const lines = (rows: boolean) => {\n const r = range()?.getRange();\n const ws = sheet();\n if (!r || !ws) return;\n if (rows) ws.deleteRows(r.startRow, r.endRow - r.startRow + 1);\n else ws.deleteColumns(r.startColumn, r.endColumn - r.startColumn + 1);\n };\n const swatches = (list: string[], pick: (c: string) => void, none: string, reset: () => void, current: string) => <span className=\"w100n-sheet-swatches\">\n {list.map((c, i) => <button key={i} type=\"button\" aria-label={c} aria-pressed={current.toLowerCase() === c} onClick={() => pick(c)}><i style={{ background: c }} /></button>)}\n <button type=\"button\" className=\"w100n-sheet-none\" onClick={reset}>{none}</button>\n </span>;\n\n return <div className=\"w100n-sheet\" data-theme={theme} onKeyDownCapture={keys}>\n <div className=\"w100n-sheet-ribbon\" role=\"toolbar\" aria-label={t.tools} onKeyDown={rove} onPointerDown={e => { if ((e.target as HTMLElement).closest('button')) e.preventDefault(); }}>\n <div className=\"w100n-sheet-tools\">\n {edit && <>\n {tool(Undo2, t.undo, () => void api()?.undo())}\n {tool(Redo2, t.redo, () => void api()?.redo())}\n {gap}\n {anchor('format', <button type=\"button\" className=\"w100n-sheet-picker\" aria-label={t.format} title={t.format} aria-expanded={pop === 'format'} disabled={phase !== 'ready'}\n onClick={() => setPop(pop === 'format' ? null : 'format')}><span>{shown}</span><ChevronDown aria-hidden /></button>,\n <span className=\"w100n-sheet-list\">{formats.map(([label, pattern], i) => <button key={i} type=\"button\" aria-selected={look?.n === pattern}\n onClick={() => { range()?.setNumberFormat(pattern); setPop(null); }}>{label}<small>{pattern === 'General' ? '' : pattern}</small></button>)}</span>)}\n {tool(Euro, t.asCurrency, () => range()?.setNumberFormat('#,##0.00 \"€\"'), look?.n === '#,##0.00 \"€\"')}\n {tool(Percent, t.asPercent, () => range()?.setNumberFormat('0.00%'), look?.n === '0.00%')}\n {tool(DecimalsArrowLeft, t.fewerDecimals, () => places(-1))}\n {tool(DecimalsArrowRight, t.moreDecimals, () => places(1))}\n {gap}\n {tool(Bold, t.bold, () => run('sheet.command.set-range-bold'), look?.bl)}\n {tool(Italic, t.italic, () => run('sheet.command.set-range-italic'), look?.it)}\n {tool(Underline, t.underline, () => run('sheet.command.set-range-underline'), look?.ul)}\n {tool(Strikethrough, t.strike, () => run('sheet.command.set-range-stroke'), look?.st)}\n {anchor('text', opener('text', Baseline, t.textColour, look?.cl ?? ''),\n swatches(['#0f172a', '#475569', '#dc2626', '#ea580c', '#ca8a04', '#16a34a', '#0891b2', '#2563eb', '#7c3aed', '#db2777'],\n c => run('sheet.command.set-range-text-color', { value: c }), t.automatic, () => run('sheet.command.reset-range-text-color'), look?.cl ?? ''))}\n {anchor('fill', opener('fill', PaintBucket, t.fill, look?.bg ?? ''),\n swatches(['#fee2e2', '#ffedd5', '#fef9c3', '#dcfce7', '#cffafe', '#dbeafe', '#ede9fe', '#fce7f3', '#f1f5f9', '#cbd5e1'],\n c => run('sheet.command.set-background-color', { value: c }), t.noFill, () => run('sheet.command.reset-background-color'), look?.bg ?? ''))}\n {anchor('border', opener('border', Grid2x2, t.borders),\n <span className=\"w100n-sheet-list\">{([[Grid2x2, t.borderAll, 'all'], [Square, t.borderOuter, 'outside'], [PanelBottom, t.borderBottom, 'bottom'], [SquareDashed, t.borderNone, 'none']] as const)\n .map(([Icon, label, type]) => <button key={type} type=\"button\" onClick={() => border(type)}><Icon aria-hidden />{label}</button>)}</span>)}\n {gap}\n {tool(TextAlignStart, t.alignLeft, () => run('sheet.command.set-horizontal-text-align', { value: 1 }), look?.ht === 1)}\n {tool(TextAlignCenter, t.alignCenter, () => run('sheet.command.set-horizontal-text-align', { value: 2 }), look?.ht === 2)}\n {tool(TextAlignEnd, t.alignRight, () => run('sheet.command.set-horizontal-text-align', { value: 3 }), look?.ht === 3)}\n {tool(TextWrap, t.wrap, () => run('sheet.command.set-text-wrap', { value: look?.tb ? 1 : 3 }), look?.tb)}\n {look?.merged ? tool(TableCellsSplit, t.unmerge, () => run('sheet.command.remove-worksheet-merge'), true) : tool(TableCellsMerge, t.merge, () => run('sheet.command.add-worksheet-merge-all'))}\n {gap}\n {tool(BetweenHorizontalStart, t.rowAbove, () => run('sheet.command.insert-row-before'))}\n {tool(BetweenHorizontalEnd, t.rowBelow, () => run('sheet.command.insert-row-after'))}\n {tool(BetweenVerticalStart, t.columnLeft, () => run('sheet.command.insert-col-before'))}\n {tool(BetweenVerticalEnd, t.columnRight, () => run('sheet.command.insert-col-after'))}\n {tool(TableRowsSplit, t.deleteRows, () => lines(true))}\n {tool(TableColumnsSplit, t.deleteColumns, () => lines(false))}\n {anchor('freeze', opener('freeze', Snowflake, t.freeze),\n <span className=\"w100n-sheet-list\">\n <button type=\"button\" onClick={() => { sheet()?.setFrozenRows(1); setPop(null); }}>{t.freezeRow}</button>\n <button type=\"button\" onClick={() => { sheet()?.setFrozenColumns(1); setPop(null); }}>{t.freezeColumn}</button>\n <button type=\"button\" onClick={() => run('sheet.command.set-selection-frozen')}>{t.freezeHere}</button>\n <button type=\"button\" onClick={() => { sheet()?.cancelFreeze(); setPop(null); }}>{t.freezeNone}</button>\n </span>)}\n {gap}\n {tool(Sigma, t.sum, sum)}\n {tool(ArrowDownAZ, t.sortUp, () => run('sheet.command.sort-range-asc'))}\n {tool(ArrowDownZA, t.sortDown, () => run('sheet.command.sort-range-desc'))}\n {!room && tool(Funnel, t.filter, () => run('sheet.command.smart-toggle-filter'))}\n {gap}\n </>}\n {(edit || notes) && tool(StickyNote, t.note, () => run('sheet.operation.add-note-popup'))}\n {tool(Search, t.find, () => run('ui.operation.open-find-dialog'))}\n </div>\n <span className=\"w100n-sheet-end\">\n {room && (room.ready ? !room.online : room.late || room.denied) && <span className=\"w100n-text-live\" title={room.denied ? undefined : t.offlineHint}><WifiOff aria-hidden />{room.denied ? t.liveOff : t.offline}</span>}\n {room && room.people.length > 0 && <span className=\"w100n-text-people\" role=\"group\" aria-label={t.people}>\n {room.people.map(p => <span key={p.id} className=\"w100n-text-face\" title={p.me ? `${p.name} (${t.you})` : p.name} style={{ '--face': p.color } as CSSProperties}>\n {p.avatarUrl ? <img src={p.avatarUrl} alt=\"\" /> : p.name.split(/\\s+/).map(w => w[0]).join('').slice(0, 2).toUpperCase()}\n </span>)}\n </span>}\n {!edit && <span className=\"w100n-docs-badge\">{notes ? t.notesOnly : t.viewOnly}</span>}\n {saving === 'failed' && <span className=\"w100n-sheet-muted\" role=\"alert\">{refusal ? t.refused[refusal.code].replace('{sheet}', refusal.sheet) : t.saveFailed}</span>}\n {(edit || notes) && <button type=\"button\" className=\"w100n-docs-action\" disabled={!pending || saving === 'busy' || phase !== 'ready' || (!!room && !room.online)} onClick={() => void save()}>\n <Save aria-hidden />{saving === 'busy' ? t.saving : !pending && saving === 'done' ? t.saved : t.save}\n </button>}\n </span>\n </div>\n <div className=\"w100n-sheet-stage\" onPointerDown={() => setPop(null)}>\n <div ref={box} className=\"w100n-sheet-grid\" />\n {phase !== 'ready' && <div className=\"w100n-sheet-cover\">\n {phase === 'loading' ? <span>{t.loading}</span> : <span>{t.failed}<button type=\"button\" className=\"w100n-docs-action\" onClick={() => setAttempt(n => n + 1)}>{t.retry}</button></span>}\n </div>}\n </div>\n </div>;\n}\n\nexport default SheetView;\n","import { ICommandService, IUndoRedoService, IUniverInstanceService, mergeWorksheetSnapshotWithDefault, type ICellData, type Injector, type IRange, type IStyleData, type Workbook } from '@univerjs/core';\nimport type { FUniver } from '@univerjs/core/facade';\nimport { SheetLazyExecuteScheduleService } from '@univerjs/sheets';\nimport * as Y from 'yjs';\nimport { quiet } from './engine';\nimport type { SheetModel } from './model';\nimport { canon, fnv, made, notesOf, parts, pieces, props, sheetOf, spot, strip, type Cell, type Col, type Row } from './shared';\n\ntype Matrix<T> = Record<number, Record<number, T>>;\ntype Params = {\n unitId?: string; subUnitId?: string; sheetId?: string; index?: number; toOrder?: number; sheet?: { id: string };\n range?: IRange; sourceRange?: IRange; targetRange?: IRange; ranges?: IRange[]; cellValue?: Matrix<unknown>;\n rowData?: Record<number, unknown>; columnData?: Record<number, unknown>; from?: { subUnitId: string; value: Matrix<unknown> }; to?: { subUnitId: string; value: Matrix<unknown> };\n};\ntype Touch = { rows: Y.YArrayEvent<string>['changes']['delta'] | null; cols: Y.YArrayEvent<string>['changes']['delta'] | null; cells: Set<string>; rowData: Set<string>; colData: Set<string>; marks: boolean; props: Set<string> };\n\nconst setters = [\n ['name', 'sheet.mutation.set-worksheet-name', 'name', ''], ['hidden', 'sheet.mutation.set-worksheet-hidden', 'hidden', 0], ['tabColor', 'sheet.mutation.set-tab-color', 'color', ''],\n ['showGridlines', 'sheet.mutation.toggle-gridlines', 'showGridlines', 1], ['rightToLeft', 'sheet.mutation.set-worksheet-right-to-left', 'rightToLeft', 0],\n ['freeze', 'sheet.mutation.set-frozen', '', { startRow: -1, startColumn: -1, xSplit: 0, ySplit: 0 }],\n] as const;\n\nconst closed = /\\.command\\.(.*filter-(range|criteria)|.*toggle-filter|.*sheet-filter|.*data-?validation.*|.*defined-name|.*protection)$/i;\n\nexport function bind(api: FUniver, injector: Injector, doc: Y.Doc, model: SheetModel, edit: boolean) {\n const unit = model.book.id;\n const wb = injector.get(IUniverInstanceService).getUnit<Workbook>(unit)!;\n const { order, sheets, styles, values } = parts(doc);\n const lines = model.lines;\n const me = {};\n let open = true;\n const looks = wb.getStyles();\n const commands = injector.get(ICommandService);\n const run = (id: string, params: object) => commands.hasCommand(id) && commands.syncExecuteCommand(id, { unitId: unit, ...params }, { fromCollab: true });\n const ws = (sid: string) => wb.getSheetBySheetId(sid)!;\n const at = new Map<string, { rows: Map<string, number>; cols: Map<string, number> }>();\n const index = (sid: string) => at.get(sid) ?? at.set(sid, { rows: new Map(lines[sid].rows.map((id, i) => [id, i])), cols: new Map(lines[sid].cols.map((id, i) => [id, i])) }).get(sid)!;\n const live = (sid: string | undefined): sid is string => !!sid && !!lines[sid] && sheets.has(sid) && !!wb.getSheetBySheetId(sid);\n\n const look = (s: ICellData['s']) => {\n const style = typeof s === 'string' ? looks.get(s) : s;\n if (!style || !Object.keys(style).length) return undefined;\n const text = canon(style);\n if (typeof s === 'string' && styles.has(s) && canon(styles.get(s)) === text) return s;\n const id = `y${fnv(new TextEncoder().encode(text)).toString(36)}`;\n if (!styles.has(id)) styles.set(id, style as IStyleData);\n return id;\n };\n\n const cellOf = (sid: string, r: number, c: number): Cell | null => {\n const raw = ws(sid).getCellRaw(r, c);\n if (!raw) return null;\n const f = raw.f || (raw.si ? api.getWorkbook(unit)!.getSheetBySheetId(sid)!.getRange(r, c).getFormula() : '');\n const out: Cell = f ? { f } : strip({ v: raw.v, t: raw.t });\n if (raw.p) out.p = raw.p;\n const s = look(raw.s);\n if (s) out.s = s;\n return Object.keys(out).length ? out : null;\n };\n\n const put = (sid: string, r: number, c: number) => {\n const row = lines[sid].rows[r], col = lines[sid].cols[c];\n if (row === undefined || col === undefined) return;\n const { cells } = pieces(sheets.get(sid)!);\n const key = spot(row, col);\n const next = cellOf(sid, r, c), was = cells.get(key);\n if (canon(next) === canon(was)) return;\n if (next) cells.set(key, next);\n else cells.delete(key);\n if (next?.f !== was?.f) values.delete(`${sid}:${key}`);\n };\n\n const each = (m: Matrix<unknown> | undefined, fn: (r: number, c: number) => void) => {\n for (const [r, line] of Object.entries(m ?? {})) for (const c of Object.keys(line ?? {})) fn(+r, +c);\n };\n\n const putRow = (sid: string, r: number) => {\n const id = lines[sid].rows[r];\n const raw = ws(sid).getRowManager().getRow(r);\n const { rowData } = pieces(sheets.get(sid)!);\n const next = raw ? strip<Row>({ h: raw.h, hd: raw.hd || undefined, ia: raw.ia, s: look(raw.s) }) : {};\n if (id === undefined || canon(next) === canon(rowData.get(id) ?? {})) return;\n if (Object.keys(next).length) rowData.set(id, next);\n else rowData.delete(id);\n };\n\n const putCol = (sid: string, c: number) => {\n const id = lines[sid].cols[c];\n const raw = ws(sid).getColumnManager().getColumn(c);\n const { colData } = pieces(sheets.get(sid)!);\n const next = raw ? strip<Col>({ w: raw.w, hd: raw.hd || undefined, s: look(raw.s) }) : {};\n if (id === undefined || canon(next) === canon(colData.get(id) ?? {})) return;\n if (Object.keys(next).length) colData.set(id, next);\n else colData.delete(id);\n };\n\n const merges = (sid: string) => {\n const l = lines[sid];\n const { merges: kept } = pieces(sheets.get(sid)!);\n const want = new Set(ws(sid).getMergeData().map(b => [l.rows[b.startRow], l.cols[b.startColumn], l.rows[b.endRow], l.cols[b.endColumn]].join(':')));\n for (const k of [...kept.keys()]) if (!want.has(k)) kept.delete(k);\n for (const k of want) if (!kept.has(k)) kept.set(k, 1);\n };\n\n const notes = (sid: string) => {\n const l = lines[sid];\n const { notes: kept } = pieces(sheets.get(sid)!);\n const want = new Map(api.getWorkbook(unit)!.getSheetBySheetId(sid)!.getNotes().map(n => [spot(l.rows[n.row], l.cols[n.col]), { note: n.note, width: n.width, height: n.height }]));\n for (const k of [...kept.keys()]) if (!want.has(k)) kept.delete(k);\n for (const [k, n] of want) if (canon(kept.get(k)) !== canon(n)) kept.set(k, n);\n };\n\n const prop = (sid: string, name: typeof props[number]) => {\n const m = sheets.get(sid)!;\n const empty = setters.find(x => x[0] === name)![3];\n const now = ws(sid).getConfig()[name] ?? empty;\n if (canon(m.get(name) ?? empty) === canon(now)) return;\n if (canon(now) === canon(empty)) m.delete(name);\n else m.set(name, now);\n };\n\n const fit = (list: Y.Array<string>, now: string[]) => {\n if (list.length > now.length) list.delete(now.length, list.length - now.length);\n else if (list.length < now.length) list.push(now.slice(list.length));\n };\n\n const resync = (sid: string) => {\n const l = lines[sid];\n const { cells } = pieces(sheets.get(sid)!);\n const seen = new Set<string>();\n ws(sid).getCellMatrix().forValue((r, c) => {\n put(sid, r, c);\n seen.add(spot(l.rows[r], l.cols[c]));\n });\n const { rows, cols } = index(sid);\n for (const k of [...cells.keys()]) if (!seen.has(k) && rows.has(k.split(':')[0]) && cols.has(k.split(':')[1])) cells.delete(k);\n l.rows.forEach((_, r) => putRow(sid, r));\n l.cols.forEach((_, c) => putCol(sid, c));\n merges(sid);\n notes(sid);\n props.forEach(name => prop(sid, name));\n };\n\n const write = (id: string, p: Params) => {\n const sid = p.subUnitId ?? p.sheetId;\n if (id === 'sheet.mutation.insert-sheet' && p.sheet && lines[p.sheet.id]) {\n const added = p.sheet.id;\n sheets.set(added, made(ws(added).getConfig(), lines[added]));\n order.insert(Math.min(p.index ?? order.length, order.length), [added]);\n return resync(added);\n }\n if (id === 'sheet.mutation.remove-sheet' && sid) {\n at.delete(sid);\n sheets.delete(sid);\n const i = order.toArray().indexOf(sid);\n if (i >= 0) order.delete(i, 1);\n return;\n }\n if (id === 'sheet.mutation.set-worksheet-order' && sid) {\n const i = order.toArray().indexOf(sid);\n if (i >= 0) order.delete(i, 1);\n return order.insert(Math.min(p.toOrder ?? 0, order.length), [sid]);\n }\n if (id === 'sheet.mutation.move-range' && p.from && p.to) {\n if (live(p.from.subUnitId)) each(p.from.value, (r, c) => put(p.from!.subUnitId, r, c));\n if (live(p.to.subUnitId)) each(p.to.value, (r, c) => put(p.to!.subUnitId, r, c));\n return;\n }\n if (!live(sid)) return;\n const { rows, cols } = pieces(sheets.get(sid)!);\n const l = lines[sid];\n const count = (r: IRange, row: boolean) => row ? r.endRow - r.startRow + 1 : r.endColumn - r.startColumn + 1;\n const shift = (list: Y.Array<string>, from: number, n: number, to: number) => {\n const ids = list.slice(from, from + n);\n list.delete(from, n);\n list.insert(to > from ? to - n : to, ids);\n at.delete(sid);\n };\n switch (id) {\n case 'sheet.mutation.set-range-values': return each(p.cellValue, (r, c) => put(sid, r, c));\n case 'sheet.mutation.reorder-range':\n for (let r = p.range!.startRow; r <= p.range!.endRow; r++) for (let c = p.range!.startColumn; c <= p.range!.endColumn; c++) put(sid, r, c);\n return;\n case 'sheet.mutation.insert-row':\n rows.insert(p.range!.startRow, l.rows.slice(p.range!.startRow, p.range!.endRow + 1));\n at.delete(sid);\n for (let r = p.range!.startRow; r <= p.range!.endRow; r++) putRow(sid, r);\n return;\n case 'sheet.mutation.insert-col':\n cols.insert(p.range!.startColumn, l.cols.slice(p.range!.startColumn, p.range!.endColumn + 1));\n at.delete(sid);\n for (let c = p.range!.startColumn; c <= p.range!.endColumn; c++) putCol(sid, c);\n return;\n case 'sheet.mutation.remove-rows':\n at.delete(sid);\n return rows.delete(p.range!.startRow, count(p.range!, true));\n case 'sheet.mutation.remove-col':\n at.delete(sid);\n return cols.delete(p.range!.startColumn, count(p.range!, false));\n case 'sheet.mutation.move-rows': return shift(rows, p.sourceRange!.startRow, count(p.sourceRange!, true), p.targetRange!.startRow);\n case 'sheet.mutation.move-columns': return shift(cols, p.sourceRange!.startColumn, count(p.sourceRange!, false), p.targetRange!.startColumn);\n case 'sheet.mutation.set-worksheet-row-count':\n at.delete(sid);\n return fit(rows, l.rows);\n case 'sheet.mutation.set-worksheet-column-count':\n at.delete(sid);\n return fit(cols, l.cols);\n case 'sheet.mutation.set-worksheet-row-height':\n case 'sheet.mutation.set-worksheet-row-is-auto-height':\n case 'sheet.mutation.set-row-hidden':\n case 'sheet.mutation.set-row-visible':\n for (const r of p.ranges ?? []) for (let i = r.startRow; i <= r.endRow; i++) putRow(sid, i);\n return;\n case 'sheet.mutation.set-worksheet-col-width':\n case 'sheet.mutation.set-col-hidden':\n case 'sheet.mutation.set-col-visible':\n for (const r of p.ranges ?? []) for (let i = r.startColumn; i <= r.endColumn; i++) putCol(sid, i);\n return;\n case 'sheet.mutation.set-row-data': return Object.keys(p.rowData ?? {}).forEach(r => putRow(sid, +r));\n case 'sheet.mutation.set-col-data': return Object.keys(p.columnData ?? {}).forEach(c => putCol(sid, +c));\n case 'sheet.mutation.add-worksheet-merge':\n case 'sheet.mutation.remove-worksheet-merge': return merges(sid);\n case 'sheet.mutation.update-note':\n case 'sheet.mutation.remove-note':\n case 'sheet.mutation.update-note-position': return notes(sid);\n default: {\n const setter = setters.find(x => x[1] === id);\n if (setter) prop(sid, setter[0]);\n else if (!quiet.has(id)) resync(sid);\n }\n }\n };\n\n const computed = (p: Params) => {\n const sid = p.subUnitId;\n if (!live(sid)) return;\n each(p.cellValue, (r, c) => {\n const raw = ws(sid).getCellRaw(r, c);\n const row = lines[sid].rows[r], col = lines[sid].cols[c];\n if ((!raw?.f && !raw?.si) || row === undefined || col === undefined) return;\n const key = `${sid}:${spot(row, col)}`, next = { v: raw.v ?? null, t: raw.t ?? null };\n if (canon(values.get(key)) !== canon(next)) values.set(key, next);\n });\n };\n\n const refuse = api.addEvent(api.Event.BeforeCommandExecute, e => {\n if (edit && e.type === 0 && closed.test(e.id)) e.cancel = true;\n });\n\n const local = api.addEvent(api.Event.CommandExecuted, e => {\n const p = (e.params ?? {}) as Params;\n if (e.type !== 2 || p.unitId !== unit || e.options?.fromCollab || !edit) return;\n if (e.options?.onlyLocal) {\n if (e.options.applyFormulaCalculationResult) doc.transact(() => computed(p), me);\n return;\n }\n doc.transact(() => write(e.id, p), me);\n });\n\n const lazy = commands.onMutationExecutedForCollab((e, options) => {\n if (!edit || !options?.syncOnly || e.id !== 'sheet.mutation.copy-worksheet-end') return;\n const sid = (e.params as Params).subUnitId!;\n const wait = () => open && (injector.get(SheetLazyExecuteScheduleService).hasPendingTasks() ? setTimeout(wait, 100) : live(sid) && doc.transact(() => resync(sid), me));\n wait();\n });\n\n const full = (sid: string, key: string, x: Cell | undefined): ICellData | null => {\n if (!x) return null;\n const kept = x.f ? values.get(`${sid}:${key}`) : undefined;\n return { v: (x.f ? kept?.v : x.v) ?? null, t: (x.f ? kept?.t : x.t) ?? undefined, f: x.f ?? null, si: null, p: x.p ?? null, s: x.s ? styles.get(x.s) ?? null : null };\n };\n\n const cellsTo = (sid: string, keys: Iterable<string>) => {\n const { cells } = pieces(sheets.get(sid)!);\n const { rows, cols } = index(sid);\n const cellValue: Matrix<ICellData | null> = {};\n for (const key of keys) {\n const [row, col] = key.split(':');\n const r = rows.get(row), c = cols.get(col);\n if (r !== undefined && c !== undefined) (cellValue[r] ??= {})[c] = full(sid, key, cells.get(key));\n }\n if (Object.keys(cellValue).length) run('sheet.mutation.set-range-values', { subUnitId: sid, cellValue, isOverrideStyle: true });\n };\n\n const linesTo = (sid: string, ids: Iterable<string>, row: boolean) => {\n const { rowData, colData } = pieces(sheets.get(sid)!);\n const map = row ? index(sid).rows : index(sid).cols;\n const info: Record<number, object | null> = {}, sizes: Record<number, number> = {};\n const ranges: IRange[] = [];\n for (const id of ids) {\n const i = map.get(id);\n if (i === undefined) continue;\n const x = (row ? rowData : colData).get(id) as (Row & Col) | undefined;\n const s = x?.s ? styles.get(x.s) : undefined;\n info[i] = x ? row ? { h: x.h, hd: x.hd, ia: x.ia, s } : { w: x.w, hd: x.hd, s } : null;\n const size = row ? x?.h : x?.w;\n if (size !== undefined) sizes[i] = size;\n ranges.push({ startRow: row ? i : 0, endRow: row ? i : 0, startColumn: row ? 0 : i, endColumn: row ? 0 : i });\n }\n if (!ranges.length) return;\n if (row) {\n run('sheet.mutation.set-row-data', { subUnitId: sid, rowData: info });\n run('sheet.mutation.set-worksheet-row-height', { subUnitId: sid, ranges, rowHeight: sizes });\n } else {\n run('sheet.mutation.set-col-data', { subUnitId: sid, columnData: info });\n run('sheet.mutation.set-worksheet-col-width', { subUnitId: sid, ranges, colWidth: sizes });\n }\n };\n\n const mergesTo = (sid: string) => {\n const { merges: kept } = pieces(sheets.get(sid)!);\n const { rows, cols } = index(sid);\n const want = [...kept.keys()].map(k => k.split(':')).map(([r0, c0, r1, c1]) => ({ startRow: rows.get(r0)!, startColumn: cols.get(c0)!, endRow: rows.get(r1)!, endColumn: cols.get(c1)! }))\n .filter(b => [b.startRow, b.startColumn, b.endRow, b.endColumn].every(n => n !== undefined));\n const has = ws(sid).getMergeData().map(b => ({ startRow: b.startRow, startColumn: b.startColumn, endRow: b.endRow, endColumn: b.endColumn }));\n const gone = has.filter(b => !want.some(w => canon(w) === canon(b))), added = want.filter(w => !has.some(b => canon(w) === canon(b)));\n if (gone.length) run('sheet.mutation.remove-worksheet-merge', { subUnitId: sid, ranges: gone });\n if (added.length) run('sheet.mutation.add-worksheet-merge', { subUnitId: sid, ranges: added });\n };\n\n const notesTo = (sid: string) => {\n const want = notesOf(sheets.get(sid)!, lines[sid]);\n const shown = api.getWorkbook(unit)!.getSheetBySheetId(sid)!.getNotes();\n for (const n of shown) if (!want.some(w => w.row === n.row && w.col === n.col)) run('sheet.mutation.remove-note', { sheetId: sid, noteId: n.id, row: n.row, col: n.col });\n for (const w of want) {\n const n = shown.find(x => x.row === w.row && x.col === w.col);\n if (!n || n.note !== w.note || n.width !== w.width || n.height !== w.height) run('sheet.mutation.update-note', { sheetId: sid, row: w.row, col: w.col, note: { note: w.note, width: w.width, height: w.height } });\n }\n };\n\n const shape = () => {\n const want = [...new Set(order.toArray())].filter(sid => sheets.has(sid));\n for (const sheet of wb.getSheets()) {\n const sid = sheet.getSheetId();\n if (want.includes(sid)) continue;\n if (wb.getActiveSheet().getSheetId() === sid) {\n const other = want.find(x => wb.getSheetBySheetId(x));\n if (other) api.syncExecuteCommand('sheet.operation.set-worksheet-active', { unitId: unit, subUnitId: other });\n }\n run('sheet.mutation.remove-sheet', { subUnitId: sid });\n delete lines[sid];\n at.delete(sid);\n }\n want.forEach((sid, i) => {\n if (wb.getSheetBySheetId(sid)) return;\n const { rows, cols } = pieces(sheets.get(sid)!);\n lines[sid] = { rows: rows.toArray(), cols: cols.toArray() };\n run('sheet.mutation.insert-sheet', { index: Math.min(i, wb.getSheets().length), sheet: mergeWorksheetSnapshotWithDefault(sheetOf(doc, sid, lines[sid])), styles: styles.toJSON() });\n notesTo(sid);\n });\n want.forEach((sid, i) => {\n const now = wb.getSheetOrders().indexOf(sid);\n if (now >= 0 && now !== i) run('sheet.mutation.set-worksheet-order', { subUnitId: sid, fromOrder: now, toOrder: i });\n });\n };\n\n const move = (sid: string, delta: Touch['rows'], row: boolean) => {\n const added = new Set<string>();\n if (!delta) return added;\n const list = row ? lines[sid].rows : lines[sid].cols;\n let i = 0;\n for (const d of delta) {\n if (d.retain) i += d.retain;\n if (d.delete) {\n const end = i + d.delete - 1;\n if (row) run('sheet.mutation.remove-rows', { subUnitId: sid, range: { startRow: i, endRow: end, startColumn: 0, endColumn: lines[sid].cols.length - 1, rangeType: 1 } });\n else run('sheet.mutation.remove-col', { subUnitId: sid, range: { startRow: 0, endRow: lines[sid].rows.length - 1, startColumn: i, endColumn: end, rangeType: 2 } });\n list.splice(i, d.delete);\n }\n if (d.insert) {\n const ids = d.insert as string[];\n const end = i + ids.length - 1;\n if (row) run('sheet.mutation.insert-row', { subUnitId: sid, range: { startRow: i, endRow: end, startColumn: 0, endColumn: lines[sid].cols.length - 1 } });\n else run('sheet.mutation.insert-col', { subUnitId: sid, range: { startRow: 0, endRow: lines[sid].rows.length - 1, startColumn: i, endColumn: end } });\n list.splice(i, 0, ...ids);\n ids.forEach(id => added.add(id));\n i += ids.length;\n }\n }\n at.delete(sid);\n return added;\n };\n\n const remote = (events: Y.YEvent<Y.AbstractType<unknown>>[], tr: Y.Transaction) => {\n if (tr.origin === me) return;\n const touched = new Map<string, Touch>();\n let reshaped = false;\n for (const e of events) {\n const t = e.target;\n if (t === sheets || t === order) {\n reshaped = true;\n continue;\n }\n const owner = t.parent === sheets ? t : t.parent?.parent === sheets ? t.parent : null;\n const sid = owner && [...sheets.entries()].find(([, m]) => m === owner)?.[0];\n if (!owner || !sid) continue;\n if (!touched.has(sid)) touched.set(sid, { rows: null, cols: null, cells: new Set(), rowData: new Set(), colData: new Set(), marks: false, props: new Set() });\n const s = touched.get(sid)!;\n const m = owner as Y.Map<unknown>;\n const keys = [...e.changes.keys.keys()];\n if (t === owner) keys.forEach(k => s.props.add(k));\n else if (t === m.get('rows')) s.rows = e.changes.delta;\n else if (t === m.get('cols')) s.cols = e.changes.delta;\n else if (t === m.get('cells')) keys.forEach(k => s.cells.add(k));\n else if (t === m.get('rowData')) keys.forEach(k => s.rowData.add(k));\n else if (t === m.get('colData')) keys.forEach(k => s.colData.add(k));\n else s.marks = true;\n }\n let structural = false;\n if (reshaped) {\n const before = wb.getSheets().length;\n shape();\n structural = before !== wb.getSheets().length;\n }\n for (const [sid, s] of touched) {\n if (!live(sid)) continue;\n const rows = move(sid, s.rows, true), cols = move(sid, s.cols, false);\n if (s.rows || s.cols) structural = true;\n for (const [name, id, key, empty] of setters) if (s.props.has(name)) {\n const v = sheets.get(sid)!.get(name) ?? empty;\n run(id, { subUnitId: sid, ...(key ? { [key]: v } : v as object) });\n }\n const keys = new Set(s.cells);\n if (rows.size || cols.size) for (const k of pieces(sheets.get(sid)!).cells.keys()) if (rows.has(k.split(':')[0]) || cols.has(k.split(':')[1])) keys.add(k);\n linesTo(sid, new Set([...s.rowData, ...rows]), true);\n linesTo(sid, new Set([...s.colData, ...cols]), false);\n cellsTo(sid, keys);\n if (s.marks || s.rows || s.cols) {\n mergesTo(sid);\n notesTo(sid);\n }\n }\n if (structural) injector.get(IUndoRedoService).clearUndoRedo(unit);\n };\n\n parts(doc).book.observeDeep(remote);\n return () => {\n open = false;\n refuse.dispose();\n local.dispose();\n lazy.dispose();\n parts(doc).book.unobserveDeep(remote);\n };\n}\n","import type { IRange, IWorksheetData } from '@univerjs/core';\nimport type { FUniver } from '@univerjs/core/facade';\nimport type { FWorkbook } from '@univerjs/sheets/facade';\nimport type { Rights } from '../types';\nimport { fresh, insert, move, resize, type SheetModel } from './model';\n\nexport const quiet = new Set(['sheet.mutation.set-worksheet-row-auto-height', 'sheet.mutation.mark-dirty-filter-change', 'sheet.mutation.re-calc-filter',\n 'sheet.mutation.toggle-note-popup', 'sheet.mutation.update-note-position', 'sheet.mutation.empty', 'sheet.mutation.set-zoom-ratio']);\n\nconst mutation = 2;\n\ntype Params = { unitId?: string; subUnitId?: string; range?: IRange; sourceRange?: IRange; targetRange?: IRange; rowCount?: number; columnCount?: number; sheet?: IWorksheetData };\n\nexport const allowed = (rights: Rights, id: string) => rights.edit || quiet.has(id) || (rights.comment && /\\.(update|remove|delete)-note$|note-popup$/.test(id));\n\nexport function track(api: FUniver, model: SheetModel, rights: Rights, onDirty: () => void) {\n const lines = model.lines;\n const ours = (p: unknown) => (p as Params | undefined)?.unitId === model.book.id;\n const before = api.addEvent(api.Event.BeforeCommandExecute, e => {\n if (e.type !== mutation || e.options?.onlyLocal || e.options?.fromCollab || !ours(e.params)) return;\n if (!allowed(rights, e.id)) e.cancel = true;\n });\n const after = api.addEvent(api.Event.CommandExecuted, e => {\n if (e.type !== mutation || e.options?.onlyLocal || e.options?.fromCollab || !ours(e.params)) return;\n const p = (e.params ?? {}) as Params;\n const l = p.subUnitId ? lines[p.subUnitId] : undefined;\n const span = (r: IRange | undefined, rows: boolean) => r ? rows ? r.endRow - r.startRow + 1 : r.endColumn - r.startColumn + 1 : 0;\n if (e.id === 'sheet.mutation.insert-sheet' && p.sheet) {\n lines[p.sheet.id] = { rows: Array.from({ length: p.sheet.rowCount ?? 1000 }, () => fresh('n')), cols: Array.from({ length: p.sheet.columnCount ?? 26 }, () => fresh('n')) };\n } else if (e.id === 'sheet.mutation.remove-sheet' && p.subUnitId) delete lines[p.subUnitId];\n else if (l) {\n if (e.id === 'sheet.mutation.insert-row') insert(l.rows, p.range!.startRow, span(p.range, true), 'n');\n else if (e.id === 'sheet.mutation.remove-rows') l.rows.splice(p.range!.startRow, span(p.range, true));\n else if (e.id === 'sheet.mutation.move-rows') move(l.rows, p.sourceRange!.startRow, span(p.sourceRange, true), p.targetRange!.startRow);\n else if (e.id === 'sheet.mutation.insert-col') insert(l.cols, p.range!.startColumn, span(p.range, false), 'n');\n else if (e.id === 'sheet.mutation.remove-col') l.cols.splice(p.range!.startColumn, span(p.range, false));\n else if (e.id === 'sheet.mutation.move-columns') move(l.cols, p.sourceRange!.startColumn, span(p.sourceRange, false), p.targetRange!.startColumn);\n else if (e.id === 'sheet.mutation.set-worksheet-row-count' && p.rowCount) resize(l.rows, p.rowCount, 'n');\n else if (e.id === 'sheet.mutation.set-worksheet-column-count' && p.columnCount) resize(l.cols, p.columnCount, 'n');\n }\n if (!quiet.has(e.id)) onDirty();\n });\n return () => { before.dispose(); after.dispose(); };\n}\n\nexport function snapshot(api: FUniver, model: SheetModel): SheetModel {\n const wb: FWorkbook = api.getActiveWorkbook()!;\n const book = wb.save();\n const lines = Object.fromEntries(book.sheetOrder.map(sid => {\n const l = model.lines[sid] ?? { rows: [], cols: [] };\n const sheet = book.sheets[sid];\n const rows = [...l.rows], cols = [...l.cols];\n resize(rows, sheet.rowCount ?? rows.length, 'n');\n resize(cols, sheet.columnCount ?? cols.length, 'n');\n return [sid, { rows, cols }];\n }));\n return { ...model, book, lines, active: wb.getActiveSheet().getSheetId() };\n}\n"],"mappings":"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","names":["span","move","m","host","api","range"]}
|