@jini-ai/admin 0.3.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/README.md +71 -37
- package/dist/agent-plugins/adapters/http.d.ts +7 -0
- package/dist/agent-plugins/adapters/http.js +15 -0
- package/dist/agent-plugins/adapters/memory.d.ts +8 -0
- package/dist/agent-plugins/adapters/memory.js +25 -0
- package/dist/agent-plugins/agent-plugins.module.d.ts +51 -0
- package/dist/agent-plugins/agent-plugins.module.js +6 -0
- package/dist/agent-plugins/conformance/agent-plugins-api.conformance.d.ts +12 -0
- package/dist/agent-plugins/conformance/agent-plugins-api.conformance.js +47 -0
- package/dist/agent-plugins/controllers/agent-plugin-files.controller.d.ts +20 -0
- package/dist/agent-plugins/controllers/agent-plugin-files.controller.js +43 -0
- package/dist/agent-plugins/controllers/agent-plugins.controller.d.ts +25 -0
- package/dist/agent-plugins/controllers/agent-plugins.controller.js +91 -0
- package/dist/agent-plugins/index.d.ts +9 -0
- package/dist/agent-plugins/index.js +9 -0
- package/dist/agent-plugins/messages.en.d.ts +23 -0
- package/dist/agent-plugins/messages.en.js +14 -0
- package/dist/agent-plugins/models.d.ts +57 -0
- package/dist/agent-plugins/models.js +2 -0
- package/dist/agent-plugins/package-file-tree.d.ts +111 -0
- package/dist/agent-plugins/package-file-tree.js +188 -0
- package/dist/agent-plugins/ports.d.ts +18 -0
- package/dist/agent-plugins/ports.js +3 -0
- package/dist/agent-plugins/react/components/AgentPluginFileContent.d.ts +5 -0
- package/dist/agent-plugins/react/components/AgentPluginFileContent.js +9 -0
- package/dist/agent-plugins/react/components/AgentPluginFileTree.d.ts +9 -0
- package/dist/agent-plugins/react/components/AgentPluginFileTree.js +7 -0
- package/dist/agent-plugins/react/components/AgentPluginInspector.d.ts +3 -0
- package/dist/agent-plugins/react/components/AgentPluginInspector.js +11 -0
- package/dist/agent-plugins/react/components/AgentPluginListPanel.d.ts +6 -0
- package/dist/agent-plugins/react/components/AgentPluginListPanel.js +10 -0
- package/dist/agent-plugins/react/components/AgentPluginRow.d.ts +5 -0
- package/dist/agent-plugins/react/components/AgentPluginRow.js +8 -0
- package/dist/agent-plugins/react/hooks/AgentPluginInspector.hooks.d.ts +90 -0
- package/dist/agent-plugins/react/hooks/AgentPluginInspector.hooks.js +74 -0
- package/dist/agent-plugins/react/hooks/AgentPluginPanel.hooks.d.ts +67 -0
- package/dist/agent-plugins/react/hooks/AgentPluginPanel.hooks.js +50 -0
- package/dist/agent-plugins/react/hooks/AgentPluginRow.hooks.d.ts +55 -0
- package/dist/agent-plugins/react/hooks/AgentPluginRow.hooks.js +6 -0
- package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.d.ts +64 -0
- package/dist/agent-plugins/react/hooks/AgentPluginsPage.hooks.js +39 -0
- package/dist/agent-plugins/react/hooks/AgentPluginsPorts.hooks.d.ts +7 -0
- package/dist/agent-plugins/react/hooks/AgentPluginsPorts.hooks.js +10 -0
- package/dist/agent-plugins/react/hooks/MarketplaceTab.hooks.d.ts +6 -0
- package/dist/agent-plugins/react/hooks/MarketplaceTab.hooks.js +3 -0
- package/dist/agent-plugins/react/index.d.ts +245 -0
- package/dist/agent-plugins/react/index.js +13 -0
- package/dist/agent-plugins/react/pages/AgentPluginsPage.d.ts +4 -0
- package/dist/agent-plugins/react/pages/AgentPluginsPage.js +12 -0
- package/dist/agent-plugins/react/tabs/DownloadedTab.d.ts +4 -0
- package/dist/agent-plugins/react/tabs/DownloadedTab.js +5 -0
- package/dist/agent-plugins/react/tabs/InstalledTab.d.ts +4 -0
- package/dist/agent-plugins/react/tabs/InstalledTab.js +5 -0
- package/dist/agent-plugins/react/tabs/MarketplaceTab.d.ts +4 -0
- package/dist/agent-plugins/react/tabs/MarketplaceTab.js +10 -0
- package/dist/agent-plugins/rules.d.ts +33 -0
- package/dist/agent-plugins/rules.js +51 -0
- package/dist/browser/index.d.ts +1 -0
- package/dist/browser/index.js +1 -0
- package/dist/browser/navigation.d.ts +19 -4
- package/dist/browser/navigation.js +8 -8
- package/dist/browser/shell-navigation.d.ts +12 -0
- package/dist/browser/shell-navigation.js +16 -0
- package/dist/contracts/credential-management.d.ts +8 -0
- package/dist/contracts/credential-management.js +3 -0
- package/dist/contracts/media-picker.d.ts +17 -0
- package/dist/contracts/media-picker.js +5 -0
- package/dist/contracts/playground-render-target.d.ts +18 -0
- package/dist/contracts/playground-render-target.js +3 -0
- package/dist/core/entities/rules.d.ts +138 -0
- package/dist/core/entities/rules.js +344 -0
- package/dist/core/gated/types.d.ts +8 -4
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +1 -0
- package/dist/core/manifest/rules.d.ts +24 -6
- package/dist/core/manifest/rules.js +12 -11
- package/dist/core/module/controller-store.d.ts +22 -0
- package/dist/core/module/controller-store.js +32 -0
- package/dist/core/module/create-admin.d.ts +41 -0
- package/dist/core/module/create-admin.js +187 -0
- package/dist/core/module/define-admin-module.d.ts +4 -0
- package/dist/core/module/define-admin-module.js +5 -0
- package/dist/core/module/index.d.ts +7 -0
- package/dist/core/module/index.js +4 -0
- package/dist/core/module/token.d.ts +19 -0
- package/dist/core/module/token.js +4 -0
- package/dist/core/module/types.d.ts +79 -0
- package/dist/core/module/types.js +2 -0
- package/dist/core/permissions/rules.d.ts +4 -1
- package/dist/core/permissions/rules.js +1 -1
- package/dist/core/ports/analytics.d.ts +1 -1
- package/dist/core/ports/auth.d.ts +2 -2
- package/dist/core/ports/comments.d.ts +9 -6
- package/dist/core/ports/database.d.ts +13 -10
- package/dist/core/ports/entities.d.ts +302 -0
- package/dist/core/ports/entities.js +47 -0
- package/dist/core/ports/forms.d.ts +19 -7
- package/dist/core/ports/identity.d.ts +42 -17
- package/dist/core/ports/index.d.ts +2 -0
- package/dist/core/ports/integrations.d.ts +9 -4
- package/dist/core/ports/media.d.ts +16 -7
- package/dist/core/ports/members.d.ts +7 -3
- package/dist/core/ports/menus.d.ts +43 -0
- package/dist/core/ports/menus.js +43 -0
- package/dist/core/ports/plugins.d.ts +3 -2
- package/dist/core/ports/recovery.d.ts +10 -6
- package/dist/core/ports/redirects.d.ts +17 -7
- package/dist/core/ports/seo.d.ts +12 -6
- package/dist/core/ports/shell.d.ts +41 -0
- package/dist/core/ports/shell.js +2 -0
- package/dist/core/ports/workspace.d.ts +3 -3
- package/dist/core/routing/rules.d.ts +17 -4
- package/dist/core/routing/rules.js +4 -4
- package/dist/core/transport/errors.d.ts +13 -4
- package/dist/core/transport/errors.js +4 -4
- package/dist/core/transport/http.d.ts +26 -16
- package/dist/core/transport/http.js +59 -21
- package/dist/core/transport/types.d.ts +26 -14
- package/dist/core/transport/types.js +9 -7
- package/dist/media/adapters/http.d.ts +27 -0
- package/dist/media/adapters/http.js +44 -0
- package/dist/media/adapters/memory.d.ts +11 -0
- package/dist/media/adapters/memory.js +139 -0
- package/dist/media/conformance/media-api.conformance.d.ts +7 -0
- package/dist/media/conformance/media-api.conformance.js +69 -0
- package/dist/media/controllers/edit-media.controller.d.ts +24 -0
- package/dist/media/controllers/edit-media.controller.js +69 -0
- package/dist/media/controllers/library.controller.d.ts +47 -0
- package/dist/media/controllers/library.controller.js +173 -0
- package/dist/media/controllers/providers.controller.d.ts +30 -0
- package/dist/media/controllers/providers.controller.js +76 -0
- package/dist/media/html-attributes.d.ts +82 -0
- package/dist/media/html-attributes.js +204 -0
- package/dist/media/index.d.ts +12 -0
- package/dist/media/index.js +9 -0
- package/dist/media/media.module.d.ts +83 -0
- package/dist/media/media.module.js +43 -0
- package/dist/media/messages.en.d.ts +24 -0
- package/dist/media/messages.en.js +24 -0
- package/dist/media/models.d.ts +72 -0
- package/dist/media/models.js +2 -0
- package/dist/media/ports.d.ts +75 -0
- package/dist/media/ports.js +7 -0
- package/dist/media/react/components/EditMediaPanel.d.ts +3 -0
- package/dist/media/react/components/EditMediaPanel.js +10 -0
- package/dist/media/react/components/MediaCard.d.ts +5 -0
- package/dist/media/react/components/MediaCard.js +17 -0
- package/dist/media/react/components/MediaDialog.d.ts +3 -0
- package/dist/media/react/components/MediaDialog.js +8 -0
- package/dist/media/react/components/MediaGrid.d.ts +4 -0
- package/dist/media/react/components/MediaGrid.js +8 -0
- package/dist/media/react/components/MediaIcons.d.ts +14 -0
- package/dist/media/react/components/MediaIcons.js +39 -0
- package/dist/media/react/components/MediaLightbox.d.ts +5 -0
- package/dist/media/react/components/MediaLightbox.js +12 -0
- package/dist/media/react/components/MediaPicker.d.ts +3 -0
- package/dist/media/react/components/MediaPicker.js +10 -0
- package/dist/media/react/components/MediaPurgeDialog.d.ts +4 -0
- package/dist/media/react/components/MediaPurgeDialog.js +9 -0
- package/dist/media/react/components/UploadButton.d.ts +3 -0
- package/dist/media/react/components/UploadButton.js +8 -0
- package/dist/media/react/hooks/EditMediaPanel.hooks.d.ts +84 -0
- package/dist/media/react/hooks/EditMediaPanel.hooks.js +105 -0
- package/dist/media/react/hooks/LibraryTab.hooks.d.ts +103 -0
- package/dist/media/react/hooks/LibraryTab.hooks.js +164 -0
- package/dist/media/react/hooks/MediaCard.hooks.d.ts +79 -0
- package/dist/media/react/hooks/MediaCard.hooks.js +63 -0
- package/dist/media/react/hooks/MediaDialog.hooks.d.ts +10 -0
- package/dist/media/react/hooks/MediaDialog.hooks.js +20 -0
- package/dist/media/react/hooks/MediaGrid.hooks.d.ts +28 -0
- package/dist/media/react/hooks/MediaGrid.hooks.js +6 -0
- package/dist/media/react/hooks/MediaLightbox.hooks.d.ts +27 -0
- package/dist/media/react/hooks/MediaLightbox.hooks.js +64 -0
- package/dist/media/react/hooks/MediaPage.hooks.d.ts +68 -0
- package/dist/media/react/hooks/MediaPage.hooks.js +68 -0
- package/dist/media/react/hooks/MediaPicker.hooks.d.ts +26 -0
- package/dist/media/react/hooks/MediaPicker.hooks.js +25 -0
- package/dist/media/react/hooks/MediaPorts.hooks.d.ts +9 -0
- package/dist/media/react/hooks/MediaPorts.hooks.js +10 -0
- package/dist/media/react/hooks/MediaPurgeDialog.hooks.d.ts +22 -0
- package/dist/media/react/hooks/MediaPurgeDialog.hooks.js +6 -0
- package/dist/media/react/hooks/ProvidersTab.hooks.d.ts +55 -0
- package/dist/media/react/hooks/ProvidersTab.hooks.js +124 -0
- package/dist/media/react/hooks/UploadButton.hooks.d.ts +48 -0
- package/dist/media/react/hooks/UploadButton.hooks.js +118 -0
- package/dist/media/react/index.d.ts +373 -0
- package/dist/media/react/index.js +73 -0
- package/dist/media/react/pages/MediaPage.d.ts +4 -0
- package/dist/media/react/pages/MediaPage.js +9 -0
- package/dist/media/react/tabs/LibraryTab.d.ts +4 -0
- package/dist/media/react/tabs/LibraryTab.js +14 -0
- package/dist/media/react/tabs/ProvidersTab.d.ts +4 -0
- package/dist/media/react/tabs/ProvidersTab.js +10 -0
- package/dist/media/rules.d.ts +80 -0
- package/dist/media/rules.js +127 -0
- package/dist/media/styles.d.ts +4 -0
- package/dist/media/styles.js +5 -0
- package/dist/playground/adapters/http.d.ts +8 -0
- package/dist/playground/adapters/http.js +4 -0
- package/dist/playground/adapters/memory.d.ts +10 -0
- package/dist/playground/adapters/memory.js +30 -0
- package/dist/playground/conformance/playground-api.conformance.d.ts +6 -0
- package/dist/playground/conformance/playground-api.conformance.js +37 -0
- package/dist/playground/controllers/playground.controller.d.ts +16 -0
- package/dist/playground/controllers/playground.controller.js +21 -0
- package/dist/playground/index.d.ts +7 -0
- package/dist/playground/index.js +5 -0
- package/dist/playground/messages.en.d.ts +9 -0
- package/dist/playground/messages.en.js +2 -0
- package/dist/playground/models.d.ts +4 -0
- package/dist/playground/models.js +2 -0
- package/dist/playground/playground.module.d.ts +31 -0
- package/dist/playground/playground.module.js +5 -0
- package/dist/playground/ports.d.ts +5 -0
- package/dist/playground/ports.js +2 -0
- package/dist/playground/react/components/Canvas.d.ts +3 -0
- package/dist/playground/react/components/Canvas.js +9 -0
- package/dist/playground/react/hooks/Canvas.hooks.d.ts +7 -0
- package/dist/playground/react/hooks/Canvas.hooks.js +18 -0
- package/dist/playground/react/hooks/PlaygroundPage.hooks.d.ts +8 -0
- package/dist/playground/react/hooks/PlaygroundPage.hooks.js +2 -0
- package/dist/playground/react/hooks/PlaygroundPorts.hooks.d.ts +4 -0
- package/dist/playground/react/hooks/PlaygroundPorts.hooks.js +6 -0
- package/dist/playground/react/index.d.ts +136 -0
- package/dist/playground/react/index.js +10 -0
- package/dist/playground/react/pages/PlaygroundPage.d.ts +4 -0
- package/dist/playground/react/pages/PlaygroundPage.js +11 -0
- package/dist/playground/react/tabs/CanvasTab.d.ts +4 -0
- package/dist/playground/react/tabs/CanvasTab.js +5 -0
- package/dist/playground/rules.d.ts +4 -0
- package/dist/playground/rules.js +2 -0
- package/dist/react/OverlayHost.d.ts +3 -0
- package/dist/react/OverlayHost.hooks.d.ts +9 -0
- package/dist/react/OverlayHost.hooks.js +9 -0
- package/dist/react/OverlayHost.js +7 -0
- package/dist/react/bind-react.d.ts +46 -0
- package/dist/react/bind-react.js +28 -0
- package/dist/react/components/ConfirmButton/ConfirmButton.hooks.d.ts +7 -1
- package/dist/react/components/ConfirmButton/ConfirmButton.hooks.js +2 -2
- package/dist/react/components/ConfirmButton/ConfirmButton.js +1 -1
- package/dist/react/components/ConfirmDialog/ConfirmDialog.d.ts +15 -3
- package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.d.ts +17 -3
- package/dist/react/components/ConfirmDialog/ConfirmDialog.hooks.js +3 -3
- package/dist/react/components/ConfirmDialog/ConfirmDialog.js +6 -6
- package/dist/react/components/InteractiveHtmlEditor/InteractiveHtmlEditor.d.ts +6 -2
- package/dist/react/components/InteractiveHtmlEditor/InteractiveHtmlEditor.js +7 -8
- package/dist/react/components/RowMenu/RowMenu.d.ts +5 -1
- package/dist/react/components/RowMenu/RowMenu.hooks.d.ts +8 -2
- package/dist/react/components/RowMenu/RowMenu.hooks.js +4 -4
- package/dist/react/components/RowMenu/RowMenu.js +6 -6
- package/dist/react/components/Sidebar.d.ts +1 -1
- package/dist/react/components/Sidebar.js +103 -7
- package/dist/react/entities/EntityCell.d.ts +10 -0
- package/dist/react/entities/EntityCell.js +18 -0
- package/dist/react/entities/EntityDetail.d.ts +3 -0
- package/dist/react/entities/EntityDetail.js +21 -0
- package/dist/react/entities/EntityEdit.d.ts +13 -0
- package/dist/react/entities/EntityEdit.js +45 -0
- package/dist/react/entities/EntityField.d.ts +20 -0
- package/dist/react/entities/EntityField.js +31 -0
- package/dist/react/entities/EntityIndex.d.ts +3 -0
- package/dist/react/entities/EntityIndex.js +10 -0
- package/dist/react/entities/EntityList.d.ts +7 -0
- package/dist/react/entities/EntityList.js +52 -0
- package/dist/react/entities/contribution.d.ts +26 -0
- package/dist/react/entities/contribution.js +78 -0
- package/dist/react/entities/index.d.ts +10 -0
- package/dist/react/entities/index.js +7 -0
- package/dist/react/entities/rules.d.ts +179 -0
- package/dist/react/entities/rules.js +224 -0
- package/dist/react/entities/types.d.ts +45 -0
- package/dist/react/entities/types.js +5 -0
- package/dist/react/entities/use-entity-edit.d.ts +35 -0
- package/dist/react/entities/use-entity-edit.js +98 -0
- package/dist/react/entities/use-entity-read.d.ts +22 -0
- package/dist/react/entities/use-entity-read.js +27 -0
- package/dist/react/hooks/use-nav-sections.d.ts +12 -3
- package/dist/react/hooks/use-nav-sections.js +14 -14
- package/dist/react/hooks/use-sidebar-rail.d.ts +7 -1
- package/dist/react/hooks/use-sidebar-rail.js +11 -11
- package/dist/react/index.d.ts +3 -1
- package/dist/react/index.js +5 -2
- package/dist/react/kit/Kit.hooks.d.ts +13 -0
- package/dist/react/kit/Kit.hooks.js +10 -0
- package/dist/react/kit/Native.hooks.d.ts +38 -0
- package/dist/react/kit/Native.hooks.js +65 -0
- package/dist/react/kit/index.d.ts +12 -0
- package/dist/react/kit/index.js +21 -0
- package/dist/react/kit/native.d.ts +3 -0
- package/dist/react/kit/native.js +21 -0
- package/dist/react/kit/types.d.ts +40 -0
- package/dist/react/kit/types.js +2 -0
- package/dist/react/overlay.d.ts +36 -0
- package/dist/react/overlay.js +35 -0
- package/dist/react/overlays.d.ts +38 -0
- package/dist/react/overlays.js +46 -0
- package/dist/react/shell/AdminShell.d.ts +9 -0
- package/dist/react/shell/AdminShell.hooks.d.ts +15 -0
- package/dist/react/shell/AdminShell.hooks.js +27 -0
- package/dist/react/shell/AdminShell.js +46 -0
- package/dist/react/shell/index.d.ts +7 -0
- package/dist/react/shell/index.js +5 -0
- package/dist/react/shell/model.d.ts +25 -0
- package/dist/react/shell/model.js +29 -0
- package/dist/react/shell/theme-ports.d.ts +28 -0
- package/dist/react/shell/theme-ports.js +2 -0
- package/dist/react/shell/types.d.ts +99 -0
- package/dist/react/shell/types.js +2 -0
- package/dist/react/shell/use-admin-shell-session.d.ts +13 -0
- package/dist/react/shell/use-admin-shell-session.js +81 -0
- package/dist/react/shell/use-admin-theme.d.ts +16 -0
- package/dist/react/shell/use-admin-theme.js +57 -0
- package/dist/react/types.d.ts +6 -4
- package/dist/react/types.js +2 -2
- package/dist/react/use-controller.d.ts +16 -0
- package/dist/react/use-controller.js +18 -0
- package/dist/security/adapters/http.d.ts +16 -0
- package/dist/security/adapters/http.js +94 -0
- package/dist/security/adapters/memory.d.ts +15 -0
- package/dist/security/adapters/memory.js +60 -0
- package/dist/security/conformance/security-api.conformance.d.ts +10 -0
- package/dist/security/conformance/security-api.conformance.js +48 -0
- package/dist/security/controllers/access-tokens.controller.d.ts +44 -0
- package/dist/security/controllers/access-tokens.controller.js +112 -0
- package/dist/security/controllers/other-credentials.controller.d.ts +30 -0
- package/dist/security/controllers/other-credentials.controller.js +74 -0
- package/dist/security/controllers/root-key.controller.d.ts +35 -0
- package/dist/security/controllers/root-key.controller.js +90 -0
- package/dist/security/index.d.ts +9 -0
- package/dist/security/index.js +9 -0
- package/dist/security/messages.en.d.ts +12 -0
- package/dist/security/messages.en.js +2 -0
- package/dist/security/models.d.ts +112 -0
- package/dist/security/models.js +2 -0
- package/dist/security/ports.d.ts +58 -0
- package/dist/security/ports.js +5 -0
- package/dist/security/react/components/CredentialEditor.d.ts +3 -0
- package/dist/security/react/components/CredentialEditor.js +8 -0
- package/dist/security/react/hooks/AccessTokensTab.hooks.d.ts +94 -0
- package/dist/security/react/hooks/AccessTokensTab.hooks.js +36 -0
- package/dist/security/react/hooks/CredentialEditor.hooks.d.ts +49 -0
- package/dist/security/react/hooks/CredentialEditor.hooks.js +14 -0
- package/dist/security/react/hooks/RootKeyTab.hooks.d.ts +29 -0
- package/dist/security/react/hooks/RootKeyTab.hooks.js +19 -0
- package/dist/security/react/hooks/SecurityPage.hooks.d.ts +17 -0
- package/dist/security/react/hooks/SecurityPage.hooks.js +12 -0
- package/dist/security/react/hooks/SecurityPorts.hooks.d.ts +9 -0
- package/dist/security/react/hooks/SecurityPorts.hooks.js +6 -0
- package/dist/security/react/index.d.ts +215 -0
- package/dist/security/react/index.js +10 -0
- package/dist/security/react/pages/SecurityPage.d.ts +4 -0
- package/dist/security/react/pages/SecurityPage.js +10 -0
- package/dist/security/react/tabs/AccessTokensTab.d.ts +4 -0
- package/dist/security/react/tabs/AccessTokensTab.js +10 -0
- package/dist/security/react/tabs/RootKeyTab.d.ts +4 -0
- package/dist/security/react/tabs/RootKeyTab.js +9 -0
- package/dist/security/rules.d.ts +57 -0
- package/dist/security/rules.js +63 -0
- package/dist/security/security.module.d.ts +45 -0
- package/dist/security/security.module.js +5 -0
- package/dist/source-control/adapters/http.d.ts +6 -0
- package/dist/source-control/adapters/http.js +13 -0
- package/dist/source-control/adapters/memory.d.ts +9 -0
- package/dist/source-control/adapters/memory.js +35 -0
- package/dist/source-control/conformance/source-control-api.conformance.d.ts +10 -0
- package/dist/source-control/conformance/source-control-api.conformance.js +48 -0
- package/dist/source-control/controllers/source-control.controller.d.ts +26 -0
- package/dist/source-control/controllers/source-control.controller.js +70 -0
- package/dist/source-control/index.d.ts +8 -0
- package/dist/source-control/index.js +6 -0
- package/dist/source-control/messages.en.d.ts +11 -0
- package/dist/source-control/messages.en.js +2 -0
- package/dist/source-control/models.d.ts +70 -0
- package/dist/source-control/models.js +2 -0
- package/dist/source-control/ports.d.ts +23 -0
- package/dist/source-control/ports.js +3 -0
- package/dist/source-control/react/components/SourceControlCredentialFields.d.ts +5 -0
- package/dist/source-control/react/components/SourceControlCredentialFields.js +8 -0
- package/dist/source-control/react/components/SourceControlProviderRow.d.ts +5 -0
- package/dist/source-control/react/components/SourceControlProviderRow.js +7 -0
- package/dist/source-control/react/hooks/ProvidersTab.hooks.d.ts +45 -0
- package/dist/source-control/react/hooks/ProvidersTab.hooks.js +20 -0
- package/dist/source-control/react/hooks/SourceControlCredentialFields.hooks.d.ts +43 -0
- package/dist/source-control/react/hooks/SourceControlCredentialFields.hooks.js +9 -0
- package/dist/source-control/react/hooks/SourceControlPage.hooks.d.ts +17 -0
- package/dist/source-control/react/hooks/SourceControlPage.hooks.js +5 -0
- package/dist/source-control/react/hooks/SourceControlPorts.hooks.d.ts +9 -0
- package/dist/source-control/react/hooks/SourceControlPorts.hooks.js +6 -0
- package/dist/source-control/react/index.d.ts +156 -0
- package/dist/source-control/react/index.js +10 -0
- package/dist/source-control/react/pages/SourceControlPage.d.ts +4 -0
- package/dist/source-control/react/pages/SourceControlPage.js +11 -0
- package/dist/source-control/react/tabs/ProvidersTab.d.ts +4 -0
- package/dist/source-control/react/tabs/ProvidersTab.js +10 -0
- package/dist/source-control/rules.d.ts +32 -0
- package/dist/source-control/rules.js +35 -0
- package/dist/source-control/source-control.module.d.ts +36 -0
- package/dist/source-control/source-control.module.js +6 -0
- package/package.json +207 -4
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
/** Reads a browser File at the React boundary; headless controllers only receive bytes. */
|
|
3
|
+
export function readMediaFile({ file }, { signal } = {}) {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
signal?.throwIfAborted();
|
|
6
|
+
const reader = new FileReader();
|
|
7
|
+
const abort = () => {
|
|
8
|
+
reader.abort();
|
|
9
|
+
reject(new Error('File read aborted'));
|
|
10
|
+
};
|
|
11
|
+
const cleanup = () => signal?.removeEventListener('abort', abort);
|
|
12
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
13
|
+
reader.onerror = () => {
|
|
14
|
+
cleanup();
|
|
15
|
+
reject(new Error('Failed to read file'));
|
|
16
|
+
};
|
|
17
|
+
reader.onload = () => {
|
|
18
|
+
cleanup();
|
|
19
|
+
const value = String(reader.result ?? '');
|
|
20
|
+
resolve({
|
|
21
|
+
filename: file.name,
|
|
22
|
+
contentType: file.type,
|
|
23
|
+
dataBase64: value.slice(value.indexOf(',') + 1),
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
reader.readAsDataURL(file);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function useUploadButton(props, _optional = {}) {
|
|
30
|
+
// Advisory picker formats mirror the host's standard ceiling, including video. The
|
|
31
|
+
// injected server still validates/sniffs bytes; a file picker is never a security boundary.
|
|
32
|
+
const inputRef = useRef(null);
|
|
33
|
+
const [selectedFiles, setSelectedFiles] = useState([]);
|
|
34
|
+
const [alt, setAlt] = useState(''), [busy, setBusy] = useState(false), [error, setError] = useState(null), [success, setSuccess] = useState(null);
|
|
35
|
+
const inFlight = useRef(false), lifetime = useRef(null);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
const abort = new AbortController();
|
|
38
|
+
lifetime.current = abort;
|
|
39
|
+
return () => abort.abort();
|
|
40
|
+
}, []);
|
|
41
|
+
function onFile(event) {
|
|
42
|
+
if (!inFlight.current && !props.disabled) {
|
|
43
|
+
setSelectedFiles(Array.from(event.currentTarget.files ?? []).slice(0, props.multiple === false ? 1 : undefined));
|
|
44
|
+
setError(null);
|
|
45
|
+
setSuccess(null);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function uploadFiles(files) {
|
|
49
|
+
if (!files.length || inFlight.current || props.disabled)
|
|
50
|
+
return;
|
|
51
|
+
const signal = lifetime.current?.signal;
|
|
52
|
+
inFlight.current = true;
|
|
53
|
+
setBusy(true);
|
|
54
|
+
setError(null);
|
|
55
|
+
setSuccess(null);
|
|
56
|
+
const uploaded = [];
|
|
57
|
+
let remaining = [...files];
|
|
58
|
+
try {
|
|
59
|
+
for (const file of files) {
|
|
60
|
+
const input = await readMediaFile({ file }, signal ? { signal } : {});
|
|
61
|
+
if (signal?.aborted)
|
|
62
|
+
return;
|
|
63
|
+
if (!await props.upload({ input, ...(alt.trim() ? { alt: alt.trim() } : {}) }))
|
|
64
|
+
throw new Error(`Upload failed for ${file.name}`);
|
|
65
|
+
if (signal?.aborted)
|
|
66
|
+
return;
|
|
67
|
+
uploaded.push(file.name);
|
|
68
|
+
remaining = remaining.slice(1);
|
|
69
|
+
}
|
|
70
|
+
setAlt('');
|
|
71
|
+
if (inputRef.current)
|
|
72
|
+
inputRef.current.value = '';
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (!signal?.aborted)
|
|
76
|
+
setError(error instanceof Error ? error.message : 'Upload failed');
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
inFlight.current = false;
|
|
80
|
+
if (!signal?.aborted) {
|
|
81
|
+
// Keep only failed/unattempted files: retry must not duplicate successes in a batch.
|
|
82
|
+
setSelectedFiles(remaining);
|
|
83
|
+
setBusy(false);
|
|
84
|
+
if (uploaded.length)
|
|
85
|
+
setSuccess(`Uploaded ${uploaded.join(', ')}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
alt,
|
|
91
|
+
withAlt: props.withAlt !== false,
|
|
92
|
+
multiple: props.multiple !== false,
|
|
93
|
+
chooseLabel: 'Choose file',
|
|
94
|
+
altLabel: props.multiple === false ? 'Alt text' : 'Upload alt text',
|
|
95
|
+
handles: props.label === 'Replace file'
|
|
96
|
+
? { toolbar: 'media-replace-toolbar', file: 'media-replace-file', alt: 'media-replace-alt', submit: 'media-replace-submit' }
|
|
97
|
+
: { toolbar: 'media-upload-toolbar', file: 'media-upload-file', alt: 'media-upload-alt', submit: 'media-upload-submit' },
|
|
98
|
+
selectedFileName: selectedFiles.map(file => file.name).join(', ') || 'No file chosen',
|
|
99
|
+
onUpload: () => { void uploadFiles(selectedFiles); },
|
|
100
|
+
onDragOver: (event) => { event.preventDefault(); },
|
|
101
|
+
onDrop: (event) => {
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
if (inFlight.current || props.disabled)
|
|
104
|
+
return;
|
|
105
|
+
const files = Array.from(event.dataTransfer.files).slice(0, props.multiple === false ? 1 : undefined);
|
|
106
|
+
setSelectedFiles(files);
|
|
107
|
+
void uploadFiles(files);
|
|
108
|
+
},
|
|
109
|
+
// An empty selection is a no-op, as on the original toolbar; Upload stays enabled.
|
|
110
|
+
uploadDisabled: busy || props.disabled === true,
|
|
111
|
+
setAlt: ({ value }) => setAlt(value),
|
|
112
|
+
inputRef, onFile, error, success,
|
|
113
|
+
disabled: busy || props.disabled === true,
|
|
114
|
+
onPress: () => inputRef.current?.click(),
|
|
115
|
+
label: props.label ?? 'Upload',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=UploadButton.hooks.js.map
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { OverlayPort } from '../../react/overlays.js';
|
|
3
|
+
import type { MediaApiPort } from '../ports.js';
|
|
4
|
+
import type { MediaPickerPort } from '../../contracts/media-picker.js';
|
|
5
|
+
export type { MediaPageProps } from './hooks/MediaPage.hooks.js';
|
|
6
|
+
export { useMediaPorts } from './hooks/MediaPorts.hooks.js';
|
|
7
|
+
/** One module factory per mounted admin scope. Tabs and even the picker are loaded on demand. */
|
|
8
|
+
export declare function media({ overlays }: {
|
|
9
|
+
overlays: OverlayPort;
|
|
10
|
+
}, { headerActions }?: {
|
|
11
|
+
headerActions?: ReactNode;
|
|
12
|
+
}): {
|
|
13
|
+
factories: {
|
|
14
|
+
mediaPicker: ({ ports, permissions, }: {
|
|
15
|
+
ports: Readonly<Record<string, unknown>>;
|
|
16
|
+
permissions: readonly string[];
|
|
17
|
+
}, _optional?: Record<string, never>) => MediaPickerPort & {
|
|
18
|
+
dispose(): void;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
id: "media";
|
|
22
|
+
requires: {
|
|
23
|
+
readonly mediaApi: import("../../core/module/token.js").AdminPortToken<MediaApiPort, "admin.media.api">;
|
|
24
|
+
};
|
|
25
|
+
optional: {
|
|
26
|
+
readonly mediaProviders: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaProvidersPort, "admin.media.providers">;
|
|
27
|
+
readonly mediaEvents: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaEventsPort, "admin.media.events">;
|
|
28
|
+
};
|
|
29
|
+
provides: {
|
|
30
|
+
readonly mediaPicker: import("../../core/module/token.js").AdminPortToken<MediaPickerPort, "admin.media.picker">;
|
|
31
|
+
};
|
|
32
|
+
messages: {
|
|
33
|
+
readonly media: "Media";
|
|
34
|
+
readonly all: "All";
|
|
35
|
+
readonly images: "Images";
|
|
36
|
+
readonly videos: "Videos";
|
|
37
|
+
readonly providers: "External Providers";
|
|
38
|
+
readonly upload: "Upload";
|
|
39
|
+
readonly title: "Title";
|
|
40
|
+
readonly alt: "Alt text";
|
|
41
|
+
readonly save: "Save";
|
|
42
|
+
readonly cancel: "Cancel";
|
|
43
|
+
readonly empty: "No media found";
|
|
44
|
+
readonly loading: "Loading media…";
|
|
45
|
+
readonly choose: "Choose media";
|
|
46
|
+
readonly trash: "Trash";
|
|
47
|
+
readonly purge: "Delete permanently";
|
|
48
|
+
readonly purgeWarning: "This permanently deletes the file. This cannot be undone.";
|
|
49
|
+
readonly edit: "Edit metadata";
|
|
50
|
+
readonly preview: "View larger";
|
|
51
|
+
readonly replace: "Replace file";
|
|
52
|
+
readonly unavailable: "Provider service unavailable";
|
|
53
|
+
readonly untyped: "Some assets have no recorded content type and only appear under All.";
|
|
54
|
+
};
|
|
55
|
+
pages: {
|
|
56
|
+
readonly library: {
|
|
57
|
+
readonly path: "/media";
|
|
58
|
+
readonly label: "Media";
|
|
59
|
+
readonly permissions: readonly ["media.read"];
|
|
60
|
+
readonly agentReachable: true;
|
|
61
|
+
readonly nav: {
|
|
62
|
+
readonly group: "content";
|
|
63
|
+
readonly icon: "image";
|
|
64
|
+
};
|
|
65
|
+
readonly tabs: {
|
|
66
|
+
readonly all: {
|
|
67
|
+
readonly label: "All";
|
|
68
|
+
readonly params: {
|
|
69
|
+
readonly filter: "all";
|
|
70
|
+
};
|
|
71
|
+
readonly agentReachable: true;
|
|
72
|
+
};
|
|
73
|
+
readonly images: {
|
|
74
|
+
readonly label: "Images";
|
|
75
|
+
readonly params: {
|
|
76
|
+
readonly filter: "images";
|
|
77
|
+
};
|
|
78
|
+
readonly agentReachable: true;
|
|
79
|
+
};
|
|
80
|
+
readonly videos: {
|
|
81
|
+
readonly label: "Videos";
|
|
82
|
+
readonly params: {
|
|
83
|
+
readonly filter: "videos";
|
|
84
|
+
};
|
|
85
|
+
readonly agentReachable: true;
|
|
86
|
+
};
|
|
87
|
+
readonly 'external-providers': {
|
|
88
|
+
readonly label: "External Providers";
|
|
89
|
+
readonly permissions: readonly ["media.providers"];
|
|
90
|
+
readonly optional: {
|
|
91
|
+
readonly mediaProviders: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaProvidersPort, "admin.media.providers">;
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
} & {
|
|
98
|
+
react: {
|
|
99
|
+
module: {
|
|
100
|
+
factories: {
|
|
101
|
+
mediaPicker: ({ ports, permissions, }: {
|
|
102
|
+
ports: Readonly<Record<string, unknown>>;
|
|
103
|
+
permissions: readonly string[];
|
|
104
|
+
}, _optional?: Record<string, never>) => MediaPickerPort & {
|
|
105
|
+
dispose(): void;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
id: "media";
|
|
109
|
+
requires: {
|
|
110
|
+
readonly mediaApi: import("../../core/module/token.js").AdminPortToken<MediaApiPort, "admin.media.api">;
|
|
111
|
+
};
|
|
112
|
+
optional: {
|
|
113
|
+
readonly mediaProviders: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaProvidersPort, "admin.media.providers">;
|
|
114
|
+
readonly mediaEvents: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaEventsPort, "admin.media.events">;
|
|
115
|
+
};
|
|
116
|
+
provides: {
|
|
117
|
+
readonly mediaPicker: import("../../core/module/token.js").AdminPortToken<MediaPickerPort, "admin.media.picker">;
|
|
118
|
+
};
|
|
119
|
+
messages: {
|
|
120
|
+
readonly media: "Media";
|
|
121
|
+
readonly all: "All";
|
|
122
|
+
readonly images: "Images";
|
|
123
|
+
readonly videos: "Videos";
|
|
124
|
+
readonly providers: "External Providers";
|
|
125
|
+
readonly upload: "Upload";
|
|
126
|
+
readonly title: "Title";
|
|
127
|
+
readonly alt: "Alt text";
|
|
128
|
+
readonly save: "Save";
|
|
129
|
+
readonly cancel: "Cancel";
|
|
130
|
+
readonly empty: "No media found";
|
|
131
|
+
readonly loading: "Loading media…";
|
|
132
|
+
readonly choose: "Choose media";
|
|
133
|
+
readonly trash: "Trash";
|
|
134
|
+
readonly purge: "Delete permanently";
|
|
135
|
+
readonly purgeWarning: "This permanently deletes the file. This cannot be undone.";
|
|
136
|
+
readonly edit: "Edit metadata";
|
|
137
|
+
readonly preview: "View larger";
|
|
138
|
+
readonly replace: "Replace file";
|
|
139
|
+
readonly unavailable: "Provider service unavailable";
|
|
140
|
+
readonly untyped: "Some assets have no recorded content type and only appear under All.";
|
|
141
|
+
};
|
|
142
|
+
pages: {
|
|
143
|
+
readonly library: {
|
|
144
|
+
readonly path: "/media";
|
|
145
|
+
readonly label: "Media";
|
|
146
|
+
readonly permissions: readonly ["media.read"];
|
|
147
|
+
readonly agentReachable: true;
|
|
148
|
+
readonly nav: {
|
|
149
|
+
readonly group: "content";
|
|
150
|
+
readonly icon: "image";
|
|
151
|
+
};
|
|
152
|
+
readonly tabs: {
|
|
153
|
+
readonly all: {
|
|
154
|
+
readonly label: "All";
|
|
155
|
+
readonly params: {
|
|
156
|
+
readonly filter: "all";
|
|
157
|
+
};
|
|
158
|
+
readonly agentReachable: true;
|
|
159
|
+
};
|
|
160
|
+
readonly images: {
|
|
161
|
+
readonly label: "Images";
|
|
162
|
+
readonly params: {
|
|
163
|
+
readonly filter: "images";
|
|
164
|
+
};
|
|
165
|
+
readonly agentReachable: true;
|
|
166
|
+
};
|
|
167
|
+
readonly videos: {
|
|
168
|
+
readonly label: "Videos";
|
|
169
|
+
readonly params: {
|
|
170
|
+
readonly filter: "videos";
|
|
171
|
+
};
|
|
172
|
+
readonly agentReachable: true;
|
|
173
|
+
};
|
|
174
|
+
readonly 'external-providers': {
|
|
175
|
+
readonly label: "External Providers";
|
|
176
|
+
readonly permissions: readonly ["media.providers"];
|
|
177
|
+
readonly optional: {
|
|
178
|
+
readonly mediaProviders: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaProvidersPort, "admin.media.providers">;
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
pages: {
|
|
186
|
+
readonly library: {
|
|
187
|
+
Page: import("react").LazyExoticComponent<import("react").ComponentType<import("../../react/bind-react.js").ModulePageProps>>;
|
|
188
|
+
tabs: {
|
|
189
|
+
readonly all: import("react").LazyExoticComponent<import("react").ComponentType<import("../../react/bind-react.js").TabViewProps>>;
|
|
190
|
+
readonly images: import("react").LazyExoticComponent<import("react").ComponentType<import("../../react/bind-react.js").TabViewProps>>;
|
|
191
|
+
readonly videos: import("react").LazyExoticComponent<import("react").ComponentType<import("../../react/bind-react.js").TabViewProps>>;
|
|
192
|
+
readonly 'external-providers': import("react").LazyExoticComponent<import("react").ComponentType<import("../../react/bind-react.js").TabViewProps>>;
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
Provider: ({ admin, children }: {
|
|
197
|
+
admin: import("../../core/module/types.js").AdminInstance;
|
|
198
|
+
children: ReactNode;
|
|
199
|
+
}, _optional?: Record<string, never>) => import("react").FunctionComponentElement<import("react").ProviderProps<import("../../core/module/types.js").ScopedPorts<{
|
|
200
|
+
factories: {
|
|
201
|
+
mediaPicker: ({ ports, permissions, }: {
|
|
202
|
+
ports: Readonly<Record<string, unknown>>;
|
|
203
|
+
permissions: readonly string[];
|
|
204
|
+
}, _optional?: Record<string, never>) => MediaPickerPort & {
|
|
205
|
+
dispose(): void;
|
|
206
|
+
};
|
|
207
|
+
};
|
|
208
|
+
id: "media";
|
|
209
|
+
requires: {
|
|
210
|
+
readonly mediaApi: import("../../core/module/token.js").AdminPortToken<MediaApiPort, "admin.media.api">;
|
|
211
|
+
};
|
|
212
|
+
optional: {
|
|
213
|
+
readonly mediaProviders: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaProvidersPort, "admin.media.providers">;
|
|
214
|
+
readonly mediaEvents: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaEventsPort, "admin.media.events">;
|
|
215
|
+
};
|
|
216
|
+
provides: {
|
|
217
|
+
readonly mediaPicker: import("../../core/module/token.js").AdminPortToken<MediaPickerPort, "admin.media.picker">;
|
|
218
|
+
};
|
|
219
|
+
messages: {
|
|
220
|
+
readonly media: "Media";
|
|
221
|
+
readonly all: "All";
|
|
222
|
+
readonly images: "Images";
|
|
223
|
+
readonly videos: "Videos";
|
|
224
|
+
readonly providers: "External Providers";
|
|
225
|
+
readonly upload: "Upload";
|
|
226
|
+
readonly title: "Title";
|
|
227
|
+
readonly alt: "Alt text";
|
|
228
|
+
readonly save: "Save";
|
|
229
|
+
readonly cancel: "Cancel";
|
|
230
|
+
readonly empty: "No media found";
|
|
231
|
+
readonly loading: "Loading media…";
|
|
232
|
+
readonly choose: "Choose media";
|
|
233
|
+
readonly trash: "Trash";
|
|
234
|
+
readonly purge: "Delete permanently";
|
|
235
|
+
readonly purgeWarning: "This permanently deletes the file. This cannot be undone.";
|
|
236
|
+
readonly edit: "Edit metadata";
|
|
237
|
+
readonly preview: "View larger";
|
|
238
|
+
readonly replace: "Replace file";
|
|
239
|
+
readonly unavailable: "Provider service unavailable";
|
|
240
|
+
readonly untyped: "Some assets have no recorded content type and only appear under All.";
|
|
241
|
+
};
|
|
242
|
+
pages: {
|
|
243
|
+
readonly library: {
|
|
244
|
+
readonly path: "/media";
|
|
245
|
+
readonly label: "Media";
|
|
246
|
+
readonly permissions: readonly ["media.read"];
|
|
247
|
+
readonly agentReachable: true;
|
|
248
|
+
readonly nav: {
|
|
249
|
+
readonly group: "content";
|
|
250
|
+
readonly icon: "image";
|
|
251
|
+
};
|
|
252
|
+
readonly tabs: {
|
|
253
|
+
readonly all: {
|
|
254
|
+
readonly label: "All";
|
|
255
|
+
readonly params: {
|
|
256
|
+
readonly filter: "all";
|
|
257
|
+
};
|
|
258
|
+
readonly agentReachable: true;
|
|
259
|
+
};
|
|
260
|
+
readonly images: {
|
|
261
|
+
readonly label: "Images";
|
|
262
|
+
readonly params: {
|
|
263
|
+
readonly filter: "images";
|
|
264
|
+
};
|
|
265
|
+
readonly agentReachable: true;
|
|
266
|
+
};
|
|
267
|
+
readonly videos: {
|
|
268
|
+
readonly label: "Videos";
|
|
269
|
+
readonly params: {
|
|
270
|
+
readonly filter: "videos";
|
|
271
|
+
};
|
|
272
|
+
readonly agentReachable: true;
|
|
273
|
+
};
|
|
274
|
+
readonly 'external-providers': {
|
|
275
|
+
readonly label: "External Providers";
|
|
276
|
+
readonly permissions: readonly ["media.providers"];
|
|
277
|
+
readonly optional: {
|
|
278
|
+
readonly mediaProviders: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaProvidersPort, "admin.media.providers">;
|
|
279
|
+
};
|
|
280
|
+
};
|
|
281
|
+
};
|
|
282
|
+
};
|
|
283
|
+
};
|
|
284
|
+
}> | null>>;
|
|
285
|
+
usePorts: (_required?: Record<string, never>, _optional?: Record<string, never>) => import("../../core/module/types.js").ScopedPorts<{
|
|
286
|
+
factories: {
|
|
287
|
+
mediaPicker: ({ ports, permissions, }: {
|
|
288
|
+
ports: Readonly<Record<string, unknown>>;
|
|
289
|
+
permissions: readonly string[];
|
|
290
|
+
}, _optional?: Record<string, never>) => MediaPickerPort & {
|
|
291
|
+
dispose(): void;
|
|
292
|
+
};
|
|
293
|
+
};
|
|
294
|
+
id: "media";
|
|
295
|
+
requires: {
|
|
296
|
+
readonly mediaApi: import("../../core/module/token.js").AdminPortToken<MediaApiPort, "admin.media.api">;
|
|
297
|
+
};
|
|
298
|
+
optional: {
|
|
299
|
+
readonly mediaProviders: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaProvidersPort, "admin.media.providers">;
|
|
300
|
+
readonly mediaEvents: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaEventsPort, "admin.media.events">;
|
|
301
|
+
};
|
|
302
|
+
provides: {
|
|
303
|
+
readonly mediaPicker: import("../../core/module/token.js").AdminPortToken<MediaPickerPort, "admin.media.picker">;
|
|
304
|
+
};
|
|
305
|
+
messages: {
|
|
306
|
+
readonly media: "Media";
|
|
307
|
+
readonly all: "All";
|
|
308
|
+
readonly images: "Images";
|
|
309
|
+
readonly videos: "Videos";
|
|
310
|
+
readonly providers: "External Providers";
|
|
311
|
+
readonly upload: "Upload";
|
|
312
|
+
readonly title: "Title";
|
|
313
|
+
readonly alt: "Alt text";
|
|
314
|
+
readonly save: "Save";
|
|
315
|
+
readonly cancel: "Cancel";
|
|
316
|
+
readonly empty: "No media found";
|
|
317
|
+
readonly loading: "Loading media…";
|
|
318
|
+
readonly choose: "Choose media";
|
|
319
|
+
readonly trash: "Trash";
|
|
320
|
+
readonly purge: "Delete permanently";
|
|
321
|
+
readonly purgeWarning: "This permanently deletes the file. This cannot be undone.";
|
|
322
|
+
readonly edit: "Edit metadata";
|
|
323
|
+
readonly preview: "View larger";
|
|
324
|
+
readonly replace: "Replace file";
|
|
325
|
+
readonly unavailable: "Provider service unavailable";
|
|
326
|
+
readonly untyped: "Some assets have no recorded content type and only appear under All.";
|
|
327
|
+
};
|
|
328
|
+
pages: {
|
|
329
|
+
readonly library: {
|
|
330
|
+
readonly path: "/media";
|
|
331
|
+
readonly label: "Media";
|
|
332
|
+
readonly permissions: readonly ["media.read"];
|
|
333
|
+
readonly agentReachable: true;
|
|
334
|
+
readonly nav: {
|
|
335
|
+
readonly group: "content";
|
|
336
|
+
readonly icon: "image";
|
|
337
|
+
};
|
|
338
|
+
readonly tabs: {
|
|
339
|
+
readonly all: {
|
|
340
|
+
readonly label: "All";
|
|
341
|
+
readonly params: {
|
|
342
|
+
readonly filter: "all";
|
|
343
|
+
};
|
|
344
|
+
readonly agentReachable: true;
|
|
345
|
+
};
|
|
346
|
+
readonly images: {
|
|
347
|
+
readonly label: "Images";
|
|
348
|
+
readonly params: {
|
|
349
|
+
readonly filter: "images";
|
|
350
|
+
};
|
|
351
|
+
readonly agentReachable: true;
|
|
352
|
+
};
|
|
353
|
+
readonly videos: {
|
|
354
|
+
readonly label: "Videos";
|
|
355
|
+
readonly params: {
|
|
356
|
+
readonly filter: "videos";
|
|
357
|
+
};
|
|
358
|
+
readonly agentReachable: true;
|
|
359
|
+
};
|
|
360
|
+
readonly 'external-providers': {
|
|
361
|
+
readonly label: "External Providers";
|
|
362
|
+
readonly permissions: readonly ["media.providers"];
|
|
363
|
+
readonly optional: {
|
|
364
|
+
readonly mediaProviders: import("../../core/module/token.js").AdminPortToken<import("../ports.js").MediaProvidersPort, "admin.media.providers">;
|
|
365
|
+
};
|
|
366
|
+
};
|
|
367
|
+
};
|
|
368
|
+
};
|
|
369
|
+
};
|
|
370
|
+
}>;
|
|
371
|
+
};
|
|
372
|
+
};
|
|
373
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { createElement } from 'react';
|
|
2
|
+
import { bindReact } from '../../react/bind-react.js';
|
|
3
|
+
import { mediaModule } from '../media.module.js';
|
|
4
|
+
import { MediaPortsContext } from './hooks/MediaPorts.hooks.js';
|
|
5
|
+
export { useMediaPorts } from './hooks/MediaPorts.hooks.js';
|
|
6
|
+
/** One module factory per mounted admin scope. Tabs and even the picker are loaded on demand. */
|
|
7
|
+
export function media({ overlays }, { headerActions } = {}) {
|
|
8
|
+
const module = {
|
|
9
|
+
...mediaModule,
|
|
10
|
+
factories: {
|
|
11
|
+
mediaPicker: ({ ports, permissions, }, _optional = {}) => {
|
|
12
|
+
const pending = new Set();
|
|
13
|
+
let disposed = false;
|
|
14
|
+
return {
|
|
15
|
+
async pick({ accept }, { signal } = {}) {
|
|
16
|
+
if (disposed)
|
|
17
|
+
return null;
|
|
18
|
+
if (!permissions.includes('media.read'))
|
|
19
|
+
throw new Error('Permission denied: media.read');
|
|
20
|
+
const abort = new AbortController();
|
|
21
|
+
pending.add(abort);
|
|
22
|
+
const onAbort = () => abort.abort();
|
|
23
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
24
|
+
if (signal?.aborted)
|
|
25
|
+
abort.abort();
|
|
26
|
+
try {
|
|
27
|
+
const { MediaPicker } = await import('./components/MediaPicker.js');
|
|
28
|
+
if (abort.signal.aborted)
|
|
29
|
+
return null;
|
|
30
|
+
return await overlays.open({
|
|
31
|
+
render: ({ resolve, cancel }) => createElement(MediaPicker, {
|
|
32
|
+
api: ports.mediaApi,
|
|
33
|
+
accept,
|
|
34
|
+
onChoose: resolve,
|
|
35
|
+
onClose: cancel,
|
|
36
|
+
}),
|
|
37
|
+
}, { signal: abort.signal });
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
signal?.removeEventListener('abort', onAbort);
|
|
41
|
+
pending.delete(abort);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
dispose() {
|
|
45
|
+
disposed = true;
|
|
46
|
+
for (const abort of pending)
|
|
47
|
+
abort.abort();
|
|
48
|
+
pending.clear();
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const react = bindReact({
|
|
55
|
+
module,
|
|
56
|
+
views: {
|
|
57
|
+
library: {
|
|
58
|
+
page: async () => {
|
|
59
|
+
const { MediaPage } = await import('./pages/MediaPage.js');
|
|
60
|
+
return { default: (props) => createElement(MediaPage, { ...props, headerActions }) };
|
|
61
|
+
},
|
|
62
|
+
tabs: {
|
|
63
|
+
all: () => import('./tabs/LibraryTab.js'),
|
|
64
|
+
images: () => import('./tabs/LibraryTab.js'),
|
|
65
|
+
videos: () => import('./tabs/LibraryTab.js'),
|
|
66
|
+
'external-providers': () => import('./tabs/ProvidersTab.js'),
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
}, { context: MediaPortsContext });
|
|
71
|
+
return Object.assign(module, { react });
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Suspense } from 'react';
|
|
3
|
+
import { MediaLibraryContext, useMediaPage } from '../hooks/MediaPage.hooks.js';
|
|
4
|
+
export function MediaPage(props, _optional = {}) {
|
|
5
|
+
const vm = useMediaPage(props);
|
|
6
|
+
return (_jsxs("section", { className: "jini-page", "data-jini-part": "media.page", children: [_jsxs("header", { className: "jini-page-header", "data-jini-part": "media.header", children: [_jsxs("div", { className: "jini-page-header-text", children: [_jsx("p", { className: "jini-page-kicker", "data-jini-part": "media.header.eyebrow", children: "Content" }), _jsx("h1", { className: "jini-page-title", "data-agent-element": "media-header", children: props.description.label }), _jsx("p", { className: "jini-page-description", "data-jini-part": "media.header.subtitle", children: "Upload and manage image and video assets used across the site." })] }), !vm.denied && _jsx("div", { className: "jini-page-actions", "data-jini-part": "media.header.actions", children: vm.headerActions })] }), vm.denied ? (_jsx("p", { className: "jini-notice jini-notice-error", role: "alert", children: "Permission denied" })) : (_jsxs(_Fragment, { children: [_jsx("nav", { className: "jini-tab-bar", role: "tablist", "aria-label": "Media", children: vm.tabs.map((tab) => (_jsxs("button", { className: "jini-tab-bar-item", type: "button", role: "tab", "data-jini-part": "media.tab", "data-agent-element": tab.handle, "aria-selected": tab.selected, "aria-label": tab.label, onClick: tab.onPress, children: [_jsx("span", { className: "jini-tab-bar-icon", "aria-hidden": "true", children: tab.icon }), tab.label, tab.count != null && _jsx("span", { className: "jini-tab-bar-count", children: tab.count })] }, tab.id))) }), _jsx(MediaLibraryContext.Provider, { value: vm.library, children: _jsx(Suspense, { fallback: _jsx("p", { className: "jini-notice", role: "status", children: "Loading media\u2026" }), children: vm.ActiveTab && (_jsx(vm.ActiveTab, { params: vm.params, permissions: vm.permissions }, vm.activeId)) }) })] }))] }));
|
|
7
|
+
}
|
|
8
|
+
export default MediaPage;
|
|
9
|
+
//# sourceMappingURL=MediaPage.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Select, TextField } from '@jini-ai/ui-kit/react';
|
|
3
|
+
import { useLibraryTab } from '../hooks/LibraryTab.hooks.js';
|
|
4
|
+
import { MediaGrid } from '../components/MediaGrid.js';
|
|
5
|
+
import { UploadButton } from '../components/UploadButton.js';
|
|
6
|
+
import { EditMediaPanel } from '../components/EditMediaPanel.js';
|
|
7
|
+
import { MediaLightbox } from '../components/MediaLightbox.js';
|
|
8
|
+
import { MediaPurgeDialog } from '../components/MediaPurgeDialog.js';
|
|
9
|
+
export function LibraryTab(props, _optional = {}) {
|
|
10
|
+
const vm = useLibraryTab(props);
|
|
11
|
+
return (_jsxs("section", { className: "jini-media-library", "data-jini-part": "media.library", children: [vm.canUpload && _jsx(UploadButton, { upload: vm.upload, disabled: vm.busy }), _jsx("div", { className: "jini-media-order-control", children: _jsx(Select, { label: "Order by", attrs: { 'data-jini-part': 'media.sort', 'data-agent-element': 'media-order-by' }, value: vm.orderBy, onValueChange: vm.onOrder, options: [{ value: 'created', label: 'Created (newest first)' }, { value: 'alphabetical', label: 'Alphabetical (A–Z)' }] }) }), _jsxs("div", { className: "jini-media-library-filters", hidden: true, children: [_jsx(TextField, { attrs: { 'data-jini-part': 'media.search', 'data-agent-element': 'media-search' }, label: "Search media", value: vm.search, onValueChange: vm.onSearch }), _jsx(Select, { label: "Status", value: vm.statusFilter, onValueChange: vm.onStatus, options: [{ value: 'all', label: 'All statuses' }, { value: 'active', label: 'Active' }, { value: 'trashed', label: 'Trash' }] })] }), _jsx("p", { className: "jini-media-success", role: "status", "aria-live": "polite", "aria-atomic": "true", children: vm.success }), vm.untyped && _jsx("p", { className: "jini-notice", children: vm.t.untyped }), vm.snapshot?.error && _jsxs("div", { className: "jini-notice jini-notice-error", children: [_jsx("p", { className: "jini-notice-text", role: "alert", children: vm.snapshot.error }), _jsx(Button, { onPress: vm.onRetry, children: "Retry" })] }), vm.loading ? (_jsx("p", { className: "jini-notice", role: "status", children: vm.t.loading })) : (_jsx(MediaGrid, { gridRef: vm.gridRef, emptyLabel: vm.emptyLabel, actions: vm.actions, api: vm.mediaApi })), _jsx(MediaLightbox, { items: vm.items, api: vm.mediaApi, activeIndex: vm.lightboxIndex, onNavigate: vm.onNavigate, onClose: vm.closeLightbox }), vm.editing && (_jsx(EditMediaPanel, { api: vm.mediaApi, item: vm.editing, onSaved: vm.saved, onClose: vm.closeEdit }, vm.editing.id)), _jsx(MediaPurgeDialog, { open: !!vm.snapshot?.pendingPurge, pending: vm.busy, ...(vm.snapshot?.pendingPurge ? { filename: vm.snapshot.pendingPurge.title } : {}), onCancel: vm.cancelPurge, onConfirm: vm.confirmPurge })] }));
|
|
12
|
+
}
|
|
13
|
+
export default LibraryTab;
|
|
14
|
+
//# sourceMappingURL=LibraryTab.js.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Fragment } from 'react';
|
|
3
|
+
import { useProvidersTab } from '../hooks/ProvidersTab.hooks.js';
|
|
4
|
+
import { EyeIcon, HiddenEyeIcon, ReloadIcon } from '../components/MediaIcons.js';
|
|
5
|
+
export function ProvidersTab(_props, _optional = {}) {
|
|
6
|
+
const vm = useProvidersTab();
|
|
7
|
+
return _jsxs("section", { className: "jini-media-providers-panel jini-settings-section jini-settings-media-providers", "data-jini-part": "media.providers", "data-theme": "light", children: [_jsxs("div", { className: "jini-section-head", children: [_jsxs("div", { children: [_jsx("h4", { children: "Media providers" }), _jsx("p", { className: "jini-hint", children: "Credentials this host uses to generate images and video." })] }), _jsxs("button", { type: "button", className: "jini-button jini-button-ghost", "data-agent-element": "media-providers-reload", onClick: vm.reload, disabled: vm.reloadDisabled, children: [_jsx(ReloadIcon, {}), _jsx("span", { children: vm.reloadLabel })] })] }), vm.unreachable && _jsx("p", { className: "jini-hint jini-hint-error", role: "alert", children: "Could not reach the server. Showing local changes only." }), vm.empty && _jsx("p", { className: "jini-hint", children: "No media providers configured yet." }), _jsx("div", { className: "jini-media-provider-list", children: vm.rows.map(row => _jsxs(Fragment, { children: [row.divider && _jsx("hr", { className: "jini-media-provider-divider" }), _jsxs("article", { className: "jini-media-provider-card", children: [_jsxs("div", { className: "jini-media-provider-card-head", children: [_jsx("strong", { className: "jini-media-provider-name", children: row.label }), row.statusLabel && _jsx("span", { className: row.statusClassName, children: row.statusLabel })] }), _jsxs("div", { className: "jini-media-provider-fields", children: [_jsxs("label", { className: "jini-media-provider-field jini-media-provider-field--secret", children: [_jsxs("span", { className: "jini-field-label jini-sr-only", children: [row.label, " credential"] }), _jsx("input", { className: "jini-input", ...row.credentialAttrs, autoComplete: "new-password", spellCheck: false, type: row.credentialType, placeholder: row.credentialPlaceholder, value: row.credential, onChange: row.onCredential, disabled: vm.disabled }), _jsx("button", { type: "button", className: "jini-input-affix-btn", "aria-label": row.toggleLabel, "aria-pressed": row.visible, onClick: row.toggle, disabled: vm.disabled, children: row.visible ? _jsx(HiddenEyeIcon, {}) : _jsx(EyeIcon, {}) })] }), _jsxs("label", { className: "jini-media-provider-field", children: [_jsx("span", { className: "jini-field-label jini-sr-only", children: row.baseUrlLabel }), _jsx("input", { className: "jini-input", "aria-label": row.baseUrlLabel, placeholder: row.baseUrlPlaceholder, type: "url", inputMode: "url", spellCheck: false, "aria-invalid": row.ariaInvalid, value: row.baseUrl, onChange: row.onBaseUrl, disabled: vm.settingsDisabled })] }), row.hasModels && _jsxs("label", { className: "jini-media-provider-field", children: [_jsx("span", { className: "jini-field-label jini-sr-only", children: row.modelLabel }), _jsx("input", { className: "jini-input", "aria-label": row.modelLabel, list: row.modelsId, placeholder: "Default model", spellCheck: false, value: row.model, onChange: row.onModel, disabled: vm.settingsDisabled }), _jsx("datalist", { id: row.modelsId, children: row.models?.map(model => _jsx("option", { value: model }, model)) })] }), _jsx("button", { type: "button", className: "jini-button jini-button-ghost", "data-jini-part": "media.provider.remove", "aria-label": row.clearLabel, onClick: row.clear, disabled: row.clearDisabled, children: "Clear" })] }), row.hint && _jsx("span", { className: row.hintClassName, role: row.hintRole, children: row.hint })] })] }, row.id)) }), _jsxs("div", { className: "jini-media-provider-save-row", children: [_jsx("button", { type: "button", className: "jini-button", "data-jini-part": "media.provider.save", "data-agent-element": "media-providers-save", onClick: vm.save, disabled: vm.saveDisabled, children: vm.saveLabel }), vm.saved && _jsx("span", { className: "jini-hint", role: "status", children: "Saved." }), vm.saveError && _jsx("span", { className: "jini-hint jini-hint-error", role: "alert", children: "Could not save media providers." })] })] });
|
|
8
|
+
}
|
|
9
|
+
export default ProvidersTab;
|
|
10
|
+
//# sourceMappingURL=ProvidersTab.js.map
|