@w100n/documents 0.13.0 → 0.15.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/{SheetView-3XTEV2VT.css → SheetView-43MPR64N.css} +5 -4
- package/dist/{SheetView-3XTEV2VT.css.map → SheetView-43MPR64N.css.map} +1 -1
- package/dist/{SheetView-3UAFXGZS.js → SheetView-72KXS4DM.js} +51 -10
- package/dist/SheetView-72KXS4DM.js.map +1 -0
- package/dist/TextEditor-NSICFE6U.js +1562 -0
- package/dist/TextEditor-NSICFE6U.js.map +1 -0
- package/dist/{chunk-L765DZPO.js → chunk-2CA3HQTI.js} +3 -3
- package/dist/{chunk-L765DZPO.js.map → chunk-2CA3HQTI.js.map} +1 -1
- package/dist/{chunk-WR3MT7KP.js → chunk-M4OQG3EN.js} +754 -57
- package/dist/chunk-M4OQG3EN.js.map +1 -0
- package/dist/{chunk-T7XCGDE5.js → chunk-OXC4PUOC.js} +2 -2
- package/dist/{chunk-MRP3EURG.js → chunk-Z7UNJ4ND.js} +194 -25
- package/dist/chunk-Z7UNJ4ND.js.map +1 -0
- package/dist/collab.cjs +927 -80
- package/dist/collab.cjs.map +1 -1
- package/dist/collab.d.cts +2 -2
- package/dist/collab.d.ts +2 -2
- package/dist/collab.js +2 -2
- package/dist/{grid-EI5JNZAA.js → grid-Q4XBPQFY.js} +3 -3
- package/dist/grid-Q4XBPQFY.js.map +1 -0
- package/dist/index.cjs +2136 -420
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1047 -171
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +9 -4
- package/dist/index.d.ts +9 -4
- package/dist/index.js +283 -33
- package/dist/index.js.map +1 -1
- package/dist/kinds.cjs +2 -2
- package/dist/kinds.cjs.map +1 -1
- package/dist/kinds.d.cts +2 -2
- package/dist/kinds.d.ts +2 -2
- package/dist/kinds.js +1 -1
- package/dist/memory.cjs +3 -0
- package/dist/memory.cjs.map +1 -1
- package/dist/memory.d.cts +1 -1
- package/dist/memory.d.ts +1 -1
- package/dist/memory.js +4 -1
- package/dist/memory.js.map +1 -1
- package/dist/{types-Er60M5kL.d.ts → types-BTsVooZw.d.cts} +2 -1
- package/dist/{types-Er60M5kL.d.cts → types-BTsVooZw.d.ts} +2 -1
- package/dist/write-BCI8yool.d.cts +16 -0
- package/dist/write-BCI8yool.d.ts +16 -0
- package/package.json +1 -1
- package/dist/SheetView-3UAFXGZS.js.map +0 -1
- package/dist/TextEditor-OLBLWC6F.js +0 -983
- package/dist/TextEditor-OLBLWC6F.js.map +0 -1
- package/dist/chunk-MRP3EURG.js.map +0 -1
- package/dist/chunk-WR3MT7KP.js.map +0 -1
- package/dist/grid-EI5JNZAA.js.map +0 -1
- package/dist/write-DaVtTJCS.d.cts +0 -6
- package/dist/write-DaVtTJCS.d.ts +0 -6
- /package/dist/{chunk-T7XCGDE5.js.map → chunk-OXC4PUOC.js.map} +0 -0
package/dist/kinds.cjs
CHANGED
|
@@ -57,9 +57,9 @@ function readable(name, mimeType) {
|
|
|
57
57
|
const kind = kindOf(name, mimeType);
|
|
58
58
|
return kind !== "sheet" || /\.(xlsx|csv)$/i.test(name) || /spreadsheetml|text\/csv/.test(mimeType ?? "") ? kind : null;
|
|
59
59
|
}
|
|
60
|
-
function matches(doc, query,
|
|
60
|
+
function matches(doc, query, picked) {
|
|
61
61
|
const words = query.toLocaleLowerCase().split(/\s+/).filter(Boolean);
|
|
62
|
-
return (
|
|
62
|
+
return (!picked.length || picked.includes(doc.kind)) && words.every((word) => doc.name.toLocaleLowerCase().includes(word));
|
|
63
63
|
}
|
|
64
64
|
// Annotate the CommonJS export names for ESM import in node:
|
|
65
65
|
0 && (module.exports = {
|
package/dist/kinds.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/kinds.ts"],"sourcesContent":["import type { DocumentKind } from './types';\n\nconst byExtension: Record<string, DocumentKind> = {\n docx: 'docx', md: 'markdown', markdown: 'markdown', pdf: 'pdf', xlsx: 'sheet', csv: 'sheet', xls: 'sheet', ods: 'sheet', tsv: 'sheet', html: 'slides', htm: 'slides',\n};\n\nconst byMime: Record<string, DocumentKind> = {\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'text/markdown': 'markdown',\n 'application/pdf': 'pdf',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'sheet',\n 'text/csv': 'sheet',\n 'text/html': 'slides',\n};\n\nexport const kinds: DocumentKind[] = ['docx', 'markdown', 'pdf', 'sheet', 'slides'];\n\nexport function kindOf(name: string, mimeType?: string | null): DocumentKind | null {\n const extension = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n return byExtension[extension] ?? (mimeType ? byMime[mimeType.split(';')[0].trim().toLowerCase()] : undefined) ?? null;\n}\n\nexport function readable(name: string, mimeType?: string | null): DocumentKind | null {\n const kind = kindOf(name, mimeType);\n return kind !== 'sheet' || /\\.(xlsx|csv)$/i.test(name) || /spreadsheetml|text\\/csv/.test(mimeType ?? '') ? kind : null;\n}\n\nexport function matches(doc: { name: string; kind: DocumentKind }, query: string,
|
|
1
|
+
{"version":3,"sources":["../src/kinds.ts"],"sourcesContent":["import type { DocumentKind } from './types';\n\nconst byExtension: Record<string, DocumentKind> = {\n docx: 'docx', md: 'markdown', markdown: 'markdown', pdf: 'pdf', xlsx: 'sheet', csv: 'sheet', xls: 'sheet', ods: 'sheet', tsv: 'sheet', html: 'slides', htm: 'slides',\n};\n\nconst byMime: Record<string, DocumentKind> = {\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'text/markdown': 'markdown',\n 'application/pdf': 'pdf',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'sheet',\n 'text/csv': 'sheet',\n 'text/html': 'slides',\n};\n\nexport const kinds: DocumentKind[] = ['docx', 'markdown', 'pdf', 'sheet', 'slides'];\n\nexport function kindOf(name: string, mimeType?: string | null): DocumentKind | null {\n const extension = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n return byExtension[extension] ?? (mimeType ? byMime[mimeType.split(';')[0].trim().toLowerCase()] : undefined) ?? null;\n}\n\nexport function readable(name: string, mimeType?: string | null): DocumentKind | null {\n const kind = kindOf(name, mimeType);\n return kind !== 'sheet' || /\\.(xlsx|csv)$/i.test(name) || /spreadsheetml|text\\/csv/.test(mimeType ?? '') ? kind : null;\n}\n\nexport function matches(doc: { name: string; kind: DocumentKind }, query: string, picked: DocumentKind[]) {\n const words = query.toLocaleLowerCase().split(/\\s+/).filter(Boolean);\n return (!picked.length || picked.includes(doc.kind)) && words.every(word => doc.name.toLocaleLowerCase().includes(word));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,IAAM,cAA4C;AAAA,EAChD,MAAM;AAAA,EAAQ,IAAI;AAAA,EAAY,UAAU;AAAA,EAAY,KAAK;AAAA,EAAO,MAAM;AAAA,EAAS,KAAK;AAAA,EAAS,KAAK;AAAA,EAAS,KAAK;AAAA,EAAS,KAAK;AAAA,EAAS,MAAM;AAAA,EAAU,KAAK;AAC9J;AAEA,IAAM,SAAuC;AAAA,EAC3C,2EAA2E;AAAA,EAC3E,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qEAAqE;AAAA,EACrE,YAAY;AAAA,EACZ,aAAa;AACf;AAEO,IAAM,QAAwB,CAAC,QAAQ,YAAY,OAAO,SAAS,QAAQ;AAE3E,SAAS,OAAO,MAAc,UAA+C;AAClF,QAAM,YAAY,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,EAAG,YAAY,IAAI;AAC9E,SAAO,YAAY,SAAS,MAAM,WAAW,OAAO,SAAS,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,WAAc;AACnH;AAEO,SAAS,SAAS,MAAc,UAA+C;AACpF,QAAM,OAAO,OAAO,MAAM,QAAQ;AAClC,SAAO,SAAS,WAAW,iBAAiB,KAAK,IAAI,KAAK,0BAA0B,KAAK,YAAY,EAAE,IAAI,OAAO;AACpH;AAEO,SAAS,QAAQ,KAA2C,OAAe,QAAwB;AACxG,QAAM,QAAQ,MAAM,kBAAkB,EAAE,MAAM,KAAK,EAAE,OAAO,OAAO;AACnE,UAAQ,CAAC,OAAO,UAAU,OAAO,SAAS,IAAI,IAAI,MAAM,MAAM,MAAM,UAAQ,IAAI,KAAK,kBAAkB,EAAE,SAAS,IAAI,CAAC;AACzH;","names":[]}
|
package/dist/kinds.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as DocumentKind } from './types-
|
|
1
|
+
import { b as DocumentKind } from './types-BTsVooZw.cjs';
|
|
2
2
|
|
|
3
3
|
declare const kinds: DocumentKind[];
|
|
4
4
|
declare function kindOf(name: string, mimeType?: string | null): DocumentKind | null;
|
|
@@ -6,6 +6,6 @@ declare function readable(name: string, mimeType?: string | null): DocumentKind
|
|
|
6
6
|
declare function matches(doc: {
|
|
7
7
|
name: string;
|
|
8
8
|
kind: DocumentKind;
|
|
9
|
-
}, query: string,
|
|
9
|
+
}, query: string, picked: DocumentKind[]): boolean;
|
|
10
10
|
|
|
11
11
|
export { kindOf, kinds, matches, readable };
|
package/dist/kinds.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as DocumentKind } from './types-
|
|
1
|
+
import { b as DocumentKind } from './types-BTsVooZw.js';
|
|
2
2
|
|
|
3
3
|
declare const kinds: DocumentKind[];
|
|
4
4
|
declare function kindOf(name: string, mimeType?: string | null): DocumentKind | null;
|
|
@@ -6,6 +6,6 @@ declare function readable(name: string, mimeType?: string | null): DocumentKind
|
|
|
6
6
|
declare function matches(doc: {
|
|
7
7
|
name: string;
|
|
8
8
|
kind: DocumentKind;
|
|
9
|
-
}, query: string,
|
|
9
|
+
}, query: string, picked: DocumentKind[]): boolean;
|
|
10
10
|
|
|
11
11
|
export { kindOf, kinds, matches, readable };
|
package/dist/kinds.js
CHANGED
package/dist/memory.cjs
CHANGED
|
@@ -139,6 +139,9 @@ function memoryHost({ me, spaces, files, collab }) {
|
|
|
139
139
|
if (!file.comments?.find((c) => c.id === commentId)?.author.id.startsWith("guest:")) own(file, commentId);
|
|
140
140
|
file.comments = file.comments.filter((c) => c.id !== commentId && c.replyTo !== commentId);
|
|
141
141
|
},
|
|
142
|
+
rename: async (id, name) => {
|
|
143
|
+
find(id).name = name;
|
|
144
|
+
},
|
|
142
145
|
exportAs: async (id, format) => {
|
|
143
146
|
const file = find(id);
|
|
144
147
|
if ((format === "md" ? "markdown" : format) !== kindOf(file.name)) throw new Error("this format needs a converter on the host");
|
package/dist/memory.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/memory.ts","../src/kinds.ts"],"sourcesContent":["import { kindOf } from './kinds';\nimport type { Comment, DocumentsHost, Person, Rights, Signature, Space } from './types';\n\ntype Bytes = ArrayBuffer | string;\n\nexport type MemoryFile = {\n id: string;\n spaceId: string;\n name: string;\n folder?: string;\n bytes: Bytes;\n version?: string;\n note?: string;\n updatedAt?: string;\n rights?: Partial<Rights>;\n versions?: { id: string; createdAt: string; bytes: Bytes; note?: string }[];\n signatures?: Signature[];\n comments?: Comment[];\n};\n\nconst mimes = { pdf: 'application/pdf', docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', md: 'text/markdown' };\n\nconst encode = (bytes: Bytes) => typeof bytes === 'string' ? new TextEncoder().encode(bytes).buffer as ArrayBuffer : bytes;\n\nexport function memoryHost({ me, spaces, files, collab }: { me: Person; spaces: Space[]; files: MemoryFile[]; collab?: string }): DocumentsHost {\n const find = (id: string) => {\n const file = files.find(item => item.id === id);\n if (!file) throw new Error('document not found');\n return file;\n };\n const own = (file: MemoryFile, commentId: string) => {\n const found = file.comments?.find(c => c.id === commentId);\n if (!found || found.author.id !== me.id) throw new Error('only the author changes a comment');\n return found;\n };\n const summary = (file: MemoryFile) => ({\n id: file.id, spaceId: file.spaceId, name: file.name, kind: kindOf(file.name)!, size: encode(file.bytes).byteLength,\n updatedAt: file.updatedAt ?? '2026-10-19T09:00:00Z', updatedBy: me, folder: file.folder ?? null,\n });\n const archive = (file: MemoryFile, bytes: Bytes, note?: string) => {\n const versions = [{ id: file.version ?? `v${(file.versions?.length ?? 0) + 1}`, createdAt: file.updatedAt ?? '2026-10-19T09:00:00Z', bytes: file.bytes, note: file.note }, ...(file.versions ?? [])];\n const version = `v${versions.length + 1}`;\n Object.assign(file, { versions, version, bytes, note, updatedAt: new Date().toISOString() });\n return version;\n };\n return {\n me,\n ...(collab ? { collab: { url: `memory:${collab}`, token: async () => me.id } } : {}),\n spaces: async () => spaces,\n documents: async spaceId => files.filter(file => file.spaceId === spaceId && kindOf(file.name)).map(summary),\n document: async id => ({ ...summary(find(id)), rights: { view: true, comment: true, edit: true, ...find(id).rights }, live: !!collab }),\n versions: async id => {\n const file = find(id);\n return [\n { id: file.version ?? 'current', createdAt: summary(file).updatedAt, size: summary(file).size, author: me, note: file.note ?? null, current: true },\n ...(file.versions ?? []).map(v => ({ id: v.id, createdAt: v.createdAt, size: encode(v.bytes).byteLength, author: me, note: v.note ?? null, current: false })),\n ];\n },\n content: async (id, versionId) => {\n const file = find(id);\n const old = versionId && versionId !== 'current' && versionId !== file.version ? file.versions?.find(v => v.id === versionId) : undefined;\n return encode(old ? old.bytes : file.bytes);\n },\n restore: async (id, versionId) => {\n const file = find(id);\n const old = file.versions?.find(v => v.id === versionId);\n if (!old) throw new Error('version not found');\n archive(file, old.bytes);\n },\n save: async (id, bytes, note) => ({ versionId: archive(find(id), bytes, note) }),\n signatures: async id => [...(find(id).signatures ?? [])].reverse(),\n sign: async (id, entry) => {\n const file = find(id);\n const signature = { id: `s${(file.signatures?.length ?? 0) + 1}`, signer: me, signedAt: new Date().toISOString(), ...entry };\n file.signatures = [...(file.signatures ?? []), signature];\n return signature;\n },\n comments: async id => [...(find(id).comments ?? [])],\n comment: async (id, entry) => {\n const file = find(id);\n let n = (file.comments?.length ?? 0) + 1;\n while (file.comments?.some(c => c.id === `c${n}`)) n++;\n const made: Comment = { id: `c${n}`, documentId: id, author: me, body: entry.body, createdAt: new Date().toISOString(), quote: entry.quote, replyTo: entry.replyTo, resolved: false };\n file.comments = [...(file.comments ?? []), made];\n return made;\n },\n resolveComment: async (id, commentId, resolved) => {\n const file = find(id);\n file.comments = (file.comments ?? []).map(c => c.id === commentId ? { ...c, resolved } : c);\n },\n editComment: async (id, commentId, body) => {\n const file = find(id);\n const mine = own(file, commentId);\n const edited = { ...mine, body };\n file.comments = file.comments!.map(c => c === mine ? edited : c);\n return edited;\n },\n deleteComment: async (id, commentId) => {\n const file = find(id);\n if (!file.comments?.find(c => c.id === commentId)?.author.id.startsWith('guest:')) own(file, commentId);\n file.comments = file.comments!.filter(c => c.id !== commentId && c.replyTo !== commentId);\n },\n exportAs: async (id, format) => {\n const file = find(id);\n if ((format === 'md' ? 'markdown' : format) !== kindOf(file.name)) throw new Error('this format needs a converter on the host');\n return new Blob([encode(file.bytes)], { type: mimes[format] });\n },\n ...(spaces.length ? {\n createIn: `${spaces[0].name} / Documents`,\n create: async ({ name, bytes }: { name: string; bytes: ArrayBuffer }) => {\n const file = { id: `new-${files.length + 1}`, spaceId: spaces[0].id, name, folder: 'Documents', bytes, updatedAt: new Date().toISOString() };\n files.push(file);\n return summary(file);\n },\n } : {}),\n };\n}\n","import type { DocumentKind } from './types';\n\nconst byExtension: Record<string, DocumentKind> = {\n docx: 'docx', md: 'markdown', markdown: 'markdown', pdf: 'pdf', xlsx: 'sheet', csv: 'sheet', xls: 'sheet', ods: 'sheet', tsv: 'sheet', html: 'slides', htm: 'slides',\n};\n\nconst byMime: Record<string, DocumentKind> = {\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'text/markdown': 'markdown',\n 'application/pdf': 'pdf',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'sheet',\n 'text/csv': 'sheet',\n 'text/html': 'slides',\n};\n\nexport const kinds: DocumentKind[] = ['docx', 'markdown', 'pdf', 'sheet', 'slides'];\n\nexport function kindOf(name: string, mimeType?: string | null): DocumentKind | null {\n const extension = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n return byExtension[extension] ?? (mimeType ? byMime[mimeType.split(';')[0].trim().toLowerCase()] : undefined) ?? null;\n}\n\nexport function readable(name: string, mimeType?: string | null): DocumentKind | null {\n const kind = kindOf(name, mimeType);\n return kind !== 'sheet' || /\\.(xlsx|csv)$/i.test(name) || /spreadsheetml|text\\/csv/.test(mimeType ?? '') ? kind : null;\n}\n\nexport function matches(doc: { name: string; kind: DocumentKind }, query: string, kind: DocumentKind | 'all') {\n const words = query.toLocaleLowerCase().split(/\\s+/).filter(Boolean);\n return (kind === 'all' || doc.kind === kind) && words.every(word => doc.name.toLocaleLowerCase().includes(word));\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/memory.ts","../src/kinds.ts"],"sourcesContent":["import { kindOf } from './kinds';\nimport type { Comment, DocumentsHost, Person, Rights, Signature, Space } from './types';\n\ntype Bytes = ArrayBuffer | string;\n\nexport type MemoryFile = {\n id: string;\n spaceId: string;\n name: string;\n folder?: string;\n bytes: Bytes;\n version?: string;\n note?: string;\n updatedAt?: string;\n rights?: Partial<Rights>;\n versions?: { id: string; createdAt: string; bytes: Bytes; note?: string }[];\n signatures?: Signature[];\n comments?: Comment[];\n};\n\nconst mimes = { pdf: 'application/pdf', docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', md: 'text/markdown' };\n\nconst encode = (bytes: Bytes) => typeof bytes === 'string' ? new TextEncoder().encode(bytes).buffer as ArrayBuffer : bytes;\n\nexport function memoryHost({ me, spaces, files, collab }: { me: Person; spaces: Space[]; files: MemoryFile[]; collab?: string }): DocumentsHost {\n const find = (id: string) => {\n const file = files.find(item => item.id === id);\n if (!file) throw new Error('document not found');\n return file;\n };\n const own = (file: MemoryFile, commentId: string) => {\n const found = file.comments?.find(c => c.id === commentId);\n if (!found || found.author.id !== me.id) throw new Error('only the author changes a comment');\n return found;\n };\n const summary = (file: MemoryFile) => ({\n id: file.id, spaceId: file.spaceId, name: file.name, kind: kindOf(file.name)!, size: encode(file.bytes).byteLength,\n updatedAt: file.updatedAt ?? '2026-10-19T09:00:00Z', updatedBy: me, folder: file.folder ?? null,\n });\n const archive = (file: MemoryFile, bytes: Bytes, note?: string) => {\n const versions = [{ id: file.version ?? `v${(file.versions?.length ?? 0) + 1}`, createdAt: file.updatedAt ?? '2026-10-19T09:00:00Z', bytes: file.bytes, note: file.note }, ...(file.versions ?? [])];\n const version = `v${versions.length + 1}`;\n Object.assign(file, { versions, version, bytes, note, updatedAt: new Date().toISOString() });\n return version;\n };\n return {\n me,\n ...(collab ? { collab: { url: `memory:${collab}`, token: async () => me.id } } : {}),\n spaces: async () => spaces,\n documents: async spaceId => files.filter(file => file.spaceId === spaceId && kindOf(file.name)).map(summary),\n document: async id => ({ ...summary(find(id)), rights: { view: true, comment: true, edit: true, ...find(id).rights }, live: !!collab }),\n versions: async id => {\n const file = find(id);\n return [\n { id: file.version ?? 'current', createdAt: summary(file).updatedAt, size: summary(file).size, author: me, note: file.note ?? null, current: true },\n ...(file.versions ?? []).map(v => ({ id: v.id, createdAt: v.createdAt, size: encode(v.bytes).byteLength, author: me, note: v.note ?? null, current: false })),\n ];\n },\n content: async (id, versionId) => {\n const file = find(id);\n const old = versionId && versionId !== 'current' && versionId !== file.version ? file.versions?.find(v => v.id === versionId) : undefined;\n return encode(old ? old.bytes : file.bytes);\n },\n restore: async (id, versionId) => {\n const file = find(id);\n const old = file.versions?.find(v => v.id === versionId);\n if (!old) throw new Error('version not found');\n archive(file, old.bytes);\n },\n save: async (id, bytes, note) => ({ versionId: archive(find(id), bytes, note) }),\n signatures: async id => [...(find(id).signatures ?? [])].reverse(),\n sign: async (id, entry) => {\n const file = find(id);\n const signature = { id: `s${(file.signatures?.length ?? 0) + 1}`, signer: me, signedAt: new Date().toISOString(), ...entry };\n file.signatures = [...(file.signatures ?? []), signature];\n return signature;\n },\n comments: async id => [...(find(id).comments ?? [])],\n comment: async (id, entry) => {\n const file = find(id);\n let n = (file.comments?.length ?? 0) + 1;\n while (file.comments?.some(c => c.id === `c${n}`)) n++;\n const made: Comment = { id: `c${n}`, documentId: id, author: me, body: entry.body, createdAt: new Date().toISOString(), quote: entry.quote, replyTo: entry.replyTo, resolved: false };\n file.comments = [...(file.comments ?? []), made];\n return made;\n },\n resolveComment: async (id, commentId, resolved) => {\n const file = find(id);\n file.comments = (file.comments ?? []).map(c => c.id === commentId ? { ...c, resolved } : c);\n },\n editComment: async (id, commentId, body) => {\n const file = find(id);\n const mine = own(file, commentId);\n const edited = { ...mine, body };\n file.comments = file.comments!.map(c => c === mine ? edited : c);\n return edited;\n },\n deleteComment: async (id, commentId) => {\n const file = find(id);\n if (!file.comments?.find(c => c.id === commentId)?.author.id.startsWith('guest:')) own(file, commentId);\n file.comments = file.comments!.filter(c => c.id !== commentId && c.replyTo !== commentId);\n },\n rename: async (id, name) => { find(id).name = name; },\n exportAs: async (id, format) => {\n const file = find(id);\n if ((format === 'md' ? 'markdown' : format) !== kindOf(file.name)) throw new Error('this format needs a converter on the host');\n return new Blob([encode(file.bytes)], { type: mimes[format] });\n },\n ...(spaces.length ? {\n createIn: `${spaces[0].name} / Documents`,\n create: async ({ name, bytes }: { name: string; bytes: ArrayBuffer }) => {\n const file = { id: `new-${files.length + 1}`, spaceId: spaces[0].id, name, folder: 'Documents', bytes, updatedAt: new Date().toISOString() };\n files.push(file);\n return summary(file);\n },\n } : {}),\n };\n}\n","import type { DocumentKind } from './types';\n\nconst byExtension: Record<string, DocumentKind> = {\n docx: 'docx', md: 'markdown', markdown: 'markdown', pdf: 'pdf', xlsx: 'sheet', csv: 'sheet', xls: 'sheet', ods: 'sheet', tsv: 'sheet', html: 'slides', htm: 'slides',\n};\n\nconst byMime: Record<string, DocumentKind> = {\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'text/markdown': 'markdown',\n 'application/pdf': 'pdf',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'sheet',\n 'text/csv': 'sheet',\n 'text/html': 'slides',\n};\n\nexport const kinds: DocumentKind[] = ['docx', 'markdown', 'pdf', 'sheet', 'slides'];\n\nexport function kindOf(name: string, mimeType?: string | null): DocumentKind | null {\n const extension = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n return byExtension[extension] ?? (mimeType ? byMime[mimeType.split(';')[0].trim().toLowerCase()] : undefined) ?? null;\n}\n\nexport function readable(name: string, mimeType?: string | null): DocumentKind | null {\n const kind = kindOf(name, mimeType);\n return kind !== 'sheet' || /\\.(xlsx|csv)$/i.test(name) || /spreadsheetml|text\\/csv/.test(mimeType ?? '') ? kind : null;\n}\n\nexport function matches(doc: { name: string; kind: DocumentKind }, query: string, picked: DocumentKind[]) {\n const words = query.toLocaleLowerCase().split(/\\s+/).filter(Boolean);\n return (!picked.length || picked.includes(doc.kind)) && words.every(word => doc.name.toLocaleLowerCase().includes(word));\n}\n"],"mappings":"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","names":[]}
|
package/dist/memory.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { R as Rights, S as Signature, C as Comment, h as Person, j as Space, D as DocumentsHost } from './types-
|
|
1
|
+
import { R as Rights, S as Signature, C as Comment, h as Person, j as Space, D as DocumentsHost } from './types-BTsVooZw.cjs';
|
|
2
2
|
|
|
3
3
|
type Bytes = ArrayBuffer | string;
|
|
4
4
|
type MemoryFile = {
|
package/dist/memory.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { R as Rights, S as Signature, C as Comment, h as Person, j as Space, D as DocumentsHost } from './types-
|
|
1
|
+
import { R as Rights, S as Signature, C as Comment, h as Person, j as Space, D as DocumentsHost } from './types-BTsVooZw.js';
|
|
2
2
|
|
|
3
3
|
type Bytes = ArrayBuffer | string;
|
|
4
4
|
type MemoryFile = {
|
package/dist/memory.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import {
|
|
3
3
|
kindOf
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-2CA3HQTI.js";
|
|
5
5
|
|
|
6
6
|
// src/memory.ts
|
|
7
7
|
var mimes = { pdf: "application/pdf", docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document", md: "text/markdown" };
|
|
@@ -90,6 +90,9 @@ function memoryHost({ me, spaces, files, collab }) {
|
|
|
90
90
|
if (!file.comments?.find((c) => c.id === commentId)?.author.id.startsWith("guest:")) own(file, commentId);
|
|
91
91
|
file.comments = file.comments.filter((c) => c.id !== commentId && c.replyTo !== commentId);
|
|
92
92
|
},
|
|
93
|
+
rename: async (id, name) => {
|
|
94
|
+
find(id).name = name;
|
|
95
|
+
},
|
|
93
96
|
exportAs: async (id, format) => {
|
|
94
97
|
const file = find(id);
|
|
95
98
|
if ((format === "md" ? "markdown" : format) !== kindOf(file.name)) throw new Error("this format needs a converter on the host");
|
package/dist/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/memory.ts"],"sourcesContent":["import { kindOf } from './kinds';\nimport type { Comment, DocumentsHost, Person, Rights, Signature, Space } from './types';\n\ntype Bytes = ArrayBuffer | string;\n\nexport type MemoryFile = {\n id: string;\n spaceId: string;\n name: string;\n folder?: string;\n bytes: Bytes;\n version?: string;\n note?: string;\n updatedAt?: string;\n rights?: Partial<Rights>;\n versions?: { id: string; createdAt: string; bytes: Bytes; note?: string }[];\n signatures?: Signature[];\n comments?: Comment[];\n};\n\nconst mimes = { pdf: 'application/pdf', docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', md: 'text/markdown' };\n\nconst encode = (bytes: Bytes) => typeof bytes === 'string' ? new TextEncoder().encode(bytes).buffer as ArrayBuffer : bytes;\n\nexport function memoryHost({ me, spaces, files, collab }: { me: Person; spaces: Space[]; files: MemoryFile[]; collab?: string }): DocumentsHost {\n const find = (id: string) => {\n const file = files.find(item => item.id === id);\n if (!file) throw new Error('document not found');\n return file;\n };\n const own = (file: MemoryFile, commentId: string) => {\n const found = file.comments?.find(c => c.id === commentId);\n if (!found || found.author.id !== me.id) throw new Error('only the author changes a comment');\n return found;\n };\n const summary = (file: MemoryFile) => ({\n id: file.id, spaceId: file.spaceId, name: file.name, kind: kindOf(file.name)!, size: encode(file.bytes).byteLength,\n updatedAt: file.updatedAt ?? '2026-10-19T09:00:00Z', updatedBy: me, folder: file.folder ?? null,\n });\n const archive = (file: MemoryFile, bytes: Bytes, note?: string) => {\n const versions = [{ id: file.version ?? `v${(file.versions?.length ?? 0) + 1}`, createdAt: file.updatedAt ?? '2026-10-19T09:00:00Z', bytes: file.bytes, note: file.note }, ...(file.versions ?? [])];\n const version = `v${versions.length + 1}`;\n Object.assign(file, { versions, version, bytes, note, updatedAt: new Date().toISOString() });\n return version;\n };\n return {\n me,\n ...(collab ? { collab: { url: `memory:${collab}`, token: async () => me.id } } : {}),\n spaces: async () => spaces,\n documents: async spaceId => files.filter(file => file.spaceId === spaceId && kindOf(file.name)).map(summary),\n document: async id => ({ ...summary(find(id)), rights: { view: true, comment: true, edit: true, ...find(id).rights }, live: !!collab }),\n versions: async id => {\n const file = find(id);\n return [\n { id: file.version ?? 'current', createdAt: summary(file).updatedAt, size: summary(file).size, author: me, note: file.note ?? null, current: true },\n ...(file.versions ?? []).map(v => ({ id: v.id, createdAt: v.createdAt, size: encode(v.bytes).byteLength, author: me, note: v.note ?? null, current: false })),\n ];\n },\n content: async (id, versionId) => {\n const file = find(id);\n const old = versionId && versionId !== 'current' && versionId !== file.version ? file.versions?.find(v => v.id === versionId) : undefined;\n return encode(old ? old.bytes : file.bytes);\n },\n restore: async (id, versionId) => {\n const file = find(id);\n const old = file.versions?.find(v => v.id === versionId);\n if (!old) throw new Error('version not found');\n archive(file, old.bytes);\n },\n save: async (id, bytes, note) => ({ versionId: archive(find(id), bytes, note) }),\n signatures: async id => [...(find(id).signatures ?? [])].reverse(),\n sign: async (id, entry) => {\n const file = find(id);\n const signature = { id: `s${(file.signatures?.length ?? 0) + 1}`, signer: me, signedAt: new Date().toISOString(), ...entry };\n file.signatures = [...(file.signatures ?? []), signature];\n return signature;\n },\n comments: async id => [...(find(id).comments ?? [])],\n comment: async (id, entry) => {\n const file = find(id);\n let n = (file.comments?.length ?? 0) + 1;\n while (file.comments?.some(c => c.id === `c${n}`)) n++;\n const made: Comment = { id: `c${n}`, documentId: id, author: me, body: entry.body, createdAt: new Date().toISOString(), quote: entry.quote, replyTo: entry.replyTo, resolved: false };\n file.comments = [...(file.comments ?? []), made];\n return made;\n },\n resolveComment: async (id, commentId, resolved) => {\n const file = find(id);\n file.comments = (file.comments ?? []).map(c => c.id === commentId ? { ...c, resolved } : c);\n },\n editComment: async (id, commentId, body) => {\n const file = find(id);\n const mine = own(file, commentId);\n const edited = { ...mine, body };\n file.comments = file.comments!.map(c => c === mine ? edited : c);\n return edited;\n },\n deleteComment: async (id, commentId) => {\n const file = find(id);\n if (!file.comments?.find(c => c.id === commentId)?.author.id.startsWith('guest:')) own(file, commentId);\n file.comments = file.comments!.filter(c => c.id !== commentId && c.replyTo !== commentId);\n },\n exportAs: async (id, format) => {\n const file = find(id);\n if ((format === 'md' ? 'markdown' : format) !== kindOf(file.name)) throw new Error('this format needs a converter on the host');\n return new Blob([encode(file.bytes)], { type: mimes[format] });\n },\n ...(spaces.length ? {\n createIn: `${spaces[0].name} / Documents`,\n create: async ({ name, bytes }: { name: string; bytes: ArrayBuffer }) => {\n const file = { id: `new-${files.length + 1}`, spaceId: spaces[0].id, name, folder: 'Documents', bytes, updatedAt: new Date().toISOString() };\n files.push(file);\n return summary(file);\n },\n } : {}),\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/memory.ts"],"sourcesContent":["import { kindOf } from './kinds';\nimport type { Comment, DocumentsHost, Person, Rights, Signature, Space } from './types';\n\ntype Bytes = ArrayBuffer | string;\n\nexport type MemoryFile = {\n id: string;\n spaceId: string;\n name: string;\n folder?: string;\n bytes: Bytes;\n version?: string;\n note?: string;\n updatedAt?: string;\n rights?: Partial<Rights>;\n versions?: { id: string; createdAt: string; bytes: Bytes; note?: string }[];\n signatures?: Signature[];\n comments?: Comment[];\n};\n\nconst mimes = { pdf: 'application/pdf', docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', md: 'text/markdown' };\n\nconst encode = (bytes: Bytes) => typeof bytes === 'string' ? new TextEncoder().encode(bytes).buffer as ArrayBuffer : bytes;\n\nexport function memoryHost({ me, spaces, files, collab }: { me: Person; spaces: Space[]; files: MemoryFile[]; collab?: string }): DocumentsHost {\n const find = (id: string) => {\n const file = files.find(item => item.id === id);\n if (!file) throw new Error('document not found');\n return file;\n };\n const own = (file: MemoryFile, commentId: string) => {\n const found = file.comments?.find(c => c.id === commentId);\n if (!found || found.author.id !== me.id) throw new Error('only the author changes a comment');\n return found;\n };\n const summary = (file: MemoryFile) => ({\n id: file.id, spaceId: file.spaceId, name: file.name, kind: kindOf(file.name)!, size: encode(file.bytes).byteLength,\n updatedAt: file.updatedAt ?? '2026-10-19T09:00:00Z', updatedBy: me, folder: file.folder ?? null,\n });\n const archive = (file: MemoryFile, bytes: Bytes, note?: string) => {\n const versions = [{ id: file.version ?? `v${(file.versions?.length ?? 0) + 1}`, createdAt: file.updatedAt ?? '2026-10-19T09:00:00Z', bytes: file.bytes, note: file.note }, ...(file.versions ?? [])];\n const version = `v${versions.length + 1}`;\n Object.assign(file, { versions, version, bytes, note, updatedAt: new Date().toISOString() });\n return version;\n };\n return {\n me,\n ...(collab ? { collab: { url: `memory:${collab}`, token: async () => me.id } } : {}),\n spaces: async () => spaces,\n documents: async spaceId => files.filter(file => file.spaceId === spaceId && kindOf(file.name)).map(summary),\n document: async id => ({ ...summary(find(id)), rights: { view: true, comment: true, edit: true, ...find(id).rights }, live: !!collab }),\n versions: async id => {\n const file = find(id);\n return [\n { id: file.version ?? 'current', createdAt: summary(file).updatedAt, size: summary(file).size, author: me, note: file.note ?? null, current: true },\n ...(file.versions ?? []).map(v => ({ id: v.id, createdAt: v.createdAt, size: encode(v.bytes).byteLength, author: me, note: v.note ?? null, current: false })),\n ];\n },\n content: async (id, versionId) => {\n const file = find(id);\n const old = versionId && versionId !== 'current' && versionId !== file.version ? file.versions?.find(v => v.id === versionId) : undefined;\n return encode(old ? old.bytes : file.bytes);\n },\n restore: async (id, versionId) => {\n const file = find(id);\n const old = file.versions?.find(v => v.id === versionId);\n if (!old) throw new Error('version not found');\n archive(file, old.bytes);\n },\n save: async (id, bytes, note) => ({ versionId: archive(find(id), bytes, note) }),\n signatures: async id => [...(find(id).signatures ?? [])].reverse(),\n sign: async (id, entry) => {\n const file = find(id);\n const signature = { id: `s${(file.signatures?.length ?? 0) + 1}`, signer: me, signedAt: new Date().toISOString(), ...entry };\n file.signatures = [...(file.signatures ?? []), signature];\n return signature;\n },\n comments: async id => [...(find(id).comments ?? [])],\n comment: async (id, entry) => {\n const file = find(id);\n let n = (file.comments?.length ?? 0) + 1;\n while (file.comments?.some(c => c.id === `c${n}`)) n++;\n const made: Comment = { id: `c${n}`, documentId: id, author: me, body: entry.body, createdAt: new Date().toISOString(), quote: entry.quote, replyTo: entry.replyTo, resolved: false };\n file.comments = [...(file.comments ?? []), made];\n return made;\n },\n resolveComment: async (id, commentId, resolved) => {\n const file = find(id);\n file.comments = (file.comments ?? []).map(c => c.id === commentId ? { ...c, resolved } : c);\n },\n editComment: async (id, commentId, body) => {\n const file = find(id);\n const mine = own(file, commentId);\n const edited = { ...mine, body };\n file.comments = file.comments!.map(c => c === mine ? edited : c);\n return edited;\n },\n deleteComment: async (id, commentId) => {\n const file = find(id);\n if (!file.comments?.find(c => c.id === commentId)?.author.id.startsWith('guest:')) own(file, commentId);\n file.comments = file.comments!.filter(c => c.id !== commentId && c.replyTo !== commentId);\n },\n rename: async (id, name) => { find(id).name = name; },\n exportAs: async (id, format) => {\n const file = find(id);\n if ((format === 'md' ? 'markdown' : format) !== kindOf(file.name)) throw new Error('this format needs a converter on the host');\n return new Blob([encode(file.bytes)], { type: mimes[format] });\n },\n ...(spaces.length ? {\n createIn: `${spaces[0].name} / Documents`,\n create: async ({ name, bytes }: { name: string; bytes: ArrayBuffer }) => {\n const file = { id: `new-${files.length + 1}`, spaceId: spaces[0].id, name, folder: 'Documents', bytes, updatedAt: new Date().toISOString() };\n files.push(file);\n return summary(file);\n },\n } : {}),\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -127,7 +127,7 @@ interface DocumentsHost {
|
|
|
127
127
|
versions(id: string, opts?: Fetch): Promise<DocumentVersion[]>;
|
|
128
128
|
content(id: string, versionId?: string | null, opts?: Fetch): Promise<ArrayBuffer>;
|
|
129
129
|
restore?(id: string, versionId: string): Promise<void>;
|
|
130
|
-
save?(id: string, bytes: ArrayBuffer, note: string): Promise<{
|
|
130
|
+
save?(id: string, bytes: ArrayBuffer, note: string, auto?: boolean): Promise<{
|
|
131
131
|
versionId: string;
|
|
132
132
|
}>;
|
|
133
133
|
signatures?(id: string, opts?: Fetch): Promise<Signature[]>;
|
|
@@ -148,6 +148,7 @@ interface DocumentsHost {
|
|
|
148
148
|
deleteComment?(id: string, commentId: string): Promise<void>;
|
|
149
149
|
exportAs?(id: string, format: 'pdf' | 'docx' | 'md'): Promise<Blob>;
|
|
150
150
|
copyAs?(id: string, format: 'xlsx'): Promise<DocumentSummary>;
|
|
151
|
+
rename?(id: string, name: string): Promise<void>;
|
|
151
152
|
create?(entry: {
|
|
152
153
|
name: string;
|
|
153
154
|
bytes: ArrayBuffer;
|
|
@@ -127,7 +127,7 @@ interface DocumentsHost {
|
|
|
127
127
|
versions(id: string, opts?: Fetch): Promise<DocumentVersion[]>;
|
|
128
128
|
content(id: string, versionId?: string | null, opts?: Fetch): Promise<ArrayBuffer>;
|
|
129
129
|
restore?(id: string, versionId: string): Promise<void>;
|
|
130
|
-
save?(id: string, bytes: ArrayBuffer, note: string): Promise<{
|
|
130
|
+
save?(id: string, bytes: ArrayBuffer, note: string, auto?: boolean): Promise<{
|
|
131
131
|
versionId: string;
|
|
132
132
|
}>;
|
|
133
133
|
signatures?(id: string, opts?: Fetch): Promise<Signature[]>;
|
|
@@ -148,6 +148,7 @@ interface DocumentsHost {
|
|
|
148
148
|
deleteComment?(id: string, commentId: string): Promise<void>;
|
|
149
149
|
exportAs?(id: string, format: 'pdf' | 'docx' | 'md'): Promise<Blob>;
|
|
150
150
|
copyAs?(id: string, format: 'xlsx'): Promise<DocumentSummary>;
|
|
151
|
+
rename?(id: string, name: string): Promise<void>;
|
|
151
152
|
create?(entry: {
|
|
152
153
|
name: string;
|
|
153
154
|
bytes: ArrayBuffer;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type Img = {
|
|
2
|
+
bytes: Uint8Array;
|
|
3
|
+
mime: string;
|
|
4
|
+
};
|
|
5
|
+
type Setup = {
|
|
6
|
+
page?: {
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
margins: [number, number, number, number];
|
|
10
|
+
};
|
|
11
|
+
header?: string;
|
|
12
|
+
footer?: string;
|
|
13
|
+
numbers?: boolean;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type { Img as I, Setup as S };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type Img = {
|
|
2
|
+
bytes: Uint8Array;
|
|
3
|
+
mime: string;
|
|
4
|
+
};
|
|
5
|
+
type Setup = {
|
|
6
|
+
page?: {
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
margins: [number, number, number, number];
|
|
10
|
+
};
|
|
11
|
+
header?: string;
|
|
12
|
+
footer?: string;
|
|
13
|
+
numbers?: boolean;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type { Img as I, Setup as S };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
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, 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 type { BorderStyleTypes, 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\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, theme === 'dark', 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.toggleDarkMode(theme === 'dark'); }, [theme]);\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 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 {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(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.slice(0, 1).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"]}
|