docxodus 12.2.0 → 12.3.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/README.md +9 -4
- package/dist/editor.bundle.js +2 -1
- package/dist/embed.bundle.js +592 -3
- package/dist/embed.d.ts +1 -1
- package/dist/embed.iife.js +592 -3
- package/dist/embed.js +1 -1
- package/dist/export-assets.json +9 -9
- package/dist/history-checkpoints.d.ts +48 -0
- package/dist/history-checkpoints.d.ts.map +1 -0
- package/dist/history-checkpoints.js +100 -0
- package/dist/history-checkpoints.js.map +1 -0
- package/dist/history-controls.d.ts +30 -0
- package/dist/history-controls.d.ts.map +1 -0
- package/dist/history-controls.js +333 -0
- package/dist/history-controls.js.map +1 -0
- package/dist/history-indexeddb.d.ts +12 -0
- package/dist/history-indexeddb.d.ts.map +1 -0
- package/dist/history-indexeddb.js +154 -0
- package/dist/history-indexeddb.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/ribbon.js +3 -1
- package/dist/ribbon.js.map +1 -1
- package/dist/wasm/_framework/Docxodus.wasm +0 -0
- package/dist/wasm/_framework/Docxodus.wasm.br +0 -0
- package/dist/wasm/_framework/DocxodusWasm.wasm +0 -0
- package/dist/wasm/_framework/DocxodusWasm.wasm.br +0 -0
- package/dist/wasm/_framework/System.Private.CoreLib.wasm +0 -0
- package/dist/wasm/_framework/System.Private.CoreLib.wasm.br +0 -0
- package/dist/wasm/_framework/System.Runtime.InteropServices.JavaScript.wasm +0 -0
- package/dist/wasm/_framework/System.Runtime.InteropServices.JavaScript.wasm.br +0 -0
- package/dist/wasm/_framework/dotnet.boot.js +6 -6
- package/dist/wasm/_framework/dotnet.boot.js.br +0 -0
- package/dist/wasm/_framework/dotnet.native.wasm +0 -0
- package/dist/wasm/_framework/dotnet.native.wasm.br +0 -0
- package/package.json +3 -1
package/dist/export-assets.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "https://docxodus.dev/schemas/export/export-assets/v1",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"packageVersion": "12.
|
|
4
|
+
"packageVersion": "12.3.0",
|
|
5
5
|
"assets": [
|
|
6
6
|
{
|
|
7
7
|
"path": "./docxodus.worker.js",
|
|
@@ -48,14 +48,14 @@
|
|
|
48
48
|
{
|
|
49
49
|
"path": "./wasm/_framework/Docxodus.wasm",
|
|
50
50
|
"mediaType": "application/wasm",
|
|
51
|
-
"byteLength":
|
|
52
|
-
"sha256": "
|
|
51
|
+
"byteLength": 4023577,
|
|
52
|
+
"sha256": "462062967aa6d6a7bf4003ae4a743de465c3a7819cd53d238056d2db18860e9c"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"path": "./wasm/_framework/DocxodusWasm.wasm",
|
|
56
56
|
"mediaType": "application/wasm",
|
|
57
57
|
"byteLength": 507669,
|
|
58
|
-
"sha256": "
|
|
58
|
+
"sha256": "e62162fadea88ced9e30e8b9be94dd717fe79969ef0515b11aa01a4cc38e7105"
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
61
|
"path": "./wasm/_framework/System.Collections.Concurrent.wasm",
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
"path": "./wasm/_framework/System.Private.CoreLib.wasm",
|
|
170
170
|
"mediaType": "application/wasm",
|
|
171
171
|
"byteLength": 1650965,
|
|
172
|
-
"sha256": "
|
|
172
|
+
"sha256": "813b21d926c9350da8bd3e24fb3feed29826219a15ecd4c9abcac61bbba4405e"
|
|
173
173
|
},
|
|
174
174
|
{
|
|
175
175
|
"path": "./wasm/_framework/System.Private.Uri.wasm",
|
|
@@ -193,7 +193,7 @@
|
|
|
193
193
|
"path": "./wasm/_framework/System.Runtime.InteropServices.JavaScript.wasm",
|
|
194
194
|
"mediaType": "application/wasm",
|
|
195
195
|
"byteLength": 43797,
|
|
196
|
-
"sha256": "
|
|
196
|
+
"sha256": "32cdacd4bc6b19490dcff9ee0f3a5fc8cf59860e2b508d4c97b3ecb1963da73e"
|
|
197
197
|
},
|
|
198
198
|
{
|
|
199
199
|
"path": "./wasm/_framework/System.Runtime.wasm",
|
|
@@ -247,7 +247,7 @@
|
|
|
247
247
|
"path": "./wasm/_framework/dotnet.boot.js",
|
|
248
248
|
"mediaType": "text/javascript",
|
|
249
249
|
"byteLength": 9374,
|
|
250
|
-
"sha256": "
|
|
250
|
+
"sha256": "650f4e7f246dd2ee509849399ddda33f4d3ef840128d27ec265dc5d8592889f7"
|
|
251
251
|
},
|
|
252
252
|
{
|
|
253
253
|
"path": "./wasm/_framework/dotnet.js",
|
|
@@ -264,8 +264,8 @@
|
|
|
264
264
|
{
|
|
265
265
|
"path": "./wasm/_framework/dotnet.native.wasm",
|
|
266
266
|
"mediaType": "application/wasm",
|
|
267
|
-
"byteLength":
|
|
268
|
-
"sha256": "
|
|
267
|
+
"byteLength": 8549433,
|
|
268
|
+
"sha256": "8edd26071337e35bef463c79cc0cc1026d73ea3ac77e823661492e1fd4411b90"
|
|
269
269
|
},
|
|
270
270
|
{
|
|
271
271
|
"path": "./wasm/_framework/dotnet.runtime.js",
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { DocxHistoryDocument, DocxHistoryView, DocxVersionMetadata, HistoryBlobReference, HistoryHead } from './history.js';
|
|
2
|
+
/** Persist the entire request before publication. Bytes are structured-cloneable, not JSON. */
|
|
3
|
+
export type HistoryCheckpointRequest = {
|
|
4
|
+
id: string;
|
|
5
|
+
documentId: string;
|
|
6
|
+
metadata: DocxVersionMetadata;
|
|
7
|
+
} & ({
|
|
8
|
+
kind: 'save';
|
|
9
|
+
head: HistoryHead | null;
|
|
10
|
+
bytes: Uint8Array;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'restore';
|
|
13
|
+
head: HistoryHead;
|
|
14
|
+
target: HistoryBlobReference;
|
|
15
|
+
});
|
|
16
|
+
/** Host-owned durable outbox, scoped to one document. Methods resolve only after commit.
|
|
17
|
+
* put must atomically return the existing request or insert and return the supplied one.
|
|
18
|
+
* Existing inputs must never change, even for the same ID. remove must match the ID.
|
|
19
|
+
* Share exclusion between tabs/clients. Never clear an uncertain publication to start another. */
|
|
20
|
+
export interface HistoryCheckpointJournal {
|
|
21
|
+
read(): Promise<HistoryCheckpointRequest | null>;
|
|
22
|
+
put(request: HistoryCheckpointRequest): Promise<HistoryCheckpointRequest>;
|
|
23
|
+
remove(requestId: string): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/** Explicit checkpoint commands. No editor ownership, timers, automatic retries or subscriptions.
|
|
26
|
+
* Keep this instance for the document's editing session; refresh only when the user requests it. */
|
|
27
|
+
export declare class HistoryCheckpoints {
|
|
28
|
+
readonly document: DocxHistoryDocument;
|
|
29
|
+
private readonly journal;
|
|
30
|
+
private current;
|
|
31
|
+
private request;
|
|
32
|
+
private running;
|
|
33
|
+
private stale;
|
|
34
|
+
private constructor();
|
|
35
|
+
/** Pass an already captured view when opening its exact version in an editor (for example, after import). */
|
|
36
|
+
static open(document: DocxHistoryDocument, journal: HistoryCheckpointJournal, view?: DocxHistoryView | null): Promise<HistoryCheckpoints>;
|
|
37
|
+
get view(): DocxHistoryView | null;
|
|
38
|
+
get hasPending(): boolean;
|
|
39
|
+
get needsRefresh(): boolean;
|
|
40
|
+
refresh(): Promise<DocxHistoryView | null>;
|
|
41
|
+
save(bytes: Uint8Array, metadata: DocxVersionMetadata): Promise<DocxHistoryView>;
|
|
42
|
+
restore(target: HistoryBlobReference, metadata: DocxVersionMetadata): Promise<DocxHistoryView>;
|
|
43
|
+
retry(): Promise<DocxHistoryView>;
|
|
44
|
+
private start;
|
|
45
|
+
private publish;
|
|
46
|
+
private exclusive;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=history-checkpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-checkpoints.d.ts","sourceRoot":"","sources":["../src/history-checkpoints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjI,+FAA+F;AAC/F,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B,GAAG,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAAC;AAE1E;;;kGAGkG;AAClG,MAAM,WAAW,wBAAwB;IACvC,IAAI,IAAI,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC;IACjD,GAAG,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC1E,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1C;AAED;oGACoG;AACpG,qBAAa,kBAAkB;IAMT,QAAQ,CAAC,QAAQ,EAAE,mBAAmB;IAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpF,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO;IAEP,6GAA6G;WAChG,IAAI,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,wBAAwB,EAChF,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAW7D,IAAI,IAAI,IAAI,eAAe,GAAG,IAAI,CAA0C;IAC5E,IAAI,UAAU,IAAI,OAAO,CAAkC;IAC3D,IAAI,YAAY,IAAI,OAAO,CAAuB;IAE5C,OAAO,IAAI,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAQ1C,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;IAKhF,OAAO,CAAC,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;IAM9F,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;YAOzB,KAAK;YASL,OAAO;YA2BP,SAAS;CAKxB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { DocxHistoryError } from './history.js';
|
|
2
|
+
/** Explicit checkpoint commands. No editor ownership, timers, automatic retries or subscriptions.
|
|
3
|
+
* Keep this instance for the document's editing session; refresh only when the user requests it. */
|
|
4
|
+
export class HistoryCheckpoints {
|
|
5
|
+
constructor(document, journal) {
|
|
6
|
+
this.document = document;
|
|
7
|
+
this.journal = journal;
|
|
8
|
+
this.current = null;
|
|
9
|
+
this.request = null;
|
|
10
|
+
this.running = false;
|
|
11
|
+
this.stale = false;
|
|
12
|
+
}
|
|
13
|
+
/** Pass an already captured view when opening its exact version in an editor (for example, after import). */
|
|
14
|
+
static async open(document, journal, view) {
|
|
15
|
+
const controls = new HistoryCheckpoints(document, journal);
|
|
16
|
+
controls.request = structuredClone(await journal.read());
|
|
17
|
+
if (controls.request && controls.request.documentId !== document.documentId)
|
|
18
|
+
throw new DocxHistoryError('InvalidRequest', 'The pending checkpoint belongs to another document.');
|
|
19
|
+
controls.current = view === undefined ? await document.read() : structuredClone(view);
|
|
20
|
+
if (controls.current && controls.current.state.documentId !== document.documentId)
|
|
21
|
+
throw new DocxHistoryError('InvalidRequest', 'The captured view belongs to another document.');
|
|
22
|
+
return controls;
|
|
23
|
+
}
|
|
24
|
+
get view() { return structuredClone(this.current); }
|
|
25
|
+
get hasPending() { return this.request !== null; }
|
|
26
|
+
get needsRefresh() { return this.stale; }
|
|
27
|
+
async refresh() {
|
|
28
|
+
return this.exclusive(async () => {
|
|
29
|
+
this.current = await this.document.read();
|
|
30
|
+
this.stale = false;
|
|
31
|
+
return this.view;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async save(bytes, metadata) {
|
|
35
|
+
return this.start({ kind: 'save', head: this.current?.head ?? null, bytes,
|
|
36
|
+
id: crypto.randomUUID(), documentId: this.document.documentId, metadata });
|
|
37
|
+
}
|
|
38
|
+
async restore(target, metadata) {
|
|
39
|
+
if (!this.current)
|
|
40
|
+
throw new DocxHistoryError('NotFound', 'Save a checkpoint before restoring a version.');
|
|
41
|
+
return this.start({ kind: 'restore', head: this.current.head, target,
|
|
42
|
+
id: crypto.randomUUID(), documentId: this.document.documentId, metadata });
|
|
43
|
+
}
|
|
44
|
+
async retry() {
|
|
45
|
+
return this.exclusive(async () => {
|
|
46
|
+
if (!this.request)
|
|
47
|
+
throw new DocxHistoryError('InvalidRequest', 'There is no pending checkpoint.');
|
|
48
|
+
return this.publish();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async start(request) {
|
|
52
|
+
return this.exclusive(async () => {
|
|
53
|
+
if (this.request)
|
|
54
|
+
throw new DocxHistoryError('PendingRequest', 'Retry the pending checkpoint first.');
|
|
55
|
+
if (this.stale)
|
|
56
|
+
throw new DocxHistoryError('StaleHead', 'Refresh history before saving again.');
|
|
57
|
+
this.request = structuredClone(request);
|
|
58
|
+
return this.publish();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async publish() {
|
|
62
|
+
const intended = this.request;
|
|
63
|
+
// Retry persistence too: an outbox acknowledgement can be lost independently of publication.
|
|
64
|
+
const request = await this.journal.put(structuredClone(intended));
|
|
65
|
+
this.request = structuredClone(request);
|
|
66
|
+
if (request.id !== intended.id)
|
|
67
|
+
throw new DocxHistoryError('PendingRequest', 'Another tab has a pending checkpoint. Retry it before saving your draft.');
|
|
68
|
+
let view;
|
|
69
|
+
try {
|
|
70
|
+
view = request.kind === 'save'
|
|
71
|
+
? await this.document.createVersion(request.head, request.bytes, request.metadata, request.id)
|
|
72
|
+
: await this.document.restoreVersion(request.head, request.target, request.metadata, request.id);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error instanceof DocxHistoryError && error.code === 'StaleHead') {
|
|
76
|
+
this.stale = true;
|
|
77
|
+
await this.journal.remove(request.id);
|
|
78
|
+
this.request = null;
|
|
79
|
+
}
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
// Idempotent retries may return an older version. Retain that exact view, never substitute latest.
|
|
83
|
+
this.current = view;
|
|
84
|
+
await this.journal.remove(request.id);
|
|
85
|
+
this.request = null;
|
|
86
|
+
return this.view;
|
|
87
|
+
}
|
|
88
|
+
async exclusive(action) {
|
|
89
|
+
if (this.running)
|
|
90
|
+
throw new DocxHistoryError('Busy', 'A history command is still running.');
|
|
91
|
+
this.running = true;
|
|
92
|
+
try {
|
|
93
|
+
return await action();
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
this.running = false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=history-checkpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-checkpoints.js","sourceRoot":"","sources":["../src/history-checkpoints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { DocxHistoryReader, DocxHistoryView } from './history.js';
|
|
2
|
+
import type { HistoryCheckpoints } from './history-checkpoints.js';
|
|
3
|
+
export interface HistoryControlsOptions {
|
|
4
|
+
reader: DocxHistoryReader;
|
|
5
|
+
/** Omit for a read-only archive. Must belong to reader. */
|
|
6
|
+
checkpoints?: HistoryCheckpoints;
|
|
7
|
+
/** Capture the open draft on Save only. The panel never replaces editor content. */
|
|
8
|
+
capture?: () => Uint8Array | Promise<Uint8Array>;
|
|
9
|
+
author?: string;
|
|
10
|
+
documentName?: string;
|
|
11
|
+
/** Render in a separate preview; reject on failure, preserving the previous document. */
|
|
12
|
+
preview: (bytes: Uint8Array, title: string) => void | Promise<void>;
|
|
13
|
+
/** Defaults to a browser download. */
|
|
14
|
+
download?: (bytes: Uint8Array, filename: string) => void | Promise<void>;
|
|
15
|
+
/** Called after an acknowledged checkpoint, before the list refreshes. Retries may return an older view. */
|
|
16
|
+
onCheckpoint?: (view: DocxHistoryView, action: 'save' | 'restore' | 'retry') => void | Promise<void>;
|
|
17
|
+
pageSize?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface HistoryControls {
|
|
20
|
+
readonly element: HTMLElement;
|
|
21
|
+
/** Initial metadata load. No document export or checkpoint is implicit. */
|
|
22
|
+
readonly ready: Promise<void>;
|
|
23
|
+
refresh(): Promise<void>;
|
|
24
|
+
/** Removes controls and awaits their active call. The host may then close its reader/client. */
|
|
25
|
+
destroy(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
/** Mount explicit document-history controls. Persistence and preview/editor ownership stay with the host. */
|
|
28
|
+
export declare function mountHistoryControls(container: HTMLElement, options: HistoryControlsOptions): HistoryControls;
|
|
29
|
+
export declare function historyControlError(error: unknown, pending?: boolean): string;
|
|
30
|
+
//# sourceMappingURL=history-controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-controls.d.ts","sourceRoot":"","sources":["../src/history-controls.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAgE,MAAM,cAAc,CAAC;AACrI,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,2DAA2D;IAC3D,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,4GAA4G;IAC5G,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrG,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,gGAAgG;IAChG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,6GAA6G;AAC7G,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAM7G;AAwOD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,UAAQ,GAAG,MAAM,CAU3E"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { DocxHistoryError } from './history.js';
|
|
2
|
+
/** Mount explicit document-history controls. Persistence and preview/editor ownership stay with the host. */
|
|
3
|
+
export function mountHistoryControls(container, options) {
|
|
4
|
+
const pageSize = options.pageSize ?? 25;
|
|
5
|
+
if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize > 100)
|
|
6
|
+
throw new RangeError('History page size must be 1–100.');
|
|
7
|
+
if (options.checkpoints && options.checkpoints.document !== options.reader)
|
|
8
|
+
throw new Error('History controls and checkpoints must use the same document.');
|
|
9
|
+
return new HistoryPanel(container, options, pageSize);
|
|
10
|
+
}
|
|
11
|
+
class HistoryPanel {
|
|
12
|
+
constructor(container, options, pageSize) {
|
|
13
|
+
this.options = options;
|
|
14
|
+
this.pageSize = pageSize;
|
|
15
|
+
this.actions = new Map();
|
|
16
|
+
this.events = new AbortController();
|
|
17
|
+
this.records = [];
|
|
18
|
+
this.next = null;
|
|
19
|
+
this.view = null;
|
|
20
|
+
this.active = null;
|
|
21
|
+
this.destroyed = false;
|
|
22
|
+
const doc = container.ownerDocument;
|
|
23
|
+
this.element = doc.createElement('section');
|
|
24
|
+
this.element.className = 'dx-history';
|
|
25
|
+
this.element.setAttribute('aria-label', 'Document history');
|
|
26
|
+
const style = doc.createElement('style');
|
|
27
|
+
style.textContent = HISTORY_CSS;
|
|
28
|
+
const title = doc.createElement('h2');
|
|
29
|
+
title.textContent = 'Document history';
|
|
30
|
+
this.status = doc.createElement('p');
|
|
31
|
+
this.status.setAttribute('role', 'status');
|
|
32
|
+
this.status.setAttribute('aria-live', 'polite');
|
|
33
|
+
this.fieldset = doc.createElement('fieldset');
|
|
34
|
+
const legend = doc.createElement('legend');
|
|
35
|
+
legend.textContent = 'Versions and checkpoints';
|
|
36
|
+
this.fieldset.append(legend);
|
|
37
|
+
this.element.append(style, title, this.status, this.fieldset);
|
|
38
|
+
container.append(this.element);
|
|
39
|
+
const note = doc.createElement('p');
|
|
40
|
+
note.textContent = options.checkpoints ? 'Browse saved versions without changing your draft.' : 'Read-only history. Preview or download any saved version.';
|
|
41
|
+
this.fieldset.append(note);
|
|
42
|
+
this.button('refresh', 'Refresh history', () => this.load(true));
|
|
43
|
+
this.button('latest', 'Open latest', async () => this.preview(await options.reader.exportDocx(), 'Latest saved version'));
|
|
44
|
+
this.versions = this.select('Version');
|
|
45
|
+
this.versions.size = 6;
|
|
46
|
+
this.detail = doc.createElement('p');
|
|
47
|
+
this.fieldset.append(this.detail);
|
|
48
|
+
this.versions.addEventListener('change', () => this.update(), { signal: this.events.signal });
|
|
49
|
+
this.button('preview', 'Preview selected', async () => this.preview(await options.reader.exportDocx(this.selected().id), versionTitle(this.selected())));
|
|
50
|
+
this.button('download', 'Download selected', async () => this.download(await options.reader.exportDocx(this.selected().id), `version-${this.selected().record.sequence}.docx`));
|
|
51
|
+
this.before = this.select('Compare from');
|
|
52
|
+
this.before.addEventListener('change', () => this.update(), { signal: this.events.signal });
|
|
53
|
+
const compareNote = doc.createElement('p');
|
|
54
|
+
compareNote.textContent = 'Compare from this version to the selected version above.';
|
|
55
|
+
this.fieldset.append(compareNote);
|
|
56
|
+
this.button('compare', 'Compare versions', async () => {
|
|
57
|
+
const before = this.records[Number(this.before.value)];
|
|
58
|
+
await this.preview(await options.reader.compareVersions(before.id, this.selected().id), 'Comparison with tracked changes');
|
|
59
|
+
});
|
|
60
|
+
this.button('more', 'Load older versions', async () => { if (this.next)
|
|
61
|
+
await this.page(this.next, false); });
|
|
62
|
+
this.author = this.input('Your name', 'text', options.author ?? 'You');
|
|
63
|
+
this.label = this.input('Checkpoint name (optional)', 'text');
|
|
64
|
+
this.author.parentElement.hidden = this.label.parentElement.hidden = !options.checkpoints;
|
|
65
|
+
this.button('save', 'Save checkpoint', async () => {
|
|
66
|
+
const view = await options.checkpoints.save(await options.capture(), this.metadata());
|
|
67
|
+
await options.onCheckpoint?.(view, 'save');
|
|
68
|
+
await this.load(false);
|
|
69
|
+
this.label.value = '';
|
|
70
|
+
this.status.textContent = 'Checkpoint saved. Your draft remains open.';
|
|
71
|
+
});
|
|
72
|
+
this.button('restore', 'Restore selected', async () => {
|
|
73
|
+
const version = this.selected();
|
|
74
|
+
if (!doc.defaultView?.confirm(`Restore ${versionTitle(version)} as a new checkpoint?\n\nYour current draft and all later versions will be kept.`)) {
|
|
75
|
+
this.status.textContent = 'Restore canceled. Your draft and history are unchanged.';
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const view = await options.checkpoints.restore(version.id, this.metadata());
|
|
79
|
+
await options.onCheckpoint?.(view, 'restore');
|
|
80
|
+
await this.load(false);
|
|
81
|
+
this.status.textContent = 'Restored as a new checkpoint. Your draft and later versions are kept.';
|
|
82
|
+
});
|
|
83
|
+
const restoreNote = doc.createElement('p');
|
|
84
|
+
restoreNote.hidden = !options.checkpoints;
|
|
85
|
+
restoreNote.textContent = 'Restore creates a new checkpoint. Open latest to preview it; your draft stays open.';
|
|
86
|
+
this.fieldset.append(restoreNote);
|
|
87
|
+
this.button('retry', 'Retry checkpoint', async () => {
|
|
88
|
+
const view = await options.checkpoints.retry();
|
|
89
|
+
await options.onCheckpoint?.(view, 'retry');
|
|
90
|
+
await this.load(false);
|
|
91
|
+
this.status.textContent = 'Checkpoint recovered. Your draft remains open. Refresh history to check for newer versions.';
|
|
92
|
+
});
|
|
93
|
+
const sharing = this.disclosure('Download with history');
|
|
94
|
+
const sharingNote = doc.createElement('p');
|
|
95
|
+
sharingNote.textContent = 'Includes retained drafts and collaboration proposals. Share this file only when you want to include that history. A DOCX download keeps existing Word comments and revisions, without external history.';
|
|
96
|
+
sharing.append(sharingNote);
|
|
97
|
+
this.button('archive', 'Download .docxhistory', async () => this.download(await options.reader.exportHistoryArchive(), 'docxhistory'), sharing);
|
|
98
|
+
const time = this.disclosure('Find a version by time');
|
|
99
|
+
const cutoff = this.input('Saved at or before (local time)', 'datetime-local', '', time);
|
|
100
|
+
this.button('time', 'Preview at time', async () => {
|
|
101
|
+
if (!cutoff.value)
|
|
102
|
+
throw new DocxHistoryError('InvalidRequest', 'Choose a date and time first.');
|
|
103
|
+
const sequence = await options.reader.resolveSequenceAtTime(new Date(cutoff.value).toISOString());
|
|
104
|
+
await this.preview(await options.reader.materialize(sequence), 'Version at selected time');
|
|
105
|
+
}, time);
|
|
106
|
+
const activity = this.disclosure('Recorded collaboration');
|
|
107
|
+
const decisions = doc.createElement('ol');
|
|
108
|
+
let showOlderActivity = () => { };
|
|
109
|
+
this.button('activity', 'Load activity', async () => {
|
|
110
|
+
const { operations } = await options.reader.readOperationsSince(null);
|
|
111
|
+
const resolved = new Set(operations.filter(op => op.record.status === 'accepted').map(op => op.input.request.resolves?.digest.value));
|
|
112
|
+
let shown = 0;
|
|
113
|
+
showOlderActivity = () => {
|
|
114
|
+
const page = operations.slice(Math.max(0, operations.length - shown - this.pageSize), operations.length - shown).reverse();
|
|
115
|
+
decisions.append(...page.map(op => this.activityItem(op, resolved.has(op.id.digest.value))));
|
|
116
|
+
shown += page.length;
|
|
117
|
+
this.actions.get('activity-more').hidden = shown >= operations.length;
|
|
118
|
+
};
|
|
119
|
+
decisions.replaceChildren();
|
|
120
|
+
showOlderActivity();
|
|
121
|
+
this.status.textContent = operations.length ? 'Recorded activity loaded.' : 'No recorded collaboration.';
|
|
122
|
+
}, activity);
|
|
123
|
+
activity.append(decisions);
|
|
124
|
+
this.button('activity-more', 'Load older activity', async () => showOlderActivity(), activity);
|
|
125
|
+
this.actions.get('activity-more').hidden = true;
|
|
126
|
+
this.ready = this.run('Loading history', () => this.load(false));
|
|
127
|
+
}
|
|
128
|
+
refresh() { return this.run('Loading history', () => this.load(true)); }
|
|
129
|
+
async destroy() {
|
|
130
|
+
this.destroyed = true;
|
|
131
|
+
this.events.abort();
|
|
132
|
+
this.element.remove();
|
|
133
|
+
await this.active?.catch(() => { });
|
|
134
|
+
}
|
|
135
|
+
async load(refresh) {
|
|
136
|
+
this.view = this.options.checkpoints
|
|
137
|
+
? refresh ? await this.options.checkpoints.refresh() : this.options.checkpoints.view
|
|
138
|
+
: await this.options.reader.read();
|
|
139
|
+
if (this.view)
|
|
140
|
+
await this.page(this.view.version.id, true);
|
|
141
|
+
else {
|
|
142
|
+
this.records = [];
|
|
143
|
+
this.next = null;
|
|
144
|
+
this.versions.replaceChildren();
|
|
145
|
+
this.before.replaceChildren();
|
|
146
|
+
}
|
|
147
|
+
this.status.textContent = this.options.checkpoints?.hasPending
|
|
148
|
+
? 'A checkpoint needs recovery. Retry it before saving more changes.'
|
|
149
|
+
: this.view ? 'History loaded. Select a version to preview, download or restore.' : 'No checkpoints yet. Save your first checkpoint when you are ready.';
|
|
150
|
+
}
|
|
151
|
+
async page(cursor, reset) {
|
|
152
|
+
const page = await this.options.reader.listVersions(cursor, this.pageSize);
|
|
153
|
+
if (reset) {
|
|
154
|
+
this.records = [];
|
|
155
|
+
this.versions.replaceChildren();
|
|
156
|
+
this.before.replaceChildren();
|
|
157
|
+
}
|
|
158
|
+
const start = this.records.length;
|
|
159
|
+
this.records.push(...page.versions);
|
|
160
|
+
this.next = page.next;
|
|
161
|
+
for (let index = start; index < this.records.length; index++) {
|
|
162
|
+
for (const select of [this.versions, this.before]) {
|
|
163
|
+
const option = select.ownerDocument.createElement('option');
|
|
164
|
+
option.value = String(index);
|
|
165
|
+
option.textContent = option.title = versionTitle(this.records[index]);
|
|
166
|
+
select.append(option);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (reset) {
|
|
170
|
+
this.versions.value = '0';
|
|
171
|
+
this.before.value = this.records.length > 1 ? '1' : '0';
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
update() {
|
|
175
|
+
const hasVersion = this.records.length > 0;
|
|
176
|
+
const pending = this.options.checkpoints?.hasPending ?? false;
|
|
177
|
+
const stale = this.options.checkpoints?.needsRefresh ?? false;
|
|
178
|
+
for (const key of ['latest', 'preview', 'download', 'archive', 'time', 'activity'])
|
|
179
|
+
this.actions.get(key).disabled = !hasVersion;
|
|
180
|
+
this.actions.get('more').hidden = !this.next;
|
|
181
|
+
this.actions.get('compare').disabled = !hasVersion || this.before.value === this.versions.value;
|
|
182
|
+
this.actions.get('save').hidden = !this.options.checkpoints || !this.options.capture;
|
|
183
|
+
this.actions.get('save').disabled = pending || stale;
|
|
184
|
+
this.actions.get('restore').hidden = !this.options.checkpoints;
|
|
185
|
+
this.actions.get('restore').disabled = !hasVersion || pending || stale;
|
|
186
|
+
this.actions.get('retry').hidden = !pending;
|
|
187
|
+
this.detail.textContent = hasVersion ? [versionTitle(this.selected()), this.selected().record.metadata.message,
|
|
188
|
+
this.selected().record.restoredFrom ? 'Restored from an earlier version.' : ''].filter(Boolean).join(' — ') : '';
|
|
189
|
+
}
|
|
190
|
+
selected() { return this.records[Number(this.versions.value)]; }
|
|
191
|
+
activityItem(op, resolved) {
|
|
192
|
+
const doc = this.element.ownerDocument;
|
|
193
|
+
const item = doc.createElement('li');
|
|
194
|
+
const state = op.record.status === 'accepted' ? 'Accepted' : resolved ? 'Conflict resolved' : 'Conflict needs review';
|
|
195
|
+
const label = doc.createElement('p');
|
|
196
|
+
label.textContent = `${op.input.request.metadata.author} · ${state} · ${formatTime(op.input.request.metadata.createdAt)}`;
|
|
197
|
+
item.append(label);
|
|
198
|
+
const description = doc.createElement('p');
|
|
199
|
+
this.commandButton('View decision', async () => {
|
|
200
|
+
const decision = await this.options.reader.getOperation(op.id);
|
|
201
|
+
const { kind, metadata } = decision.input.request;
|
|
202
|
+
description.textContent = [{ text: 'Text edit', package: 'Document edit', discard: 'Discarded proposal' }[kind],
|
|
203
|
+
metadata.label, metadata.message, decision.record.conflict].filter(Boolean).join(' — ');
|
|
204
|
+
}, item);
|
|
205
|
+
item.append(description);
|
|
206
|
+
this.commandButton('Download proposal', async () => {
|
|
207
|
+
await this.download(await this.options.reader.exportOperationProposal(op.id), `proposal-${op.record.revision}.docx`);
|
|
208
|
+
}, item);
|
|
209
|
+
return item;
|
|
210
|
+
}
|
|
211
|
+
metadata() { return { author: this.author.value.trim() || 'You', createdAt: new Date().toISOString(), label: this.label.value.trim() || undefined }; }
|
|
212
|
+
async preview(bytes, title) {
|
|
213
|
+
if (!this.destroyed)
|
|
214
|
+
await this.options.preview(bytes, title);
|
|
215
|
+
}
|
|
216
|
+
async download(bytes, suffix) {
|
|
217
|
+
if (this.destroyed)
|
|
218
|
+
return;
|
|
219
|
+
const stem = (this.options.documentName ?? 'document').replace(/\.(docx|docxhistory)$/i, '');
|
|
220
|
+
const name = suffix === 'docxhistory' ? `${stem}.docxhistory` : `${stem}-${suffix}`;
|
|
221
|
+
if (this.options.download) {
|
|
222
|
+
await this.options.download(bytes, name);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const url = URL.createObjectURL(new Blob([bytes.slice()], { type: suffix === 'docxhistory' ? 'application/octet-stream' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }));
|
|
226
|
+
const link = this.element.ownerDocument.createElement('a');
|
|
227
|
+
link.href = url;
|
|
228
|
+
link.download = name;
|
|
229
|
+
link.click();
|
|
230
|
+
setTimeout(() => URL.revokeObjectURL(url), 1000);
|
|
231
|
+
}
|
|
232
|
+
async run(label, action) {
|
|
233
|
+
if (this.destroyed)
|
|
234
|
+
throw new DocxHistoryError('Closed', 'History controls are closed.');
|
|
235
|
+
if (this.active)
|
|
236
|
+
throw new DocxHistoryError('Busy', 'A history command is still running.');
|
|
237
|
+
this.fieldset.disabled = true;
|
|
238
|
+
this.element.setAttribute('aria-busy', 'true');
|
|
239
|
+
this.status.textContent = `${label}…`;
|
|
240
|
+
const work = Promise.resolve().then(action);
|
|
241
|
+
this.active = work;
|
|
242
|
+
try {
|
|
243
|
+
await work;
|
|
244
|
+
if (this.status.textContent === `${label}…`)
|
|
245
|
+
this.status.textContent = 'Ready.';
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
if (!this.destroyed)
|
|
249
|
+
this.status.textContent = historyControlError(error, this.options.checkpoints?.hasPending);
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
this.active = null;
|
|
254
|
+
if (!this.destroyed) {
|
|
255
|
+
this.fieldset.disabled = false;
|
|
256
|
+
this.element.setAttribute('aria-busy', 'false');
|
|
257
|
+
this.update();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
button(key, title, action, parent = this.fieldset) {
|
|
262
|
+
this.actions.set(key, this.commandButton(title, action, parent));
|
|
263
|
+
}
|
|
264
|
+
commandButton(title, action, parent) {
|
|
265
|
+
const button = parent.ownerDocument.createElement('button');
|
|
266
|
+
button.type = 'button';
|
|
267
|
+
button.textContent = title;
|
|
268
|
+
button.addEventListener('click', () => { void this.run(title, action).catch(() => { }); }, { signal: this.events.signal });
|
|
269
|
+
parent.append(button);
|
|
270
|
+
return button;
|
|
271
|
+
}
|
|
272
|
+
select(title) {
|
|
273
|
+
const label = this.fieldset.ownerDocument.createElement('label');
|
|
274
|
+
label.textContent = title;
|
|
275
|
+
const select = label.ownerDocument.createElement('select');
|
|
276
|
+
select.setAttribute('aria-label', title);
|
|
277
|
+
label.append(select);
|
|
278
|
+
this.fieldset.append(label);
|
|
279
|
+
return select;
|
|
280
|
+
}
|
|
281
|
+
input(title, type, value = '', parent = this.fieldset) {
|
|
282
|
+
const label = parent.ownerDocument.createElement('label');
|
|
283
|
+
label.textContent = title;
|
|
284
|
+
const input = label.ownerDocument.createElement('input');
|
|
285
|
+
input.type = type;
|
|
286
|
+
input.value = value;
|
|
287
|
+
label.append(input);
|
|
288
|
+
parent.append(label);
|
|
289
|
+
return input;
|
|
290
|
+
}
|
|
291
|
+
disclosure(title) {
|
|
292
|
+
const details = this.fieldset.ownerDocument.createElement('details');
|
|
293
|
+
const summary = details.ownerDocument.createElement('summary');
|
|
294
|
+
summary.textContent = title;
|
|
295
|
+
details.append(summary);
|
|
296
|
+
this.fieldset.append(details);
|
|
297
|
+
return details;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
export function historyControlError(error, pending = false) {
|
|
301
|
+
const code = error instanceof DocxHistoryError ? error.code : '';
|
|
302
|
+
if (code === 'StaleHead')
|
|
303
|
+
return 'A newer checkpoint exists. Your draft is safe. Refresh history, review the newer version, then save again.';
|
|
304
|
+
if (code === 'ImportConflict')
|
|
305
|
+
return 'A different local history already exists. Open this file read-only to explore it.';
|
|
306
|
+
if (code === 'InitializationUnsupported')
|
|
307
|
+
return 'This storage cannot import history. Open read-only or choose storage that supports importing.';
|
|
308
|
+
if (pending)
|
|
309
|
+
return 'The checkpoint could not be confirmed. Your draft is safe. Retry checkpoint to recover the original request.';
|
|
310
|
+
if (code === 'ResourceLimit')
|
|
311
|
+
return 'This history file exceeds browser processing limits, which can apply even below 64 MiB. Your document is unchanged.';
|
|
312
|
+
if (code === 'UnsupportedVersion')
|
|
313
|
+
return 'This history file uses an unsupported version. Open it with a newer app. Your document is unchanged.';
|
|
314
|
+
if (code === 'InvalidManifest')
|
|
315
|
+
return 'This history file is damaged or incomplete. Choose another copy. Your document is unchanged.';
|
|
316
|
+
return `History could not be loaded. Your document is unchanged. ${error instanceof Error ? error.message : 'Please try again.'}`;
|
|
317
|
+
}
|
|
318
|
+
function versionTitle(version) {
|
|
319
|
+
const { metadata, sequence } = version.record;
|
|
320
|
+
return `${metadata.label || `Version ${BigInt(sequence) + 1n}`} · ${metadata.author} · ${formatTime(metadata.createdAt)}`;
|
|
321
|
+
}
|
|
322
|
+
function formatTime(value) { const time = new Date(value); return Number.isNaN(time.getTime()) ? value : time.toLocaleString(); }
|
|
323
|
+
const HISTORY_CSS = `
|
|
324
|
+
.dx-history{font:14px/1.5 system-ui,sans-serif;color:#203047;background:#fff;border:1px solid #cbd5e1;border-radius:12px;padding:18px;min-width:0}
|
|
325
|
+
.dx-history *{box-sizing:border-box}.dx-history h2{font-size:20px;margin:0 0 8px}.dx-history p{margin:8px 0;overflow-wrap:anywhere}
|
|
326
|
+
.dx-history fieldset{border:0;padding:0;margin:0;min-width:0}.dx-history legend{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
|
|
327
|
+
.dx-history label{display:block;font-weight:600;margin:12px 0 6px}.dx-history input,.dx-history select{display:block;width:100%;max-width:100%;margin-top:4px;font:inherit;color:inherit;border:1px solid #94a3b8;border-radius:6px;padding:8px;background:#fff}
|
|
328
|
+
.dx-history button{min-height:40px;margin:4px 6px 4px 0;padding:7px 12px;border:1px solid #94a3b8;border-radius:6px;background:#f8fafc;color:inherit;font:inherit;cursor:pointer}
|
|
329
|
+
.dx-history button:disabled{opacity:.5;cursor:wait}.dx-history :focus-visible{outline:3px solid #2563eb;outline-offset:2px}.dx-history [hidden]{display:none}
|
|
330
|
+
.dx-history details{margin-top:16px;border-top:1px solid #e2e8f0;padding-top:12px}.dx-history summary{cursor:pointer;font-weight:600;padding:4px 0}
|
|
331
|
+
.dx-history [role=status]{min-height:42px}.dx-history ol{padding-left:22px}.dx-history option{padding:6px}
|
|
332
|
+
`;
|
|
333
|
+
//# sourceMappingURL=history-controls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-controls.js","sourceRoot":"","sources":["../src/history-controls.ts"],"names":[],"mappings":"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"}
|