@arbidocs/blocks 0.5.124 → 0.5.126
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/{ClippingMediaViewer-ZFEX5A3U.cjs → ClippingMediaViewer-47BAXNLO.cjs} +10 -11
- package/dist/ClippingMediaViewer-47BAXNLO.cjs.map +1 -0
- package/dist/{ClippingPdfViewer-3LRTEPHV.cjs → ClippingPdfViewer-D5BYHEAH.cjs} +16 -14
- package/dist/ClippingPdfViewer-D5BYHEAH.cjs.map +1 -0
- package/dist/{ConnectedCallDock-XJOYVVAH.cjs → ConnectedCallDock-733O5M36.cjs} +5 -5
- package/dist/{ConnectedCallDock-XJOYVVAH.cjs.map → ConnectedCallDock-733O5M36.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-CUDYAPQK.cjs → ConnectedCallRoom-TAUGSRGV.cjs} +5 -5
- package/dist/{ConnectedCallRoom-CUDYAPQK.cjs.map → ConnectedCallRoom-TAUGSRGV.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-QKHCYD6W.cjs → ConnectedNativeDocxComparison-HDE522YC.cjs} +9 -9
- package/dist/{ConnectedNativeDocxComparison-QKHCYD6W.cjs.map → ConnectedNativeDocxComparison-HDE522YC.cjs.map} +1 -1
- package/dist/{ConnectedPresentation-OV2KBOLK.cjs → ConnectedPresentation-SI3L77J4.cjs} +33 -34
- package/dist/ConnectedPresentation-SI3L77J4.cjs.map +1 -0
- package/dist/{ConnectedSlidesTab-LUAGZ6FD.cjs → ConnectedSlidesTab-JSPU6EY5.cjs} +37 -43
- package/dist/ConnectedSlidesTab-JSPU6EY5.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-AG62232A.cjs → ConnectedStreamedWordArtifact-4FHPOAFZ.cjs} +9 -9
- package/dist/{ConnectedStreamedWordArtifact-AG62232A.cjs.map → ConnectedStreamedWordArtifact-4FHPOAFZ.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-M53XFLI2.cjs → DocumentReviewCard-BDNXP3D4.cjs} +4 -4
- package/dist/{DocumentReviewCard-M53XFLI2.cjs.map → DocumentReviewCard-BDNXP3D4.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-JWKNJLWG.cjs → FilesViewerDialog-WQRNSKWM.cjs} +10 -11
- package/dist/FilesViewerDialog-WQRNSKWM.cjs.map +1 -0
- package/dist/{NativeDocxEditor-2LQY2CTV.cjs → NativeDocxEditor-SUDULUN3.cjs} +6 -6
- package/dist/{NativeDocxEditor-2LQY2CTV.cjs.map → NativeDocxEditor-SUDULUN3.cjs.map} +1 -1
- package/dist/{SpotlightStrip-ED22UYTM.cjs → SpotlightStrip-QQ2WUI32.cjs} +28 -29
- package/dist/SpotlightStrip-QQ2WUI32.cjs.map +1 -0
- package/dist/WorkspaceTableView-3XYAV4BV.cjs +1 -1
- package/dist/agents/index.cjs +1 -1
- package/dist/ai-IEIR7SC2.cjs +1 -1
- package/dist/calls/index.cjs +2 -2
- package/dist/{chunk-ZZZITHGK.cjs → chunk-26SFI2BH.cjs} +16 -3
- package/dist/chunk-26SFI2BH.cjs.map +1 -0
- package/dist/{chunk-NG2EE7HR.cjs → chunk-463QM764.cjs} +3 -3
- package/dist/{chunk-NG2EE7HR.cjs.map → chunk-463QM764.cjs.map} +1 -1
- package/dist/{chunk-XGM4VVNV.cjs → chunk-4KEQ62SL.cjs} +6 -6
- package/dist/{chunk-XGM4VVNV.cjs.map → chunk-4KEQ62SL.cjs.map} +1 -1
- package/dist/{chunk-YGBHY67W.cjs → chunk-6B4CCDDB.cjs} +5 -5
- package/dist/{chunk-YGBHY67W.cjs.map → chunk-6B4CCDDB.cjs.map} +1 -1
- package/dist/{chunk-JY7UUZQG.cjs → chunk-7Q46YAX4.cjs} +74 -71
- package/dist/chunk-7Q46YAX4.cjs.map +1 -0
- package/dist/{chunk-3ZZZO4F7.cjs → chunk-BY3QA3S5.cjs} +9 -9
- package/dist/{chunk-3ZZZO4F7.cjs.map → chunk-BY3QA3S5.cjs.map} +1 -1
- package/dist/{chunk-VKH3BEZE.cjs → chunk-CMPHJRVV.cjs} +3 -3
- package/dist/{chunk-VKH3BEZE.cjs.map → chunk-CMPHJRVV.cjs.map} +1 -1
- package/dist/{chunk-BX6G2ZCI.cjs → chunk-FB3JXSQT.cjs} +71 -43
- package/dist/chunk-FB3JXSQT.cjs.map +1 -0
- package/dist/{chunk-EMRY62HS.cjs → chunk-FGOJBOZX.cjs} +4 -4
- package/dist/{chunk-EMRY62HS.cjs.map → chunk-FGOJBOZX.cjs.map} +1 -1
- package/dist/{chunk-V6MW7B4B.cjs → chunk-I4X72WUT.cjs} +6 -6
- package/dist/{chunk-V6MW7B4B.cjs.map → chunk-I4X72WUT.cjs.map} +1 -1
- package/dist/{chunk-ORNLCBNE.cjs → chunk-JVEDKKNO.cjs} +43 -4
- package/dist/chunk-JVEDKKNO.cjs.map +1 -0
- package/dist/{chunk-7557LDAN.cjs → chunk-LOB2ATS5.cjs} +23 -10
- package/dist/chunk-LOB2ATS5.cjs.map +1 -0
- package/dist/{chunk-MXBXZXXQ.cjs → chunk-LXM5QXII.cjs} +3 -3
- package/dist/{chunk-MXBXZXXQ.cjs.map → chunk-LXM5QXII.cjs.map} +1 -1
- package/dist/chunk-OALQGO5C.cjs +18 -0
- package/dist/{chunk-SDRYSLOX.cjs.map → chunk-OALQGO5C.cjs.map} +1 -1
- package/dist/{chunk-2CSLFAGF.cjs → chunk-Q6N5D3R5.cjs} +34 -8
- package/dist/chunk-Q6N5D3R5.cjs.map +1 -0
- package/dist/{chunk-MVXHTAJ4.cjs → chunk-QWVUBTW3.cjs} +9 -9
- package/dist/{chunk-MVXHTAJ4.cjs.map → chunk-QWVUBTW3.cjs.map} +1 -1
- package/dist/{chunk-ADPRIBSH.cjs → chunk-X7ALF4MP.cjs} +7 -7
- package/dist/{chunk-ADPRIBSH.cjs.map → chunk-X7ALF4MP.cjs.map} +1 -1
- package/dist/{chunk-COD5ENHK.cjs → chunk-XNB27POJ.cjs} +4 -4
- package/dist/{chunk-COD5ENHK.cjs.map → chunk-XNB27POJ.cjs.map} +1 -1
- package/dist/{chunk-H236SNEV.cjs → chunk-ZCU72Q76.cjs} +191 -165
- package/dist/chunk-ZCU72Q76.cjs.map +1 -0
- package/dist/connect/docx.cjs +13 -13
- package/dist/connect/index.cjs +198 -163
- package/dist/connect/index.cjs.map +1 -1
- package/dist/connect/viewer.cjs +8 -9
- package/dist/connection/ai.d.ts +1 -0
- package/dist/connection/docx/ConnectedNativeDocxEditor.js +4 -5
- package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
- package/dist/connection/docx/save-native-version.d.ts +3 -0
- package/dist/connection/docx/save-native-version.js +19 -0
- package/dist/connection/docx/save-native-version.js.map +7 -0
- package/dist/connection/presentation/ClippingPdfViewer.js +8 -5
- package/dist/connection/presentation/ClippingPdfViewer.js.map +2 -2
- package/dist/connection/presentation/ConnectedSlidesTab.js +8 -13
- package/dist/connection/presentation/ConnectedSlidesTab.js.map +2 -2
- package/dist/connection/presentation/usePresentationController.js +24 -15
- package/dist/connection/presentation/usePresentationController.js.map +2 -2
- package/dist/connection/presentation/usePresentationFiles.d.ts +2 -1
- package/dist/connection/presentation/usePresentationFiles.js +15 -6
- package/dist/connection/presentation/usePresentationFiles.js.map +2 -2
- package/dist/connection/search/ConnectedSearchPage.d.ts +0 -11
- package/dist/connection/search/ConnectedSearchPage.js +3 -0
- package/dist/connection/search/ConnectedSearchPage.js.map +2 -2
- package/dist/connection/search/SearchResultRows.js +75 -43
- package/dist/connection/search/SearchResultRows.js.map +2 -2
- package/dist/connection/viewer/CleanViewControl.d.ts +3 -1
- package/dist/connection/viewer/CleanViewControl.js +5 -1
- package/dist/connection/viewer/CleanViewControl.js.map +2 -2
- package/dist/connection/viewer/ConnectedDocumentViewer.js +1 -1
- package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
- package/dist/connection/viewer/VersionDropdown.js +1 -1
- package/dist/connection/viewer/VersionDropdown.js.map +1 -1
- package/dist/connection/viewer/ViewerPdfPane.js +2 -0
- package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
- package/dist/connection/viewer/pdf/usePassageTextFallback.d.ts +12 -0
- package/dist/connection/viewer/pdf/usePassageTextFallback.js +30 -0
- package/dist/connection/viewer/pdf/usePassageTextFallback.js.map +7 -0
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js +2 -11
- package/dist/connection/viewer/pdf/usePdfPassageHighlights.js.map +2 -2
- package/dist/connection/viewer/useCleanView.d.ts +1 -1
- package/dist/connection/viewer/useCleanView.js +2 -2
- package/dist/connection/viewer/useCleanView.js.map +2 -2
- package/dist/connection/viewer/useViewedDocument.d.ts +1 -0
- package/dist/connection/viewer/useViewerTabs.js +13 -1
- package/dist/connection/viewer/useViewerTabs.js.map +2 -2
- package/dist/docx/DocxCommandMenu.js +2 -1
- package/dist/docx/DocxCommandMenu.js.map +2 -2
- package/dist/docx/NativeDocxEditor.d.ts +2 -1
- package/dist/docx/NativeDocxEditor.js +30 -5
- package/dist/docx/NativeDocxEditor.js.map +2 -2
- package/dist/docx/index.cjs +38 -38
- package/dist/embed/index.cjs +2 -2
- package/dist/facts/index.cjs +43 -43
- package/dist/index.cjs +73 -73
- package/dist/presentation/ClipCaptureOverlay.js +14 -1
- package/dist/presentation/ClipCaptureOverlay.js.map +2 -2
- package/dist/presentation/ClipImage.js +7 -4
- package/dist/presentation/ClipImage.js.map +2 -2
- package/dist/presentation/ClipTray.js +11 -7
- package/dist/presentation/ClipTray.js.map +2 -2
- package/dist/presentation/SlidesEditor.js +6 -2
- package/dist/presentation/SlidesEditor.js.map +2 -2
- package/dist/presentation/store.d.ts +2 -0
- package/dist/presentation/store.js +15 -0
- package/dist/presentation/store.js.map +3 -3
- package/dist/settings/index.cjs +1 -1
- package/dist/studio/index.cjs +1 -1
- package/dist/styles.css +1 -1
- package/dist/workflow-canvas/index.cjs +12 -12
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ClippingMediaViewer-ZFEX5A3U.cjs.map +0 -1
- package/dist/ClippingPdfViewer-3LRTEPHV.cjs.map +0 -1
- package/dist/ConnectedPresentation-OV2KBOLK.cjs.map +0 -1
- package/dist/ConnectedSlidesTab-LUAGZ6FD.cjs.map +0 -1
- package/dist/FilesViewerDialog-JWKNJLWG.cjs.map +0 -1
- package/dist/SpotlightStrip-ED22UYTM.cjs.map +0 -1
- package/dist/chunk-2CSLFAGF.cjs.map +0 -1
- package/dist/chunk-7557LDAN.cjs.map +0 -1
- package/dist/chunk-BX6G2ZCI.cjs.map +0 -1
- package/dist/chunk-GFUOCGY6.cjs +0 -32
- package/dist/chunk-GFUOCGY6.cjs.map +0 -1
- package/dist/chunk-H236SNEV.cjs.map +0 -1
- package/dist/chunk-JY7UUZQG.cjs.map +0 -1
- package/dist/chunk-ORNLCBNE.cjs.map +0 -1
- package/dist/chunk-SDRYSLOX.cjs +0 -18
- package/dist/chunk-ZZZITHGK.cjs.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkJVEDKKNO_cjs = require('./chunk-JVEDKKNO.cjs');
|
|
5
5
|
var zustand = require('zustand');
|
|
6
6
|
var viewers = require('@arbidocs/react/viewers');
|
|
7
7
|
|
|
@@ -18,9 +18,9 @@ function spotlightSteps(clips) {
|
|
|
18
18
|
function spotlightSlide(clips, ids, note, look) {
|
|
19
19
|
const shown = ids.map((id) => clips.find((clip) => clip.id === id)).filter((clip) => !!clip);
|
|
20
20
|
const base = { caption: note.trim(), layout: "clips" };
|
|
21
|
-
const frames =
|
|
21
|
+
const frames = chunkJVEDKKNO_cjs.autoLayout(
|
|
22
22
|
shown.map((clip) => clip.aspect),
|
|
23
|
-
|
|
23
|
+
chunkJVEDKKNO_cjs.reserveOf(base, look)
|
|
24
24
|
);
|
|
25
25
|
return {
|
|
26
26
|
...base,
|
|
@@ -33,7 +33,7 @@ function spotlightSlide(clips, ids, note, look) {
|
|
|
33
33
|
}
|
|
34
34
|
var sequence = 0;
|
|
35
35
|
function release(gone, kept) {
|
|
36
|
-
const inUse = new Set([...kept, ...
|
|
36
|
+
const inUse = new Set([...kept, ...chunkJVEDKKNO_cjs.usePresentation.getState().clips].map((clip) => clip.source));
|
|
37
37
|
for (const source of new Set(gone.map((clip) => clip.source))) {
|
|
38
38
|
if (!inUse.has(source)) viewers.releasePdfRegionSource(source);
|
|
39
39
|
}
|
|
@@ -53,7 +53,7 @@ var useSpotlight = zustand.create()((set, get) => ({
|
|
|
53
53
|
const full = {
|
|
54
54
|
...clip,
|
|
55
55
|
id,
|
|
56
|
-
caption: clip.caption ??
|
|
56
|
+
caption: clip.caption ?? chunkJVEDKKNO_cjs.defaultCaption(clip.fileName, clip.page),
|
|
57
57
|
zoomBase: clip.zoomBase ?? clip.rect.w
|
|
58
58
|
};
|
|
59
59
|
set((state) => ({ clips: [...state.clips, full] }));
|
|
@@ -82,13 +82,13 @@ var useSpotlight = zustand.create()((set, get) => ({
|
|
|
82
82
|
const { clips, step, note } = get();
|
|
83
83
|
const ids = spotlightSteps(clips)[step];
|
|
84
84
|
if (!ids) return;
|
|
85
|
-
|
|
85
|
+
chunkJVEDKKNO_cjs.usePresentation.getState().addSlideOf(
|
|
86
86
|
ids.map((id) => clips.find((clip) => clip.id === id)),
|
|
87
87
|
note.trim()
|
|
88
88
|
);
|
|
89
89
|
},
|
|
90
90
|
addToTray() {
|
|
91
|
-
|
|
91
|
+
chunkJVEDKKNO_cjs.usePresentation.getState().adoptClips(get().clips);
|
|
92
92
|
set({ ...EMPTY });
|
|
93
93
|
},
|
|
94
94
|
clear() {
|
|
@@ -107,5 +107,5 @@ var useSpotlight = zustand.create()((set, get) => ({
|
|
|
107
107
|
exports.spotlightSlide = spotlightSlide;
|
|
108
108
|
exports.spotlightSteps = spotlightSteps;
|
|
109
109
|
exports.useSpotlight = useSpotlight;
|
|
110
|
-
//# sourceMappingURL=chunk-
|
|
111
|
-
//# sourceMappingURL=chunk-
|
|
110
|
+
//# sourceMappingURL=chunk-QWVUBTW3.cjs.map
|
|
111
|
+
//# sourceMappingURL=chunk-QWVUBTW3.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/presentation/spotlight.ts"],"names":["autoLayout","reserveOf","usePresentation","create","defaultCaption"],"mappings":"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","file":"chunk-MVXHTAJ4.cjs","sourcesContent":["/**\n * The spotlight: clips gathered in the document viewer (from one document or several) and shown,\n * on request, as a slide over the viewer itself — the same window, so a call sharing it keeps\n * sharing it. It is transient: nothing reaches the presentation unless \"Keep as slide\" (or \"Add to\n * the presentation\") puts it there.\n *\n * Kept in memory only, like the presentation (a clip holds its decrypted file), and cleared when\n * another user signs in (`owner`).\n */\n\nimport { create } from 'zustand'\nimport { releasePdfRegionSource } from '@arbidocs/react/viewers'\nimport { autoLayout, defaultCaption, type Clip, type Slide } from './model'\nimport { reserveOf, usePresentation, type NewClip } from './store'\n\n/** A spotlight slide holds this many clips at most; more are shown on further slides. */\nexport const SPOTLIGHT_PER_SLIDE = 4\n\ninterface SpotlightState {\n clips: Clip[]\n /** A line of text shown as the spotlight's title (empty: none). */\n note: string\n /** The spotlight is on screen. */\n showing: boolean\n /** Which of its steps (`spotlightSteps`) is shown. */\n step: number\n /** The user the clips were gathered by. */\n owner: string | null\n /**\n * The viewer's Clip mode is on: kept here, not in the viewer, so it stays on as the viewer opens\n * one document after another.\n */\n clipping: boolean\n}\n\ninterface SpotlightActions {\n gather(clip: NewClip): string\n remove(clipId: string): void\n setNote(note: string): void\n show(): void\n hide(): void\n goTo(step: number): void\n /** The step on screen, as a slide of the open presentation (after its current slide). */\n keep(): void\n /** The gathered clips, into the presentation's tray (not placed); the spotlight is emptied. */\n addToTray(): void\n clear(): void\n /** Gathering for this user: another's clips are dropped. */\n own(userId: string | null): void\n setClipping(on: boolean): void\n}\n\nexport type SpotlightStore = SpotlightState & SpotlightActions\n\n/**\n * What ← → step through: the clips together (up to four a slide), and, where a slide shows more\n * than one, each of them alone after it. Each step lists clip ids.\n */\nexport function spotlightSteps(clips: readonly Pick<Clip, 'id'>[]): string[][] {\n const steps: string[][] = []\n for (let i = 0; i < clips.length; i += SPOTLIGHT_PER_SLIDE) {\n const group = clips.slice(i, i + SPOTLIGHT_PER_SLIDE).map((clip) => clip.id)\n steps.push(group)\n if (group.length > 1) steps.push(...group.map((id) => [id]))\n }\n return steps\n}\n\n/**\n * A step as a slide, arranged as the presentation arranges one (`autoLayout`: two tall clips go\n * side by side, two wide ones stack), with the note as its title and the presentation's look.\n */\nexport function spotlightSlide(\n clips: readonly Clip[],\n ids: readonly string[],\n note: string,\n look: Parameters<typeof reserveOf>[1]\n): Slide {\n const shown = ids\n .map((id) => clips.find((clip) => clip.id === id))\n .filter((clip): clip is Clip => !!clip)\n const base = { caption: note.trim(), layout: 'clips' as const }\n const frames = autoLayout(\n shown.map((clip) => clip.aspect),\n reserveOf(base, look)\n )\n return {\n ...base,\n id: 'spotlight',\n auto: true,\n points: '',\n boxes: [],\n items: shown.map((clip, i) => ({ clipId: clip.id, frame: frames[i] })),\n }\n}\n\nlet sequence = 0\n\n/** Its file goes from the PDF engine once neither the spotlight nor the presentation shows it. */\nfunction release(gone: readonly Clip[], kept: readonly Clip[]) {\n const inUse = new Set([...kept, ...usePresentation.getState().clips].map((clip) => clip.source))\n for (const source of new Set(gone.map((clip) => clip.source))) {\n if (!inUse.has(source)) releasePdfRegionSource(source)\n }\n}\n\nconst EMPTY: Omit<SpotlightState, 'owner' | 'clipping'> = {\n clips: [],\n note: '',\n showing: false,\n step: 0,\n}\n\nexport const useSpotlight = create<SpotlightStore>()((set, get) => ({\n ...EMPTY,\n owner: null,\n clipping: false,\n\n gather(clip) {\n const id = `spot-${Date.now().toString(36)}-${++sequence}`\n const full: Clip = {\n ...clip,\n id,\n caption: clip.caption ?? defaultCaption(clip.fileName, clip.page),\n zoomBase: clip.zoomBase ?? clip.rect.w,\n }\n set((state) => ({ clips: [...state.clips, full] }))\n return id\n },\n\n remove(clipId) {\n const { clips, step } = get()\n const gone = clips.filter((clip) => clip.id === clipId)\n if (!gone.length) return\n const rest = clips.filter((clip) => clip.id !== clipId)\n const steps = spotlightSteps(rest).length\n set({\n clips: rest,\n step: Math.min(step, Math.max(0, steps - 1)),\n ...(rest.length ? {} : { showing: false, note: '' }),\n })\n release(gone, rest)\n },\n\n setNote: (note) => set({ note }),\n show: () => set((state) => (state.clips.length ? { showing: true, step: 0 } : state)),\n hide: () => set({ showing: false }),\n goTo: (step) =>\n set((state) =>\n step < 0 || step >= spotlightSteps(state.clips).length || step === state.step\n ? state\n : { step }\n ),\n\n keep() {\n const { clips, step, note } = get()\n const ids = spotlightSteps(clips)[step]\n if (!ids) return\n usePresentation.getState().addSlideOf(\n ids.map((id) => clips.find((clip) => clip.id === id)!),\n note.trim()\n )\n },\n\n addToTray() {\n usePresentation.getState().adoptClips(get().clips)\n set({ ...EMPTY })\n },\n\n clear() {\n const gone = get().clips\n set({ ...EMPTY })\n release(gone, [])\n },\n\n own(userId) {\n if (get().owner === userId) return\n get().clear()\n set({ owner: userId, clipping: false })\n },\n\n setClipping: (clipping) => set({ clipping }),\n}))\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/presentation/spotlight.ts"],"names":["autoLayout","reserveOf","usePresentation","create","defaultCaption"],"mappings":"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","file":"chunk-QWVUBTW3.cjs","sourcesContent":["/**\n * The spotlight: clips gathered in the document viewer (from one document or several) and shown,\n * on request, as a slide over the viewer itself — the same window, so a call sharing it keeps\n * sharing it. It is transient: nothing reaches the presentation unless \"Keep as slide\" (or \"Add to\n * the presentation\") puts it there.\n *\n * Kept in memory only, like the presentation (a clip holds its decrypted file), and cleared when\n * another user signs in (`owner`).\n */\n\nimport { create } from 'zustand'\nimport { releasePdfRegionSource } from '@arbidocs/react/viewers'\nimport { autoLayout, defaultCaption, type Clip, type Slide } from './model'\nimport { reserveOf, usePresentation, type NewClip } from './store'\n\n/** A spotlight slide holds this many clips at most; more are shown on further slides. */\nexport const SPOTLIGHT_PER_SLIDE = 4\n\ninterface SpotlightState {\n clips: Clip[]\n /** A line of text shown as the spotlight's title (empty: none). */\n note: string\n /** The spotlight is on screen. */\n showing: boolean\n /** Which of its steps (`spotlightSteps`) is shown. */\n step: number\n /** The user the clips were gathered by. */\n owner: string | null\n /**\n * The viewer's Clip mode is on: kept here, not in the viewer, so it stays on as the viewer opens\n * one document after another.\n */\n clipping: boolean\n}\n\ninterface SpotlightActions {\n gather(clip: NewClip): string\n remove(clipId: string): void\n setNote(note: string): void\n show(): void\n hide(): void\n goTo(step: number): void\n /** The step on screen, as a slide of the open presentation (after its current slide). */\n keep(): void\n /** The gathered clips, into the presentation's tray (not placed); the spotlight is emptied. */\n addToTray(): void\n clear(): void\n /** Gathering for this user: another's clips are dropped. */\n own(userId: string | null): void\n setClipping(on: boolean): void\n}\n\nexport type SpotlightStore = SpotlightState & SpotlightActions\n\n/**\n * What ← → step through: the clips together (up to four a slide), and, where a slide shows more\n * than one, each of them alone after it. Each step lists clip ids.\n */\nexport function spotlightSteps(clips: readonly Pick<Clip, 'id'>[]): string[][] {\n const steps: string[][] = []\n for (let i = 0; i < clips.length; i += SPOTLIGHT_PER_SLIDE) {\n const group = clips.slice(i, i + SPOTLIGHT_PER_SLIDE).map((clip) => clip.id)\n steps.push(group)\n if (group.length > 1) steps.push(...group.map((id) => [id]))\n }\n return steps\n}\n\n/**\n * A step as a slide, arranged as the presentation arranges one (`autoLayout`: two tall clips go\n * side by side, two wide ones stack), with the note as its title and the presentation's look.\n */\nexport function spotlightSlide(\n clips: readonly Clip[],\n ids: readonly string[],\n note: string,\n look: Parameters<typeof reserveOf>[1]\n): Slide {\n const shown = ids\n .map((id) => clips.find((clip) => clip.id === id))\n .filter((clip): clip is Clip => !!clip)\n const base = { caption: note.trim(), layout: 'clips' as const }\n const frames = autoLayout(\n shown.map((clip) => clip.aspect),\n reserveOf(base, look)\n )\n return {\n ...base,\n id: 'spotlight',\n auto: true,\n points: '',\n boxes: [],\n items: shown.map((clip, i) => ({ clipId: clip.id, frame: frames[i] })),\n }\n}\n\nlet sequence = 0\n\n/** Its file goes from the PDF engine once neither the spotlight nor the presentation shows it. */\nfunction release(gone: readonly Clip[], kept: readonly Clip[]) {\n const inUse = new Set([...kept, ...usePresentation.getState().clips].map((clip) => clip.source))\n for (const source of new Set(gone.map((clip) => clip.source))) {\n if (!inUse.has(source)) releasePdfRegionSource(source)\n }\n}\n\nconst EMPTY: Omit<SpotlightState, 'owner' | 'clipping'> = {\n clips: [],\n note: '',\n showing: false,\n step: 0,\n}\n\nexport const useSpotlight = create<SpotlightStore>()((set, get) => ({\n ...EMPTY,\n owner: null,\n clipping: false,\n\n gather(clip) {\n const id = `spot-${Date.now().toString(36)}-${++sequence}`\n const full: Clip = {\n ...clip,\n id,\n caption: clip.caption ?? defaultCaption(clip.fileName, clip.page),\n zoomBase: clip.zoomBase ?? clip.rect.w,\n }\n set((state) => ({ clips: [...state.clips, full] }))\n return id\n },\n\n remove(clipId) {\n const { clips, step } = get()\n const gone = clips.filter((clip) => clip.id === clipId)\n if (!gone.length) return\n const rest = clips.filter((clip) => clip.id !== clipId)\n const steps = spotlightSteps(rest).length\n set({\n clips: rest,\n step: Math.min(step, Math.max(0, steps - 1)),\n ...(rest.length ? {} : { showing: false, note: '' }),\n })\n release(gone, rest)\n },\n\n setNote: (note) => set({ note }),\n show: () => set((state) => (state.clips.length ? { showing: true, step: 0 } : state)),\n hide: () => set({ showing: false }),\n goTo: (step) =>\n set((state) =>\n step < 0 || step >= spotlightSteps(state.clips).length || step === state.step\n ? state\n : { step }\n ),\n\n keep() {\n const { clips, step, note } = get()\n const ids = spotlightSteps(clips)[step]\n if (!ids) return\n usePresentation.getState().addSlideOf(\n ids.map((id) => clips.find((clip) => clip.id === id)!),\n note.trim()\n )\n },\n\n addToTray() {\n usePresentation.getState().adoptClips(get().clips)\n set({ ...EMPTY })\n },\n\n clear() {\n const gone = get().clips\n set({ ...EMPTY })\n release(gone, [])\n },\n\n own(userId) {\n if (get().owner === userId) return\n get().clear()\n set({ owner: userId, clipping: false })\n },\n\n setClipping: (clipping) => set({ clipping }),\n}))\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkJVEDKKNO_cjs = require('./chunk-JVEDKKNO.cjs');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
|
|
7
7
|
// src/presentation/stage-videos.ts
|
|
@@ -36,22 +36,22 @@ function usePresenterKeys(view, presenting, selection) {
|
|
|
36
36
|
if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.altKey) return;
|
|
37
37
|
const target = event.target;
|
|
38
38
|
if (target?.closest?.('input, textarea, select, [contenteditable="true"]')) return;
|
|
39
|
-
const state =
|
|
39
|
+
const state = chunkJVEDKKNO_cjs.usePresentation.getState();
|
|
40
40
|
const key = event.key;
|
|
41
41
|
const onSlide = selected && state.slides[state.current]?.items.some((i) => i.clipId === selected);
|
|
42
42
|
const box = selected?.startsWith("box-") ? state.slides.flatMap((slide) => slide.boxes).find((entry) => entry.id === selected) : void 0;
|
|
43
43
|
if (box && key.startsWith("Arrow")) {
|
|
44
44
|
const step = event.shiftKey ? BIG_NUDGE : NUDGE;
|
|
45
45
|
const dx = key === "ArrowLeft" ? -step : key === "ArrowRight" ? step : 0;
|
|
46
|
-
const dy = (key === "ArrowUp" ? -step : key === "ArrowDown" ? step : 0) *
|
|
47
|
-
state.updateBox(box.id, (entry) => ({ ...entry, frame:
|
|
46
|
+
const dy = (key === "ArrowUp" ? -step : key === "ArrowDown" ? step : 0) * chunkJVEDKKNO_cjs.STAGE_ASPECT;
|
|
47
|
+
state.updateBox(box.id, (entry) => ({ ...entry, frame: chunkJVEDKKNO_cjs.moveBox(entry.frame, dx, dy) }));
|
|
48
48
|
} else if (box && (key === "Delete" || key === "Backspace")) {
|
|
49
49
|
state.removeBox(box.id);
|
|
50
50
|
clear?.();
|
|
51
51
|
} else if (onSlide && key.startsWith("Arrow")) {
|
|
52
52
|
const step = event.shiftKey ? BIG_NUDGE : NUDGE;
|
|
53
53
|
const dx = key === "ArrowLeft" ? -step : key === "ArrowRight" ? step : 0;
|
|
54
|
-
const dy = (key === "ArrowUp" ? -step : key === "ArrowDown" ? step : 0) *
|
|
54
|
+
const dy = (key === "ArrowUp" ? -step : key === "ArrowDown" ? step : 0) * chunkJVEDKKNO_cjs.STAGE_ASPECT;
|
|
55
55
|
state.nudge(selected, dx, dy);
|
|
56
56
|
} else if (onSlide && (key === "Delete" || key === "Backspace")) {
|
|
57
57
|
state.unplace(selected);
|
|
@@ -74,5 +74,5 @@ function usePresenterKeys(view, presenting, selection) {
|
|
|
74
74
|
exports.STAGE_VIDEO_ATTRIBUTE = STAGE_VIDEO_ATTRIBUTE;
|
|
75
75
|
exports.toggleFullscreen = toggleFullscreen;
|
|
76
76
|
exports.usePresenterKeys = usePresenterKeys;
|
|
77
|
-
//# sourceMappingURL=chunk-
|
|
78
|
-
//# sourceMappingURL=chunk-
|
|
77
|
+
//# sourceMappingURL=chunk-X7ALF4MP.cjs.map
|
|
78
|
+
//# sourceMappingURL=chunk-X7ALF4MP.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/presentation/stage-videos.ts","../src/presentation/usePresenterKeys.ts"],"names":["useEffect","usePresentation","STAGE_ASPECT","moveBox"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/presentation/stage-videos.ts","../src/presentation/usePresenterKeys.ts"],"names":["useEffect","usePresentation","STAGE_ASPECT","moveBox"],"mappings":"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","file":"chunk-X7ALF4MP.cjs","sourcesContent":["/** The presented stage's videos, which the presenter plays and pauses with Space. */\n\n/** Marks the stage's videos, for the presenter's Space key. */\nexport const STAGE_VIDEO_ATTRIBUTE = 'data-presentation-video'\n\n/** Play the presented stage's videos, or pause them if any is playing. */\nexport function toggleStageVideos(doc: Document): boolean {\n const videos = Array.from(\n doc.querySelectorAll<HTMLVideoElement>(`video[${STAGE_VIDEO_ATTRIBUTE}]`)\n )\n if (!videos.length) return false\n const playing = videos.some((video) => !video.paused)\n for (const video of videos) {\n if (playing) video.pause()\n else void video.play().catch(() => undefined)\n }\n return true\n}\n","/**\n * The keys of the presentation window. A presenter (or a presentation clicker, which sends Page Up /\n * Page Down and \".\" or \"b\"): previous / next slide and blank the stage; while presenting, F for\n * full screen and Escape back to editing. While editing with a clip selected: the arrows nudge it\n * (Shift: further), Delete takes it off the slide and Escape deselects it.\n */\n\nimport { useEffect } from 'react'\nimport { toggleStageVideos } from './stage-videos'\nimport { STAGE_ASPECT } from './model'\nimport { usePresentation } from './store'\nimport { moveBox } from './boxes'\n\n/** A nudge, as a fraction of the stage width (vertical nudges move as far on screen). */\nconst NUDGE = 0.005\nconst BIG_NUDGE = 0.04\n\n/** Full screen on or off for a window's page (from a key or click in that window). */\nexport function toggleFullscreen(view: Window): void {\n const doc = view.document\n if (doc.fullscreenElement) void doc.exitFullscreen()\n else void doc.documentElement.requestFullscreen?.()\n}\n\nexport interface PresenterSelection {\n clipId: string | null\n clear: () => void\n}\n\nexport function usePresenterKeys(\n view: Window | null | undefined,\n presenting: boolean,\n selection?: PresenterSelection\n): void {\n const selected = presenting ? null : (selection?.clipId ?? null)\n const clear = selection?.clear\n useEffect(() => {\n if (!view) return\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.defaultPrevented || event.metaKey || event.ctrlKey || event.altKey) return\n const target = event.target as HTMLElement | null\n if (target?.closest?.('input, textarea, select, [contenteditable=\"true\"]')) return\n const state = usePresentation.getState()\n const key = event.key\n const onSlide =\n selected && state.slides[state.current]?.items.some((i) => i.clipId === selected)\n const box = selected?.startsWith('box-')\n ? state.slides.flatMap((slide) => slide.boxes).find((entry) => entry.id === selected)\n : undefined\n if (box && key.startsWith('Arrow')) {\n const step = event.shiftKey ? BIG_NUDGE : NUDGE\n const dx = key === 'ArrowLeft' ? -step : key === 'ArrowRight' ? step : 0\n const dy = (key === 'ArrowUp' ? -step : key === 'ArrowDown' ? step : 0) * STAGE_ASPECT\n state.updateBox(box.id, (entry) => ({ ...entry, frame: moveBox(entry.frame, dx, dy) }))\n } else if (box && (key === 'Delete' || key === 'Backspace')) {\n state.removeBox(box.id)\n clear?.()\n } else if (onSlide && key.startsWith('Arrow')) {\n const step = event.shiftKey ? BIG_NUDGE : NUDGE\n const dx = key === 'ArrowLeft' ? -step : key === 'ArrowRight' ? step : 0\n const dy = (key === 'ArrowUp' ? -step : key === 'ArrowDown' ? step : 0) * STAGE_ASPECT\n state.nudge(selected, dx, dy)\n } else if (onSlide && (key === 'Delete' || key === 'Backspace')) {\n state.unplace(selected)\n clear?.()\n } else if (selected && key === 'Escape') clear?.()\n // Editing (in the app's own window too): only a selected clip takes keys.\n else if (!presenting) return\n else if (key === 'ArrowRight' || key === 'PageDown') state.goTo(state.current + 1)\n else if (key === 'ArrowLeft' || key === 'PageUp') state.goTo(state.current - 1)\n else if (key === 'b' || key === 'B' || key === '.') state.setBlank(!state.blank)\n else if (presenting && (key === 'f' || key === 'F')) toggleFullscreen(view)\n // Space plays or pauses the slide's videos.\n else if (presenting && key === ' ' && toggleStageVideos(view.document)) {\n // handled\n }\n // Out of full screen the browser takes the first Escape; the next one stops presenting.\n else if (presenting && key === 'Escape') state.setPresenting(false)\n else return\n event.preventDefault()\n }\n view.addEventListener('keydown', onKeyDown)\n return () => view.removeEventListener('keydown', onKeyDown)\n }, [view, presenting, selected, clear])\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkQ6N5D3R5_cjs = require('./chunk-Q6N5D3R5.cjs');
|
|
5
5
|
var react = require('react');
|
|
6
6
|
var artifacts = require('@arbidocs/react/artifacts');
|
|
7
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -115,7 +115,7 @@ function NativeDocxComparison({
|
|
|
115
115
|
if (!documentId)
|
|
116
116
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "native-docx-error", role: "status", children: "Comparing Word documents\u2026" });
|
|
117
117
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
118
|
-
|
|
118
|
+
chunkQ6N5D3R5_cjs.NativeDocxEditor,
|
|
119
119
|
{
|
|
120
120
|
adapter,
|
|
121
121
|
documentId,
|
|
@@ -126,5 +126,5 @@ function NativeDocxComparison({
|
|
|
126
126
|
}
|
|
127
127
|
|
|
128
128
|
exports.NativeDocxComparison = NativeDocxComparison;
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
129
|
+
//# sourceMappingURL=chunk-XNB27POJ.cjs.map
|
|
130
|
+
//# sourceMappingURL=chunk-XNB27POJ.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/docx/NativeDocxComparison.tsx"],"names":["parseVersionRef","useRef","useState","useEffect","error","jsxs","jsx","NativeDocxEditor"],"mappings":"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","file":"chunk-COD5ENHK.cjs","sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport { NativeDocxEditor, type NativeDocxAdapter } from './NativeDocxEditor'\n\n/** A workspace document as the comparison needs it: its current version and what it was made from. */\nexport interface NativeDocxComparedDocument {\n external_id: string\n current_version?: number | null\n derived_from?: ReadonlyArray<{\n doc_ext_id: string\n role: string\n version?: number | null\n }> | null\n}\n\nexport interface NativeDocxComparisonProps {\n adapter: NativeDocxAdapter\n baseId: string\n revisedId: string\n title: string\n /** Called once for each redline the comparison saves as a new document (to add it to the lists). */\n onCompared?: (documentId: string) => void | Promise<void>\n /**\n * The workspace's documents, all of them (a redline may be on any page). The unedited redline\n * saved earlier from the same two versions is opened from here instead of saving another.\n */\n documents?: ReadonlyArray<NativeDocxComparedDocument>\n}\n\n/** A `doc-…@v{n}` side names an older version: the endpoint takes its document and version apart. */\nfunction redlineQuery(baseId: string, revisedId: string): URLSearchParams {\n const base = parseVersionRef(baseId)\n const revised = parseVersionRef(revisedId)\n const query = new URLSearchParams({ base_ext_id: base.docId, revised_ext_id: revised.docId })\n if (base.version) query.set('base_version', String(base.version))\n if (revised.version) query.set('revised_version', String(revised.version))\n return query\n}\n\ninterface ComparedSide {\n docId: string\n version: number\n}\n\n/** The two versions compared. A plain id compares the document's current version (from the list). */\nfunction comparedSides(\n documents: ReadonlyArray<NativeDocxComparedDocument>,\n baseId: string,\n revisedId: string\n): { base: ComparedSide; revised: ComparedSide; key: string } | null {\n const side = (ref: string): ComparedSide | null => {\n const { docId, version } = parseVersionRef(ref)\n if (version) return { docId, version }\n const doc = documents.find((d) => d.external_id === docId)\n return doc ? { docId, version: doc.current_version ?? 1 } : null\n }\n const base = side(baseId)\n const revised = side(revisedId)\n if (!base || !revised) return null\n return {\n base,\n revised,\n key: `${base.docId}@v${base.version}>${revised.docId}@v${revised.version}`,\n }\n}\n\n/**\n * Redlines saved in this page's life, by the versions compared, with whether the lists have shown\n * them yet. One the lists never got (adding it failed) is reopened from here; one they showed and\n * no longer do was deleted.\n */\nconst savedThisSession = new Map<string, { id: string; listed: boolean }>()\n\n/**\n * The redline to reopen for these two versions: a document made from both (`redline_base` and\n * `redline_revised`, at the versions compared) that is still unedited (no version saved since it\n * was made, so it shows the real differences), else the one saved earlier in this page's life that\n * the lists never got. An edited or deleted one is not reopened: the comparison makes a fresh one.\n */\nfunction reusableRedline(\n documents: ReadonlyArray<NativeDocxComparedDocument>,\n sides: { base: ComparedSide; revised: ComparedSide; key: string }\n): string | undefined {\n const madeFrom = (doc: NativeDocxComparedDocument, role: string, from: ComparedSide) =>\n !!doc.derived_from?.some(\n (link) =>\n link.role === role && link.doc_ext_id === from.docId && link.version === from.version\n )\n const unedited = documents.find(\n (doc) =>\n (doc.current_version ?? 1) === 1 &&\n madeFrom(doc, 'redline_base', sides.base) &&\n madeFrom(doc, 'redline_revised', sides.revised)\n )\n if (unedited) return unedited.external_id\n const saved = savedThisSession.get(sides.key)\n if (!saved) return undefined\n // Listed now (yet not unedited) means edited; listed before and gone means deleted.\n if (saved.listed || documents.some((doc) => doc.external_id === saved.id)) {\n savedThisSession.delete(sides.key)\n return undefined\n }\n return saved.id\n}\n\n/** Note which redlines saved in this page's life the lists now show. */\nfunction noteListed(documents: ReadonlyArray<NativeDocxComparedDocument>): void {\n for (const saved of savedThisSession.values())\n if (!saved.listed && documents.some((doc) => doc.external_id === saved.id)) saved.listed = true\n}\n\n/**\n * Redlines being saved, by request. Another open of the same comparison meanwhile (React\n * StrictMode runs effects twice; reopening the viewer) waits for this one instead of saving a\n * second. Each is kept until its document has been added to the lists, where the next open finds it.\n */\nconst savingRedlines = new Map<string, Promise<string>>()\n\nfunction saveRedline(\n adapter: NativeDocxAdapter,\n query: string,\n sessionKey: string | undefined,\n onSaved: (documentId: string) => void | Promise<void>\n): Promise<string> {\n const saving = savingRedlines.get(query)\n if (saving) return saving\n const saved = adapter\n .request(`/redline?${query}`, { method: 'POST' })\n .then((response) => response.json())\n .then((result: { document_ext_id: string }) => {\n if (!result.document_ext_id) throw new Error('Comparison did not return a Word document.')\n if (sessionKey)\n savedThisSession.set(sessionKey, { id: result.document_ext_id, listed: false })\n return result.document_ext_id\n })\n savingRedlines.set(query, saved)\n void saved\n .then(\n (documentId) => Promise.resolve(onSaved(documentId)).catch(() => {}),\n () => {}\n )\n .finally(() => savingRedlines.delete(query))\n return saved\n}\n\n/** Word comparison through the host's authenticated transport and LibreOffice service. */\nexport function NativeDocxComparison({\n adapter,\n baseId,\n revisedId,\n title,\n onCompared,\n documents,\n}: NativeDocxComparisonProps) {\n const host = useRef({ adapter, onCompared, documents })\n host.current = { adapter, onCompared, documents }\n const [documentId, setDocumentId] = useState('')\n const [error, setError] = useState('')\n const [attempt, setAttempt] = useState(0)\n useEffect(() => {\n if (documents) noteListed(documents)\n }, [documents])\n useEffect(() => {\n let cancelled = false\n setDocumentId('')\n setError('')\n const listed = host.current.documents ?? []\n const sides = comparedSides(listed, baseId, revisedId)\n const saved = sides && reusableRedline(listed, sides)\n // The redline is a document of its own (the Word editor opens documents): reopen the unedited\n // one saved from these versions, else save it once, however often the comparison opens.\n void (\n saved\n ? Promise.resolve(saved)\n : saveRedline(\n host.current.adapter,\n String(redlineQuery(baseId, revisedId)),\n sides?.key,\n (id) => host.current.onCompared?.(id)\n )\n )\n .then((id) => {\n if (!cancelled) setDocumentId(id)\n })\n .catch((error) => {\n if (!cancelled) setError(error instanceof Error ? error.message : String(error))\n })\n return () => {\n cancelled = true\n }\n }, [baseId, revisedId, attempt])\n if (error)\n return (\n <div className=\"native-docx-error\" role=\"alert\">\n <p>{error}</p>\n <button onClick={() => setAttempt((value) => value + 1)}>Retry comparison</button>\n </div>\n )\n if (!documentId)\n return (\n <div className=\"native-docx-error\" role=\"status\">\n Comparing Word documents…\n </div>\n )\n return (\n <NativeDocxEditor\n key={documentId}\n adapter={adapter}\n documentId={documentId}\n title={`${title.replace(/\\.[^.]+$/, '')} (redline).docx`}\n />\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/docx/NativeDocxComparison.tsx"],"names":["parseVersionRef","useRef","useState","useEffect","error","jsxs","jsx","NativeDocxEditor"],"mappings":"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","file":"chunk-XNB27POJ.cjs","sourcesContent":["import { useEffect, useRef, useState } from 'react'\nimport { parseVersionRef } from '@arbidocs/react/artifacts'\nimport { NativeDocxEditor, type NativeDocxAdapter } from './NativeDocxEditor'\n\n/** A workspace document as the comparison needs it: its current version and what it was made from. */\nexport interface NativeDocxComparedDocument {\n external_id: string\n current_version?: number | null\n derived_from?: ReadonlyArray<{\n doc_ext_id: string\n role: string\n version?: number | null\n }> | null\n}\n\nexport interface NativeDocxComparisonProps {\n adapter: NativeDocxAdapter\n baseId: string\n revisedId: string\n title: string\n /** Called once for each redline the comparison saves as a new document (to add it to the lists). */\n onCompared?: (documentId: string) => void | Promise<void>\n /**\n * The workspace's documents, all of them (a redline may be on any page). The unedited redline\n * saved earlier from the same two versions is opened from here instead of saving another.\n */\n documents?: ReadonlyArray<NativeDocxComparedDocument>\n}\n\n/** A `doc-…@v{n}` side names an older version: the endpoint takes its document and version apart. */\nfunction redlineQuery(baseId: string, revisedId: string): URLSearchParams {\n const base = parseVersionRef(baseId)\n const revised = parseVersionRef(revisedId)\n const query = new URLSearchParams({ base_ext_id: base.docId, revised_ext_id: revised.docId })\n if (base.version) query.set('base_version', String(base.version))\n if (revised.version) query.set('revised_version', String(revised.version))\n return query\n}\n\ninterface ComparedSide {\n docId: string\n version: number\n}\n\n/** The two versions compared. A plain id compares the document's current version (from the list). */\nfunction comparedSides(\n documents: ReadonlyArray<NativeDocxComparedDocument>,\n baseId: string,\n revisedId: string\n): { base: ComparedSide; revised: ComparedSide; key: string } | null {\n const side = (ref: string): ComparedSide | null => {\n const { docId, version } = parseVersionRef(ref)\n if (version) return { docId, version }\n const doc = documents.find((d) => d.external_id === docId)\n return doc ? { docId, version: doc.current_version ?? 1 } : null\n }\n const base = side(baseId)\n const revised = side(revisedId)\n if (!base || !revised) return null\n return {\n base,\n revised,\n key: `${base.docId}@v${base.version}>${revised.docId}@v${revised.version}`,\n }\n}\n\n/**\n * Redlines saved in this page's life, by the versions compared, with whether the lists have shown\n * them yet. One the lists never got (adding it failed) is reopened from here; one they showed and\n * no longer do was deleted.\n */\nconst savedThisSession = new Map<string, { id: string; listed: boolean }>()\n\n/**\n * The redline to reopen for these two versions: a document made from both (`redline_base` and\n * `redline_revised`, at the versions compared) that is still unedited (no version saved since it\n * was made, so it shows the real differences), else the one saved earlier in this page's life that\n * the lists never got. An edited or deleted one is not reopened: the comparison makes a fresh one.\n */\nfunction reusableRedline(\n documents: ReadonlyArray<NativeDocxComparedDocument>,\n sides: { base: ComparedSide; revised: ComparedSide; key: string }\n): string | undefined {\n const madeFrom = (doc: NativeDocxComparedDocument, role: string, from: ComparedSide) =>\n !!doc.derived_from?.some(\n (link) =>\n link.role === role && link.doc_ext_id === from.docId && link.version === from.version\n )\n const unedited = documents.find(\n (doc) =>\n (doc.current_version ?? 1) === 1 &&\n madeFrom(doc, 'redline_base', sides.base) &&\n madeFrom(doc, 'redline_revised', sides.revised)\n )\n if (unedited) return unedited.external_id\n const saved = savedThisSession.get(sides.key)\n if (!saved) return undefined\n // Listed now (yet not unedited) means edited; listed before and gone means deleted.\n if (saved.listed || documents.some((doc) => doc.external_id === saved.id)) {\n savedThisSession.delete(sides.key)\n return undefined\n }\n return saved.id\n}\n\n/** Note which redlines saved in this page's life the lists now show. */\nfunction noteListed(documents: ReadonlyArray<NativeDocxComparedDocument>): void {\n for (const saved of savedThisSession.values())\n if (!saved.listed && documents.some((doc) => doc.external_id === saved.id)) saved.listed = true\n}\n\n/**\n * Redlines being saved, by request. Another open of the same comparison meanwhile (React\n * StrictMode runs effects twice; reopening the viewer) waits for this one instead of saving a\n * second. Each is kept until its document has been added to the lists, where the next open finds it.\n */\nconst savingRedlines = new Map<string, Promise<string>>()\n\nfunction saveRedline(\n adapter: NativeDocxAdapter,\n query: string,\n sessionKey: string | undefined,\n onSaved: (documentId: string) => void | Promise<void>\n): Promise<string> {\n const saving = savingRedlines.get(query)\n if (saving) return saving\n const saved = adapter\n .request(`/redline?${query}`, { method: 'POST' })\n .then((response) => response.json())\n .then((result: { document_ext_id: string }) => {\n if (!result.document_ext_id) throw new Error('Comparison did not return a Word document.')\n if (sessionKey)\n savedThisSession.set(sessionKey, { id: result.document_ext_id, listed: false })\n return result.document_ext_id\n })\n savingRedlines.set(query, saved)\n void saved\n .then(\n (documentId) => Promise.resolve(onSaved(documentId)).catch(() => {}),\n () => {}\n )\n .finally(() => savingRedlines.delete(query))\n return saved\n}\n\n/** Word comparison through the host's authenticated transport and LibreOffice service. */\nexport function NativeDocxComparison({\n adapter,\n baseId,\n revisedId,\n title,\n onCompared,\n documents,\n}: NativeDocxComparisonProps) {\n const host = useRef({ adapter, onCompared, documents })\n host.current = { adapter, onCompared, documents }\n const [documentId, setDocumentId] = useState('')\n const [error, setError] = useState('')\n const [attempt, setAttempt] = useState(0)\n useEffect(() => {\n if (documents) noteListed(documents)\n }, [documents])\n useEffect(() => {\n let cancelled = false\n setDocumentId('')\n setError('')\n const listed = host.current.documents ?? []\n const sides = comparedSides(listed, baseId, revisedId)\n const saved = sides && reusableRedline(listed, sides)\n // The redline is a document of its own (the Word editor opens documents): reopen the unedited\n // one saved from these versions, else save it once, however often the comparison opens.\n void (\n saved\n ? Promise.resolve(saved)\n : saveRedline(\n host.current.adapter,\n String(redlineQuery(baseId, revisedId)),\n sides?.key,\n (id) => host.current.onCompared?.(id)\n )\n )\n .then((id) => {\n if (!cancelled) setDocumentId(id)\n })\n .catch((error) => {\n if (!cancelled) setError(error instanceof Error ? error.message : String(error))\n })\n return () => {\n cancelled = true\n }\n }, [baseId, revisedId, attempt])\n if (error)\n return (\n <div className=\"native-docx-error\" role=\"alert\">\n <p>{error}</p>\n <button onClick={() => setAttempt((value) => value + 1)}>Retry comparison</button>\n </div>\n )\n if (!documentId)\n return (\n <div className=\"native-docx-error\" role=\"status\">\n Comparing Word documents…\n </div>\n )\n return (\n <NativeDocxEditor\n key={documentId}\n adapter={adapter}\n documentId={documentId}\n title={`${title.replace(/\\.[^.]+$/, '')} (redline).docx`}\n />\n )\n}\n"]}
|