@pitcher/js-api 1.29.0 → 1.31.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/js-api.esm.js +488 -56
- package/js-api.esm.js.map +1 -1
- package/js-api.umd.min.js +32 -11
- package/js-api.umd.min.js.map +1 -1
- package/lib/ai-tasks/__tests__/weekly-focus.spec.d.ts +1 -0
- package/lib/ai-tasks/weekly-focus.d.ts +241 -0
- package/lib/apps/browser/appTypes.d.ts +28 -0
- package/lib/apps/browser/components/ContextMenu/TranslateFileButton.test.d.ts +1 -0
- package/lib/apps/browser/stores/api.d.ts +6 -1
- package/lib/apps/browser/stores/api.filesFoldersDeleter.test.d.ts +1 -0
- package/lib/apps/browser/stores/app.d.ts +5 -0
- package/lib/apps/browser/stores/app.selectionPruneScope.test.d.ts +1 -0
- package/lib/apps/browser/stores/upload.d.ts +26 -1
- package/lib/apps/browser/stores/upload.types.d.ts +9 -0
- package/lib/apps/browser/util/lifecycle.d.ts +57 -0
- package/lib/apps/browser/util/lifecycle.test.d.ts +1 -0
- package/lib/apps/canvas-builder/components/container/PopupApps/PopupAppModal.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/components/container/PresentationTools/PresentationToolsButtons.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/components/ui/BottomSheetModal/BottomSheetModal.integration.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/components/ui/BottomSheetModal/BottomSheetModal.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/components/ui/DynamicContent/section-component-bindings.util.d.ts +32 -0
- package/lib/apps/canvas-builder/components/ui/DynamicContent/useDynamicContent.d.ts +6 -0
- package/lib/apps/canvas-builder/components/ui/Link/Link.util.d.ts +8 -1
- package/lib/apps/canvas-builder/components/ui/Link/Link.util.test.d.ts +1 -0
- package/lib/apps/canvas-builder/components/ui/Multimedia/Multimedia.ldAsset.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/components/ui/SectionList/SectionItemModal.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/composables/useCanvas.d.ts +286 -10
- package/lib/apps/canvas-builder/composables/useCanvas.saveEcho.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/composables/useCanvasBlocks.d.ts +40 -2
- package/lib/apps/canvas-builder/composables/useCanvasExit.d.ts +1 -0
- package/lib/apps/canvas-builder/composables/useCanvasHistory.d.ts +38 -2
- package/lib/apps/canvas-builder/composables/useCanvasTheme.d.ts +4 -2
- package/lib/apps/canvas-builder/composables/useContentSelector.d.ts +8 -1
- package/lib/apps/canvas-builder/composables/useInstalledEmbeddables.d.ts +1 -1
- package/lib/apps/canvas-builder/composables/useNavigatorDrawer.d.ts +27 -0
- package/lib/apps/canvas-builder/composables/useNavigatorDrawer.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/composables/usePopupApps.d.ts +43 -4
- package/lib/apps/canvas-builder/composables/usePopupApps.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/composables/usePresentationTools.d.ts +112 -0
- package/lib/apps/canvas-builder/composables/usePresentationTools.spec.d.ts +1 -0
- package/lib/apps/canvas-builder/types/canvas.d.ts +66 -3
- package/lib/apps/canvas-builder/util/canvas.util.d.ts +12 -0
- package/lib/apps/canvas-builder/util/completionWizard.util.d.ts +347 -0
- package/lib/apps/canvas-builder/util/completionWizard.util.test.d.ts +1 -0
- package/lib/apps/canvas-builder/util/fullscreenMode.util.d.ts +7 -0
- package/lib/apps/canvas-builder/util/fullscreenMode.util.test.d.ts +1 -0
- package/lib/apps/canvas-builder/util/iframe.util.d.ts +24 -2
- package/lib/apps/canvas-builder/util/iframe.util.test.d.ts +1 -0
- package/lib/apps/canvas-builder/util/lazySections.util.d.ts +35 -0
- package/lib/apps/canvas-builder/util/lazySections.util.test.d.ts +1 -0
- package/lib/apps/canvas-selector/stores/app.d.ts +14 -0
- package/lib/apps/collection-player/components/AppHeader.spec.d.ts +1 -0
- package/lib/apps/collection-player/composables/collection-navigation.util.d.ts +27 -0
- package/lib/apps/collection-player/composables/collection-navigation.util.spec.d.ts +1 -0
- package/lib/apps/collection-player/composables/speaker-notes.use.d.ts +14 -0
- package/lib/apps/collection-player/composables/speaker-notes.use.spec.d.ts +1 -0
- package/lib/apps/collection-player/stores/app.store.d.ts +8 -1
- package/lib/apps/collection-player/stores/showNotesToggle.spec.d.ts +1 -0
- package/lib/apps/content-selector/appTypes.d.ts +16 -0
- package/lib/apps/content-selector/components/Assets.uploaderRefresh.spec.d.ts +1 -0
- package/lib/apps/content-selector/components/Content/AllContent/List/expandFileGuard.spec.d.ts +1 -0
- package/lib/apps/content-selector/stores/app.d.ts +1 -1
- package/lib/apps/notes/NotesApp.accountNotes.spec.d.ts +1 -0
- package/lib/apps/notes/NotesApp.speakerNotes.spec.d.ts +1 -0
- package/lib/apps/notes/composables/useAccountNotes.d.ts +14 -0
- package/lib/apps/notes/composables/useAccountNotes.spec.d.ts +1 -0
- package/lib/apps/notes/composables/useAccountOnlyNotesGate.d.ts +21 -0
- package/lib/apps/notes/composables/useAccountOnlyNotesGate.spec.d.ts +1 -0
- package/lib/apps/notes/composables/useActiveSlideNotes.d.ts +42 -0
- package/lib/apps/notes/composables/useActiveSlideNotes.spec.d.ts +1 -0
- package/lib/components/CFileAccessManagement/collaborationApi.d.ts +2 -0
- package/lib/components/CFilePanel/Details.spec.d.ts +1 -0
- package/lib/components/CFilePanel/KeyMessages.spec.d.ts +1 -0
- package/lib/components/CFilePanel/Summary.spec.d.ts +1 -0
- package/lib/components/CFileViewer/pdf/CFileViewer.pdf.annotations.use.d.ts +5 -1
- package/lib/components/CFileViewer/pdf/CFileViewer.pdf.formFields.use.d.ts +8 -0
- package/lib/components/CFileViewer/pdf/CFileViewer.pdf.link.use.d.ts +1 -1
- package/lib/components/CFileViewer/pdf/CFileViewer.pdf.overlayItems.use.d.ts +1 -1
- package/lib/components/CFileViewer/pdf/CFileViewer.pdf.use.d.ts +4 -9
- package/lib/components/CFileViewer/pdf/CFileViewer.pdf.util.d.ts +53 -1
- package/lib/components/CFileViewer/pdf/CFileViewerFullscreen.pdf.use.d.ts +1 -1
- package/lib/components/CFileViewer/pdf/__tests__/CFileViewer.pdf.annotations.text.test.d.ts +1 -0
- package/lib/components/CGlobalLoader/CGlobalLoaderMark.spec.d.ts +1 -0
- package/lib/components/CGlobalLoader/globalLoader.paths.d.ts +2 -0
- package/lib/components/CGlobalSearch/globalSearchTarget.util.d.ts +31 -0
- package/lib/components/CGlobalSearch/globalSearchTarget.util.test.d.ts +1 -0
- package/lib/components/CRichTextEditor/extensions/paragraphExtended.d.ts +7 -1
- package/lib/components/CRichTextEditor/extensions/paragraphExtended.test.d.ts +1 -0
- package/lib/components/canvases/CanvasesManagementBulk.use.d.ts +12 -2
- package/lib/components/masterCanvases/CMasterCanvasesManagement.use.d.ts +86 -0
- package/lib/components/masterCanvases/CMasterCanvasesManagement.use.spec.d.ts +1 -0
- package/lib/components/masterCanvases/CMasterCanvasesPendingShareCell.spec.d.ts +1 -0
- package/lib/components/masterCanvases/CMasterCanvasesSharedWithCell.use.d.ts +39 -0
- package/lib/components/masterCanvases/CMasterCanvasesSharedWithCell.use.spec.d.ts +1 -0
- package/lib/components/masterCanvases/createFromMaster.use.d.ts +255 -0
- package/lib/components/masterCanvases/createFromMaster.use.spec.d.ts +1 -0
- package/lib/components/masterCanvases/masterCanvasDocuments.use.d.ts +56 -0
- package/lib/components/masterCanvases/masterCanvasDocuments.use.spec.d.ts +1 -0
- package/lib/components/masterCanvases/masterCanvasShares.use.d.ts +103 -0
- package/lib/components/masterCanvases/masterCanvasShares.use.spec.d.ts +1 -0
- package/lib/components/masterCanvases/masterFromCanvas.use.d.ts +122 -0
- package/lib/components/masterCanvases/masterFromCanvas.use.spec.d.ts +1 -0
- package/lib/components/masterCanvases/masterFromTemplate.use.d.ts +50 -0
- package/lib/components/masterCanvases/masterFromTemplate.use.spec.d.ts +1 -0
- package/lib/components/savedCanvases/CSavedCanvasesManagement.use.d.ts +204 -0
- package/lib/components/savedCanvases/savedCanvasDocuments.use.d.ts +111 -0
- package/lib/components/savedCanvases/savedCanvasDocuments.use.spec.d.ts +1 -0
- package/lib/components/savedCanvases/smartFolders/SmartFolders.use.d.ts +4 -0
- package/lib/composables/useCourseOnlyApps.d.ts +1 -1
- package/lib/composables/usePdfInterpolation.d.ts +2 -2
- package/lib/composables/useWindowEvents.d.ts +1 -1
- package/lib/constants/cdp.const.d.ts +2 -0
- package/lib/constants/translationLanguages.const.d.ts +150 -0
- package/lib/constants/translationLanguages.const.spec.d.ts +1 -0
- package/lib/main.lib.d.ts +7 -0
- package/lib/sdk/api/HighLevelApi.d.ts +19 -6
- package/lib/sdk/api/modules/ai.d.ts +43 -1
- package/lib/sdk/api/modules/ai.spec.d.ts +1 -0
- package/lib/sdk/api/modules/appsDb.d.ts +4 -4
- package/lib/sdk/api/modules/canvas.d.ts +20 -0
- package/lib/sdk/api/modules/ui/types.ui.d.ts +25 -0
- package/lib/sdk/interfaces.d.ts +31 -1
- package/lib/sdk/main.d.ts +46 -0
- package/lib/sdk/payload.types.d.ts +149 -0
- package/lib/sdk/platform.d.ts +27 -0
- package/lib/sdk/platform.spec.d.ts +1 -0
- package/lib/sdk/singleton-scope.spec.d.ts +1 -0
- package/lib/sdk/utils/httpFetch.spec.d.ts +1 -0
- package/lib/theme/canvasUiUnoPreset.test.d.ts +1 -0
- package/lib/types/ai-tasks.const.d.ts +39 -1
- package/lib/types/app.d.ts +55 -1
- package/lib/types/call.d.ts +14 -0
- package/lib/types/canvases.d.ts +15 -0
- package/lib/types/launchDarkly.types.d.ts +8 -3
- package/lib/types/organizationSettings.types.d.ts +39 -0
- package/lib/util/aiSummary.d.ts +30 -0
- package/lib/util/aiSummary.spec.d.ts +1 -0
- package/lib/util/network.d.ts +35 -0
- package/lib/util/user.d.ts +18 -0
- package/lib/util/user.test.d.ts +1 -0
- package/package.json +1 -1
- package/types/openapi/models/Canvas.d.ts +1 -0
- package/types/openapi/models/CanvasCreate.d.ts +1 -0
- package/types/openapi/models/CanvasCreateRequest.d.ts +1 -0
- package/types/openapi/models/CanvasRecommendedFile.d.ts +1 -1
- package/types/openapi/models/CanvasRetrieve.d.ts +1 -0
- package/types/openapi/models/CanvasUpdate.d.ts +1 -0
- package/types/openapi/models/CanvasUpdateRequest.d.ts +1 -0
- package/types/openapi/models/DeletedCanvas.d.ts +1 -0
- package/types/openapi/models/DeletedEnvironment.d.ts +0 -1
- package/types/openapi/models/Environment.d.ts +0 -1
- package/types/openapi/models/EnvironmentRequest.d.ts +0 -1
- package/types/openapi/models/File.d.ts +3 -1
- package/types/openapi/models/FileRetrieve.d.ts +2 -0
- package/types/openapi/models/PatchedCanvasUpdateRequest.d.ts +1 -0
- package/types/openapi/models/PatchedEnvironmentRequest.d.ts +0 -1
- package/types/openapi/models/SharedLink.d.ts +6 -0
- package/types/openapi/models/SharedLinkCreateRequest.d.ts +5 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { CanvasRetrieve } from '../../../types/openapi';
|
|
2
|
+
/**
|
|
3
|
+
* PIT-7488 block 3 — turning an existing pitchdeck into a master.
|
|
4
|
+
*
|
|
5
|
+
* The deck is DUPLICATED, never mutated: the rep keeps the deck they were presenting, and a new
|
|
6
|
+
* `is_master` copy appears on the master tab.
|
|
7
|
+
*
|
|
8
|
+
* **The promoter owns the master, always — so the create payload must OMIT `owned_by_id`**
|
|
9
|
+
* (PIT-8362; the payload itself is `buildMasterFromCanvasPayload`, beside its block-4 mirror in
|
|
10
|
+
* `createFromMaster.use`). Django declares that field
|
|
11
|
+
* `default=CreateOnlyDefault(CurrentUserDefault())`, so leaving it out is precisely what assigns
|
|
12
|
+
* the caller; sending anything is a transfer, which `CanvasOwnedByFieldValidator` 400s for anyone
|
|
13
|
+
* but an org/instance admin.
|
|
14
|
+
*
|
|
15
|
+
* This reverses block 3's original rule, so read the history before "fixing" it back. That rule
|
|
16
|
+
* kept the SOURCE deck's owner, on the reasoning that a master should stay attributed to whoever
|
|
17
|
+
* built the deck. Vontobel's validation rejected it: "My Master Pitchdecks" is a personal,
|
|
18
|
+
* RESTRICTED, owner-scoped tab that the promote flow navigates to on success, so a master owned by
|
|
19
|
+
* someone else lands in a tab it does not belong in — invisible to a rep (`filter_by_member_access`
|
|
20
|
+
* is `owned_by=me OR public`), and attributed to a stranger for an admin, who sees the whole
|
|
21
|
+
* instance anyway.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Context keys that must NOT survive onto a master.
|
|
25
|
+
*
|
|
26
|
+
* A master is a reusable *source*, so anything baked into its context propagates to every deck
|
|
27
|
+
* built from it later — `{{user.name}}` would render whoever ran "Use as master" rather than the
|
|
28
|
+
* rep actually presenting. That is the wrong-identity-on-a-copy defect class, one step upstream, and it is the
|
|
29
|
+
* same reasoning that keeps the master download path from PATCHing `context`.
|
|
30
|
+
*
|
|
31
|
+
* This is a DENYLIST on purpose. `pitcher_canvas.context` is a free-form client-written
|
|
32
|
+
* JSONField that also carries customer-specific keys, so an allowlist would silently drop those,
|
|
33
|
+
* and would drop any config key added later — which is exactly how PIT-7473 broke the pitchdeck
|
|
34
|
+
* wizard. Failing this way round means a *new* identity key leaks until it is listed here, which
|
|
35
|
+
* shows up as a visibly wrong name on a deck and is a one-line fix.
|
|
36
|
+
*/
|
|
37
|
+
export declare const MASTER_CONTEXT_IDENTITY_KEYS: readonly ["user", "today", "Account", "salesforce_data", "Meeting", "pitcher_data", "analytics", "account", "meeting", "SelectedAccount"];
|
|
38
|
+
/**
|
|
39
|
+
* Top-level context key FAMILIES that are identity, matched by prefix rather than by name.
|
|
40
|
+
*
|
|
41
|
+
* `ctx_overwrite_<slideIndex>` is written by the `react-salesforce-admin` populator
|
|
42
|
+
* (`public/populator.html:509-525`) and holds BOTH a `pitcher_data` and a `salesforce_data` copy of
|
|
43
|
+
* a matched customer record, scoped to one slide — the same two namespaces
|
|
44
|
+
* `MASTER_CONTEXT_IDENTITY_KEYS` already strips at the top level, one nesting deeper and therefore
|
|
45
|
+
* invisible to a literal-key `omit`. A master promoted from a rep's deck carried the promoter's
|
|
46
|
+
* customer (client name, ids, figures) onto every deck built from it, per slide (PIT-8399 review).
|
|
47
|
+
*
|
|
48
|
+
* The key count is unbounded (one per matched slide) and the names embed a component id, so this
|
|
49
|
+
* cannot be expressed as literals — hence a prefix list.
|
|
50
|
+
*
|
|
51
|
+
* **Not to be confused with `context.wizard.overwrite_<sectionListId>_<n>`**, which is the WIZARD's
|
|
52
|
+
* positional slide override (`buildStepUpdate`) and is curation a master must keep. The two are
|
|
53
|
+
* cleanly separable: the populator's lives at the top level, the wizard's inside `wizard`.
|
|
54
|
+
*/
|
|
55
|
+
export declare const MASTER_CONTEXT_IDENTITY_KEY_PREFIXES: readonly ["ctx_overwrite_"];
|
|
56
|
+
/** Drops every top-level key matching one of the identity prefixes above. Non-mutating. */
|
|
57
|
+
export declare function withoutPrefixedIdentityKeys(context: Record<string, unknown>): Record<string, unknown>;
|
|
58
|
+
/**
|
|
59
|
+
* Whether a context carries a wizard artifact the restore could actually rebuild POINTS from.
|
|
60
|
+
*
|
|
61
|
+
* Mirrors the two — and only two — skeleton sources of the app's restore walk: the enrichment's
|
|
62
|
+
* per-point spans (`react_wizard.points`) and the vanilla group selections
|
|
63
|
+
* (`group_selections_<sectionListId>`). BOTH must be non-empty arrays: `for (const sel of
|
|
64
|
+
* selections)` and the enrichment loop each build zero skeletons from `[]`, so a present-but-empty
|
|
65
|
+
* key describes nothing. Checking only the selections KEY made this looser than the app's
|
|
66
|
+
* `fromArtifact` (which uses `selections.length > 0`) — and on the duplicate path, which has no
|
|
67
|
+
* second gate, looser means unguarded. Everything else under `wizard` is answers, cover picks or
|
|
68
|
+
* admin config: the live repro deck carries `selected_assets`, `selected_asset_url`, `selected_file`
|
|
69
|
+
* and `title`, and the populator reads a `wizard.dataIndexMap` — none of which can rebuild a point.
|
|
70
|
+
*
|
|
71
|
+
* So `!!context.wizard` is NOT the same question, and the difference bites hardest in
|
|
72
|
+
* `buildDuplicateContext`: its marker selects `react_saved`, which resolves to the EDIT flow, whose
|
|
73
|
+
* restore is deliberately ungated on the app's own `fromArtifact` check (a vanilla deck legitimately
|
|
74
|
+
* restores by attribution). A master whose `wizard` held only cover picks therefore opened with an
|
|
75
|
+
* agenda rebuilt by attribution — the PIT-7488 QA Q9 outcome — with nothing downstream to catch it
|
|
76
|
+
* (peer review F2).
|
|
77
|
+
*
|
|
78
|
+
* Deliberately WEAKER than the app's `fromArtifact`, which also requires the enrichment spans to
|
|
79
|
+
* partition the node's ref list. The host has no refs to hand here, so it answers "are there
|
|
80
|
+
* skeleton sources at all"; the app makes the precise call. That is the two-gate design, and it is
|
|
81
|
+
* why the two predicates are allowed to differ.
|
|
82
|
+
*/
|
|
83
|
+
export declare function hasRestorableArtifact(context?: Record<string, unknown> | null): boolean;
|
|
84
|
+
/** Suffix appended to the source deck's name to seed the dialog. Matches the prototype. */
|
|
85
|
+
export declare const MASTER_NAME_SUFFIX = "(master)";
|
|
86
|
+
/**
|
|
87
|
+
* Strips the identity above out of `context.wizard`, leaving the curation intact.
|
|
88
|
+
*
|
|
89
|
+
* Non-mutating — `omit` returns a new object at every level this touches, so the source master's
|
|
90
|
+
* own context is never altered. A `wizard` (or a `react_wizard`) left with nothing in it is
|
|
91
|
+
* dropped rather than kept as `{}`, the same rule `withoutPitcherKeys` follows for
|
|
92
|
+
* `context.pitcher`. A context carrying no `wizard` at all is returned untouched, which is what
|
|
93
|
+
* makes this safe to compose onto every master-context builder.
|
|
94
|
+
*
|
|
95
|
+
* Deliberately does NOT touch `react_wizard.points` / `version`: `restoreAgenda` validates the
|
|
96
|
+
* enrichment by checking that its per-point `slide_count`s partition the node's ref list exactly,
|
|
97
|
+
* so pruning identity here cannot invalidate the artifact the agenda is rebuilt from.
|
|
98
|
+
*/
|
|
99
|
+
export declare function withoutWizardIdentity(context: Record<string, unknown>): Record<string, unknown>;
|
|
100
|
+
/**
|
|
101
|
+
* The context to store on the new master: everything the source deck carried, minus identity.
|
|
102
|
+
*
|
|
103
|
+
* Identity is pruned at all THREE places it hides — the top-level keys above, the prefixed
|
|
104
|
+
* `ctx_overwrite_*` families (`withoutPrefixedIdentityKeys`), and the wizard artifact's own
|
|
105
|
+
* (`withoutWizardIdentity`). A master promoted from a deck the rep had run the
|
|
106
|
+
* wizard on carried the promoter's customer in `wizard.subtitle`, which deck templates render on
|
|
107
|
+
* the cover slide, so the top-level pass alone was not enough (PIT-8399).
|
|
108
|
+
*
|
|
109
|
+
* Deliberately NOT gated on `copy_context_to_canvas`. That flag exists because copying context
|
|
110
|
+
* wholesale was risky, and the risk was the identity keys stripped here — gating on it would
|
|
111
|
+
* hand flag-off instances a master with no `section_list_config`, reintroducing PIT-7473 for
|
|
112
|
+
* every deck built from it.
|
|
113
|
+
*
|
|
114
|
+
* Returns `undefined` rather than `{}` when nothing survives, so the create payload omits the
|
|
115
|
+
* field instead of writing an empty object over the server's default.
|
|
116
|
+
*/
|
|
117
|
+
export declare function buildMasterContext(context?: CanvasRetrieve['context'] | null): Record<string, unknown> | undefined;
|
|
118
|
+
/**
|
|
119
|
+
* Seeds the dialog's name field. The rep can overwrite it; the suffix only exists so the master
|
|
120
|
+
* is distinguishable from the deck it came from in a list sorted by name.
|
|
121
|
+
*/
|
|
122
|
+
export declare function defaultMasterNameFor(sourceName?: string | null): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { CanvasCreateRequest, CanvasRetrieve } from '../../../types/openapi';
|
|
2
|
+
/**
|
|
3
|
+
* PIT-7488 — creating a master FROM AN ADMIN TEMPLATE.
|
|
4
|
+
*
|
|
5
|
+
* The fourth and last of the master copy paths, and the one that was missing: block 3 is
|
|
6
|
+
* deck -> master (`buildMasterContext`), block 4 is master -> deck (`buildContextFromMaster`),
|
|
7
|
+
* block 5 is master -> shared copy (next-core's `buildSharedCopyContext`), and this is
|
|
8
|
+
* template -> master.
|
|
9
|
+
*
|
|
10
|
+
* It exists because **Django does not clone a template server-side.** `POST /canvases` stores
|
|
11
|
+
* `template_id` as a plain FK and nothing else, so every create path clones client-side —
|
|
12
|
+
* `canvas.create.ts` for pitchdecks, `buildCreateFromMasterPayload` for decks from masters. The
|
|
13
|
+
* master tab was the one path that never did, so a master built from a template was created
|
|
14
|
+
* EMPTY: no `content` means no `SectionList`/`ContentList` nodes, and
|
|
15
|
+
* `useCanvasCompletionWizard.isCompletionWizardEnabled` is `wizardSteps.length > 0`, so the
|
|
16
|
+
* pitchdeck wizard could never run on it either. One missing clone, two reported symptoms.
|
|
17
|
+
*
|
|
18
|
+
* Not built on `slotty-ui-ng`'s shared `createCanvas` util on purpose: that util assigns
|
|
19
|
+
* `content`/`theme`/`context` AFTER spreading the caller's payload, so a sanitized master context
|
|
20
|
+
* cannot be passed in — and what it writes instead is wrong in both flag states (with
|
|
21
|
+
* `copy_context_to_canvas` on it copies the template context wholesale, identity and completed
|
|
22
|
+
* wizard state included; with it off it writes `{}`, losing `section_list_config`). It also
|
|
23
|
+
* prompts for an account and merges CRM data into the context on orgs with
|
|
24
|
+
* `require_account_on_canvas_creation`, which no master may carry.
|
|
25
|
+
*/
|
|
26
|
+
/** The narrow slice of a fetched template this needs — request it as `fields=content,theme,context`. */
|
|
27
|
+
export interface MasterTemplateSource extends Pick<CanvasRetrieve, 'content' | 'theme' | 'context'> {
|
|
28
|
+
}
|
|
29
|
+
/** The create-payload fields to spread over the master's own invariants. */
|
|
30
|
+
export interface MasterFromTemplatePayload extends Pick<CanvasCreateRequest, 'content' | 'theme' | 'context'> {
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Builds the `content`/`theme`/`context` a master should inherit from the template it was created
|
|
34
|
+
* from. Pure, non-mutating, and **deliberately ungated**.
|
|
35
|
+
*
|
|
36
|
+
* Not gated on `copy_context_to_canvas` for the same reason `buildMasterContext` is not: that flag
|
|
37
|
+
* exists because copying context wholesale was risky, and the risk *is* the identity keys stripped
|
|
38
|
+
* here. Gating on it would hand flag-off instances a master with no `section_list_config`, which is
|
|
39
|
+
* PIT-7473 reintroduced for every deck later built from that master.
|
|
40
|
+
*
|
|
41
|
+
* `metadata` is deliberately NOT copied. Nothing the wizard reads lives there, and a template's
|
|
42
|
+
* metadata carries its own bookkeeping — the async-download record (`job_id`, `pdf_url`, `pptx_url`,
|
|
43
|
+
* `conversion_date`) and `frozen_until`, which would make a brand-new master born read-only and
|
|
44
|
+
* offering a download of the TEMPLATE. Having none is the truthful state for a new master.
|
|
45
|
+
*
|
|
46
|
+
* Every field is omitted rather than emitted as `undefined`/`{}` when there is nothing to carry, so
|
|
47
|
+
* the no-template case ("New master pitchdeck") posts byte-identical to what it posts today instead
|
|
48
|
+
* of writing empty objects over the server's defaults.
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildMasterFromTemplatePayload(template?: MasterTemplateSource | null): MasterFromTemplatePayload;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -4,6 +4,209 @@ export type FreezeStatus = 'active' | 'expired' | null;
|
|
|
4
4
|
export declare function getFreezeStatus(canvas: Pick<CanvasRetrieve, 'metadata'>): FreezeStatus;
|
|
5
5
|
export declare const SYSTEM_EXCLUDED_TAGS: readonly ["home", "share", "sharebox"];
|
|
6
6
|
export declare function hasHidingTag(tags?: string[], dynamicTags?: string[]): boolean;
|
|
7
|
+
export declare function isTemplateHiddenFromReps(canvas: Pick<CanvasRetrieve, 'tags' | 'template'>, rendererExcludedTags?: string[]): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* PIT-7488 — which canvas list `CSavedCanvasesManagement` is rendering.
|
|
10
|
+
*
|
|
11
|
+
* Everything the variant changes lives in the pure resolvers below rather than inline in the
|
|
12
|
+
* SFC, because three of them guard state that is SHARED between simultaneously-reachable
|
|
13
|
+
* instances of the component (localStorage / sessionStorage), where a wrong answer shows up as
|
|
14
|
+
* the other tab misbehaving and is invisible in normal single-tab use.
|
|
15
|
+
*/
|
|
16
|
+
export type CanvasesManagementVariant = 'pitchdecks' | 'masters';
|
|
17
|
+
export declare function isMastersVariant(variant?: CanvasesManagementVariant): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Smart folders are a pitchdeck-only view. `isSmartFoldersView` is a `useLocalStorage`, shared
|
|
20
|
+
* across every instance of the component, so without the variant guard a rep who switched the
|
|
21
|
+
* Pitchdecks tab to smart folders would find the master tab rendering `SmartFolders` — which
|
|
22
|
+
* lists ordinary pitchdecks. Masters aren't foldered, so they have no smart-folder equivalent.
|
|
23
|
+
*/
|
|
24
|
+
export declare function resolveCanvasesView(opts: {
|
|
25
|
+
isMasters: boolean;
|
|
26
|
+
smartFoldersEnabled?: boolean;
|
|
27
|
+
isSmartFoldersView?: boolean;
|
|
28
|
+
}): 'smartFolders' | 'normal';
|
|
29
|
+
/**
|
|
30
|
+
* The localStorage key `useTableColumnsSettings` persists show/hide/reorder under. Must differ
|
|
31
|
+
* per variant: a shared key lets the two tabs overwrite each other's layout, and writes the
|
|
32
|
+
* masters-only `shared_with` column into the pitchdeck tab's saved settings.
|
|
33
|
+
*
|
|
34
|
+
* The masters key is `ciq_master_canvases_management_table_columns_settings`. It was renamed off
|
|
35
|
+
* `…master_pitchdecks…` with the rest of the feature, which resets any column layout a tester had
|
|
36
|
+
* already saved on the master tab — once, and only for that tab.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveColumnSettingsKey(isMasters: boolean): string;
|
|
39
|
+
/**
|
|
40
|
+
* Which `canvas_manager_table_columns` key to read LD column visibility from. Masters get their
|
|
41
|
+
* own so ops can configure the two lists independently — `getVisibleColumns` degrades to "show
|
|
42
|
+
* every column" when the key is absent, whereas reusing `canvases` would mean hiding a column on
|
|
43
|
+
* the Pitchdecks tab silently hid it here too.
|
|
44
|
+
*
|
|
45
|
+
* The masters key is now `master_canvases`: ops must rename it inside the
|
|
46
|
+
* `canvas_manager_table_columns` LD value, and until they do the helper degrades to "show every
|
|
47
|
+
* column" rather than failing closed.
|
|
48
|
+
*/
|
|
49
|
+
export declare function resolveColumnVisibilityView(isMasters: boolean): 'canvases' | 'master_canvases';
|
|
50
|
+
/**
|
|
51
|
+
* PIT-8360 QA — the copy that must NAME a master instead of saying "canvas".
|
|
52
|
+
*
|
|
53
|
+
* QA read the delete and unfreeze confirmations on the masters tab as belonging to an ordinary
|
|
54
|
+
* pitchdeck, because every sentence in them says "canvas". Instances rename that word through
|
|
55
|
+
* `translation_overrides` (a whole-word replace, so Vontobel's "canvas" -> "PitchDeck" makes them
|
|
56
|
+
* read "this PitchDeck"), which means the fix is NOT a per-instance label change: the source
|
|
57
|
+
* string has to carry the qualifier so the same override yields "master PitchDeck". This is also
|
|
58
|
+
* why the master strings say "master canvas" rather than "master pitchdeck" — the override only
|
|
59
|
+
* fires on the word it knows.
|
|
60
|
+
*
|
|
61
|
+
* Two shapes were rejected, and both failures are worth keeping written down:
|
|
62
|
+
*
|
|
63
|
+
* 1. An `{entity}` placeholder in the shared sentences. The pitchdeck tab uses the same strings in
|
|
64
|
+
* 14 locales, where a swapped-in noun would have to agree in article and gender.
|
|
65
|
+
* 2. A `resolveKey(copy, isMasters)` table returning the i18n key. **`vue-i18n-extract` runs with
|
|
66
|
+
* `--remove` in CI** (`scripts/lib-extract-translations.js`, and slotty's `extract:translations`)
|
|
67
|
+
* and finds keys by scanning source for literal translation calls — a computed key is
|
|
68
|
+
* invisible to it, so it deleted the master keys AND the pitchdeck keys whose literals the
|
|
69
|
+
* table had replaced. Every i18n key must appear spelled out as the argument of a translation
|
|
70
|
+
* call at its own call site; that is why the master copy is selected with a ternary over two
|
|
71
|
+
* whole calls rather than by picking a key. `resolveBulkEntityType` below is fine because it
|
|
72
|
+
* names an ENTITY, not a key — its `canvasUI.common.masterCanvas` literal lives in
|
|
73
|
+
* `getCanvasTypeTranslation`. Mind this when writing about i18n in a comment, too: a
|
|
74
|
+
* call-shaped example inside the scan glob is harvested as a real key.
|
|
75
|
+
*/
|
|
76
|
+
/**
|
|
77
|
+
* The noun the BULK dialogs put in front of the rep ("delete the 2 selected …").
|
|
78
|
+
*
|
|
79
|
+
* Only the two bulk dialogs the masters tab actually offers take this — delete and manage
|
|
80
|
+
* attributes. The tag dialogs are hidden there (`moreActions.addTags: !isMasters`) and keep the
|
|
81
|
+
* plain `CanvasType`, because their value is also sent to the instance-tags endpoint as
|
|
82
|
+
* `canvas_type`, where `'master-canvas'` is not a thing.
|
|
83
|
+
*/
|
|
84
|
+
export declare function resolveBulkEntityType(isMasters: boolean): 'canvas' | 'master-canvas';
|
|
85
|
+
/**
|
|
86
|
+
* Account scoping for the fetch. Never applies to masters: they are account-less server-side
|
|
87
|
+
* (`resolve_account` nulls it on write), so an `account__id` filter matches nothing and empties
|
|
88
|
+
* the whole list. The selected account comes from localStorage and therefore survives across
|
|
89
|
+
* tabs — so this fires on the master tab even when no account was ever picked there.
|
|
90
|
+
*/
|
|
91
|
+
export declare function resolveAccountFilterId(opts: {
|
|
92
|
+
isMasters: boolean;
|
|
93
|
+
accountVisibilityEnabled?: boolean;
|
|
94
|
+
selectedAccountId?: string | null;
|
|
95
|
+
}): string | undefined;
|
|
96
|
+
/** Masters have no account, so the column would render a dash on every row. */
|
|
97
|
+
export declare function shouldShowAccountColumn(opts: {
|
|
98
|
+
isMasters: boolean;
|
|
99
|
+
isCRM?: boolean;
|
|
100
|
+
}): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Masters always show Owner: block 5 lets colleagues share a master, so the list stops being
|
|
103
|
+
* "only mine" and the owner becomes what distinguishes rows. On the pitchdeck tab it stays
|
|
104
|
+
* admin-gated exactly as before.
|
|
105
|
+
*/
|
|
106
|
+
export declare function shouldShowOwnerColumn(opts: {
|
|
107
|
+
isMasters: boolean;
|
|
108
|
+
isAnyTypeOfAdmin?: boolean;
|
|
109
|
+
accountVisibilityEnabled?: boolean;
|
|
110
|
+
}): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Whether the Documents column shows (PIT-8360).
|
|
113
|
+
*
|
|
114
|
+
* Pitchdecks only. It shipped on the MASTER tab, where the signed-off prototype never put it — the
|
|
115
|
+
* prototype's "Document download" column belongs to the pitchdecks tab. Nothing is lost by
|
|
116
|
+
* removing it from the masters list: a master's rendered documents are still reachable from its row
|
|
117
|
+
* actions (Download PDF / PPTX / Regenerate), which read the same server-side state the column did.
|
|
118
|
+
*
|
|
119
|
+
* The `enable_scale_content` term is not belt-and-braces. That flag selects which conversion path
|
|
120
|
+
* runs for a DECK, and only the pdftopptx path it enables ever writes the `pdf_url`/`pptx_url`
|
|
121
|
+
* metadata this column reads — so with it off every row would render a dash under a header
|
|
122
|
+
* promising documents. Hidden beats uniformly empty.
|
|
123
|
+
*
|
|
124
|
+
* The downloader term follows how `shared_with` gates on its fetcher: a host that supplies none
|
|
125
|
+
* would otherwise get a column whose PDF/PPTX buttons render and then do nothing — the silent-no-op
|
|
126
|
+
* failure this file's `template`-column comment records as a reported QA bug.
|
|
127
|
+
*
|
|
128
|
+
* Gated here rather than through the LD column config because `getVisibleColumns` degrades to
|
|
129
|
+
* "show every column" when an instance configures no entry for the view, so the config cannot
|
|
130
|
+
* express "never on this tab".
|
|
131
|
+
*/
|
|
132
|
+
export declare function shouldShowDocumentsColumn(opts: {
|
|
133
|
+
isMasters: boolean;
|
|
134
|
+
scaleContentEnabled?: boolean;
|
|
135
|
+
/** The host callback behind the column's click; without it the buttons are inert. */
|
|
136
|
+
hasDocumentDownloader?: boolean;
|
|
137
|
+
}): boolean;
|
|
138
|
+
/**
|
|
139
|
+
* Whether duplicating should prompt for an account first.
|
|
140
|
+
*
|
|
141
|
+
* Never for masters. Not merely because the value would be redundant (the server nulls it) — the
|
|
142
|
+
* master tab passes `accounts: []`, so the modal would open with an empty list, the rep could
|
|
143
|
+
* select nothing, and the duplicate would silently abort with no toast and no error.
|
|
144
|
+
*/
|
|
145
|
+
export declare function shouldRequireAccountOnDuplicate(opts: {
|
|
146
|
+
isMasters: boolean;
|
|
147
|
+
isCRM?: boolean;
|
|
148
|
+
requireAccountOnCanvasCreation?: boolean;
|
|
149
|
+
}): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* PIT-7488 block 4 — inputs shared by the two places the create-from-master flow can be started.
|
|
152
|
+
*
|
|
153
|
+
* The host capabilities are part of the gate on purpose: the flow needs a way to LIST masters (for
|
|
154
|
+
* the picker, and to resolve a preselected id to a label) and a way to create an ORDINARY deck
|
|
155
|
+
* (the masters tab's own `creator` makes masters). A flag turned on without them renders an entry
|
|
156
|
+
* that cannot work, which reads as a broken feature rather than an unconfigured one.
|
|
157
|
+
*
|
|
158
|
+
* `isCanvasCreationDisabled` matters because this creates a canvas — the same permission bypass
|
|
159
|
+
* CodeRabbit caught on block 3's "Use as master", where a rep without `canvas.create` could make
|
|
160
|
+
* one anyway.
|
|
161
|
+
*/
|
|
162
|
+
interface CreateFromMasterCapability {
|
|
163
|
+
masterCanvasesEnabled?: boolean;
|
|
164
|
+
hasMasterFetcher?: boolean;
|
|
165
|
+
hasCanvasFromMasterCreator?: boolean;
|
|
166
|
+
isCanvasCreationDisabled?: boolean;
|
|
167
|
+
}
|
|
168
|
+
/** Enables the master row's "Use to create pitchdeck" button (rendered disabled until block 4). */
|
|
169
|
+
export declare function canUseMasterToCreateCanvas(opts: CreateFromMasterCapability): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* Whether NEW becomes a dropdown offering "From my master pitchdeck".
|
|
172
|
+
*
|
|
173
|
+
* The ONLY difference from `canUseMasterToCreateCanvas` is the variant term, and it is not
|
|
174
|
+
* cosmetic: `CSavedCanvasesManagementToolbar` renders for BOTH variants, so without the guard the
|
|
175
|
+
* master tab's own NEW grows an entry that builds a deck from a master while standing in the master
|
|
176
|
+
* list — the same shared-surface trap as the smart-folders view and the column-settings key.
|
|
177
|
+
*/
|
|
178
|
+
export declare function shouldOfferCreateFromMaster(opts: CreateFromMasterCapability & {
|
|
179
|
+
isMasters: boolean;
|
|
180
|
+
}): boolean;
|
|
181
|
+
/**
|
|
182
|
+
* PIT-8398 — apply a known field delta to one loaded row, instead of refetching the page to
|
|
183
|
+
* discover what the caller just wrote.
|
|
184
|
+
*
|
|
185
|
+
* Two properties this relies on, both load-bearing:
|
|
186
|
+
*
|
|
187
|
+
* 1. **Immutable replacement**, because this is a pure function — it must not mutate the array
|
|
188
|
+
* the caller handed it, which is also what makes it testable in isolation. Note this is NOT
|
|
189
|
+
* a reactivity requirement: `CTable` renders each cell from `row.original`, so Vue's deep
|
|
190
|
+
* proxy tracks a nested write and an in-place `rows[i].metadata = …` re-renders too
|
|
191
|
+
* (measured, not assumed). Replacement is preferred anyway — it matches the three existing
|
|
192
|
+
* row-write patterns in the consuming component (`updateProperty`, `refreshCanvasMetadata`,
|
|
193
|
+
* `startAsyncDownload`) and it does not depend on the row being a reactive proxy at all,
|
|
194
|
+
* which a plain snapshot passed through `deepToRaw` would not be.
|
|
195
|
+
* 2. **Spread onto the existing row, never replace it.** A PATCH response carries only the
|
|
196
|
+
* canvas fields; it does not carry the list-only ones the row already holds (`indicators`
|
|
197
|
+
* from the list serializer, the account name injected by `enrichCanvasesWithAccountNames`).
|
|
198
|
+
* Overwriting the row with a response would silently drop them — the trap `updateProperty`
|
|
199
|
+
* works around by re-attaching `indicators` by hand.
|
|
200
|
+
*
|
|
201
|
+
* `patched` is false when the id is not on the current page, so a caller can fall back to a
|
|
202
|
+
* full `refetch()` rather than assume the UI caught up.
|
|
203
|
+
*/
|
|
204
|
+
export declare function applyRowPatch<T extends {
|
|
205
|
+
id: string;
|
|
206
|
+
}>(rows: T[], id: T['id'], patch: Partial<T>): {
|
|
207
|
+
rows: T[];
|
|
208
|
+
patched: boolean;
|
|
209
|
+
};
|
|
7
210
|
export declare function useCSavedCanvasesManagement(): {
|
|
8
211
|
statusOptions: {
|
|
9
212
|
label: string;
|
|
@@ -13,3 +216,4 @@ export declare function useCSavedCanvasesManagement(): {
|
|
|
13
216
|
[key: string]: any;
|
|
14
217
|
}>[];
|
|
15
218
|
};
|
|
219
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { MasterDocumentsState } from '../masterCanvases/masterCanvasDocuments.use';
|
|
2
|
+
/**
|
|
3
|
+
* PIT-8360 — the Documents column on the PITCHDECK tab.
|
|
4
|
+
*
|
|
5
|
+
* The column shipped on the master tab, which the signed-off prototype never had: its
|
|
6
|
+
* "Document download" column sits on the pitchdecks tab. Moving it there means feeding the SAME
|
|
7
|
+
* cell from a different artifact store, because the two tabs' documents come from different
|
|
8
|
+
* pipelines and only one of them is server-orchestrated:
|
|
9
|
+
*
|
|
10
|
+
* - a MASTER's artifacts live in `core_master_canvas_documents`, rendered server-side by
|
|
11
|
+
* next-core, and the bulk read is also the scheduler;
|
|
12
|
+
* - a DECK's artifacts live in its own `metadata` (`pdf_url` / `pptx_url` / `conversion_date` /
|
|
13
|
+
* `job_id`), written by the pdftopptx callback server when a rep asks for a download.
|
|
14
|
+
*
|
|
15
|
+
* So this is an adapter, not a second fetch: everything it needs is already on the row the list
|
|
16
|
+
* fetched. That is the whole reason the column could move without touching the backend — and why
|
|
17
|
+
* relaxing next-core's `c.is_master = true` filters was not necessary. It also means the pitchdeck
|
|
18
|
+
* column adds no requests and schedules no renders, which matters: reps hold far more decks than
|
|
19
|
+
* masters, so scheduling one render per listed row would have multiplied Gotenberg load.
|
|
20
|
+
*
|
|
21
|
+
* Kept free of Vue so the mapping is testable on its own, like its master-side counterpart.
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* What `getAsyncDownloadState` in `CSavedCanvasesManagement` returns.
|
|
25
|
+
*
|
|
26
|
+
* Declared here rather than exported from the component: it is a local `const` inside a
|
|
27
|
+
* 2000-line SFC, and the call site is what structurally checks the two against each other, so a
|
|
28
|
+
* drift shows up as a type error there. `undefined` is part of the contract — that function
|
|
29
|
+
* returns it outright when `enable_scale_content` is off.
|
|
30
|
+
*/
|
|
31
|
+
export interface SavedCanvasDownloadNotStarted {
|
|
32
|
+
status: 'not_started';
|
|
33
|
+
}
|
|
34
|
+
export interface SavedCanvasDownloadInProgress {
|
|
35
|
+
status: 'in_progress';
|
|
36
|
+
jobId?: string;
|
|
37
|
+
/** `metadata.conversion_date` verbatim — when the job was queued. See the staleness rule below. */
|
|
38
|
+
conversionDate?: string | null;
|
|
39
|
+
/**
|
|
40
|
+
* The rep started this download in THIS session, so the component is already polling it and it is
|
|
41
|
+
* live by construction. Exempt from the staleness rule, and legitimately stampless.
|
|
42
|
+
*/
|
|
43
|
+
startedThisSession?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export interface SavedCanvasDownloadCompleted {
|
|
46
|
+
status: 'completed';
|
|
47
|
+
pdfUrl?: string;
|
|
48
|
+
pptxUrl?: string;
|
|
49
|
+
jobId?: string;
|
|
50
|
+
/** The presigned artifact is past the instance's `async_download_expiration_hours` window. */
|
|
51
|
+
isExpired?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* `metadata.conversion_date` verbatim. Needed here because `isExpired` alone cannot be trusted —
|
|
54
|
+
* see the age guards in `toDocumentsState`.
|
|
55
|
+
*/
|
|
56
|
+
conversionDate?: string | null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* A `type` because it is a union, which an interface cannot express; the object shapes above are
|
|
60
|
+
* interfaces per the repo convention.
|
|
61
|
+
*/
|
|
62
|
+
export type SavedCanvasAsyncDownloadState = SavedCanvasDownloadNotStarted | SavedCanvasDownloadInProgress | SavedCanvasDownloadCompleted;
|
|
63
|
+
/**
|
|
64
|
+
* Maps a deck's async-download state onto the shape `CMasterCanvasesDocumentsCell` renders.
|
|
65
|
+
*
|
|
66
|
+
* `null` means "no documents", which the cell draws as a dash. Three states reach it:
|
|
67
|
+
*
|
|
68
|
+
* - the pipeline is off (`undefined`), so no deck can have artifacts;
|
|
69
|
+
* - nobody has downloaded this deck yet;
|
|
70
|
+
* - the artifacts have EXPIRED. Returning the URLs anyway would hand the rep two buttons
|
|
71
|
+
* pointing at objects that are gone — the actions menu already refuses to offer them
|
|
72
|
+
* (`!props.isExpired` gates its PDF/PPTX entries) and offers Regenerate instead, so a dash here
|
|
73
|
+
* keeps the two surfaces telling the same story.
|
|
74
|
+
*
|
|
75
|
+
* Note what is deliberately NOT mapped:
|
|
76
|
+
*
|
|
77
|
+
* - `is_stale` is always false. Staleness is a master concept — the server re-renders a master
|
|
78
|
+
* whose slides have moved on, and the cell keeps the old links plus a quiet refresh spinner. A
|
|
79
|
+
* deck's artifact is never refreshed behind the rep's back; it expires instead.
|
|
80
|
+
* - there is no `failed`. `getAsyncDownloadState` never reports one, so `canRetryDocuments` stays
|
|
81
|
+
* false and the cell renders no Retry button — which is correct, because re-running a deck
|
|
82
|
+
* conversion is the actions menu's Download entry, not this cell's job.
|
|
83
|
+
* - `rendered_at` and `error` stay null: the deck pipeline records neither, and inventing values
|
|
84
|
+
* would claim knowledge the cell would then display.
|
|
85
|
+
*/
|
|
86
|
+
export declare function toDocumentsState(asyncState: SavedCanvasAsyncDownloadState | undefined | null): MasterDocumentsState | null;
|
|
87
|
+
/**
|
|
88
|
+
* The predicate behind `openableUrl`, exported because the row's Download actions need the same
|
|
89
|
+
* answer: they build their own anchor instead of going through the host's opener, so without this
|
|
90
|
+
* they are the only artifact surface with no scheme check on them at all.
|
|
91
|
+
*/
|
|
92
|
+
export declare function isOpenableDocumentUrl(url: string | null | undefined): url is string;
|
|
93
|
+
/**
|
|
94
|
+
* Whether the cell should offer a download for a deck that has no artifact yet (PIT-8360 follow-up).
|
|
95
|
+
*
|
|
96
|
+
* The column started as a mirror of existing artifacts, so a deck nobody had downloaded showed a
|
|
97
|
+
* dash — which reads as "no documents available" when the truth is "nobody has asked yet". The
|
|
98
|
+
* developer's call: a READY deck always offers PDF and PPTX, and the click generates them.
|
|
99
|
+
*
|
|
100
|
+
* Gated on Ready (`is_draft === false`) because that is the signal the rep uses to mean "this deck
|
|
101
|
+
* is finished". A draft still keeps its Download action in the row menu, so nothing is lost — the
|
|
102
|
+
* column simply does not invite a render of something still being written.
|
|
103
|
+
*
|
|
104
|
+
* `isDraft` is optional and a missing value is treated as NOT ready: a partially-fetched row must
|
|
105
|
+
* not invite a Gotenberg render on a deck whose state we do not actually know.
|
|
106
|
+
*/
|
|
107
|
+
export declare function shouldOfferDocumentDownload(opts: {
|
|
108
|
+
isDraft?: boolean;
|
|
109
|
+
/** Present when the artifacts already exist — then the cell shows real links, not an offer. */
|
|
110
|
+
hasDocuments?: boolean;
|
|
111
|
+
}): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -65,6 +65,7 @@ export default function useSmartFolders(emit?: (event: 'open', ...args: any[]) =
|
|
|
65
65
|
is_template?: boolean | undefined;
|
|
66
66
|
is_section?: boolean | undefined;
|
|
67
67
|
is_block?: boolean | undefined;
|
|
68
|
+
is_master?: boolean | undefined;
|
|
68
69
|
is_editable?: boolean | undefined;
|
|
69
70
|
is_default?: boolean | undefined;
|
|
70
71
|
metadata?: any;
|
|
@@ -150,6 +151,7 @@ export default function useSmartFolders(emit?: (event: 'open', ...args: any[]) =
|
|
|
150
151
|
is_template?: boolean | undefined;
|
|
151
152
|
is_section?: boolean | undefined;
|
|
152
153
|
is_block?: boolean | undefined;
|
|
154
|
+
is_master?: boolean | undefined;
|
|
153
155
|
is_editable?: boolean | undefined;
|
|
154
156
|
is_default?: boolean | undefined;
|
|
155
157
|
metadata?: any;
|
|
@@ -215,6 +217,7 @@ export default function useSmartFolders(emit?: (event: 'open', ...args: any[]) =
|
|
|
215
217
|
is_template?: boolean | undefined;
|
|
216
218
|
is_section?: boolean | undefined;
|
|
217
219
|
is_block?: boolean | undefined;
|
|
220
|
+
is_master?: boolean | undefined;
|
|
218
221
|
is_editable?: boolean | undefined;
|
|
219
222
|
is_default?: boolean | undefined;
|
|
220
223
|
metadata?: any;
|
|
@@ -281,6 +284,7 @@ export default function useSmartFolders(emit?: (event: 'open', ...args: any[]) =
|
|
|
281
284
|
is_template?: boolean | undefined;
|
|
282
285
|
is_section?: boolean | undefined;
|
|
283
286
|
is_block?: boolean | undefined;
|
|
287
|
+
is_master?: boolean | undefined;
|
|
284
288
|
is_editable?: boolean | undefined;
|
|
285
289
|
is_default?: boolean | undefined;
|
|
286
290
|
metadata?: any;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { default as PSPDFKitType,
|
|
1
|
+
import { default as PSPDFKitType, Configuration } from '@nutrient-sdk/viewer';
|
|
2
2
|
declare function annotationsInterpolation({ PSPDFKit, config, data, }: {
|
|
3
3
|
PSPDFKit: typeof PSPDFKitType;
|
|
4
|
-
config:
|
|
4
|
+
config: Configuration;
|
|
5
5
|
data: Record<string, string>;
|
|
6
6
|
}): Promise<void>;
|
|
7
7
|
export default function usePdfInterpolation(strategy?: 'annotations' | 'text'): typeof annotationsInterpolation;
|
|
@@ -9,7 +9,7 @@ export type InactiveEventPayload = {
|
|
|
9
9
|
file_id?: string;
|
|
10
10
|
[key: string]: any;
|
|
11
11
|
};
|
|
12
|
-
export default function (track: (eventName: string, payload: any) => void, pitcherApi?: ReturnType<typeof usePitcherApi>, flushTrack?: (eventName: string, payload: any) => void): {
|
|
12
|
+
export default function (track: (eventName: string, payload: any) => void, pitcherApi?: ReturnType<typeof usePitcherApi>, flushTrack?: (eventName: string, payload: any) => void, heartbeatIntervalMs?: number): {
|
|
13
13
|
registerInactiveEvent: ({ id, payload, enterEvent, exitEvent, type, }: {
|
|
14
14
|
id: string;
|
|
15
15
|
payload: InactiveEventPayload | ((type?: EventLifecycle) => InactiveEventPayload);
|
|
@@ -10,6 +10,7 @@ export declare const CDP_EVENT_TYPE: {
|
|
|
10
10
|
readonly appExited: "App Exited";
|
|
11
11
|
readonly canvasEntered: "Canvas Entered";
|
|
12
12
|
readonly canvasExited: "Canvas Exited";
|
|
13
|
+
readonly canvasHeartbeat: "Canvas Heartbeat";
|
|
13
14
|
readonly wizardEntered: "Wizard Entered";
|
|
14
15
|
readonly wizardExited: "Wizard Exited";
|
|
15
16
|
readonly canvasShared: "Canvas Shared";
|
|
@@ -50,6 +51,7 @@ export declare const PLATFORM_TYPE: {
|
|
|
50
51
|
readonly ios: "ios";
|
|
51
52
|
readonly android: "android";
|
|
52
53
|
readonly windows: "windows";
|
|
54
|
+
readonly macos: "macos";
|
|
53
55
|
};
|
|
54
56
|
export declare const EMBED_TYPE: {
|
|
55
57
|
readonly standalone: "standalone";
|