@agent-native/core 0.102.1 → 0.103.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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +15 -0
- package/corpus/core/docs/content/local-file-mode.mdx +99 -489
- package/corpus/core/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
- package/corpus/core/docs/content/locales/ar-SA/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
- package/corpus/core/docs/content/locales/de-DE/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
- package/corpus/core/docs/content/locales/es-ES/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
- package/corpus/core/docs/content/locales/fr-FR/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
- package/corpus/core/docs/content/locales/hi-IN/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
- package/corpus/core/docs/content/locales/ja-JP/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
- package/corpus/core/docs/content/locales/ko-KR/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
- package/corpus/core/docs/content/locales/pt-BR/template-content.mdx +10 -24
- package/corpus/core/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
- package/corpus/core/docs/content/locales/zh-CN/template-content.mdx +9 -24
- package/corpus/core/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
- package/corpus/core/docs/content/locales/zh-TW/template-content.mdx +9 -24
- package/corpus/core/docs/content/template-content.mdx +26 -42
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/content-local.ts +86 -18
- package/corpus/core/src/cli/index.ts +2 -2
- package/corpus/core/src/cli/skills-content/content-skill.ts +36 -25
- package/corpus/core/src/cli/skills.ts +47 -13
- package/corpus/core/src/client/AgentPanel.tsx +7 -0
- package/corpus/core/src/client/AssistantChat.tsx +7 -0
- package/corpus/core/src/client/agent-chat-adapter.ts +7 -1
- package/corpus/core/src/client/chat/message-components.tsx +17 -3
- package/corpus/core/src/client/composer/ComposerPlusMenu.tsx +96 -6
- package/corpus/core/src/client/composer/asset-picker-url.ts +80 -0
- package/corpus/core/src/client/error-format.ts +24 -0
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +8 -1
- package/corpus/core/src/local-artifacts/index.ts +65 -0
- package/corpus/templates/assets/app/components/library/GenerationPresetsPanel.tsx +325 -0
- package/corpus/templates/assets/app/hooks/use-navigation-state.ts +12 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +21 -0
- package/corpus/templates/assets/app/i18n-data.ts +215 -0
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +19 -479
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +1 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id_.settings.tsx +446 -0
- package/corpus/templates/assets/app/routes/library.tsx +69 -0
- package/corpus/templates/assets/changelog/2026-07-15-fixed-top-level-image-picker-selections-returning-to-the-com.md +6 -0
- package/corpus/templates/clips/actions/disconnect-calendar.ts +57 -9
- package/corpus/templates/clips/actions/generate-workflow.ts +102 -59
- package/corpus/templates/clips/actions/get-recording-player-data.ts +64 -1
- package/corpus/templates/clips/actions/regenerate-summary.ts +7 -0
- package/corpus/templates/clips/actions/regenerate-title.ts +29 -11
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +34 -13
- package/corpus/templates/clips/app/components/editor/thumbnail-picker.tsx +87 -9
- package/corpus/templates/clips/app/components/editor/trim-handles.tsx +15 -0
- package/corpus/templates/clips/app/components/editor/waveform.tsx +21 -8
- package/corpus/templates/clips/app/components/library/folder-tree.tsx +52 -0
- package/corpus/templates/clips/app/components/player/settings-panel.tsx +116 -58
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +43 -37
- package/corpus/templates/clips/app/components/player/video-player.tsx +50 -2
- package/corpus/templates/clips/app/components/recorder/microphone-visualizer.tsx +22 -3
- package/corpus/templates/clips/app/i18n/ar-SA.ts +5 -2
- package/corpus/templates/clips/app/i18n/de-DE.ts +6 -2
- package/corpus/templates/clips/app/i18n/en-US.ts +5 -2
- package/corpus/templates/clips/app/i18n/es-ES.ts +6 -2
- package/corpus/templates/clips/app/i18n/fr-FR.ts +5 -2
- package/corpus/templates/clips/app/i18n/hi-IN.ts +5 -2
- package/corpus/templates/clips/app/i18n/ja-JP.ts +6 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +5 -2
- package/corpus/templates/clips/app/i18n/pt-BR.ts +6 -2
- package/corpus/templates/clips/app/i18n/zh-CN.ts +5 -2
- package/corpus/templates/clips/app/i18n/zh-TW.ts +5 -2
- package/corpus/templates/clips/app/lib/timestamp-mapping.ts +14 -0
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -2
- package/corpus/templates/clips/app/routes/_index.tsx +1 -2
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +98 -32
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +4 -1
- package/corpus/templates/clips/changelog/2026-07-15-ai-workflow-generation-now-stays-visible-avoids-duplicate-re.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-clip-playback-and-cta-controls-remain-interactive-through-ed.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-clip-titles-no-longer-describe-the-product-as-a-loom-alterna.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-description-regeneration-now-opens-the-agent-chat-so-progres.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-direct-recording-urls-now-respect-share-link-and-password-ac.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-disconnecting-a-calendar-now-clears-unrecorded-synced-meetin.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-folders-now-expose-rename-and-delete-actions-directly-in-the.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-recording-pages-now-explain-sign-in-access-and-avoid-showing.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-the-clips-extension-quick-actions-toolbar-can-be-moved-out-o.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-the-editor-now-skips-cut-sections-during-preview-and-keeps-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-thumbnail-capture-now-updates-previews-while-scrubbing-and-l.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-15-windows-permission-links-open-the-matching-settings-page.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/content-script.ts +117 -2
- package/corpus/templates/clips/chrome-extension/src/overlay.ts +27 -0
- package/corpus/templates/clips/desktop/src-tauri/tauri.conf.json +1 -1
- package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +139 -101
- package/corpus/templates/clips/server/lib/recording-page-access.ts +35 -0
- package/corpus/templates/clips/server/lib/share-password.ts +6 -3
- package/corpus/templates/content/.agents/skills/content/SKILL.md +26 -39
- package/corpus/templates/content/AGENTS.md +25 -30
- package/corpus/templates/content/actions/_builder-docs-client.ts +23 -0
- package/corpus/templates/content/actions/_content-database-source-adapters.ts +21 -3
- package/corpus/templates/content/actions/_content-files.ts +338 -0
- package/corpus/templates/content/actions/_content-space-access.ts +135 -0
- package/corpus/templates/content/actions/_content-spaces.ts +640 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +90 -7
- package/corpus/templates/content/actions/_database-utils.ts +7 -1
- package/corpus/templates/content/actions/_local-file-documents.ts +0 -9
- package/corpus/templates/content/actions/_local-folder-source.ts +53 -0
- package/corpus/templates/content/actions/_property-utils.ts +9 -4
- package/corpus/templates/content/actions/add-database-item.ts +108 -65
- package/corpus/templates/content/actions/backfill-content-files.ts +22 -0
- package/corpus/templates/content/actions/connect-local-folder-source.ts +221 -0
- package/corpus/templates/content/actions/create-content-database.ts +129 -3
- package/corpus/templates/content/actions/create-document.ts +65 -55
- package/corpus/templates/content/actions/create-inline-content-database.ts +6 -1
- package/corpus/templates/content/actions/delete-content-database.ts +3 -0
- package/corpus/templates/content/actions/delete-document.ts +7 -11
- package/corpus/templates/content/actions/disconnect-local-folder-source.ts +175 -0
- package/corpus/templates/content/actions/duplicate-database-item.ts +10 -0
- package/corpus/templates/content/actions/duplicate-database-items.ts +13 -0
- package/corpus/templates/content/actions/edit-document.ts +2 -28
- package/corpus/templates/content/actions/ensure-content-spaces.ts +26 -0
- package/corpus/templates/content/actions/export-content-source.ts +47 -9
- package/corpus/templates/content/actions/get-document.ts +0 -14
- package/corpus/templates/content/actions/import-content-source.ts +43 -3
- package/corpus/templates/content/actions/list-content-spaces.ts +103 -0
- package/corpus/templates/content/actions/list-documents.ts +12 -9
- package/corpus/templates/content/actions/move-document.ts +3 -14
- package/corpus/templates/content/actions/pull-document.ts +0 -23
- package/corpus/templates/content/actions/remove-local-file-source.ts +50 -29
- package/corpus/templates/content/actions/resolve-local-folder-conflict.ts +442 -0
- package/corpus/templates/content/actions/reveal-local-source-file.ts +6 -17
- package/corpus/templates/content/actions/search-documents.ts +0 -34
- package/corpus/templates/content/actions/share-local-file-document.ts +25 -1
- package/corpus/templates/content/actions/submit-content-database-form.ts +12 -0
- package/corpus/templates/content/actions/sync-local-folder-source.ts +731 -0
- package/corpus/templates/content/actions/sync-manifest-local-folder-source.ts +123 -0
- package/corpus/templates/content/actions/update-content-database-view.ts +10 -1
- package/corpus/templates/content/actions/update-document.ts +0 -15
- package/corpus/templates/content/actions/view-screen.ts +2 -50
- package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +76 -62
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +70 -22
- package/corpus/templates/content/app/components/editor/database/grouping.ts +2 -1
- package/corpus/templates/content/app/components/editor/database/settings.tsx +23 -20
- package/corpus/templates/content/app/components/editor/database/shared.tsx +2 -0
- package/corpus/templates/content/app/components/editor/database/sidebar.tsx +330 -0
- package/corpus/templates/content/app/components/editor/database/types.ts +1 -0
- package/corpus/templates/content/app/components/editor/database/view-config.ts +3 -1
- package/corpus/templates/content/app/components/layout/Layout.tsx +25 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +209 -113
- package/corpus/templates/content/app/components/sidebar/select-content-space.ts +31 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +16 -0
- package/corpus/templates/content/app/hooks/use-content-spaces.ts +39 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +11 -0
- package/corpus/templates/content/app/i18n-data.ts +75 -0
- package/corpus/templates/content/app/routes/_app.local-files.tsx +174 -65
- package/corpus/templates/content/changelog/2026-07-16-content-callouts-can-now-be-reviewed-and-published-to-builder.md +6 -0
- package/corpus/templates/content/changelog/2026-07-16-heading-5-and-heading-6-are-available-from-the-editor-slash-.md +6 -0
- package/corpus/templates/content/changelog/2026-07-16-organize-every-workspace-through-a-customizable-files-databa.md +6 -0
- package/corpus/templates/content/parity/matrix.md +2 -1
- package/corpus/templates/content/parity/matrix.ts +37 -1
- package/corpus/templates/content/scripts/dev-database.mjs +7 -5
- package/corpus/templates/content/server/db/schema.ts +113 -40
- package/corpus/templates/content/server/lib/document-context.ts +15 -1
- package/corpus/templates/content/server/lib/notion-sync.ts +6 -0
- package/corpus/templates/content/server/plugins/db.ts +153 -0
- package/corpus/templates/content/shared/api.ts +17 -3
- package/corpus/templates/content/shared/builder-mdx.ts +163 -16
- package/corpus/templates/design/.agents/skills/design-templates/SKILL.md +59 -0
- package/corpus/templates/design/AGENTS.md +6 -1
- package/corpus/templates/design/actions/create-design-from-template.ts +19 -7
- package/corpus/templates/design/actions/list-design-templates.ts +69 -21
- package/corpus/templates/design/actions/navigate.ts +2 -2
- package/corpus/templates/design/actions/view-screen.ts +15 -2
- package/corpus/templates/design/agent-native.app-skill.json +5 -0
- package/corpus/templates/design/app/components/design/design-canvas/external-preview.ts +7 -3
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +281 -56
- package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +14 -2
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +3 -2
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -3
- package/corpus/templates/design/app/i18n-data.ts +21 -2
- package/corpus/templates/design/app/i18n-template-feature.ts +218 -10
- package/corpus/templates/design/app/pages/Index.tsx +195 -24
- package/corpus/templates/design/app/pages/Templates.tsx +144 -55
- package/corpus/templates/design/app/pages/design-editor/generation-prompt-directives.ts +12 -1
- package/corpus/templates/design/changelog/2026-07-14-templates-now-appear-in-the-new-design-picker-with-previews-.md +6 -0
- package/corpus/templates/design/changelog/2026-07-15-prototype-print-and-download-buttons-now-work-in-preview.md +6 -0
- package/corpus/templates/design/changelog/2026-07-15-templates-now-open-immediately-after-copying-even-while-the-.md +6 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/mail/AGENTS.md +23 -18
- package/corpus/templates/mail/actions/bulk-archive.ts +32 -28
- package/corpus/templates/mail/actions/mark-read.ts +131 -20
- package/corpus/templates/mail/actions/mark-thread-read.ts +1 -1
- package/corpus/templates/mail/actions/move-email.ts +30 -24
- package/corpus/templates/mail/actions/send-email.ts +73 -68
- package/corpus/templates/mail/changelog/2026-07-15-unread-inbox-cleanup-now-completes-reliably.md +6 -0
- package/corpus/templates/mail/server/handlers/emails.ts +218 -209
- package/corpus/templates/mail/server/lib/bulk-mark-read.ts +30 -0
- package/corpus/templates/mail/server/lib/email-state.ts +198 -113
- package/corpus/templates/mail/server/lib/google-auth.ts +218 -25
- package/corpus/templates/mail/server/lib/jobs.ts +69 -74
- package/corpus/templates/mail/server/lib/local-email-store.ts +265 -0
- package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +1 -1
- package/corpus/templates/slides/actions/import-file.ts +4 -1
- package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
- package/corpus/templates/slides/app/components/editor/ImageSearchPanel.tsx +9 -12
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +29 -21
- package/corpus/templates/slides/app/i18n/ar-SA.ts +1 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +1 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +1 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +1 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +1 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +1 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +1 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +1 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +1 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/slides/changelog/2026-07-15-image-search-and-generation-controls-now-use-the-registered-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-15-pdf-deck-references-can-be-imported-for-slide-inspiration-ag.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-15-stable-style-inspector-dock.md +6 -0
- package/dist/cli/content-local.d.ts +1 -0
- package/dist/cli/content-local.d.ts.map +1 -1
- package/dist/cli/content-local.js +75 -17
- package/dist/cli/content-local.js.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/skills-content/content-skill.d.ts +1 -1
- package/dist/cli/skills-content/content-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/content-skill.js +36 -25
- package/dist/cli/skills-content/content-skill.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +47 -14
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +5 -0
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +7 -0
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +8 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +4 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +10 -3
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +58 -6
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/asset-picker-url.d.ts +16 -0
- package/dist/client/composer/asset-picker-url.d.ts.map +1 -0
- package/dist/client/composer/asset-picker-url.js +64 -0
- package/dist/client/composer/asset-picker-url.js.map +1 -0
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +17 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +6 -1
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/local-artifacts/index.d.ts +10 -0
- package/dist/local-artifacts/index.d.ts.map +1 -1
- package/dist/local-artifacts/index.js +39 -0
- package/dist/local-artifacts/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/docs/content/local-file-mode.mdx +99 -489
- package/docs/content/locales/ar-SA/local-file-mode.mdx +35 -490
- package/docs/content/locales/ar-SA/template-content.mdx +10 -24
- package/docs/content/locales/de-DE/local-file-mode.mdx +37 -491
- package/docs/content/locales/de-DE/template-content.mdx +10 -24
- package/docs/content/locales/es-ES/local-file-mode.mdx +35 -493
- package/docs/content/locales/es-ES/template-content.mdx +10 -24
- package/docs/content/locales/fr-FR/local-file-mode.mdx +38 -491
- package/docs/content/locales/fr-FR/template-content.mdx +10 -24
- package/docs/content/locales/hi-IN/local-file-mode.mdx +33 -492
- package/docs/content/locales/hi-IN/template-content.mdx +10 -24
- package/docs/content/locales/ja-JP/local-file-mode.mdx +36 -492
- package/docs/content/locales/ja-JP/template-content.mdx +10 -24
- package/docs/content/locales/ko-KR/local-file-mode.mdx +35 -490
- package/docs/content/locales/ko-KR/template-content.mdx +10 -24
- package/docs/content/locales/pt-BR/local-file-mode.mdx +35 -493
- package/docs/content/locales/pt-BR/template-content.mdx +10 -24
- package/docs/content/locales/zh-CN/local-file-mode.mdx +31 -489
- package/docs/content/locales/zh-CN/template-content.mdx +9 -24
- package/docs/content/locales/zh-TW/local-file-mode.mdx +31 -489
- package/docs/content/locales/zh-TW/template-content.mdx +9 -24
- package/docs/content/template-content.mdx +26 -42
- package/package.json +1 -1
- package/corpus/templates/assets/app/components/library/EditLibraryDialog.tsx +0 -126
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import {
|
|
3
|
+
getLocalArtifactApp,
|
|
4
|
+
listConfiguredLocalArtifactFiles,
|
|
5
|
+
readConfiguredLocalArtifactFile,
|
|
6
|
+
type LocalArtifactOptions,
|
|
7
|
+
} from "@agent-native/core/local-artifacts";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
|
|
10
|
+
import { parseContentSourceFile } from "../shared/content-source.js";
|
|
11
|
+
import connectLocalFolderSource from "./connect-local-folder-source.js";
|
|
12
|
+
import syncLocalFolderSource from "./sync-local-folder-source.js";
|
|
13
|
+
|
|
14
|
+
const CONTENT_LOCAL_DEFAULTS: LocalArtifactOptions["defaults"] = {
|
|
15
|
+
roots: [],
|
|
16
|
+
components: "components",
|
|
17
|
+
hide: ["**/_*.md", "**/_*.mdx"],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
function localOptions(): LocalArtifactOptions {
|
|
21
|
+
return { appId: "content", defaults: CONTENT_LOCAL_DEFAULTS };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export default defineAction({
|
|
25
|
+
description:
|
|
26
|
+
"Bootstrap a manifest-declared local-folder source through the trusted local server bridge into normal SQL-backed Content.",
|
|
27
|
+
schema: z.object({
|
|
28
|
+
connectionId: z.string().min(1).max(300),
|
|
29
|
+
file: z.string().optional(),
|
|
30
|
+
spaceId: z.string().optional(),
|
|
31
|
+
dryRun: z.boolean().optional().default(false),
|
|
32
|
+
}),
|
|
33
|
+
run: async ({ connectionId, file, spaceId, dryRun }) => {
|
|
34
|
+
const options = localOptions();
|
|
35
|
+
const app = await getLocalArtifactApp(options);
|
|
36
|
+
const root = app.roots.find(
|
|
37
|
+
(candidate) =>
|
|
38
|
+
candidate.source?.type === "local-folder" &&
|
|
39
|
+
candidate.source.connectionId === connectionId,
|
|
40
|
+
);
|
|
41
|
+
if (!root) {
|
|
42
|
+
throw new Error(
|
|
43
|
+
`Local folder connection "${connectionId}" is not declared in agent-native.json`,
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
const source = root.source;
|
|
47
|
+
if (!source || source.type !== "local-folder") {
|
|
48
|
+
throw new Error(`Local folder connection "${connectionId}" is invalid`);
|
|
49
|
+
}
|
|
50
|
+
const metadata = (await listConfiguredLocalArtifactFiles(options)).filter(
|
|
51
|
+
(candidate) => candidate.rootPath === root.path,
|
|
52
|
+
);
|
|
53
|
+
const files: Record<string, string> = {};
|
|
54
|
+
for (const candidate of metadata) {
|
|
55
|
+
const loaded = await readConfiguredLocalArtifactFile({
|
|
56
|
+
...options,
|
|
57
|
+
path: candidate.path,
|
|
58
|
+
});
|
|
59
|
+
if (loaded) files[candidate.path] = loaded.content;
|
|
60
|
+
}
|
|
61
|
+
if (file && !Object.prototype.hasOwnProperty.call(files, file)) {
|
|
62
|
+
throw new Error(`Local file "${file}" is not in the configured folder`);
|
|
63
|
+
}
|
|
64
|
+
const connection = await connectLocalFolderSource.run({
|
|
65
|
+
connectionId,
|
|
66
|
+
label: root.name,
|
|
67
|
+
spaceId,
|
|
68
|
+
createSourceBackedSpace: !spaceId,
|
|
69
|
+
truthPolicy: source.truthPolicy ?? "source_primary",
|
|
70
|
+
dryRun,
|
|
71
|
+
});
|
|
72
|
+
if (!connection.connected || !connection.sourceId) {
|
|
73
|
+
const parsed = Object.entries(files).map(([path, content]) =>
|
|
74
|
+
parseContentSourceFile(path, content),
|
|
75
|
+
);
|
|
76
|
+
const valid = parsed.filter((candidate) => !candidate.errors?.length);
|
|
77
|
+
return {
|
|
78
|
+
sourceId: null,
|
|
79
|
+
spaceId: null,
|
|
80
|
+
filesDatabaseId: null,
|
|
81
|
+
truthPolicy: source.truthPolicy ?? "source_primary",
|
|
82
|
+
dryRun: true,
|
|
83
|
+
filesSeen: parsed.length,
|
|
84
|
+
created: valid.map((candidate) => ({
|
|
85
|
+
id: candidate.id ?? "",
|
|
86
|
+
path: candidate.path,
|
|
87
|
+
title: candidate.title,
|
|
88
|
+
})),
|
|
89
|
+
updated: [],
|
|
90
|
+
unchanged: [],
|
|
91
|
+
conflicts: [],
|
|
92
|
+
outbound: [],
|
|
93
|
+
skipped: parsed.flatMap((candidate) =>
|
|
94
|
+
candidate.errors?.length
|
|
95
|
+
? [{ path: candidate.path, reason: candidate.errors.join(" ") }]
|
|
96
|
+
: [],
|
|
97
|
+
),
|
|
98
|
+
errors: parsed.flatMap((candidate) =>
|
|
99
|
+
candidate.errors?.length
|
|
100
|
+
? [{ path: candidate.path, reason: candidate.errors.join(" ") }]
|
|
101
|
+
: [],
|
|
102
|
+
),
|
|
103
|
+
idByPath: Object.fromEntries(
|
|
104
|
+
valid.map((candidate) => [candidate.path, candidate.id ?? ""]),
|
|
105
|
+
),
|
|
106
|
+
connectionId,
|
|
107
|
+
requestedFile: file ?? null,
|
|
108
|
+
requestedDocumentId: null,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const result = await syncLocalFolderSource.run({
|
|
112
|
+
sourceId: connection.sourceId,
|
|
113
|
+
files,
|
|
114
|
+
dryRun,
|
|
115
|
+
});
|
|
116
|
+
return {
|
|
117
|
+
...result,
|
|
118
|
+
connectionId,
|
|
119
|
+
requestedFile: file ?? null,
|
|
120
|
+
requestedDocumentId: file ? (result.idByPath[file] ?? null) : null,
|
|
121
|
+
};
|
|
122
|
+
},
|
|
123
|
+
});
|
|
@@ -66,7 +66,16 @@ const viewSchema = z.object({
|
|
|
66
66
|
id: z.string(),
|
|
67
67
|
name: z.string(),
|
|
68
68
|
type: z
|
|
69
|
-
.enum([
|
|
69
|
+
.enum([
|
|
70
|
+
"table",
|
|
71
|
+
"board",
|
|
72
|
+
"list",
|
|
73
|
+
"gallery",
|
|
74
|
+
"calendar",
|
|
75
|
+
"timeline",
|
|
76
|
+
"form",
|
|
77
|
+
"sidebar",
|
|
78
|
+
])
|
|
70
79
|
.default("table"),
|
|
71
80
|
sorts: z.array(sortSchema).default([]),
|
|
72
81
|
filters: z.array(filterSchema).default([]),
|
|
@@ -14,11 +14,6 @@ import type { DocumentUpdateResponse } from "../shared/api.js";
|
|
|
14
14
|
import { BUILDER_CMS_BODY_CONTENT_KEY } from "./_builder-cms-source-adapter.js";
|
|
15
15
|
import { reconcileInlineDatabasesForDocument } from "./_content-database-lifecycle.js";
|
|
16
16
|
import { serializeDocumentSource } from "./_document-source.js";
|
|
17
|
-
import {
|
|
18
|
-
isLocalDocumentId,
|
|
19
|
-
isContentLocalFileMode,
|
|
20
|
-
updateLocalFileDocument,
|
|
21
|
-
} from "./_local-file-documents.js";
|
|
22
17
|
|
|
23
18
|
// Not (yet) part of the shared API surface — kept local to avoid touching
|
|
24
19
|
// shared/api.ts, which another workstream owns concurrently. Structural
|
|
@@ -198,16 +193,6 @@ export default defineAction({
|
|
|
198
193
|
const isAgentCaller =
|
|
199
194
|
ctx?.caller === "tool" || ctx?.caller === "mcp" || ctx?.caller === "a2a";
|
|
200
195
|
|
|
201
|
-
if ((await isContentLocalFileMode()) && isLocalDocumentId(id)) {
|
|
202
|
-
const doc = await updateLocalFileDocument(id, args);
|
|
203
|
-
await writeAppState("refresh-signal", { ts: Date.now() });
|
|
204
|
-
return {
|
|
205
|
-
...doc,
|
|
206
|
-
urlPath: `/page/${doc.id}`,
|
|
207
|
-
softDeletedDatabaseIds: [],
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
|
|
211
196
|
const access = await assertAccess("document", id, "editor");
|
|
212
197
|
const existing = access.resource;
|
|
213
198
|
const ownerEmail = existing.ownerEmail as string;
|
|
@@ -37,14 +37,6 @@ import {
|
|
|
37
37
|
getDocumentContextPath,
|
|
38
38
|
serializeDatabaseMembership,
|
|
39
39
|
} from "./_database-utils.js";
|
|
40
|
-
import { serializeDocumentSource } from "./_document-source.js";
|
|
41
|
-
import {
|
|
42
|
-
getLocalFileDocument,
|
|
43
|
-
getLocalDocumentContextPath,
|
|
44
|
-
isContentLocalFileMode,
|
|
45
|
-
isLocalDocumentId,
|
|
46
|
-
localContentViewScreenSummary,
|
|
47
|
-
} from "./_local-file-documents.js";
|
|
48
40
|
import {
|
|
49
41
|
listPropertiesForDocument,
|
|
50
42
|
serializeDatabase,
|
|
@@ -659,53 +651,13 @@ export default defineAction({
|
|
|
659
651
|
run: async () => {
|
|
660
652
|
const navigation = await readAppStateForCurrentTab("navigation");
|
|
661
653
|
const localFilesState = await readAppState("local-files");
|
|
654
|
+
const contentSpaceState = await readAppState("content-space");
|
|
662
655
|
|
|
663
656
|
const screen: Record<string, unknown> = {};
|
|
664
657
|
if (navigation) screen.navigation = navigation;
|
|
658
|
+
if (contentSpaceState) screen.contentSpace = contentSpaceState;
|
|
665
659
|
|
|
666
660
|
const nav = navigation as NavigationState | null;
|
|
667
|
-
if (await isContentLocalFileMode()) {
|
|
668
|
-
screen.localFiles = {
|
|
669
|
-
...(await localContentViewScreenSummary()),
|
|
670
|
-
actions: [
|
|
671
|
-
"list-documents",
|
|
672
|
-
"get-document",
|
|
673
|
-
"create-document",
|
|
674
|
-
"update-document",
|
|
675
|
-
"delete-document",
|
|
676
|
-
"share-local-file-document",
|
|
677
|
-
],
|
|
678
|
-
};
|
|
679
|
-
if (nav?.documentId && isLocalDocumentId(nav.documentId)) {
|
|
680
|
-
screen.document = {
|
|
681
|
-
...(await getLocalFileDocument(nav.documentId)),
|
|
682
|
-
contextPath: await getLocalDocumentContextPath(nav.documentId),
|
|
683
|
-
};
|
|
684
|
-
} else if (nav?.documentId) {
|
|
685
|
-
const access = await resolveAccess("document", nav.documentId);
|
|
686
|
-
if (access) {
|
|
687
|
-
const doc = access.resource;
|
|
688
|
-
screen.document = {
|
|
689
|
-
id: doc.id,
|
|
690
|
-
parentId: doc.parentId,
|
|
691
|
-
title: doc.title,
|
|
692
|
-
content: doc.content,
|
|
693
|
-
description: doc.description,
|
|
694
|
-
icon: doc.icon,
|
|
695
|
-
position: doc.position,
|
|
696
|
-
isFavorite: parseDocumentFavorite(doc.isFavorite),
|
|
697
|
-
hideFromSearch: parseDocumentHideFromSearch(doc.hideFromSearch),
|
|
698
|
-
visibility: doc.visibility,
|
|
699
|
-
source: serializeDocumentSource(doc),
|
|
700
|
-
createdAt: doc.createdAt,
|
|
701
|
-
updatedAt: doc.updatedAt,
|
|
702
|
-
contextPath: await getDocumentContextPath(doc),
|
|
703
|
-
};
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
return screen;
|
|
707
|
-
}
|
|
708
|
-
|
|
709
661
|
const db = getDb();
|
|
710
662
|
|
|
711
663
|
if (nav?.view === "local-files") {
|
|
@@ -10,6 +10,8 @@ import {
|
|
|
10
10
|
IconH2,
|
|
11
11
|
IconH3,
|
|
12
12
|
IconH4,
|
|
13
|
+
IconH5,
|
|
14
|
+
IconH6,
|
|
13
15
|
IconList,
|
|
14
16
|
IconListNumbers,
|
|
15
17
|
IconSquareCheck,
|
|
@@ -77,7 +79,7 @@ interface EquationDraft {
|
|
|
77
79
|
position: EditorMenuPosition;
|
|
78
80
|
}
|
|
79
81
|
|
|
80
|
-
interface CommandItem {
|
|
82
|
+
export interface CommandItem {
|
|
81
83
|
title: string;
|
|
82
84
|
description: string;
|
|
83
85
|
searchText?: string;
|
|
@@ -114,11 +116,81 @@ function waitForEditorUpdateFrame() {
|
|
|
114
116
|
});
|
|
115
117
|
}
|
|
116
118
|
|
|
117
|
-
interface CommandTemplate extends Omit<
|
|
119
|
+
export interface CommandTemplate extends Omit<
|
|
120
|
+
CommandItem,
|
|
121
|
+
"title" | "description"
|
|
122
|
+
> {
|
|
118
123
|
titleKey: string;
|
|
119
124
|
descriptionKey: string;
|
|
120
125
|
}
|
|
121
126
|
|
|
127
|
+
export const CONTENT_HEADING_LEVELS = [1, 2, 3, 4, 5, 6] as const;
|
|
128
|
+
|
|
129
|
+
const headingCommandMetadata = [
|
|
130
|
+
{
|
|
131
|
+
level: 1,
|
|
132
|
+
titleKey: "editor.heading1",
|
|
133
|
+
descriptionKey: "editor.slash.heading1Description",
|
|
134
|
+
shortcut: "#",
|
|
135
|
+
icon: IconH1,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
level: 2,
|
|
139
|
+
titleKey: "editor.heading2",
|
|
140
|
+
descriptionKey: "editor.slash.heading2Description",
|
|
141
|
+
shortcut: "##",
|
|
142
|
+
icon: IconH2,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
level: 3,
|
|
146
|
+
titleKey: "editor.heading3",
|
|
147
|
+
descriptionKey: "editor.slash.heading3Description",
|
|
148
|
+
shortcut: "###",
|
|
149
|
+
icon: IconH3,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
level: 4,
|
|
153
|
+
titleKey: "editor.heading4",
|
|
154
|
+
descriptionKey: "editor.slash.heading4Description",
|
|
155
|
+
shortcut: "####",
|
|
156
|
+
icon: IconH4,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
level: 5,
|
|
160
|
+
titleKey: "editor.heading5",
|
|
161
|
+
descriptionKey: "editor.slash.heading5Description",
|
|
162
|
+
shortcut: "#####",
|
|
163
|
+
icon: IconH5,
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
level: 6,
|
|
167
|
+
titleKey: "editor.heading6",
|
|
168
|
+
descriptionKey: "editor.slash.heading6Description",
|
|
169
|
+
shortcut: "######",
|
|
170
|
+
icon: IconH6,
|
|
171
|
+
},
|
|
172
|
+
] as const satisfies ReadonlyArray<{
|
|
173
|
+
level: (typeof CONTENT_HEADING_LEVELS)[number];
|
|
174
|
+
titleKey: string;
|
|
175
|
+
descriptionKey: string;
|
|
176
|
+
shortcut: string;
|
|
177
|
+
icon: React.ElementType;
|
|
178
|
+
}>;
|
|
179
|
+
|
|
180
|
+
export function buildHeadingCommands(
|
|
181
|
+
behavior: "toggle" | "set",
|
|
182
|
+
): CommandTemplate[] {
|
|
183
|
+
return headingCommandMetadata.map((heading) => ({
|
|
184
|
+
...heading,
|
|
185
|
+
action: (editor) => {
|
|
186
|
+
const chain = editor.chain().focus();
|
|
187
|
+
return behavior === "toggle"
|
|
188
|
+
? chain.toggleHeading({ level: heading.level }).run()
|
|
189
|
+
: chain.setHeading({ level: heading.level }).run();
|
|
190
|
+
},
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
|
|
122
194
|
export function setPlainTextBlock(editor: Editor) {
|
|
123
195
|
const chain = editor.chain().focus();
|
|
124
196
|
if (typeof (chain as any).setParagraph === "function") {
|
|
@@ -239,38 +311,7 @@ const commands: CommandTemplate[] = [
|
|
|
239
311
|
icon: IconTypography,
|
|
240
312
|
action: setPlainTextBlock,
|
|
241
313
|
},
|
|
242
|
-
|
|
243
|
-
titleKey: "editor.heading1",
|
|
244
|
-
descriptionKey: "editor.slash.heading1Description",
|
|
245
|
-
shortcut: "#",
|
|
246
|
-
icon: IconH1,
|
|
247
|
-
action: (editor) =>
|
|
248
|
-
editor.chain().focus().toggleHeading({ level: 1 }).run(),
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
titleKey: "editor.heading2",
|
|
252
|
-
descriptionKey: "editor.slash.heading2Description",
|
|
253
|
-
shortcut: "##",
|
|
254
|
-
icon: IconH2,
|
|
255
|
-
action: (editor) =>
|
|
256
|
-
editor.chain().focus().toggleHeading({ level: 2 }).run(),
|
|
257
|
-
},
|
|
258
|
-
{
|
|
259
|
-
titleKey: "editor.heading3",
|
|
260
|
-
descriptionKey: "editor.slash.heading3Description",
|
|
261
|
-
shortcut: "###",
|
|
262
|
-
icon: IconH3,
|
|
263
|
-
action: (editor) =>
|
|
264
|
-
editor.chain().focus().toggleHeading({ level: 3 }).run(),
|
|
265
|
-
},
|
|
266
|
-
{
|
|
267
|
-
titleKey: "editor.heading4",
|
|
268
|
-
descriptionKey: "editor.slash.heading4Description",
|
|
269
|
-
shortcut: "####",
|
|
270
|
-
icon: IconH4,
|
|
271
|
-
action: (editor) =>
|
|
272
|
-
editor.chain().focus().toggleHeading({ level: 4 }).run(),
|
|
273
|
-
},
|
|
314
|
+
...buildHeadingCommands("toggle"),
|
|
274
315
|
{
|
|
275
316
|
titleKey: "editor.slash.bulletedList",
|
|
276
317
|
descriptionKey: "editor.slash.bulletedListDescription",
|
|
@@ -367,34 +408,7 @@ const turnIntoCommands: CommandTemplate[] = [
|
|
|
367
408
|
icon: IconTypography,
|
|
368
409
|
action: setPlainTextBlock,
|
|
369
410
|
},
|
|
370
|
-
|
|
371
|
-
titleKey: "editor.heading1",
|
|
372
|
-
descriptionKey: "editor.slash.heading1Description",
|
|
373
|
-
shortcut: "#",
|
|
374
|
-
icon: IconH1,
|
|
375
|
-
action: (editor) => editor.chain().focus().setHeading({ level: 1 }).run(),
|
|
376
|
-
},
|
|
377
|
-
{
|
|
378
|
-
titleKey: "editor.heading2",
|
|
379
|
-
descriptionKey: "editor.slash.heading2Description",
|
|
380
|
-
shortcut: "##",
|
|
381
|
-
icon: IconH2,
|
|
382
|
-
action: (editor) => editor.chain().focus().setHeading({ level: 2 }).run(),
|
|
383
|
-
},
|
|
384
|
-
{
|
|
385
|
-
titleKey: "editor.heading3",
|
|
386
|
-
descriptionKey: "editor.slash.heading3Description",
|
|
387
|
-
shortcut: "###",
|
|
388
|
-
icon: IconH3,
|
|
389
|
-
action: (editor) => editor.chain().focus().setHeading({ level: 3 }).run(),
|
|
390
|
-
},
|
|
391
|
-
{
|
|
392
|
-
titleKey: "editor.heading4",
|
|
393
|
-
descriptionKey: "editor.slash.heading4Description",
|
|
394
|
-
shortcut: "####",
|
|
395
|
-
icon: IconH4,
|
|
396
|
-
action: (editor) => editor.chain().focus().setHeading({ level: 4 }).run(),
|
|
397
|
-
},
|
|
411
|
+
...buildHeadingCommands("set"),
|
|
398
412
|
{
|
|
399
413
|
titleKey: "editor.slash.bulletedList",
|
|
400
414
|
descriptionKey: "editor.slash.bulletedListDescription",
|
|
@@ -116,6 +116,7 @@ import {
|
|
|
116
116
|
IconGripVertical,
|
|
117
117
|
IconLayoutKanban,
|
|
118
118
|
IconLayoutGrid,
|
|
119
|
+
IconLayoutSidebar,
|
|
119
120
|
IconList,
|
|
120
121
|
IconLock,
|
|
121
122
|
IconMinus,
|
|
@@ -248,6 +249,7 @@ import { VisualEditor } from "../VisualEditor";
|
|
|
248
249
|
import { DatabaseFormView } from "./FormView";
|
|
249
250
|
import { DatabaseGalleryView } from "./GalleryView";
|
|
250
251
|
import { DatabaseListView } from "./ListView";
|
|
252
|
+
import { DatabaseSidebarView } from "./sidebar";
|
|
251
253
|
import { DatabaseTimelineView } from "./TimelineView";
|
|
252
254
|
|
|
253
255
|
export interface DatabaseViewProps {
|
|
@@ -307,6 +309,7 @@ const DATABASE_VIEW_TYPES: ContentDatabaseViewType[] = [
|
|
|
307
309
|
"timeline",
|
|
308
310
|
"calendar",
|
|
309
311
|
"form",
|
|
312
|
+
"sidebar",
|
|
310
313
|
];
|
|
311
314
|
const DATABASE_OPEN_PAGES_IN: ContentDatabaseOpenPagesIn[] = [
|
|
312
315
|
"preview",
|
|
@@ -2010,6 +2013,27 @@ function DatabaseTable({
|
|
|
2010
2013
|
orderedProperties,
|
|
2011
2014
|
visibleItems,
|
|
2012
2015
|
]);
|
|
2016
|
+
const sidebarGroups = useMemo(
|
|
2017
|
+
() =>
|
|
2018
|
+
databaseVisibleGroups(
|
|
2019
|
+
databaseViewItemGroups(
|
|
2020
|
+
visibleItems,
|
|
2021
|
+
orderedProperties,
|
|
2022
|
+
activeView.groupByPropertyId,
|
|
2023
|
+
),
|
|
2024
|
+
activeView.hideEmptyGroups === true,
|
|
2025
|
+
),
|
|
2026
|
+
[
|
|
2027
|
+
activeView.groupByPropertyId,
|
|
2028
|
+
activeView.hideEmptyGroups,
|
|
2029
|
+
orderedProperties,
|
|
2030
|
+
visibleItems,
|
|
2031
|
+
],
|
|
2032
|
+
);
|
|
2033
|
+
const sidebarIsGrouped = useMemo(
|
|
2034
|
+
() => !!databaseViewGroupingProperty(activeView, orderedProperties),
|
|
2035
|
+
[activeView, orderedProperties],
|
|
2036
|
+
);
|
|
2013
2037
|
|
|
2014
2038
|
useEffect(() => {
|
|
2015
2039
|
if (!data?.database.id) return;
|
|
@@ -2433,6 +2457,22 @@ function DatabaseTable({
|
|
|
2433
2457
|
onDeletedPreviewItem={handleDeletedPreviewItem}
|
|
2434
2458
|
onOpenPage={openItemPage}
|
|
2435
2459
|
/>
|
|
2460
|
+
) : activeView.type === "sidebar" ? (
|
|
2461
|
+
<DatabaseSidebarView
|
|
2462
|
+
key={activeView.id}
|
|
2463
|
+
groups={sidebarGroups}
|
|
2464
|
+
grouped={sidebarIsGrouped}
|
|
2465
|
+
isLoading={isDatabaseViewLoading}
|
|
2466
|
+
hasActiveConstraints={hasResultConstraints}
|
|
2467
|
+
openPagesIn={activeView.openPagesIn ?? "preview"}
|
|
2468
|
+
loadingLabel={dbText("loadingList")}
|
|
2469
|
+
noMatchesLabel={dbText("noRowsMatchThisView")}
|
|
2470
|
+
clearLabel={dbText("clearSearchAndFilters")}
|
|
2471
|
+
navigationLabel={dbText("databasePagePreview")}
|
|
2472
|
+
untitledLabel={dbText("untitled")}
|
|
2473
|
+
onClearResultConstraints={clearSearchAndFilters}
|
|
2474
|
+
onPreview={previewItemPage}
|
|
2475
|
+
/>
|
|
2436
2476
|
) : activeView.type === "list" ? (
|
|
2437
2477
|
<DatabaseListView
|
|
2438
2478
|
properties={tableProperties}
|
|
@@ -7625,20 +7665,19 @@ function DatabaseSettingsSourcePanel({
|
|
|
7625
7665
|
source={secondary}
|
|
7626
7666
|
canEdit={canEdit}
|
|
7627
7667
|
pending={sourceActionPending}
|
|
7628
|
-
onAddDetails={() =>
|
|
7629
|
-
secondary
|
|
7630
|
-
|
|
7631
|
-
|
|
7632
|
-
|
|
7633
|
-
|
|
7634
|
-
|
|
7635
|
-
|
|
7636
|
-
|
|
7637
|
-
|
|
7638
|
-
|
|
7639
|
-
|
|
7640
|
-
|
|
7641
|
-
}
|
|
7668
|
+
onAddDetails={() => {
|
|
7669
|
+
if (!secondary || secondary.sourceType === "local-folder") return;
|
|
7670
|
+
onNavPush({
|
|
7671
|
+
kind: "keyConfirm",
|
|
7672
|
+
candidate: {
|
|
7673
|
+
sourceType: secondary.sourceType,
|
|
7674
|
+
sourceName: secondary.sourceName,
|
|
7675
|
+
sourceTable: secondary.sourceTable,
|
|
7676
|
+
displayName: secondary.sourceName,
|
|
7677
|
+
existingSourceId: secondary.id,
|
|
7678
|
+
},
|
|
7679
|
+
});
|
|
7680
|
+
}}
|
|
7642
7681
|
onAddItems={async () => {
|
|
7643
7682
|
if (!secondary) return;
|
|
7644
7683
|
await onChangeSourceRole(secondary.id, "items");
|
|
@@ -8151,12 +8190,17 @@ function DatabaseSettingsSourcePanel({
|
|
|
8151
8190
|
|
|
8152
8191
|
<SourceRoleCard
|
|
8153
8192
|
source={selectedSource}
|
|
8154
|
-
canAddDetails={
|
|
8155
|
-
|
|
8156
|
-
|
|
8193
|
+
canAddDetails={
|
|
8194
|
+
selectedSource.sourceType !== "local-folder" &&
|
|
8195
|
+
sources.some(
|
|
8196
|
+
(item) =>
|
|
8197
|
+
item.id !== selectedSource.id && !sourceAddsDetails(item),
|
|
8198
|
+
)
|
|
8199
|
+
}
|
|
8157
8200
|
canEdit={canEdit}
|
|
8158
8201
|
pending={selectedSourceRoleControlPending}
|
|
8159
|
-
onAddDetails={() =>
|
|
8202
|
+
onAddDetails={() => {
|
|
8203
|
+
if (selectedSource.sourceType === "local-folder") return;
|
|
8160
8204
|
onNavPush({
|
|
8161
8205
|
kind: "keyConfirm",
|
|
8162
8206
|
candidate: {
|
|
@@ -8166,8 +8210,8 @@ function DatabaseSettingsSourcePanel({
|
|
|
8166
8210
|
displayName: selectedSource.sourceName,
|
|
8167
8211
|
existingSourceId: selectedSource.id,
|
|
8168
8212
|
},
|
|
8169
|
-
})
|
|
8170
|
-
}
|
|
8213
|
+
});
|
|
8214
|
+
}}
|
|
8171
8215
|
onAddItems={async () => {
|
|
8172
8216
|
await onChangeSourceRole(selectedSource.id, "items");
|
|
8173
8217
|
onNavReplace([]);
|
|
@@ -12988,7 +13032,8 @@ function normalizeClientDatabaseView(
|
|
|
12988
13032
|
value.type === "gallery" ||
|
|
12989
13033
|
value.type === "calendar" ||
|
|
12990
13034
|
value.type === "timeline" ||
|
|
12991
|
-
value.type === "form"
|
|
13035
|
+
value.type === "form" ||
|
|
13036
|
+
value.type === "sidebar"
|
|
12992
13037
|
? value.type
|
|
12993
13038
|
: "table";
|
|
12994
13039
|
return createDatabaseView(
|
|
@@ -13524,6 +13569,7 @@ function databaseViewIcon(type: ContentDatabaseViewType) {
|
|
|
13524
13569
|
if (type === "calendar") return IconCalendar;
|
|
13525
13570
|
if (type === "timeline") return IconTimeline;
|
|
13526
13571
|
if (type === "form") return IconForms;
|
|
13572
|
+
if (type === "sidebar") return IconLayoutSidebar;
|
|
13527
13573
|
return IconTable;
|
|
13528
13574
|
}
|
|
13529
13575
|
|
|
@@ -13534,6 +13580,7 @@ function databaseViewDefaultName(type: ContentDatabaseViewType) {
|
|
|
13534
13580
|
if (type === "calendar") return "Calendar";
|
|
13535
13581
|
if (type === "timeline") return "Timeline";
|
|
13536
13582
|
if (type === "form") return "Form";
|
|
13583
|
+
if (type === "sidebar") return "Sidebar";
|
|
13537
13584
|
return "Table";
|
|
13538
13585
|
}
|
|
13539
13586
|
|
|
@@ -13584,7 +13631,8 @@ export function databaseViewGroupingProperty(
|
|
|
13584
13631
|
if (
|
|
13585
13632
|
view.type !== "table" &&
|
|
13586
13633
|
view.type !== "list" &&
|
|
13587
|
-
view.type !== "gallery"
|
|
13634
|
+
view.type !== "gallery" &&
|
|
13635
|
+
view.type !== "sidebar"
|
|
13588
13636
|
) {
|
|
13589
13637
|
return null;
|
|
13590
13638
|
}
|
|
@@ -768,20 +768,19 @@ function DatabaseSettingsSourcePanel({
|
|
|
768
768
|
source={secondary}
|
|
769
769
|
canEdit={canEdit}
|
|
770
770
|
pending={sourceActionPending}
|
|
771
|
-
onAddDetails={() =>
|
|
772
|
-
secondary
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
}
|
|
771
|
+
onAddDetails={() => {
|
|
772
|
+
if (!secondary || secondary.sourceType === "local-folder") return;
|
|
773
|
+
onNavPush({
|
|
774
|
+
kind: "keyConfirm",
|
|
775
|
+
candidate: {
|
|
776
|
+
sourceType: secondary.sourceType,
|
|
777
|
+
sourceName: secondary.sourceName,
|
|
778
|
+
sourceTable: secondary.sourceTable,
|
|
779
|
+
displayName: secondary.sourceName,
|
|
780
|
+
existingSourceId: secondary.id,
|
|
781
|
+
},
|
|
782
|
+
});
|
|
783
|
+
}}
|
|
785
784
|
onAddItems={async () => {
|
|
786
785
|
if (!secondary) return;
|
|
787
786
|
await onChangeSourceRole(secondary.id, "items");
|
|
@@ -1142,12 +1141,16 @@ function DatabaseSettingsSourcePanel({
|
|
|
1142
1141
|
|
|
1143
1142
|
<SourceRoleCard
|
|
1144
1143
|
source={source}
|
|
1145
|
-
canAddDetails={
|
|
1146
|
-
|
|
1147
|
-
|
|
1144
|
+
canAddDetails={
|
|
1145
|
+
source.sourceType !== "local-folder" &&
|
|
1146
|
+
sources.some(
|
|
1147
|
+
(item) => item.id !== source.id && !sourceAddsDetails(item),
|
|
1148
|
+
)
|
|
1149
|
+
}
|
|
1148
1150
|
canEdit={canEdit}
|
|
1149
1151
|
pending={sourceActionPending}
|
|
1150
|
-
onAddDetails={() =>
|
|
1152
|
+
onAddDetails={() => {
|
|
1153
|
+
if (source.sourceType === "local-folder") return;
|
|
1151
1154
|
onNavPush({
|
|
1152
1155
|
kind: "keyConfirm",
|
|
1153
1156
|
candidate: {
|
|
@@ -1157,8 +1160,8 @@ function DatabaseSettingsSourcePanel({
|
|
|
1157
1160
|
displayName: source.sourceName,
|
|
1158
1161
|
existingSourceId: source.id,
|
|
1159
1162
|
},
|
|
1160
|
-
})
|
|
1161
|
-
}
|
|
1163
|
+
});
|
|
1164
|
+
}}
|
|
1162
1165
|
onAddItems={async () => {
|
|
1163
1166
|
await onChangeSourceRole(source.id, "items");
|
|
1164
1167
|
onNavReplace([]);
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
IconFilter,
|
|
19
19
|
IconLayoutGrid,
|
|
20
20
|
IconLayoutKanban,
|
|
21
|
+
IconLayoutSidebar,
|
|
21
22
|
IconList,
|
|
22
23
|
IconMinus,
|
|
23
24
|
IconSearch,
|
|
@@ -71,6 +72,7 @@ export function databaseViewIcon(type: ContentDatabaseViewType) {
|
|
|
71
72
|
if (type === "calendar") return IconCalendar;
|
|
72
73
|
if (type === "timeline") return IconTimeline;
|
|
73
74
|
if (type === "form") return IconForms;
|
|
75
|
+
if (type === "sidebar") return IconLayoutSidebar;
|
|
74
76
|
return IconTable;
|
|
75
77
|
}
|
|
76
78
|
|