docxodus 12.2.0 → 12.4.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 +11 -4
- package/dist/editor.bundle.js +1208 -28
- package/dist/editor.d.ts +10 -1
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +48 -16
- package/dist/editor.js.map +1 -1
- package/dist/embed.bundle.js +1212 -31
- package/dist/embed.d.ts +5 -2
- package/dist/embed.d.ts.map +1 -1
- package/dist/embed.iife.js +1212 -31
- package/dist/embed.js +10 -3
- package/dist/embed.js.map +1 -1
- package/dist/export-assets.json +9 -9
- package/dist/history-checkpoints.d.ts +50 -0
- package/dist/history-checkpoints.d.ts.map +1 -0
- package/dist/history-checkpoints.js +102 -0
- package/dist/history-checkpoints.js.map +1 -0
- package/dist/history-controls.d.ts +33 -0
- package/dist/history-controls.d.ts.map +1 -0
- package/dist/history-controls.js +375 -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 +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/ribbon-chrome.d.ts +1 -1
- package/dist/ribbon-chrome.d.ts.map +1 -1
- package/dist/ribbon-chrome.js +6 -3
- package/dist/ribbon-chrome.js.map +1 -1
- package/dist/ribbon-history.d.ts +85 -0
- package/dist/ribbon-history.d.ts.map +1 -0
- package/dist/ribbon-history.js +508 -0
- package/dist/ribbon-history.js.map +1 -0
- package/dist/ribbon.d.ts +6 -0
- package/dist/ribbon.d.ts.map +1 -1
- package/dist/ribbon.js +50 -19
- package/dist/ribbon.js.map +1 -1
- package/dist/viewport.d.ts +3 -1
- package/dist/viewport.d.ts.map +1 -1
- package/dist/viewport.js +14 -0
- package/dist/viewport.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 +8 -7
|
@@ -0,0 +1,375 @@
|
|
|
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', 'Version history');
|
|
26
|
+
const style = doc.createElement('style');
|
|
27
|
+
style.textContent = HISTORY_CSS;
|
|
28
|
+
const title = doc.createElement('h2');
|
|
29
|
+
title.textContent = 'Version 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 = 'Saved versions';
|
|
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.dataset.historyExisting = '';
|
|
41
|
+
note.textContent = options.checkpoints ? 'Browse saved versions without changing your draft.' : 'Read-only history. Preview or download any saved version.';
|
|
42
|
+
this.fieldset.append(note);
|
|
43
|
+
this.button('refresh', 'Refresh history', () => this.load(true));
|
|
44
|
+
this.button('latest', 'Preview latest', async () => this.preview(await options.reader.exportDocx(), 'Latest saved version'));
|
|
45
|
+
this.versions = this.select('Version');
|
|
46
|
+
this.versions.size = 6;
|
|
47
|
+
this.detail = doc.createElement('p');
|
|
48
|
+
this.fieldset.append(this.detail);
|
|
49
|
+
this.versions.addEventListener('change', () => this.update(), { signal: this.events.signal });
|
|
50
|
+
this.button('preview', 'Preview selected', async () => this.preview(await options.reader.exportDocx(this.selected().id), versionTitle(this.selected())));
|
|
51
|
+
this.button('download', 'Download selected', async () => this.download(await options.reader.exportDocx(this.selected().id), `version-${this.selected().record.sequence}.docx`));
|
|
52
|
+
const comparison = this.disclosure('Compare versions');
|
|
53
|
+
this.before = this.select('Compare from', comparison);
|
|
54
|
+
this.before.addEventListener('change', () => this.update(), { signal: this.events.signal });
|
|
55
|
+
const compareNote = doc.createElement('p');
|
|
56
|
+
compareNote.textContent = 'Compare from this version to the selected version above.';
|
|
57
|
+
comparison.append(compareNote);
|
|
58
|
+
this.button('compare', 'Compare versions', async () => {
|
|
59
|
+
const before = this.records[Number(this.before.value)];
|
|
60
|
+
await this.preview(await options.reader.compareVersions(before.id, this.selected().id), 'Comparison with tracked changes');
|
|
61
|
+
}, comparison);
|
|
62
|
+
this.button('more', 'Load older versions', async () => { if (this.next)
|
|
63
|
+
await this.page(this.next, false); });
|
|
64
|
+
const saveGroup = doc.createElement('div');
|
|
65
|
+
saveGroup.className = 'dx-history-save';
|
|
66
|
+
this.fieldset.insertBefore(saveGroup, note);
|
|
67
|
+
const attribution = doc.createElement('details');
|
|
68
|
+
const attributionTitle = doc.createElement('summary');
|
|
69
|
+
attributionTitle.textContent = 'Saved by';
|
|
70
|
+
attribution.append(attributionTitle);
|
|
71
|
+
saveGroup.append(attribution);
|
|
72
|
+
this.author = this.input('Your name', 'text', options.author ?? 'You', attribution);
|
|
73
|
+
this.label = this.input('Version name (optional)', 'text', '', saveGroup);
|
|
74
|
+
saveGroup.hidden = !options.checkpoints;
|
|
75
|
+
this.author.parentElement.hidden = this.label.parentElement.hidden = !options.checkpoints;
|
|
76
|
+
this.button('save', 'Save version', async () => {
|
|
77
|
+
const view = await options.checkpoints.save(await options.capture(), this.metadata());
|
|
78
|
+
await options.onCheckpoint?.(view, 'save');
|
|
79
|
+
await this.load(false);
|
|
80
|
+
this.label.value = '';
|
|
81
|
+
this.status.textContent = 'Version saved. Your draft remains open.';
|
|
82
|
+
}, saveGroup);
|
|
83
|
+
saveGroup.append(attribution);
|
|
84
|
+
this.button('restore', 'Restore selected', async () => {
|
|
85
|
+
const version = this.selected();
|
|
86
|
+
const confirmed = options.confirmRestore ? await options.confirmRestore(versionTitle(version))
|
|
87
|
+
: doc.defaultView?.confirm(`Restore ${versionTitle(version)} as a new saved version?\n\nYour current draft and all later versions will be kept.`);
|
|
88
|
+
if (!confirmed) {
|
|
89
|
+
this.status.textContent = 'Restore canceled. Your draft and history are unchanged.';
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const view = await options.checkpoints.restore(version.id, this.metadata());
|
|
93
|
+
await options.onCheckpoint?.(view, 'restore');
|
|
94
|
+
await this.load(false);
|
|
95
|
+
this.status.textContent = options.restoreUpdatesDraft ? 'Version restored. All saved versions are kept.' : 'Restored as a new saved version. Your draft and later versions are kept.';
|
|
96
|
+
});
|
|
97
|
+
const restoreNote = doc.createElement('p');
|
|
98
|
+
restoreNote.hidden = !options.checkpoints;
|
|
99
|
+
if (options.checkpoints)
|
|
100
|
+
restoreNote.dataset.historyExisting = '';
|
|
101
|
+
restoreNote.textContent = options.restoreUpdatesDraft ? 'Restore returns your document to this version and keeps every saved version.' : 'Restore creates a new saved version. Preview latest to view it; your draft stays open.';
|
|
102
|
+
this.fieldset.append(restoreNote);
|
|
103
|
+
this.button('retry', 'Retry save', async () => {
|
|
104
|
+
const request = options.checkpoints.pendingRequest;
|
|
105
|
+
if (request?.kind === 'restore' && options.confirmRestore) {
|
|
106
|
+
const target = await options.reader.getVersion(request.target);
|
|
107
|
+
if (!await options.confirmRestore(versionTitle(target))) {
|
|
108
|
+
this.status.textContent = 'Restore retry canceled. Your draft is unchanged; the saved action still needs recovery.';
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const view = await options.checkpoints.retry();
|
|
113
|
+
await options.onCheckpoint?.(view, 'retry', request ?? undefined);
|
|
114
|
+
await this.load(false);
|
|
115
|
+
this.status.textContent = request?.kind === 'restore' && options.restoreUpdatesDraft
|
|
116
|
+
? 'Version restored. All saved versions are kept. Refresh history to check for newer versions.'
|
|
117
|
+
: 'Saved version recovered. Your draft remains open. Refresh history to check for newer versions.';
|
|
118
|
+
});
|
|
119
|
+
const sharing = this.disclosure('Download with history');
|
|
120
|
+
const sharingNote = doc.createElement('p');
|
|
121
|
+
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.';
|
|
122
|
+
sharing.append(sharingNote);
|
|
123
|
+
this.button('archive', 'Download with version history', async () => this.download(await options.reader.exportHistoryArchive(), 'docxhistory'), sharing);
|
|
124
|
+
const portability = doc.createElement('p');
|
|
125
|
+
portability.textContent = 'Saved versions stay on this device. Download a history file to keep a portable copy; clearing browser data removes local versions.';
|
|
126
|
+
sharing.append(portability);
|
|
127
|
+
const time = this.disclosure('Find a version by time');
|
|
128
|
+
const cutoff = this.input('Saved at or before (local time)', 'datetime-local', '', time);
|
|
129
|
+
this.button('time', 'Preview at time', async () => {
|
|
130
|
+
if (!cutoff.value)
|
|
131
|
+
throw new DocxHistoryError('InvalidRequest', 'Choose a date and time first.');
|
|
132
|
+
const sequence = await options.reader.resolveSequenceAtTime(new Date(cutoff.value).toISOString());
|
|
133
|
+
await this.preview(await options.reader.materialize(sequence), 'Version at selected time');
|
|
134
|
+
}, time);
|
|
135
|
+
const activity = this.disclosure('Recorded collaboration');
|
|
136
|
+
const decisions = doc.createElement('ol');
|
|
137
|
+
let showOlderActivity = () => { };
|
|
138
|
+
this.button('activity', 'Load activity', async () => {
|
|
139
|
+
const { operations } = await options.reader.readOperationsSince(null);
|
|
140
|
+
const resolved = new Set(operations.filter(op => op.record.status === 'accepted').map(op => op.input.request.resolves?.digest.value));
|
|
141
|
+
let shown = 0;
|
|
142
|
+
showOlderActivity = () => {
|
|
143
|
+
const page = operations.slice(Math.max(0, operations.length - shown - this.pageSize), operations.length - shown).reverse();
|
|
144
|
+
decisions.append(...page.map(op => this.activityItem(op, resolved.has(op.id.digest.value))));
|
|
145
|
+
shown += page.length;
|
|
146
|
+
this.actions.get('activity-more').hidden = shown >= operations.length;
|
|
147
|
+
};
|
|
148
|
+
decisions.replaceChildren();
|
|
149
|
+
showOlderActivity();
|
|
150
|
+
this.status.textContent = operations.length ? 'Recorded activity loaded.' : 'No recorded collaboration.';
|
|
151
|
+
}, activity);
|
|
152
|
+
activity.append(decisions);
|
|
153
|
+
this.button('activity-more', 'Load older activity', async () => showOlderActivity(), activity);
|
|
154
|
+
this.actions.get('activity-more').hidden = true;
|
|
155
|
+
this.ready = this.run('Loading history', () => this.load(false));
|
|
156
|
+
}
|
|
157
|
+
refresh() { return this.run('Loading history', () => this.load(true)); }
|
|
158
|
+
async destroy() {
|
|
159
|
+
this.destroyed = true;
|
|
160
|
+
this.events.abort();
|
|
161
|
+
this.element.remove();
|
|
162
|
+
await this.active?.catch(() => { });
|
|
163
|
+
}
|
|
164
|
+
async load(refresh) {
|
|
165
|
+
this.view = this.options.checkpoints
|
|
166
|
+
? refresh ? await this.options.checkpoints.refresh() : this.options.checkpoints.view
|
|
167
|
+
: await this.options.reader.read();
|
|
168
|
+
if (this.view)
|
|
169
|
+
await this.page(this.view.version.id, true);
|
|
170
|
+
else {
|
|
171
|
+
this.records = [];
|
|
172
|
+
this.next = null;
|
|
173
|
+
this.versions.replaceChildren();
|
|
174
|
+
this.before.replaceChildren();
|
|
175
|
+
}
|
|
176
|
+
this.status.textContent = this.options.checkpoints?.hasPending
|
|
177
|
+
? 'A save needs recovery. Retry it before saving more changes.'
|
|
178
|
+
: this.view ? 'Select a version to preview, download or restore.' : 'No saved versions yet. Save your first version when you are ready.';
|
|
179
|
+
}
|
|
180
|
+
async page(cursor, reset) {
|
|
181
|
+
const page = await this.options.reader.listVersions(cursor, this.pageSize);
|
|
182
|
+
if (reset) {
|
|
183
|
+
this.records = [];
|
|
184
|
+
this.versions.replaceChildren();
|
|
185
|
+
this.before.replaceChildren();
|
|
186
|
+
}
|
|
187
|
+
const start = this.records.length;
|
|
188
|
+
this.records.push(...page.versions);
|
|
189
|
+
this.next = page.next;
|
|
190
|
+
for (let index = start; index < this.records.length; index++) {
|
|
191
|
+
for (const select of [this.versions, this.before]) {
|
|
192
|
+
const option = select.ownerDocument.createElement('option');
|
|
193
|
+
option.value = String(index);
|
|
194
|
+
option.textContent = option.title = versionTitle(this.records[index]);
|
|
195
|
+
select.append(option);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (reset) {
|
|
199
|
+
this.versions.value = '0';
|
|
200
|
+
this.before.value = this.records.length > 1 ? '1' : '0';
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
update() {
|
|
204
|
+
const hasVersion = this.records.length > 0;
|
|
205
|
+
const pending = this.options.checkpoints?.hasPending ?? false;
|
|
206
|
+
const stale = this.options.checkpoints?.needsRefresh ?? false;
|
|
207
|
+
for (const key of ['latest', 'preview', 'download', 'archive', 'time', 'activity'])
|
|
208
|
+
this.actions.get(key).disabled = !hasVersion;
|
|
209
|
+
this.actions.get('more').hidden = !this.next;
|
|
210
|
+
this.actions.get('compare').disabled = !hasVersion || this.before.value === this.versions.value;
|
|
211
|
+
this.actions.get('save').hidden = !this.options.checkpoints || !this.options.capture;
|
|
212
|
+
this.actions.get('save').disabled = pending || stale;
|
|
213
|
+
this.actions.get('restore').hidden = !this.options.checkpoints;
|
|
214
|
+
this.actions.get('restore').disabled = !hasVersion || pending || stale;
|
|
215
|
+
this.actions.get('retry').hidden = !pending;
|
|
216
|
+
this.versions.parentElement.hidden = this.detail.hidden = !hasVersion;
|
|
217
|
+
this.versions.size = Math.max(2, Math.min(6, this.records.length));
|
|
218
|
+
for (const key of ['latest', 'preview', 'download'])
|
|
219
|
+
this.actions.get(key).hidden = !hasVersion;
|
|
220
|
+
this.actions.get('restore').hidden = !hasVersion || !this.options.checkpoints;
|
|
221
|
+
for (const element of Array.from(this.element.querySelectorAll('[data-history-existing]')))
|
|
222
|
+
element.hidden = !hasVersion;
|
|
223
|
+
this.detail.textContent = hasVersion ? [versionTitle(this.selected()), this.selected().record.metadata.message,
|
|
224
|
+
this.selected().record.restoredFrom ? 'Restored from an earlier version.' : ''].filter(Boolean).join(' — ') : '';
|
|
225
|
+
}
|
|
226
|
+
selected() { return this.records[Number(this.versions.value)]; }
|
|
227
|
+
activityItem(op, resolved) {
|
|
228
|
+
const doc = this.element.ownerDocument;
|
|
229
|
+
const item = doc.createElement('li');
|
|
230
|
+
const state = op.record.status === 'accepted' ? 'Accepted' : resolved ? 'Conflict resolved' : 'Conflict needs review';
|
|
231
|
+
const label = doc.createElement('p');
|
|
232
|
+
label.textContent = `${op.input.request.metadata.author} · ${state} · ${formatTime(op.input.request.metadata.createdAt)}`;
|
|
233
|
+
item.append(label);
|
|
234
|
+
const description = doc.createElement('p');
|
|
235
|
+
this.commandButton('View decision', async () => {
|
|
236
|
+
const decision = await this.options.reader.getOperation(op.id);
|
|
237
|
+
const { kind, metadata } = decision.input.request;
|
|
238
|
+
description.textContent = [{ text: 'Text edit', package: 'Document edit', discard: 'Discarded proposal' }[kind],
|
|
239
|
+
metadata.label, metadata.message, decision.record.conflict].filter(Boolean).join(' — ');
|
|
240
|
+
}, item);
|
|
241
|
+
item.append(description);
|
|
242
|
+
this.commandButton('Download proposal', async () => {
|
|
243
|
+
await this.download(await this.options.reader.exportOperationProposal(op.id), `proposal-${op.record.revision}.docx`);
|
|
244
|
+
}, item);
|
|
245
|
+
return item;
|
|
246
|
+
}
|
|
247
|
+
metadata() { return { author: this.author.value.trim() || 'You', createdAt: new Date().toISOString(), label: this.label.value.trim() || undefined }; }
|
|
248
|
+
async preview(bytes, title) {
|
|
249
|
+
if (!this.destroyed)
|
|
250
|
+
await this.options.preview(bytes, title);
|
|
251
|
+
}
|
|
252
|
+
async download(bytes, suffix) {
|
|
253
|
+
if (this.destroyed)
|
|
254
|
+
return;
|
|
255
|
+
const stem = (this.options.documentName ?? 'document').replace(/\.(docx|docxhistory)$/i, '');
|
|
256
|
+
const name = suffix === 'docxhistory' ? `${stem}.docxhistory` : `${stem}-${suffix}`;
|
|
257
|
+
if (this.options.download) {
|
|
258
|
+
await this.options.download(bytes, name);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const url = URL.createObjectURL(new Blob([bytes.slice()], { type: suffix === 'docxhistory' ? 'application/octet-stream' : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }));
|
|
262
|
+
const link = this.element.ownerDocument.createElement('a');
|
|
263
|
+
link.href = url;
|
|
264
|
+
link.download = name;
|
|
265
|
+
link.click();
|
|
266
|
+
setTimeout(() => URL.revokeObjectURL(url), 1000);
|
|
267
|
+
}
|
|
268
|
+
async run(label, action) {
|
|
269
|
+
if (this.destroyed)
|
|
270
|
+
throw new DocxHistoryError('Closed', 'History controls are closed.');
|
|
271
|
+
if (this.active)
|
|
272
|
+
throw new DocxHistoryError('Busy', 'A history command is still running.');
|
|
273
|
+
this.fieldset.disabled = true;
|
|
274
|
+
this.element.setAttribute('aria-busy', 'true');
|
|
275
|
+
this.status.textContent = `${label}…`;
|
|
276
|
+
const work = Promise.resolve().then(action);
|
|
277
|
+
this.active = work;
|
|
278
|
+
try {
|
|
279
|
+
await work;
|
|
280
|
+
if (this.status.textContent === `${label}…`)
|
|
281
|
+
this.status.textContent = 'Ready.';
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
if (!this.destroyed)
|
|
285
|
+
this.status.textContent = historyControlError(error, this.options.checkpoints?.hasPending);
|
|
286
|
+
throw error;
|
|
287
|
+
}
|
|
288
|
+
finally {
|
|
289
|
+
this.active = null;
|
|
290
|
+
if (!this.destroyed) {
|
|
291
|
+
this.fieldset.disabled = false;
|
|
292
|
+
this.element.setAttribute('aria-busy', 'false');
|
|
293
|
+
this.update();
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
button(key, title, action, parent = this.fieldset) {
|
|
298
|
+
const button = this.commandButton(title, action, parent);
|
|
299
|
+
button.dataset.historyAction = key;
|
|
300
|
+
this.actions.set(key, button);
|
|
301
|
+
}
|
|
302
|
+
commandButton(title, action, parent) {
|
|
303
|
+
const button = parent.ownerDocument.createElement('button');
|
|
304
|
+
button.type = 'button';
|
|
305
|
+
button.textContent = title;
|
|
306
|
+
button.addEventListener('click', () => { void this.run(title, action).catch(() => { }); }, { signal: this.events.signal });
|
|
307
|
+
parent.append(button);
|
|
308
|
+
return button;
|
|
309
|
+
}
|
|
310
|
+
select(title, parent = this.fieldset) {
|
|
311
|
+
const label = this.fieldset.ownerDocument.createElement('label');
|
|
312
|
+
label.textContent = title;
|
|
313
|
+
const select = label.ownerDocument.createElement('select');
|
|
314
|
+
select.setAttribute('aria-label', title);
|
|
315
|
+
label.append(select);
|
|
316
|
+
parent.append(label);
|
|
317
|
+
return select;
|
|
318
|
+
}
|
|
319
|
+
input(title, type, value = '', parent = this.fieldset) {
|
|
320
|
+
const label = parent.ownerDocument.createElement('label');
|
|
321
|
+
label.textContent = title;
|
|
322
|
+
const input = label.ownerDocument.createElement('input');
|
|
323
|
+
input.type = type;
|
|
324
|
+
input.value = value;
|
|
325
|
+
label.append(input);
|
|
326
|
+
parent.append(label);
|
|
327
|
+
return input;
|
|
328
|
+
}
|
|
329
|
+
disclosure(title) {
|
|
330
|
+
const details = this.fieldset.ownerDocument.createElement('details');
|
|
331
|
+
details.dataset.historyExisting = '';
|
|
332
|
+
const summary = details.ownerDocument.createElement('summary');
|
|
333
|
+
summary.textContent = title;
|
|
334
|
+
details.append(summary);
|
|
335
|
+
this.fieldset.append(details);
|
|
336
|
+
return details;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
export function historyControlError(error, pending = false) {
|
|
340
|
+
const code = error instanceof DocxHistoryError ? error.code : '';
|
|
341
|
+
if (code === 'StaleHead')
|
|
342
|
+
return 'A newer saved version exists. Your draft is safe. Refresh history, review the newer version, then save again.';
|
|
343
|
+
if (code === 'ImportConflict')
|
|
344
|
+
return 'A different local history already exists. Open this file read-only to explore it.';
|
|
345
|
+
if (code === 'InitializationUnsupported')
|
|
346
|
+
return 'This storage cannot import history. Open read-only or choose storage that supports importing.';
|
|
347
|
+
if (pending)
|
|
348
|
+
return 'The save could not be confirmed. Your draft is safe. Retry save to recover your saved version.';
|
|
349
|
+
if (code === 'ResourceLimit')
|
|
350
|
+
return 'This history file exceeds browser processing limits, which can apply even below 64 MiB. Your document is unchanged.';
|
|
351
|
+
if (code === 'UnsupportedVersion')
|
|
352
|
+
return 'This history file uses an unsupported version. Open it with a newer app. Your document is unchanged.';
|
|
353
|
+
if (code === 'InvalidManifest')
|
|
354
|
+
return 'This history file is damaged or incomplete. Choose another copy. Your document is unchanged.';
|
|
355
|
+
return `History could not be loaded. Your document is unchanged. ${error instanceof Error ? error.message : 'Please try again.'}`;
|
|
356
|
+
}
|
|
357
|
+
function versionTitle(version) {
|
|
358
|
+
const { metadata } = version.record;
|
|
359
|
+
return `${metadata.label || 'Saved version'} · ${metadata.author} · ${formatTime(metadata.createdAt)}`;
|
|
360
|
+
}
|
|
361
|
+
function formatTime(value) {
|
|
362
|
+
const time = new Date(value);
|
|
363
|
+
return Number.isNaN(time.getTime()) ? value : new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeStyle: 'short' }).format(time);
|
|
364
|
+
}
|
|
365
|
+
const HISTORY_CSS = `
|
|
366
|
+
.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}
|
|
367
|
+
.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}
|
|
368
|
+
.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%)}
|
|
369
|
+
.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}
|
|
370
|
+
.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}
|
|
371
|
+
.dx-history button:disabled{opacity:.5;cursor:wait}.dx-history :focus-visible{outline:3px solid #2563eb;outline-offset:2px}.dx-history [hidden]{display:none}
|
|
372
|
+
.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}
|
|
373
|
+
.dx-history [role=status]{min-height:42px}.dx-history ol{padding-left:22px}.dx-history option{padding:6px}
|
|
374
|
+
`;
|
|
375
|
+
//# 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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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { HistoryStorage } from './history.js';
|
|
2
|
+
import type { HistoryCheckpointJournal } from './history-checkpoints.js';
|
|
3
|
+
export interface IndexedDbHistoryStore {
|
|
4
|
+
readonly storage: HistoryStorage;
|
|
5
|
+
journal(documentId: string): HistoryCheckpointJournal;
|
|
6
|
+
/** Await active history calls first. Stored documents and pending requests are retained. */
|
|
7
|
+
close(): void;
|
|
8
|
+
}
|
|
9
|
+
/** Optional browser-local persistence. Call explicitly; no storage, autosave or retention
|
|
10
|
+
* policy is installed by mounting controls. Browser site-data clearing removes this store. */
|
|
11
|
+
export declare function openIndexedDbHistoryStore(name: string): Promise<IndexedDbHistoryStore>;
|
|
12
|
+
//# sourceMappingURL=history-indexeddb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-indexeddb.d.ts","sourceRoot":"","sources":["../src/history-indexeddb.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAsE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvH,OAAO,KAAK,EAAE,wBAAwB,EAA4B,MAAM,0BAA0B,CAAC;AAEnG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,wBAAwB,CAAC;IACtD,4FAA4F;IAC5F,KAAK,IAAI,IAAI,CAAC;CACf;AAED;8FAC8F;AAC9F,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA+G5F"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { DocxHistoryError } from './history.js';
|
|
2
|
+
/** Optional browser-local persistence. Call explicitly; no storage, autosave or retention
|
|
3
|
+
* policy is installed by mounting controls. Browser site-data clearing removes this store. */
|
|
4
|
+
export async function openIndexedDbHistoryStore(name) {
|
|
5
|
+
const db = await new Promise((resolve, reject) => {
|
|
6
|
+
let blocked = false;
|
|
7
|
+
const request = indexedDB.open(name, 1);
|
|
8
|
+
request.onupgradeneeded = () => {
|
|
9
|
+
for (const store of ['blobs', 'heads', 'requests'])
|
|
10
|
+
request.result.createObjectStore(store);
|
|
11
|
+
};
|
|
12
|
+
request.onsuccess = () => { if (blocked)
|
|
13
|
+
request.result.close();
|
|
14
|
+
else
|
|
15
|
+
resolve(request.result); };
|
|
16
|
+
request.onerror = () => reject(request.error);
|
|
17
|
+
request.onblocked = () => {
|
|
18
|
+
blocked = true;
|
|
19
|
+
reject(new Error('Close other tabs using this history store, then try again.'));
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
db.onversionchange = () => db.close();
|
|
23
|
+
function transaction(name, mode, action) {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const tx = db.transaction(name, mode);
|
|
26
|
+
let value;
|
|
27
|
+
tx.oncomplete = () => resolve(value);
|
|
28
|
+
tx.onabort = () => reject(tx.error ?? new Error('History storage transaction was aborted.'));
|
|
29
|
+
try {
|
|
30
|
+
action(tx.objectStore(name), result => { value = result; });
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
tx.abort();
|
|
34
|
+
reject(error);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const storage = {
|
|
39
|
+
readBlob(reference) {
|
|
40
|
+
const key = referenceKey(reference);
|
|
41
|
+
return transaction('blobs', 'readonly', (store, result) => {
|
|
42
|
+
store.get(key).onsuccess = event => result(event.target.result ?? null);
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
async putBlob(reference, bytes) {
|
|
46
|
+
const key = referenceKey(reference);
|
|
47
|
+
const captured = bytes.slice();
|
|
48
|
+
if (captured.length !== reference.length)
|
|
49
|
+
throw new DocxHistoryError('PayloadMismatch', 'Stored document length does not match its reference.');
|
|
50
|
+
const hash = Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256', captured)), byte => byte.toString(16).padStart(2, '0')).join('');
|
|
51
|
+
if (hash !== key.split(':')[0])
|
|
52
|
+
throw new DocxHistoryError('PayloadMismatch', 'Stored document bytes do not match their reference.');
|
|
53
|
+
await transaction('blobs', 'readwrite', (store, result) => {
|
|
54
|
+
store.put(captured, key);
|
|
55
|
+
result();
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
readHead(documentId) {
|
|
59
|
+
return transaction('heads', 'readonly', (store, result) => {
|
|
60
|
+
store.get(documentId).onsuccess = event => result(event.target.result ?? null);
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
advanceHead(documentId, expected, state) {
|
|
64
|
+
referenceKey(state);
|
|
65
|
+
const captured = structuredClone({ expected, state });
|
|
66
|
+
if (expected)
|
|
67
|
+
validateHead(expected);
|
|
68
|
+
const revision = BigInt(expected?.revision ?? '0') + 1n;
|
|
69
|
+
if (revision > 9223372036854775807n)
|
|
70
|
+
throw new RangeError('History revision exhausted.');
|
|
71
|
+
return transaction('heads', 'readwrite', (store, result) => {
|
|
72
|
+
store.get(documentId).onsuccess = event => {
|
|
73
|
+
const current = event.target.result ?? null;
|
|
74
|
+
if (!equalHead(current, captured.expected)) {
|
|
75
|
+
result(null);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const head = { revision: String(revision), state: captured.state };
|
|
79
|
+
store.put(head, documentId);
|
|
80
|
+
result(head);
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
initializeHead(documentId, head) {
|
|
85
|
+
validateHead(head);
|
|
86
|
+
const captured = structuredClone(head);
|
|
87
|
+
// Both publication paths lock the same object store for the entire read/write transaction.
|
|
88
|
+
return transaction('heads', 'readwrite', (store, result) => {
|
|
89
|
+
store.get(documentId).onsuccess = event => {
|
|
90
|
+
const existing = event.target.result;
|
|
91
|
+
if (existing) {
|
|
92
|
+
result({ initialized: false, head: existing });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
store.put(captured, documentId);
|
|
96
|
+
result({ initialized: true, head: captured });
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
return {
|
|
102
|
+
storage,
|
|
103
|
+
journal(documentId) {
|
|
104
|
+
return {
|
|
105
|
+
read: () => transaction('requests', 'readonly', (store, result) => {
|
|
106
|
+
store.get(documentId).onsuccess = event => result(event.target.result ?? null);
|
|
107
|
+
}),
|
|
108
|
+
put(request) {
|
|
109
|
+
if (request.documentId !== documentId)
|
|
110
|
+
throw new Error('Checkpoint document identity does not match.');
|
|
111
|
+
const captured = structuredClone(request);
|
|
112
|
+
return transaction('requests', 'readwrite', (store, result) => {
|
|
113
|
+
store.get(documentId).onsuccess = event => {
|
|
114
|
+
const existing = event.target.result;
|
|
115
|
+
if (existing) {
|
|
116
|
+
result(existing);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
store.put(captured, documentId);
|
|
120
|
+
result(captured);
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
remove(requestId) {
|
|
125
|
+
return transaction('requests', 'readwrite', (store, result) => {
|
|
126
|
+
store.get(documentId).onsuccess = event => {
|
|
127
|
+
if (event.target.result?.id === requestId)
|
|
128
|
+
store.delete(documentId);
|
|
129
|
+
result();
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
},
|
|
135
|
+
close: () => db.close(),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
function referenceKey(reference) {
|
|
139
|
+
if (reference.digest.algorithm !== 'SHA-256' || !/^[a-f0-9]{64}$/.test(reference.digest.value)
|
|
140
|
+
|| !Number.isSafeInteger(reference.length) || reference.length < 0)
|
|
141
|
+
throw new DocxHistoryError('InvalidRequest', 'Invalid history blob reference.');
|
|
142
|
+
return `${reference.digest.value}:${reference.length}`;
|
|
143
|
+
}
|
|
144
|
+
function validateHead(head) {
|
|
145
|
+
referenceKey(head.state);
|
|
146
|
+
if (typeof head.revision !== 'string' || !/^[1-9][0-9]*$/.test(head.revision) || BigInt(head.revision) > 9223372036854775807n)
|
|
147
|
+
throw new DocxHistoryError('InvalidRequest', 'Invalid history revision.');
|
|
148
|
+
}
|
|
149
|
+
function equalHead(a, b) {
|
|
150
|
+
return a === null || b === null ? a === b
|
|
151
|
+
: a.revision === b.revision && a.state.length === b.state.length
|
|
152
|
+
&& a.state.digest.algorithm === b.state.digest.algorithm && a.state.digest.value === b.state.digest.value;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=history-indexeddb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history-indexeddb.js","sourceRoot":"","sources":["../src/history-indexeddb.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,9 @@ import { DocxSession } from "./session.js";
|
|
|
3
3
|
import { DocxHistoryArchive, DocxHistoryClient } from './history.js';
|
|
4
4
|
import type { HistoryStorage } from './history.js';
|
|
5
5
|
export * from './history.js';
|
|
6
|
+
export * from './history-checkpoints.js';
|
|
7
|
+
export * from './history-indexeddb.js';
|
|
8
|
+
export * from './history-controls.js';
|
|
6
9
|
/** Open history over host-owned storage after initialize(). No network layer is installed. */
|
|
7
10
|
export declare function openDocxHistory(storage: HistoryStorage): DocxHistoryClient;
|
|
8
11
|
/** Open a self-contained readonly .docxhistory file after initialize(); no storage adapter needed. */
|
|
@@ -39,7 +42,7 @@ export { CommentGutter } from "./editor-comments.js";
|
|
|
39
42
|
export type { CommentGutterHost, CommentGutterOptions } from "./editor-comments.js";
|
|
40
43
|
export type { BandWhich } from "./editor-headerfooter.js";
|
|
41
44
|
export { mountRibbon } from "./ribbon.js";
|
|
42
|
-
export type { RibbonEditor, RibbonOptions, RibbonChromeMode, RibbonState, RibbonLoader, RibbonLoaderOptions, RibbonLoaderStage, RibbonLoaderFeature, } from "./ribbon.js";
|
|
45
|
+
export type { RibbonEditor, RibbonOptions, RibbonHistoryOptions, RibbonHistoryBinding, RibbonChromeMode, RibbonState, RibbonLoader, RibbonLoaderOptions, RibbonLoaderStage, RibbonLoaderFeature, } from "./ribbon.js";
|
|
43
46
|
export type { ConversionOptions, CompareOptions, RevisionListEntry, VersionInfo, ErrorResponse, CompareResult, FormatChangeDetails, Annotation, AddAnnotationRequest, AddAnnotationResponse, RemoveAnnotationResponse, AnnotationOptions, DocumentStructure, DocumentElement, TableColumnInfo, AnnotationTarget, AddAnnotationWithTargetRequest, DocumentMetadata, SectionMetadata, OpenContractDocExport, PawlsPage, PawlsPageBoundary, PawlsToken, OpenContractsAnnotation, OpenContractsSinglePageAnnotation, BoundingBox, TokenId, TextSpan, OpenContractsRelationship, AnnotationLabel, ExternalAnnotationSet, ExternalAnnotationValidationResult, ExternalAnnotationValidationIssue, ExternalAnnotationProjectionSettings, MarkdownProjectionSettings, MarkdownAnchorTarget, MarkdownProjection, DocxDiffSettings, DocxDiffRevision, DocxDiffBatchCandidate, DocxDiffBatchResult, DocxDiffProduct, DocxDiffProducts, SemanticChange, SemanticChangeFamily, SemanticChangeOperation, SemanticChangeSet, SemanticValue, DocxDiffReviewer, DocxDiffConsolidateSettings, DocxDiffConflict, DocxDiffConflictCompetitor, DocxDiffConsolidatedRevision, };
|
|
44
47
|
export { CommentRenderMode, PaginationMode, AnnotationLabelMode, RevisionType, DocxDiffRevisionGranularity, DocxDiffFormatComparison, ConflictResolution, ProjectionScopes, AnchorRenderMode, TableRenderMode, TrackedChangeMode, EmptyParagraphMode, AnchorIdRendering, ProjectionDepth, DocumentElementType, ComparisonLogLevel, ComparisonLogCodes, isInsertion, isDeletion, isMove, isFormatChange, findElementById, findElementsByType, getParagraphs, getTables, getTableColumns, targetElement, targetParagraph, targetParagraphRange, targetRun, targetTable, targetTableRow, targetTableCell, targetTableColumn, targetSearch, targetSearchInElement, };
|
|
45
48
|
/**
|