@solidxai/core-ui 0.1.20-beta.0 → 0.1.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/common/Link.d.ts.map +1 -1
- package/dist/components/common/Link.js +2 -1
- package/dist/components/common/Link.js.map +1 -1
- package/dist/components/common/Link.tsx +2 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts +1 -0
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +109 -23
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +155 -34
- package/dist/components/core/chatter/SolidChatter.js +2 -2
- package/dist/components/core/chatter/SolidChatter.js.map +1 -1
- package/dist/components/core/chatter/SolidChatter.tsx +2 -2
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js +20 -19
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.js.map +1 -1
- package/dist/components/core/common/SolidGenericImport/SolidImportTransaction.tsx +16 -16
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.js +36 -9
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction.tsx +78 -7
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.d.ts +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.d.ts.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.js +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.js.map +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction.tsx +1 -1
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.d.ts +4 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.js +131 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.js.map +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction.tsx +151 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.d.ts +4 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.d.ts.map +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.js +13 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.js.map +1 -0
- package/dist/components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction.tsx +20 -0
- package/dist/components/core/form/SolidFormView.d.ts.map +1 -1
- package/dist/components/core/form/SolidFormView.js +4 -0
- package/dist/components/core/form/SolidFormView.js.map +1 -1
- package/dist/components/core/form/SolidFormView.tsx +4 -0
- package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +50 -15
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +22 -3
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +16 -3
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +16 -2
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +4 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +4 -1
- package/dist/components/core/module/ModulePackageDialog.css +102 -0
- package/dist/components/core/module/ModulePackageDialog.d.ts +2 -1
- package/dist/components/core/module/ModulePackageDialog.d.ts.map +1 -1
- package/dist/components/core/module/ModulePackageDialog.js +216 -68
- package/dist/components/core/module/ModulePackageDialog.js.map +1 -1
- package/dist/components/core/module/ModulePackageDialog.tsx +356 -76
- package/dist/components/core/solid-agent/SolidAgentChat.d.ts.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentChat.js +9 -3
- package/dist/components/core/solid-agent/SolidAgentChat.js.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentChat.tsx +9 -4
- package/dist/components/core/solid-agent/SolidAgentMarkdown.d.ts.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentMarkdown.js +25 -6
- package/dist/components/core/solid-agent/SolidAgentMarkdown.js.map +1 -1
- package/dist/components/core/solid-agent/SolidAgentMarkdown.tsx +15 -1
- package/dist/components/core/solid-agent/client/agentRuntime.d.ts +5 -0
- package/dist/components/core/solid-agent/client/agentRuntime.d.ts.map +1 -1
- package/dist/components/core/solid-agent/client/agentRuntime.js +77 -20
- package/dist/components/core/solid-agent/client/agentRuntime.js.map +1 -1
- package/dist/components/core/solid-agent/client/agentRuntime.ts +29 -1
- package/dist/components/core/solid-agent/client/agentSocket.d.ts +5 -1
- package/dist/components/core/solid-agent/client/agentSocket.d.ts.map +1 -1
- package/dist/components/core/solid-agent/client/agentSocket.js +27 -4
- package/dist/components/core/solid-agent/client/agentSocket.js.map +1 -1
- package/dist/components/core/solid-agent/client/agentSocket.ts +14 -3
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js +2 -2
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.js.map +1 -1
- package/dist/components/core/solid-agent/embed/AgentEmbeddingPanel.tsx +5 -5
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts +2 -0
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.d.ts.map +1 -1
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js +2 -2
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.js.map +1 -1
- package/dist/components/core/solid-agent/embed/agentEmbedProtocol.ts +4 -4
- package/dist/components/core/solid-agent/thread/AgentThread.d.ts.map +1 -1
- package/dist/components/core/solid-agent/thread/AgentThread.js +61 -26
- package/dist/components/core/solid-agent/thread/AgentThread.js.map +1 -1
- package/dist/components/core/solid-agent/thread/AgentThread.tsx +74 -40
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts +2 -1
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.d.ts.map +1 -1
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js +2 -1
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.js.map +1 -1
- package/dist/components/core/solid-agent/thread/SolidAgentChatItem.tsx +3 -1
- package/dist/components/core/solid-agent/types.d.ts +3 -0
- package/dist/components/core/solid-agent/types.d.ts.map +1 -1
- package/dist/components/core/solid-agent/types.js +0 -9
- package/dist/components/core/solid-agent/types.js.map +1 -1
- package/dist/components/core/solid-agent/types.ts +4 -2
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.d.ts.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js +5 -2
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultAssistantMessageChatWidget.tsx +11 -5
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultErrorChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultNoticeChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultThinkingChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultToolCallChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultUnknownChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/DefaultUserMessageChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidChecklistChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidCodeChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidDiffListChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js +19 -0
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidGalleryChatWidget.tsx +20 -0
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidJsonChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidLinkCardChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidMarkdownChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidProgressChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidQuestionChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidStatusChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidTableChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js +3 -0
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.js.map +1 -1
- package/dist/components/core/solid-agent/widgets/SolidToolActivityChatWidget.tsx +4 -0
- package/dist/components/core/solid-agent/widgets/solidChatWidgets.module.css +9 -1
- package/dist/components/core/users/CreateUser.d.ts.map +1 -1
- package/dist/components/core/users/CreateUser.js +23 -8
- package/dist/components/core/users/CreateUser.js.map +1 -1
- package/dist/components/core/users/CreateUser.tsx +10 -6
- package/dist/components/layout/AdminTopHeader.js +2 -2
- package/dist/components/layout/AdminTopHeader.js.map +1 -1
- package/dist/components/layout/AdminTopHeader.tsx +2 -2
- package/dist/components/layout/AppSidebar.d.ts.map +1 -1
- package/dist/components/layout/AppSidebar.js +21 -5
- package/dist/components/layout/AppSidebar.js.map +1 -1
- package/dist/components/layout/AppSidebar.tsx +24 -6
- package/dist/components/layout/SolidAiStudioLayout.d.ts.map +1 -1
- package/dist/components/layout/SolidAiStudioLayout.js +3 -4
- package/dist/components/layout/SolidAiStudioLayout.js.map +1 -1
- package/dist/components/layout/SolidAiStudioLayout.tsx +3 -4
- package/dist/components/layout/user-profile-menu.js +10 -10
- package/dist/components/layout/user-profile-menu.js.map +1 -1
- package/dist/components/layout/user-profile-menu.tsx +3 -3
- package/dist/components/shad-cn-ui/SolidLightbox.d.ts +2 -1
- package/dist/components/shad-cn-ui/SolidLightbox.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidLightbox.js +11 -4
- package/dist/components/shad-cn-ui/SolidLightbox.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidLightbox.tsx +14 -1
- package/dist/helpers/modelViewPersistence.d.ts +2 -0
- package/dist/helpers/modelViewPersistence.d.ts.map +1 -1
- package/dist/helpers/modelViewPersistence.js +72 -0
- package/dist/helpers/modelViewPersistence.js.map +1 -1
- package/dist/helpers/modelViewPersistence.ts +79 -0
- package/dist/helpers/registry.d.ts +6 -2
- package/dist/helpers/registry.d.ts.map +1 -1
- package/dist/helpers/registry.js +68 -3
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/registry.ts +62 -4
- package/dist/hooks/useModelsDevModels.d.ts +43 -0
- package/dist/hooks/useModelsDevModels.d.ts.map +1 -0
- package/dist/hooks/useModelsDevModels.js +81 -0
- package/dist/hooks/useModelsDevModels.js.map +1 -0
- package/dist/hooks/useModelsDevModels.ts +106 -0
- package/dist/hooks/useRouter.d.ts.map +1 -1
- package/dist/hooks/useRouter.js +3 -2
- package/dist/hooks/useRouter.js.map +1 -1
- package/dist/hooks/useRouter.ts +3 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.ts +4 -1
- package/dist/modules/solidUiModule.d.ts +3 -2
- package/dist/modules/solidUiModule.d.ts.map +1 -1
- package/dist/modules/solidUiModule.js +1 -1
- package/dist/modules/solidUiModule.js.map +1 -1
- package/dist/modules/solidUiModule.ts +5 -1
- package/dist/redux/api/moduleApi.d.ts +12 -2
- package/dist/redux/api/moduleApi.d.ts.map +1 -1
- package/dist/redux/api/moduleApi.js +33 -3
- package/dist/redux/api/moduleApi.js.map +1 -1
- package/dist/redux/api/moduleApi.ts +17 -2
- package/dist/redux/api/solidChatterMessageApi.d.ts +3 -1
- package/dist/redux/api/solidChatterMessageApi.d.ts.map +1 -1
- package/dist/redux/api/solidChatterMessageApi.js +9 -1
- package/dist/redux/api/solidChatterMessageApi.js.map +1 -1
- package/dist/redux/api/solidChatterMessageApi.ts +9 -1
- package/dist/redux/store/defaultStoreConfig.d.ts +9 -1
- package/dist/redux/store/defaultStoreConfig.d.ts.map +1 -1
- package/dist/resources/globals.css +30 -0
- package/dist/resources/solid-custom.css +10 -6
- package/dist/resources/solid-tailwind-generated.css +1 -1
- package/dist/routes/AppEventListener.js +1 -1
- package/dist/routes/AppEventListener.js.map +1 -1
- package/dist/routes/AppEventListener.tsx +1 -1
- package/dist/routes/pages/admin/core/AgentPersonaHistory.css +130 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.d.ts +7 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.js +228 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.js.map +1 -0
- package/dist/routes/pages/admin/core/AgentPersonaHistory.tsx +234 -0
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.css +6 -14
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js +186 -146
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.js.map +1 -1
- package/dist/routes/pages/admin/core/AgentRegistryEditorPage.tsx +170 -118
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts +2 -0
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.d.ts.map +1 -0
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js +108 -0
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.js.map +1 -0
- package/dist/routes/pages/admin/core/ArchivedChatterMessagesPage.tsx +96 -0
- package/dist/routes/solidRoutes.d.ts.map +1 -1
- package/dist/routes/solidRoutes.js +2 -0
- package/dist/routes/solidRoutes.js.map +1 -1
- package/dist/routes/solidRoutes.tsx +2 -0
- package/dist/types/extension-registry.d.ts +12 -0
- package/dist/types/extension-registry.d.ts.map +1 -1
- package/dist/types/extension-registry.js.map +1 -1
- package/dist/types/extension-registry.ts +15 -0
- package/dist/types/solid-core.d.ts +2 -0
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidLightbox.d.ts","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidLightbox.tsx"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAElC,KAAK,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;CAChC;AAED,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"SolidLightbox.d.ts","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidLightbox.tsx"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAElC,KAAK,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;CAChC;AAED,eAAO,MAAM,aAAa,6DAMvB,kBAAkB,mDAmNpB,CAAC"}
|
|
@@ -14,7 +14,7 @@ import { useEffect, useMemo, useRef, useState } from "react";
|
|
|
14
14
|
import Viewer from "viewerjs";
|
|
15
15
|
import "viewerjs/dist/viewer.css";
|
|
16
16
|
export var SolidLightbox = function (_a) {
|
|
17
|
-
var slides = _a.slides, open = _a.open, onClose = _a.onClose, viewerOptions = _a.viewerOptions;
|
|
17
|
+
var slides = _a.slides, open = _a.open, onBeforeClose = _a.onBeforeClose, onClose = _a.onClose, viewerOptions = _a.viewerOptions;
|
|
18
18
|
var _b = useState(0), currentIndex = _b[0], setCurrentIndex = _b[1];
|
|
19
19
|
var containerRef = useRef(null);
|
|
20
20
|
var viewerRef = useRef(null);
|
|
@@ -38,7 +38,7 @@ export var SolidLightbox = function (_a) {
|
|
|
38
38
|
if (viewerRef.current) {
|
|
39
39
|
viewerRef.current.destroy();
|
|
40
40
|
}
|
|
41
|
-
viewerRef.current = new Viewer(containerRef.current, __assign({ navbar: sanitizedSlides.length > 1, title: false, transition: true, movable: true, scalable: true, rotatable: true, zoomable: true, zIndex: 9999, hidden: function () {
|
|
41
|
+
viewerRef.current = new Viewer(containerRef.current, __assign(__assign({ navbar: sanitizedSlides.length > 1, title: false, transition: true, movable: true, scalable: true, rotatable: true, zoomable: true, zIndex: 9999, hidden: function () {
|
|
42
42
|
onClose();
|
|
43
43
|
}, toolbar: {
|
|
44
44
|
prev: 1,
|
|
@@ -48,7 +48,11 @@ export var SolidLightbox = function (_a) {
|
|
|
48
48
|
rotateLeft: 1,
|
|
49
49
|
rotateRight: 1,
|
|
50
50
|
reset: 1,
|
|
51
|
-
} }, viewerOptions))
|
|
51
|
+
} }, viewerOptions), { hide: function (event) {
|
|
52
|
+
var _a;
|
|
53
|
+
(_a = viewerOptions === null || viewerOptions === void 0 ? void 0 : viewerOptions.hide) === null || _a === void 0 ? void 0 : _a.call(viewerOptions, event);
|
|
54
|
+
onBeforeClose === null || onBeforeClose === void 0 ? void 0 : onBeforeClose();
|
|
55
|
+
} }));
|
|
52
56
|
viewerRef.current.show();
|
|
53
57
|
return function () {
|
|
54
58
|
if (viewerRef.current) {
|
|
@@ -107,7 +111,10 @@ export var SolidLightbox = function (_a) {
|
|
|
107
111
|
}
|
|
108
112
|
return (_jsx("img", { src: currentSlide.src, alt: "lightbox-media", style: { maxWidth: "90vw", maxHeight: "80vh", objectFit: "contain" } }, currentSlide.src));
|
|
109
113
|
};
|
|
110
|
-
return (_jsxs("div", { style: overlayStyles, children: [_jsx("button", { style: closeButtonStyles, onClick:
|
|
114
|
+
return (_jsxs("div", { style: overlayStyles, children: [_jsx("button", { style: closeButtonStyles, onClick: function () {
|
|
115
|
+
onBeforeClose === null || onBeforeClose === void 0 ? void 0 : onBeforeClose();
|
|
116
|
+
onClose();
|
|
117
|
+
}, "aria-label": "Close", children: "\u00D7" }), showNav && (_jsxs(_Fragment, { children: [_jsx("button", { style: navButtonStyles("left"), onClick: handlePrev, "aria-label": "Previous", children: "\u2039" }), _jsx("button", { style: navButtonStyles("right"), onClick: handleNext, "aria-label": "Next", children: "\u203A" })] })), _jsx("div", { style: contentStyles, children: renderSlide() })] }));
|
|
111
118
|
};
|
|
112
119
|
var overlayStyles = {
|
|
113
120
|
position: "fixed",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidLightbox.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidLightbox.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { CSSProperties } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport Viewer from \"viewerjs\";\nimport \"viewerjs/dist/viewer.css\";\n\ntype SlideType = \"image\" | \"video\" | \"audio\";\n\nexport interface SolidLightboxSlide {\n src: string;\n type?: SlideType;\n mimeType?: string;\n poster?: string;\n downloadUrl?: string;\n}\n\nexport interface SolidLightboxProps {\n slides: SolidLightboxSlide[];\n open: boolean;\n onClose: () => void;\n viewerOptions?: Viewer.Options;\n}\n\nexport const SolidLightbox = ({\n slides,\n open,\n onClose,\n viewerOptions,\n}: SolidLightboxProps) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const viewerRef = useRef<Viewer | null>(null);\n\n const sanitizedSlides = useMemo(\n () => slides.filter((slide) => !!slide?.src),\n [slides]\n );\n\n const hasOnlyImages = useMemo(\n () => sanitizedSlides.every((slide) => (slide.type ?? \"image\") === \"image\"),\n [sanitizedSlides]\n );\n\n useEffect(() => {\n if (open) {\n setCurrentIndex(0);\n }\n }, [open, sanitizedSlides]);\n\n useEffect(() => {\n if (!hasOnlyImages || !open) {\n if (viewerRef.current) {\n viewerRef.current.destroy();\n viewerRef.current = null;\n }\n return;\n }\n\n if (!containerRef.current || sanitizedSlides.length === 0) return;\n\n if (viewerRef.current) {\n viewerRef.current.destroy();\n }\n\n viewerRef.current = new Viewer(containerRef.current, {\n navbar: sanitizedSlides.length > 1,\n title: false,\n transition: true,\n movable: true,\n scalable: true,\n rotatable: true,\n zoomable: true,\n zIndex: 9999,\n hidden: () => {\n onClose();\n },\n toolbar: {\n prev: 1,\n next: 1,\n zoomIn: 1,\n zoomOut: 1,\n rotateLeft: 1,\n rotateRight: 1,\n reset: 1,\n },\n ...viewerOptions,\n });\n\n viewerRef.current.show();\n\n return () => {\n if (viewerRef.current) {\n viewerRef.current.destroy();\n viewerRef.current = null;\n }\n };\n }, [sanitizedSlides, hasOnlyImages, open]);\n\n if (!open || sanitizedSlides.length === 0) {\n return null;\n }\n\n if (hasOnlyImages) {\n return (\n <div\n ref={containerRef}\n style={{\n position: \"absolute\",\n visibility: \"hidden\",\n width: 0,\n height: 0,\n overflow: \"hidden\",\n }}\n >\n {sanitizedSlides.map((slide, index) => (\n <img key={index} src={slide.src} alt={`preview-${index}`} />\n ))}\n </div>\n );\n }\n\n const handlePrev = () => {\n setCurrentIndex((prev) =>\n prev === 0 ? sanitizedSlides.length - 1 : prev - 1\n );\n };\n\n const handleNext = () => {\n setCurrentIndex((prev) =>\n prev === sanitizedSlides.length - 1 ? 0 : prev + 1\n );\n };\n\n const currentSlide = sanitizedSlides[currentIndex];\n const showNav = sanitizedSlides.length > 1;\n\n const renderSlide = () => {\n const mediaType = currentSlide?.type ?? \"image\";\n if (mediaType === \"video\") {\n return (\n <video\n key={currentSlide.src}\n controls\n autoPlay\n style={{ maxWidth: \"90vw\", maxHeight: \"80vh\" }}\n poster={currentSlide.poster}\n >\n <source\n src={currentSlide.src}\n type={currentSlide.mimeType || \"video/mp4\"}\n />\n Your browser does not support the video tag.\n </video>\n );\n }\n\n if (mediaType === \"audio\") {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"1rem\",\n }}\n >\n <div\n style={{\n width: \"160px\",\n height: \"160px\",\n borderRadius: \"50%\",\n background: \"rgba(255,255,255,0.08)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"3rem\",\n color: \"#fff\",\n }}\n >\n ♪\n </div>\n <audio controls autoPlay preload=\"auto\" style={{ width: \"320px\" }}>\n <source\n src={currentSlide.src}\n type={currentSlide.mimeType || \"audio/mpeg\"}\n />\n Your browser does not support the audio element.\n </audio>\n </div>\n );\n }\n\n return (\n <img\n key={currentSlide.src}\n src={currentSlide.src}\n alt=\"lightbox-media\"\n style={{ maxWidth: \"90vw\", maxHeight: \"80vh\", objectFit: \"contain\" }}\n />\n );\n };\n\n return (\n <div style={overlayStyles}>\n <button style={closeButtonStyles} onClick={onClose} aria-label=\"Close\">\n ×\n </button>\n {showNav && (\n <>\n <button\n style={navButtonStyles(\"left\")}\n onClick={handlePrev}\n aria-label=\"Previous\"\n >\n ‹\n </button>\n <button\n style={navButtonStyles(\"right\")}\n onClick={handleNext}\n aria-label=\"Next\"\n >\n ›\n </button>\n </>\n )}\n <div style={contentStyles}>{renderSlide()}</div>\n </div>\n );\n};\n\nconst overlayStyles: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0,0,0,0.85)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 10000,\n};\n\nconst contentStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n padding: \"16px\",\n};\n\nconst closeButtonStyles: CSSProperties = {\n position: \"absolute\",\n top: \"16px\",\n right: \"24px\",\n fontSize: \"2rem\",\n color: \"#fff\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n};\n\nconst navButtonStyles = (direction: \"left\" | \"right\"): CSSProperties => {\n const baseStyles: CSSProperties = {\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: \"2.5rem\",\n color: \"#fff\",\n background: \"rgba(0,0,0,0.4)\",\n border: \"none\",\n width: \"48px\",\n height: \"48px\",\n borderRadius: \"999px\",\n cursor: \"pointer\",\n };\n\n if (direction === \"left\") {\n baseStyles.left = \"24px\";\n } else {\n baseStyles.right = \"24px\";\n }\n\n return baseStyles;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"SolidLightbox.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidLightbox.tsx"],"names":[],"mappings":";;;;;;;;;;;;AACA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,0BAA0B,CAAC;AAoBlC,MAAM,CAAC,IAAM,aAAa,GAAG,UAAC,EAMT;QALnB,MAAM,YAAA,EACN,IAAI,UAAA,EACJ,aAAa,mBAAA,EACb,OAAO,aAAA,EACP,aAAa,mBAAA;IAEP,IAAA,KAAkC,QAAQ,CAAC,CAAC,CAAC,EAA5C,YAAY,QAAA,EAAE,eAAe,QAAe,CAAC;IACpD,IAAM,YAAY,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACzD,IAAM,SAAS,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAE9C,IAAM,eAAe,GAAG,OAAO,CAC7B,cAAM,OAAA,MAAM,CAAC,MAAM,CAAC,UAAC,KAAK,IAAK,OAAA,CAAC,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,GAAG,CAAA,EAAZ,CAAY,CAAC,EAAtC,CAAsC,EAC5C,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,IAAM,aAAa,GAAG,OAAO,CAC3B,cAAM,OAAA,eAAe,CAAC,KAAK,CAAC,UAAC,KAAK,YAAK,OAAA,CAAC,MAAA,KAAK,CAAC,IAAI,mCAAI,OAAO,CAAC,KAAK,OAAO,CAAA,EAAA,CAAC,EAArE,CAAqE,EAC3E,CAAC,eAAe,CAAC,CAClB,CAAC;IAEF,SAAS,CAAC;QACR,IAAI,IAAI,EAAE;YACR,eAAe,CAAC,CAAC,CAAC,CAAC;SACpB;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;IAE5B,SAAS,CAAC;QACR,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,EAAE;YAC3B,IAAI,SAAS,CAAC,OAAO,EAAE;gBACrB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC5B,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;aAC1B;YACD,OAAO;SACR;QAED,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAElE,IAAI,SAAS,CAAC,OAAO,EAAE;YACrB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SAC7B;QAED,SAAS,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,sBACjD,MAAM,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,EAClC,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,IAAI,EAChB,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,IAAI,EACf,QAAQ,EAAE,IAAI,EACd,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC;YACZ,CAAC,EACD,OAAO,EAAE;gBACP,IAAI,EAAE,CAAC;gBACP,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,CAAC;gBACT,OAAO,EAAE,CAAC;gBACV,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,KAAK,EAAE,CAAC;aACT,IACE,aAAa,KAChB,IAAI,EAAE,UAAC,KAAK;;gBACV,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,IAAI,8DAAG,KAAK,CAAC,CAAC;gBAC7B,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI,CAAC;YACpB,CAAC,IACD,CAAC;QAEH,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAEzB,OAAO;YACL,IAAI,SAAS,CAAC,OAAO,EAAE;gBACrB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC5B,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;aAC1B;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,eAAe,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;IAE3C,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;QACzC,OAAO,IAAI,CAAC;KACb;IAED,IAAI,aAAa,EAAE;QACjB,OAAO,CACL,cACE,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,QAAQ,EAAE,QAAQ;aACnB,YAEA,eAAe,CAAC,GAAG,CAAC,UAAC,KAAK,EAAE,KAAK,IAAK,OAAA,CACrC,cAAiB,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,kBAAW,KAAK,CAAE,IAA9C,KAAK,CAA6C,CAC7D,EAFsC,CAEtC,CAAC,GACE,CACP,CAAC;KACH;IAED,IAAM,UAAU,GAAG;QACjB,eAAe,CAAC,UAAC,IAAI;YACnB,OAAA,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAAlD,CAAkD,CACnD,CAAC;IACJ,CAAC,CAAC;IAEF,IAAM,UAAU,GAAG;QACjB,eAAe,CAAC,UAAC,IAAI;YACnB,OAAA,IAAI,KAAK,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAAlD,CAAkD,CACnD,CAAC;IACJ,CAAC,CAAC;IAEF,IAAM,YAAY,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;IACnD,IAAM,OAAO,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IAE3C,IAAM,WAAW,GAAG;;QAClB,IAAM,SAAS,GAAG,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,mCAAI,OAAO,CAAC;QAChD,IAAI,SAAS,KAAK,OAAO,EAAE;YACzB,OAAO,CACL,iBAEE,QAAQ,QACR,QAAQ,QACR,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAC9C,MAAM,EAAE,YAAY,CAAC,MAAM,aAE3B,iBACE,GAAG,EAAE,YAAY,CAAC,GAAG,EACrB,IAAI,EAAE,YAAY,CAAC,QAAQ,IAAI,WAAW,GAC1C,qDATG,YAAY,CAAC,GAAG,CAWf,CACT,CAAC;SACH;QAED,IAAI,SAAS,KAAK,OAAO,EAAE;YACzB,OAAO,CACL,eACE,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,aAAa,EAAE,QAAQ;oBACvB,UAAU,EAAE,QAAQ;oBACpB,GAAG,EAAE,MAAM;iBACZ,aAED,cACE,KAAK,EAAE;4BACL,KAAK,EAAE,OAAO;4BACd,MAAM,EAAE,OAAO;4BACf,YAAY,EAAE,KAAK;4BACnB,UAAU,EAAE,wBAAwB;4BACpC,OAAO,EAAE,MAAM;4BACf,UAAU,EAAE,QAAQ;4BACpB,cAAc,EAAE,QAAQ;4BACxB,QAAQ,EAAE,MAAM;4BAChB,KAAK,EAAE,MAAM;yBACd,uBAGG,EACN,iBAAO,QAAQ,QAAC,QAAQ,QAAC,OAAO,EAAC,MAAM,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,aAC/D,iBACE,GAAG,EAAE,YAAY,CAAC,GAAG,EACrB,IAAI,EAAE,YAAY,CAAC,QAAQ,IAAI,YAAY,GAC3C,wDAEI,IACJ,CACP,CAAC;SACH;QAED,OAAO,CACL,cAEE,GAAG,EAAE,YAAY,CAAC,GAAG,EACrB,GAAG,EAAC,gBAAgB,EACpB,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAH/D,YAAY,CAAC,GAAG,CAIrB,CACH,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,KAAK,EAAE,aAAa,aACvB,iBACE,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE;oBACP,aAAa,aAAb,aAAa,uBAAb,aAAa,EAAI,CAAC;oBAClB,OAAO,EAAE,CAAC;gBACZ,CAAC,gBACU,OAAO,uBAGX,EACR,OAAO,IAAI,CACV,8BACE,iBACE,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAC9B,OAAO,EAAE,UAAU,gBACR,UAAU,uBAGd,EACT,iBACE,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,EAC/B,OAAO,EAAE,UAAU,gBACR,MAAM,uBAGV,IACR,CACJ,EACD,cAAK,KAAK,EAAE,aAAa,YAAG,WAAW,EAAE,GAAO,IAC5C,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,IAAM,aAAa,GAAkB;IACnC,QAAQ,EAAE,OAAO;IACjB,KAAK,EAAE,CAAC;IACR,eAAe,EAAE,kBAAkB;IACnC,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,QAAQ;IACxB,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,IAAM,aAAa,GAAkB;IACnC,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,QAAQ;IACxB,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,IAAM,iBAAiB,GAAkB;IACvC,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,MAAM;IACb,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,IAAM,eAAe,GAAG,UAAC,SAA2B;IAClD,IAAM,UAAU,GAAkB;QAChC,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,KAAK;QACV,SAAS,EAAE,kBAAkB;QAC7B,QAAQ,EAAE,QAAQ;QAClB,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,iBAAiB;QAC7B,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,OAAO;QACrB,MAAM,EAAE,SAAS;KAClB,CAAC;IAEF,IAAI,SAAS,KAAK,MAAM,EAAE;QACxB,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC;KAC1B;SAAM;QACL,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC;KAC3B;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC","sourcesContent":["import type { CSSProperties } from \"react\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport Viewer from \"viewerjs\";\nimport \"viewerjs/dist/viewer.css\";\n\ntype SlideType = \"image\" | \"video\" | \"audio\";\n\nexport interface SolidLightboxSlide {\n src: string;\n type?: SlideType;\n mimeType?: string;\n poster?: string;\n downloadUrl?: string;\n}\n\nexport interface SolidLightboxProps {\n slides: SolidLightboxSlide[];\n open: boolean;\n onBeforeClose?: () => void;\n onClose: () => void;\n viewerOptions?: Viewer.Options;\n}\n\nexport const SolidLightbox = ({\n slides,\n open,\n onBeforeClose,\n onClose,\n viewerOptions,\n}: SolidLightboxProps) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const viewerRef = useRef<Viewer | null>(null);\n\n const sanitizedSlides = useMemo(\n () => slides.filter((slide) => !!slide?.src),\n [slides]\n );\n\n const hasOnlyImages = useMemo(\n () => sanitizedSlides.every((slide) => (slide.type ?? \"image\") === \"image\"),\n [sanitizedSlides]\n );\n\n useEffect(() => {\n if (open) {\n setCurrentIndex(0);\n }\n }, [open, sanitizedSlides]);\n\n useEffect(() => {\n if (!hasOnlyImages || !open) {\n if (viewerRef.current) {\n viewerRef.current.destroy();\n viewerRef.current = null;\n }\n return;\n }\n\n if (!containerRef.current || sanitizedSlides.length === 0) return;\n\n if (viewerRef.current) {\n viewerRef.current.destroy();\n }\n\n viewerRef.current = new Viewer(containerRef.current, {\n navbar: sanitizedSlides.length > 1,\n title: false,\n transition: true,\n movable: true,\n scalable: true,\n rotatable: true,\n zoomable: true,\n zIndex: 9999,\n hidden: () => {\n onClose();\n },\n toolbar: {\n prev: 1,\n next: 1,\n zoomIn: 1,\n zoomOut: 1,\n rotateLeft: 1,\n rotateRight: 1,\n reset: 1,\n },\n ...viewerOptions,\n hide: (event) => {\n viewerOptions?.hide?.(event);\n onBeforeClose?.();\n },\n });\n\n viewerRef.current.show();\n\n return () => {\n if (viewerRef.current) {\n viewerRef.current.destroy();\n viewerRef.current = null;\n }\n };\n }, [sanitizedSlides, hasOnlyImages, open]);\n\n if (!open || sanitizedSlides.length === 0) {\n return null;\n }\n\n if (hasOnlyImages) {\n return (\n <div\n ref={containerRef}\n style={{\n position: \"absolute\",\n visibility: \"hidden\",\n width: 0,\n height: 0,\n overflow: \"hidden\",\n }}\n >\n {sanitizedSlides.map((slide, index) => (\n <img key={index} src={slide.src} alt={`preview-${index}`} />\n ))}\n </div>\n );\n }\n\n const handlePrev = () => {\n setCurrentIndex((prev) =>\n prev === 0 ? sanitizedSlides.length - 1 : prev - 1\n );\n };\n\n const handleNext = () => {\n setCurrentIndex((prev) =>\n prev === sanitizedSlides.length - 1 ? 0 : prev + 1\n );\n };\n\n const currentSlide = sanitizedSlides[currentIndex];\n const showNav = sanitizedSlides.length > 1;\n\n const renderSlide = () => {\n const mediaType = currentSlide?.type ?? \"image\";\n if (mediaType === \"video\") {\n return (\n <video\n key={currentSlide.src}\n controls\n autoPlay\n style={{ maxWidth: \"90vw\", maxHeight: \"80vh\" }}\n poster={currentSlide.poster}\n >\n <source\n src={currentSlide.src}\n type={currentSlide.mimeType || \"video/mp4\"}\n />\n Your browser does not support the video tag.\n </video>\n );\n }\n\n if (mediaType === \"audio\") {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: \"1rem\",\n }}\n >\n <div\n style={{\n width: \"160px\",\n height: \"160px\",\n borderRadius: \"50%\",\n background: \"rgba(255,255,255,0.08)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"3rem\",\n color: \"#fff\",\n }}\n >\n ♪\n </div>\n <audio controls autoPlay preload=\"auto\" style={{ width: \"320px\" }}>\n <source\n src={currentSlide.src}\n type={currentSlide.mimeType || \"audio/mpeg\"}\n />\n Your browser does not support the audio element.\n </audio>\n </div>\n );\n }\n\n return (\n <img\n key={currentSlide.src}\n src={currentSlide.src}\n alt=\"lightbox-media\"\n style={{ maxWidth: \"90vw\", maxHeight: \"80vh\", objectFit: \"contain\" }}\n />\n );\n };\n\n return (\n <div style={overlayStyles}>\n <button\n style={closeButtonStyles}\n onClick={() => {\n onBeforeClose?.();\n onClose();\n }}\n aria-label=\"Close\"\n >\n ×\n </button>\n {showNav && (\n <>\n <button\n style={navButtonStyles(\"left\")}\n onClick={handlePrev}\n aria-label=\"Previous\"\n >\n ‹\n </button>\n <button\n style={navButtonStyles(\"right\")}\n onClick={handleNext}\n aria-label=\"Next\"\n >\n ›\n </button>\n </>\n )}\n <div style={contentStyles}>{renderSlide()}</div>\n </div>\n );\n};\n\nconst overlayStyles: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0,0,0,0.85)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 10000,\n};\n\nconst contentStyles: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"100%\",\n padding: \"16px\",\n};\n\nconst closeButtonStyles: CSSProperties = {\n position: \"absolute\",\n top: \"16px\",\n right: \"24px\",\n fontSize: \"2rem\",\n color: \"#fff\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n};\n\nconst navButtonStyles = (direction: \"left\" | \"right\"): CSSProperties => {\n const baseStyles: CSSProperties = {\n position: \"absolute\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: \"2.5rem\",\n color: \"#fff\",\n background: \"rgba(0,0,0,0.4)\",\n border: \"none\",\n width: \"48px\",\n height: \"48px\",\n borderRadius: \"999px\",\n cursor: \"pointer\",\n };\n\n if (direction === \"left\") {\n baseStyles.left = \"24px\";\n } else {\n baseStyles.right = \"24px\";\n }\n\n return baseStyles;\n};\n"]}
|
|
@@ -16,6 +16,7 @@ export interface SolidLightboxSlide {
|
|
|
16
16
|
export interface SolidLightboxProps {
|
|
17
17
|
slides: SolidLightboxSlide[];
|
|
18
18
|
open: boolean;
|
|
19
|
+
onBeforeClose?: () => void;
|
|
19
20
|
onClose: () => void;
|
|
20
21
|
viewerOptions?: Viewer.Options;
|
|
21
22
|
}
|
|
@@ -23,6 +24,7 @@ export interface SolidLightboxProps {
|
|
|
23
24
|
export const SolidLightbox = ({
|
|
24
25
|
slides,
|
|
25
26
|
open,
|
|
27
|
+
onBeforeClose,
|
|
26
28
|
onClose,
|
|
27
29
|
viewerOptions,
|
|
28
30
|
}: SolidLightboxProps) => {
|
|
@@ -83,6 +85,10 @@ export const SolidLightbox = ({
|
|
|
83
85
|
reset: 1,
|
|
84
86
|
},
|
|
85
87
|
...viewerOptions,
|
|
88
|
+
hide: (event) => {
|
|
89
|
+
viewerOptions?.hide?.(event);
|
|
90
|
+
onBeforeClose?.();
|
|
91
|
+
},
|
|
86
92
|
});
|
|
87
93
|
|
|
88
94
|
viewerRef.current.show();
|
|
@@ -201,7 +207,14 @@ export const SolidLightbox = ({
|
|
|
201
207
|
|
|
202
208
|
return (
|
|
203
209
|
<div style={overlayStyles}>
|
|
204
|
-
<button
|
|
210
|
+
<button
|
|
211
|
+
style={closeButtonStyles}
|
|
212
|
+
onClick={() => {
|
|
213
|
+
onBeforeClose?.();
|
|
214
|
+
onClose();
|
|
215
|
+
}}
|
|
216
|
+
aria-label="Close"
|
|
217
|
+
>
|
|
205
218
|
×
|
|
206
219
|
</button>
|
|
207
220
|
{showNav && (
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export declare const persistLastModelViewRoute: (target: string) => void;
|
|
2
2
|
export declare const getPersistedLastModelViewRoute: (target: string) => string | null;
|
|
3
3
|
export declare const resolveRetainedModelViewRoute: (target: string) => string;
|
|
4
|
+
export declare const getMenuContextForActiveRoute: (currentPathname: string, currentSearchParams: URLSearchParams) => URLSearchParams;
|
|
5
|
+
export declare const preserveModelMenuContext: (target: string) => string;
|
|
4
6
|
export declare const storeCurrentModelViewContext: (target?: string) => void;
|
|
5
7
|
//# sourceMappingURL=modelViewPersistence.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelViewPersistence.d.ts","sourceRoot":"","sources":["../../src/helpers/modelViewPersistence.ts"],"names":[],"mappings":"AAuHA,eAAO,MAAM,yBAAyB,WAAY,MAAM,SAkBvD,CAAC;AAIF,eAAO,MAAM,8BAA8B,WAAY,MAAM,KAAG,MAAM,GAAG,IA2BxE,CAAC;AAIF,eAAO,MAAM,6BAA6B,WAAY,MAAM,KAAG,MAM9D,CAAC;AAIF,eAAO,MAAM,4BAA4B,YAAa,MAAM,SAmB3D,CAAC"}
|
|
1
|
+
{"version":3,"file":"modelViewPersistence.d.ts","sourceRoot":"","sources":["../../src/helpers/modelViewPersistence.ts"],"names":[],"mappings":"AAuHA,eAAO,MAAM,yBAAyB,WAAY,MAAM,SAkBvD,CAAC;AAIF,eAAO,MAAM,8BAA8B,WAAY,MAAM,KAAG,MAAM,GAAG,IA2BxE,CAAC;AAIF,eAAO,MAAM,6BAA6B,WAAY,MAAM,KAAG,MAM9D,CAAC;AAiBF,eAAO,MAAM,4BAA4B,oBACtB,MAAM,uBACF,eAAe,KACnC,eAwBF,CAAC;AAIF,eAAO,MAAM,wBAAwB,WAAY,MAAM,KAAG,MA+BzD,CAAC;AAIF,eAAO,MAAM,4BAA4B,YAAa,MAAM,SAmB3D,CAAC"}
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
2
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
3
|
+
if (ar || !(i in from)) {
|
|
4
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
5
|
+
ar[i] = from[i];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
9
|
+
};
|
|
1
10
|
var MODEL_VIEW_STORAGE_KEY = "solidx.model.last-view";
|
|
2
11
|
var MODEL_VIEW_ROUTE_REGEX = /^\/admin\/core\/([^/]+)\/([^/]+)\/(list|tree|kanban|card)$/;
|
|
3
12
|
var getRouteParsingBase = function () {
|
|
@@ -145,6 +154,69 @@ export var resolveRetainedModelViewRoute = function (target) {
|
|
|
145
154
|
var storedRoute = getPersistedLastModelViewRoute(target);
|
|
146
155
|
return storedRoute || target;
|
|
147
156
|
};
|
|
157
|
+
var SIDEBAR_CONTEXT_KEYS = ["menuItemId", "menuItemName"];
|
|
158
|
+
var MODEL_VIEW_CONTEXT_KEYS = __spreadArray(__spreadArray([], SIDEBAR_CONTEXT_KEYS, true), [
|
|
159
|
+
"actionId",
|
|
160
|
+
"actionName",
|
|
161
|
+
], false);
|
|
162
|
+
var MODEL_ROUTE_REGEX = /^\/admin\/core\/[^/]+\/[^/]+\/(?:list|tree|kanban|card|form)(?:\/|$)/;
|
|
163
|
+
var MODEL_KEY_REGEX = /^(\/admin\/core\/[^/]+\/[^/]+)/;
|
|
164
|
+
var getModelRouteKey = function (pathname) { var _a; return ((_a = pathname.match(MODEL_KEY_REGEX)) === null || _a === void 0 ? void 0 : _a[1]) || null; };
|
|
165
|
+
// Forms may not contain menu IDs yet. Use the current URL first, then the
|
|
166
|
+
// last model view saved before opening the form as a backwards-compatible fallback.
|
|
167
|
+
export var getMenuContextForActiveRoute = function (currentPathname, currentSearchParams) {
|
|
168
|
+
if (currentSearchParams.has("menuItemId") || currentSearchParams.has("actionId")) {
|
|
169
|
+
return currentSearchParams;
|
|
170
|
+
}
|
|
171
|
+
if (typeof window === "undefined")
|
|
172
|
+
return currentSearchParams;
|
|
173
|
+
try {
|
|
174
|
+
var storedViewUrl = window.sessionStorage.getItem("fromViewUrl");
|
|
175
|
+
if (!storedViewUrl)
|
|
176
|
+
return currentSearchParams;
|
|
177
|
+
var storedUrl = new URL(storedViewUrl, window.location.origin);
|
|
178
|
+
var storedRoute = parseModelViewRoute(storedUrl.href);
|
|
179
|
+
var currentModelKey = getModelRouteKey(currentPathname);
|
|
180
|
+
var storedModelKey = getModelRouteKey(storedUrl.pathname);
|
|
181
|
+
if (!storedRoute || !currentModelKey || currentModelKey !== storedModelKey) {
|
|
182
|
+
return currentSearchParams;
|
|
183
|
+
}
|
|
184
|
+
return storedUrl.searchParams;
|
|
185
|
+
}
|
|
186
|
+
catch (_a) {
|
|
187
|
+
return currentSearchParams;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
// Copy menu identity between routes belonging to the same model. This keeps
|
|
191
|
+
// active sidebar state in the URL for new navigation while preserving legacy forms.
|
|
192
|
+
export var preserveModelMenuContext = function (target) {
|
|
193
|
+
if (typeof window === "undefined" || !target || target.startsWith("#"))
|
|
194
|
+
return target;
|
|
195
|
+
try {
|
|
196
|
+
var currentUrl = new URL(window.location.href);
|
|
197
|
+
var targetUrl_1 = new URL(target, currentUrl.href);
|
|
198
|
+
var currentModelKey = getModelRouteKey(currentUrl.pathname);
|
|
199
|
+
var targetModelKey = getModelRouteKey(targetUrl_1.pathname);
|
|
200
|
+
var isFormRoute = /\/admin\/core\/[^/]+\/[^/]+\/form(?:\/|$)/.test(targetUrl_1.pathname);
|
|
201
|
+
if (!MODEL_ROUTE_REGEX.test(currentUrl.pathname) || !MODEL_ROUTE_REGEX.test(targetUrl_1.pathname) || !currentModelKey || currentModelKey !== targetModelKey) {
|
|
202
|
+
return target;
|
|
203
|
+
}
|
|
204
|
+
if (isFormRoute) {
|
|
205
|
+
targetUrl_1.searchParams.delete("actionId");
|
|
206
|
+
}
|
|
207
|
+
var context_1 = getMenuContextForActiveRoute(currentUrl.pathname, currentUrl.searchParams);
|
|
208
|
+
var keysToCopy = isFormRoute ? SIDEBAR_CONTEXT_KEYS : MODEL_VIEW_CONTEXT_KEYS;
|
|
209
|
+
keysToCopy.forEach(function (key) {
|
|
210
|
+
if (!targetUrl_1.searchParams.has(key) && context_1.has(key)) {
|
|
211
|
+
targetUrl_1.searchParams.set(key, context_1.get(key) || "");
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
return targetUrl_1.pathname + targetUrl_1.search + targetUrl_1.hash;
|
|
215
|
+
}
|
|
216
|
+
catch (_a) {
|
|
217
|
+
return target;
|
|
218
|
+
}
|
|
219
|
+
};
|
|
148
220
|
// Keep short-lived "back to previous view" state in sessionStorage and also
|
|
149
221
|
// refresh the longer-lived localStorage route retention in one call.
|
|
150
222
|
export var storeCurrentModelViewContext = function (target) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelViewPersistence.js","sourceRoot":"","sources":["../../src/helpers/modelViewPersistence.ts"],"names":[],"mappings":"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","sourcesContent":["const MODEL_VIEW_STORAGE_KEY = \"solidx.model.last-view\";\n\nconst MODEL_VIEW_ROUTE_REGEX =\n /^\\/admin\\/core\\/([^/]+)\\/([^/]+)\\/(list|tree|kanban|card)$/;\n\ntype ParsedModelViewRoute = {\n actionId: string;\n fullPath: string;\n menuItemId: string;\n modelName: string;\n moduleName: string;\n pathname: string;\n viewType: \"list\" | \"tree\" | \"kanban\" | \"card\";\n};\n\ntype StoredModelViewEntry = {\n path: string;\n updatedAt: number;\n};\n\ntype StoredModelViewMap = Record<string, StoredModelViewEntry | string>;\n\nconst getRouteParsingBase = () => {\n if (typeof window !== \"undefined\" && window.location?.origin) {\n return window.location.origin;\n }\n\n};\n\n// Normalize a list/tree/kanban/card URL into a shape we can store and compare.\n// We keep the full query string because menu/action params are part of the return route.\nconst parseModelViewRoute = (target: string): ParsedModelViewRoute | null => {\n if (!target) return null;\n\n try {\n const url = new URL(target, getRouteParsingBase());\n const match = url.pathname.match(MODEL_VIEW_ROUTE_REGEX);\n\n if (!match) return null;\n\n const [, moduleName, modelName, viewType] = match;\n const menuItemId = url.searchParams.get(\"menuItemId\") || \"\";\n const actionId = url.searchParams.get(\"actionId\") || \"\";\n\n return {\n actionId,\n fullPath: `${url.pathname}${url.search}`,\n menuItemId,\n modelName,\n moduleName,\n pathname: url.pathname,\n viewType: viewType as ParsedModelViewRoute[\"viewType\"],\n };\n } catch (error) {\n return null;\n }\n};\n\nconst getScopedStorageKey = (route: ParsedModelViewRoute) =>\n `model:${route.moduleName}:${route.modelName}:menu:${route.menuItemId}:action:${route.actionId}`;\n\nconst getMenuStorageKey = (route: ParsedModelViewRoute) =>\n `model:${route.moduleName}:${route.modelName}:menu:${route.menuItemId}`;\n\nconst getModelStorageKey = (route: ParsedModelViewRoute) =>\n `model:${route.moduleName}:${route.modelName}`;\n\n// Older saved values may exist as plain strings from previous implementations.\n// Convert everything into one consistent shape before comparing timestamps.\nconst normalizeStoredEntry = (value: StoredModelViewEntry | string | undefined | null): StoredModelViewEntry | null => {\n if (!value) return null;\n\n if (typeof value === \"string\") {\n return {\n path: value,\n updatedAt: 0,\n };\n }\n\n if (typeof value.path !== \"string\" || !value.path) {\n return null;\n }\n\n return {\n path: value.path,\n updatedAt: Number(value.updatedAt) || 0,\n };\n};\n\nconst readStoredModelViews = (): StoredModelViewMap => {\n if (typeof window === \"undefined\") return {};\n\n try {\n const raw = window.localStorage.getItem(MODEL_VIEW_STORAGE_KEY);\n if (!raw) return {};\n\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" ? parsed : {};\n } catch (error) {\n return {};\n }\n};\n\nconst writeStoredModelViews = (next: StoredModelViewMap) => {\n if (typeof window === \"undefined\") return;\n\n try {\n window.localStorage.setItem(MODEL_VIEW_STORAGE_KEY, JSON.stringify(next));\n } catch (error) {\n // Ignore storage write failures and keep navigation working.\n }\n};\n\n// Save the current route at three scopes:\n// 1. exact model + menu + action\n// 2. model + menu\n// 3. model\n// This lets us reopen the most useful last-selected view even when the user\n// returns through a slightly different sidebar/menu link.\nexport const persistLastModelViewRoute = (target: string) => {\n if (typeof window === \"undefined\") return;\n\n const route = parseModelViewRoute(target);\n if (!route) return;\n\n const next = readStoredModelViews();\n const entry: StoredModelViewEntry = {\n path: route.fullPath,\n updatedAt: Date.now(),\n };\n\n next[getScopedStorageKey(route)] = entry;\n if (route.menuItemId) {\n next[getMenuStorageKey(route)] = entry;\n }\n next[getModelStorageKey(route)] = entry;\n writeStoredModelViews(next);\n};\n\n// Resolve the best saved route for the current model context.\n// We prefer the newest entry and use scope priority as a tie-breaker.\nexport const getPersistedLastModelViewRoute = (target: string): string | null => {\n if (typeof window === \"undefined\") return null;\n\n const route = parseModelViewRoute(target);\n if (!route) return null;\n\n const stored = readStoredModelViews();\n const hasMenuScope = Boolean(route.menuItemId || route.actionId);\n const candidateKeys = [\n hasMenuScope ? getScopedStorageKey(route) : null,\n route.menuItemId ? getMenuStorageKey(route) : null,\n hasMenuScope ? null : getModelStorageKey(route),\n ].filter(Boolean) as string[];\n\n let bestMatch: { entry: StoredModelViewEntry; priority: number } | null = null;\n\n for (let priority = 0; priority < candidateKeys.length; priority += 1) {\n const key = candidateKeys[priority];\n const entry = normalizeStoredEntry(stored[key]);\n if (!entry) continue;\n\n if (!bestMatch || entry.updatedAt > bestMatch.entry.updatedAt || (entry.updatedAt === bestMatch.entry.updatedAt && priority < bestMatch.priority)) {\n bestMatch = { entry, priority };\n }\n }\n\n return bestMatch ? bestMatch.entry.path : null;\n};\n\n// Sidebar and menu links often point to `/list` by default.\n// If we have a retained non-list view for the same model context, reopen that instead.\nexport const resolveRetainedModelViewRoute = (target: string): string => {\n const route = parseModelViewRoute(target);\n if (!route || route.viewType !== \"list\") return target;\n\n const storedRoute = getPersistedLastModelViewRoute(target);\n return storedRoute || target;\n};\n\n// Keep short-lived \"back to previous view\" state in sessionStorage and also\n// refresh the longer-lived localStorage route retention in one call.\nexport const storeCurrentModelViewContext = (target?: string) => {\n if (typeof window === \"undefined\") return;\n\n const fallbackTarget = `${window.location.pathname}${window.location.search}`;\n const nextTarget = target || fallbackTarget;\n const route = parseModelViewRoute(nextTarget);\n\n try {\n if (route?.viewType) {\n sessionStorage.setItem(\"fromView\", route.viewType);\n }\n sessionStorage.setItem(\"fromViewUrl\", route?.fullPath || nextTarget);\n } catch (error) {\n // Ignore storage failures so navigation can still continue.\n }\n\n if (route) {\n persistLastModelViewRoute(route.fullPath);\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"modelViewPersistence.js","sourceRoot":"","sources":["../../src/helpers/modelViewPersistence.ts"],"names":[],"mappings":"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","sourcesContent":["const MODEL_VIEW_STORAGE_KEY = \"solidx.model.last-view\";\n\nconst MODEL_VIEW_ROUTE_REGEX =\n /^\\/admin\\/core\\/([^/]+)\\/([^/]+)\\/(list|tree|kanban|card)$/;\n\ntype ParsedModelViewRoute = {\n actionId: string;\n fullPath: string;\n menuItemId: string;\n modelName: string;\n moduleName: string;\n pathname: string;\n viewType: \"list\" | \"tree\" | \"kanban\" | \"card\";\n};\n\ntype StoredModelViewEntry = {\n path: string;\n updatedAt: number;\n};\n\ntype StoredModelViewMap = Record<string, StoredModelViewEntry | string>;\n\nconst getRouteParsingBase = () => {\n if (typeof window !== \"undefined\" && window.location?.origin) {\n return window.location.origin;\n }\n\n};\n\n// Normalize a list/tree/kanban/card URL into a shape we can store and compare.\n// We keep the full query string because menu/action params are part of the return route.\nconst parseModelViewRoute = (target: string): ParsedModelViewRoute | null => {\n if (!target) return null;\n\n try {\n const url = new URL(target, getRouteParsingBase());\n const match = url.pathname.match(MODEL_VIEW_ROUTE_REGEX);\n\n if (!match) return null;\n\n const [, moduleName, modelName, viewType] = match;\n const menuItemId = url.searchParams.get(\"menuItemId\") || \"\";\n const actionId = url.searchParams.get(\"actionId\") || \"\";\n\n return {\n actionId,\n fullPath: `${url.pathname}${url.search}`,\n menuItemId,\n modelName,\n moduleName,\n pathname: url.pathname,\n viewType: viewType as ParsedModelViewRoute[\"viewType\"],\n };\n } catch (error) {\n return null;\n }\n};\n\nconst getScopedStorageKey = (route: ParsedModelViewRoute) =>\n `model:${route.moduleName}:${route.modelName}:menu:${route.menuItemId}:action:${route.actionId}`;\n\nconst getMenuStorageKey = (route: ParsedModelViewRoute) =>\n `model:${route.moduleName}:${route.modelName}:menu:${route.menuItemId}`;\n\nconst getModelStorageKey = (route: ParsedModelViewRoute) =>\n `model:${route.moduleName}:${route.modelName}`;\n\n// Older saved values may exist as plain strings from previous implementations.\n// Convert everything into one consistent shape before comparing timestamps.\nconst normalizeStoredEntry = (value: StoredModelViewEntry | string | undefined | null): StoredModelViewEntry | null => {\n if (!value) return null;\n\n if (typeof value === \"string\") {\n return {\n path: value,\n updatedAt: 0,\n };\n }\n\n if (typeof value.path !== \"string\" || !value.path) {\n return null;\n }\n\n return {\n path: value.path,\n updatedAt: Number(value.updatedAt) || 0,\n };\n};\n\nconst readStoredModelViews = (): StoredModelViewMap => {\n if (typeof window === \"undefined\") return {};\n\n try {\n const raw = window.localStorage.getItem(MODEL_VIEW_STORAGE_KEY);\n if (!raw) return {};\n\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === \"object\" ? parsed : {};\n } catch (error) {\n return {};\n }\n};\n\nconst writeStoredModelViews = (next: StoredModelViewMap) => {\n if (typeof window === \"undefined\") return;\n\n try {\n window.localStorage.setItem(MODEL_VIEW_STORAGE_KEY, JSON.stringify(next));\n } catch (error) {\n // Ignore storage write failures and keep navigation working.\n }\n};\n\n// Save the current route at three scopes:\n// 1. exact model + menu + action\n// 2. model + menu\n// 3. model\n// This lets us reopen the most useful last-selected view even when the user\n// returns through a slightly different sidebar/menu link.\nexport const persistLastModelViewRoute = (target: string) => {\n if (typeof window === \"undefined\") return;\n\n const route = parseModelViewRoute(target);\n if (!route) return;\n\n const next = readStoredModelViews();\n const entry: StoredModelViewEntry = {\n path: route.fullPath,\n updatedAt: Date.now(),\n };\n\n next[getScopedStorageKey(route)] = entry;\n if (route.menuItemId) {\n next[getMenuStorageKey(route)] = entry;\n }\n next[getModelStorageKey(route)] = entry;\n writeStoredModelViews(next);\n};\n\n// Resolve the best saved route for the current model context.\n// We prefer the newest entry and use scope priority as a tie-breaker.\nexport const getPersistedLastModelViewRoute = (target: string): string | null => {\n if (typeof window === \"undefined\") return null;\n\n const route = parseModelViewRoute(target);\n if (!route) return null;\n\n const stored = readStoredModelViews();\n const hasMenuScope = Boolean(route.menuItemId || route.actionId);\n const candidateKeys = [\n hasMenuScope ? getScopedStorageKey(route) : null,\n route.menuItemId ? getMenuStorageKey(route) : null,\n hasMenuScope ? null : getModelStorageKey(route),\n ].filter(Boolean) as string[];\n\n let bestMatch: { entry: StoredModelViewEntry; priority: number } | null = null;\n\n for (let priority = 0; priority < candidateKeys.length; priority += 1) {\n const key = candidateKeys[priority];\n const entry = normalizeStoredEntry(stored[key]);\n if (!entry) continue;\n\n if (!bestMatch || entry.updatedAt > bestMatch.entry.updatedAt || (entry.updatedAt === bestMatch.entry.updatedAt && priority < bestMatch.priority)) {\n bestMatch = { entry, priority };\n }\n }\n\n return bestMatch ? bestMatch.entry.path : null;\n};\n\n// Sidebar and menu links often point to `/list` by default.\n// If we have a retained non-list view for the same model context, reopen that instead.\nexport const resolveRetainedModelViewRoute = (target: string): string => {\n const route = parseModelViewRoute(target);\n if (!route || route.viewType !== \"list\") return target;\n\n const storedRoute = getPersistedLastModelViewRoute(target);\n return storedRoute || target;\n};\n\n\nconst SIDEBAR_CONTEXT_KEYS = [\"menuItemId\", \"menuItemName\"] as const;\nconst MODEL_VIEW_CONTEXT_KEYS = [\n ...SIDEBAR_CONTEXT_KEYS,\n \"actionId\",\n \"actionName\",\n] as const;\nconst MODEL_ROUTE_REGEX = /^\\/admin\\/core\\/[^/]+\\/[^/]+\\/(?:list|tree|kanban|card|form)(?:\\/|$)/;\nconst MODEL_KEY_REGEX = /^(\\/admin\\/core\\/[^/]+\\/[^/]+)/;\n\nconst getModelRouteKey = (pathname: string): string | null =>\n pathname.match(MODEL_KEY_REGEX)?.[1] || null;\n\n// Forms may not contain menu IDs yet. Use the current URL first, then the\n// last model view saved before opening the form as a backwards-compatible fallback.\nexport const getMenuContextForActiveRoute = (\n currentPathname: string,\n currentSearchParams: URLSearchParams,\n): URLSearchParams => {\n if (currentSearchParams.has(\"menuItemId\") || currentSearchParams.has(\"actionId\")) {\n return currentSearchParams;\n }\n\n if (typeof window === \"undefined\") return currentSearchParams;\n\n try {\n const storedViewUrl = window.sessionStorage.getItem(\"fromViewUrl\");\n if (!storedViewUrl) return currentSearchParams;\n\n const storedUrl = new URL(storedViewUrl, window.location.origin);\n const storedRoute = parseModelViewRoute(storedUrl.href);\n const currentModelKey = getModelRouteKey(currentPathname);\n const storedModelKey = getModelRouteKey(storedUrl.pathname);\n\n if (!storedRoute || !currentModelKey || currentModelKey !== storedModelKey) {\n return currentSearchParams;\n }\n\n return storedUrl.searchParams;\n } catch {\n return currentSearchParams;\n }\n};\n\n// Copy menu identity between routes belonging to the same model. This keeps\n// active sidebar state in the URL for new navigation while preserving legacy forms.\nexport const preserveModelMenuContext = (target: string): string => {\n if (typeof window === \"undefined\" || !target || target.startsWith(\"#\")) return target;\n\n try {\n const currentUrl = new URL(window.location.href);\n const targetUrl = new URL(target, currentUrl.href);\n const currentModelKey = getModelRouteKey(currentUrl.pathname);\n const targetModelKey = getModelRouteKey(targetUrl.pathname);\n const isFormRoute = /\\/admin\\/core\\/[^/]+\\/[^/]+\\/form(?:\\/|$)/.test(targetUrl.pathname);\n\n if (!MODEL_ROUTE_REGEX.test(currentUrl.pathname) || !MODEL_ROUTE_REGEX.test(targetUrl.pathname) || !currentModelKey || currentModelKey !== targetModelKey) {\n return target;\n }\n\n if (isFormRoute) {\n targetUrl.searchParams.delete(\"actionId\");\n }\n\n const context = getMenuContextForActiveRoute(currentUrl.pathname, currentUrl.searchParams);\n const keysToCopy = isFormRoute ? SIDEBAR_CONTEXT_KEYS : MODEL_VIEW_CONTEXT_KEYS;\n\n keysToCopy.forEach((key) => {\n if (!targetUrl.searchParams.has(key) && context.has(key)) {\n targetUrl.searchParams.set(key, context.get(key) || \"\");\n }\n });\n\n return targetUrl.pathname + targetUrl.search + targetUrl.hash;\n } catch {\n return target;\n }\n};\n\n// Keep short-lived \"back to previous view\" state in sessionStorage and also\n// refresh the longer-lived localStorage route retention in one call.\nexport const storeCurrentModelViewContext = (target?: string) => {\n if (typeof window === \"undefined\") return;\n\n const fallbackTarget = `${window.location.pathname}${window.location.search}`;\n const nextTarget = target || fallbackTarget;\n const route = parseModelViewRoute(nextTarget);\n\n try {\n if (route?.viewType) {\n sessionStorage.setItem(\"fromView\", route.viewType);\n }\n sessionStorage.setItem(\"fromViewUrl\", route?.fullPath || nextTarget);\n } catch (error) {\n // Ignore storage failures so navigation can still continue.\n }\n\n if (route) {\n persistLastModelViewRoute(route.fullPath);\n }\n};\n"]}
|
|
@@ -178,6 +178,85 @@ export const resolveRetainedModelViewRoute = (target: string): string => {
|
|
|
178
178
|
return storedRoute || target;
|
|
179
179
|
};
|
|
180
180
|
|
|
181
|
+
|
|
182
|
+
const SIDEBAR_CONTEXT_KEYS = ["menuItemId", "menuItemName"] as const;
|
|
183
|
+
const MODEL_VIEW_CONTEXT_KEYS = [
|
|
184
|
+
...SIDEBAR_CONTEXT_KEYS,
|
|
185
|
+
"actionId",
|
|
186
|
+
"actionName",
|
|
187
|
+
] as const;
|
|
188
|
+
const MODEL_ROUTE_REGEX = /^\/admin\/core\/[^/]+\/[^/]+\/(?:list|tree|kanban|card|form)(?:\/|$)/;
|
|
189
|
+
const MODEL_KEY_REGEX = /^(\/admin\/core\/[^/]+\/[^/]+)/;
|
|
190
|
+
|
|
191
|
+
const getModelRouteKey = (pathname: string): string | null =>
|
|
192
|
+
pathname.match(MODEL_KEY_REGEX)?.[1] || null;
|
|
193
|
+
|
|
194
|
+
// Forms may not contain menu IDs yet. Use the current URL first, then the
|
|
195
|
+
// last model view saved before opening the form as a backwards-compatible fallback.
|
|
196
|
+
export const getMenuContextForActiveRoute = (
|
|
197
|
+
currentPathname: string,
|
|
198
|
+
currentSearchParams: URLSearchParams,
|
|
199
|
+
): URLSearchParams => {
|
|
200
|
+
if (currentSearchParams.has("menuItemId") || currentSearchParams.has("actionId")) {
|
|
201
|
+
return currentSearchParams;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
if (typeof window === "undefined") return currentSearchParams;
|
|
205
|
+
|
|
206
|
+
try {
|
|
207
|
+
const storedViewUrl = window.sessionStorage.getItem("fromViewUrl");
|
|
208
|
+
if (!storedViewUrl) return currentSearchParams;
|
|
209
|
+
|
|
210
|
+
const storedUrl = new URL(storedViewUrl, window.location.origin);
|
|
211
|
+
const storedRoute = parseModelViewRoute(storedUrl.href);
|
|
212
|
+
const currentModelKey = getModelRouteKey(currentPathname);
|
|
213
|
+
const storedModelKey = getModelRouteKey(storedUrl.pathname);
|
|
214
|
+
|
|
215
|
+
if (!storedRoute || !currentModelKey || currentModelKey !== storedModelKey) {
|
|
216
|
+
return currentSearchParams;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return storedUrl.searchParams;
|
|
220
|
+
} catch {
|
|
221
|
+
return currentSearchParams;
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
// Copy menu identity between routes belonging to the same model. This keeps
|
|
226
|
+
// active sidebar state in the URL for new navigation while preserving legacy forms.
|
|
227
|
+
export const preserveModelMenuContext = (target: string): string => {
|
|
228
|
+
if (typeof window === "undefined" || !target || target.startsWith("#")) return target;
|
|
229
|
+
|
|
230
|
+
try {
|
|
231
|
+
const currentUrl = new URL(window.location.href);
|
|
232
|
+
const targetUrl = new URL(target, currentUrl.href);
|
|
233
|
+
const currentModelKey = getModelRouteKey(currentUrl.pathname);
|
|
234
|
+
const targetModelKey = getModelRouteKey(targetUrl.pathname);
|
|
235
|
+
const isFormRoute = /\/admin\/core\/[^/]+\/[^/]+\/form(?:\/|$)/.test(targetUrl.pathname);
|
|
236
|
+
|
|
237
|
+
if (!MODEL_ROUTE_REGEX.test(currentUrl.pathname) || !MODEL_ROUTE_REGEX.test(targetUrl.pathname) || !currentModelKey || currentModelKey !== targetModelKey) {
|
|
238
|
+
return target;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (isFormRoute) {
|
|
242
|
+
targetUrl.searchParams.delete("actionId");
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const context = getMenuContextForActiveRoute(currentUrl.pathname, currentUrl.searchParams);
|
|
246
|
+
const keysToCopy = isFormRoute ? SIDEBAR_CONTEXT_KEYS : MODEL_VIEW_CONTEXT_KEYS;
|
|
247
|
+
|
|
248
|
+
keysToCopy.forEach((key) => {
|
|
249
|
+
if (!targetUrl.searchParams.has(key) && context.has(key)) {
|
|
250
|
+
targetUrl.searchParams.set(key, context.get(key) || "");
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
return targetUrl.pathname + targetUrl.search + targetUrl.hash;
|
|
255
|
+
} catch {
|
|
256
|
+
return target;
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
181
260
|
// Keep short-lived "back to previous view" state in sessionStorage and also
|
|
182
261
|
// refresh the longer-lived localStorage route retention in one call.
|
|
183
262
|
export const storeCurrentModelViewContext = (target?: string) => {
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { type ExtensionComponentType, type ExtensionFunctionType } from "../types/extension-registry";
|
|
3
|
-
export declare const registerExtensionComponent: (name: string, component: React.ComponentType<any
|
|
2
|
+
import { type AgentChatWidgetMetadata, type ExtensionComponentAdditionalMetadata, type ExtensionComponentMetadataProvider, type ExtensionComponentType, type ExtensionFunctionType } from "../types/extension-registry";
|
|
3
|
+
export declare const registerExtensionComponent: (name: string, component: React.ComponentType<any> & ExtensionComponentMetadataProvider, type?: ExtensionComponentType, aliases?: string[], fieldType?: string, extensionMetadata?: ExtensionComponentAdditionalMetadata) => void;
|
|
4
4
|
export declare const registerExtensionFunction: (name: string, fn: (...args: any[]) => any, type?: ExtensionFunctionType) => void;
|
|
5
5
|
export declare function getExtensionComponent(name: string): React.ComponentType<any> | null;
|
|
6
6
|
export declare function getExtensionComponent(name: string, type: ExtensionComponentType): React.ComponentType<any> | null;
|
|
7
|
+
/** Merge metadata declared at registration with optional metadata returned by the component itself. */
|
|
8
|
+
export declare function getExtensionComponentMetadata(name: string): ExtensionComponentAdditionalMetadata | null;
|
|
7
9
|
/** Names of every registered component of `type` (and `fieldType`, when given). Aliases are included. */
|
|
8
10
|
export declare const getExtensionComponents: (type: ExtensionComponentType, fieldType?: string) => string[];
|
|
11
|
+
/** Discover agent-facing metadata from chat widgets that opt in through their metadata hook. */
|
|
12
|
+
export declare const getAgentChatWidgetCatalog: () => AgentChatWidgetMetadata[];
|
|
9
13
|
export declare const getExtensionFunction: (name: string) => (...args: any[]) => any;
|
|
10
14
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/helpers/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/helpers/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAkF1B,OAAO,EAGH,KAAK,uBAAuB,EAC5B,KAAK,oCAAoC,EACzC,KAAK,kCAAkC,EACvC,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC7B,MAAM,6BAA6B,CAAC;AA+CrC,eAAO,MAAM,0BAA0B,SAAU,MAAM,aAAa,MAAM,aAAa,CAAC,GAAG,CAAC,GAAG,kCAAkC,SAAQ,sBAAsB,YAAyD,MAAM,EAAE,cAAkB,MAAM,sBAA0B,oCAAoC,SAOrT,CAAC;AAEF,eAAO,MAAM,yBAAyB,SAAU,MAAM,gBAAgB,GAAG,EAAE,KAAK,GAAG,SAAQ,qBAAqB,SAE/G,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AACrF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AAMnH,uGAAuG;AACvG,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,oCAAoC,GAAG,IAAI,CA0BvG;AAED,yGAAyG;AACzG,eAAO,MAAM,sBAAsB,SAAU,sBAAsB,cAAa,MAAM,KAAQ,MAAM,EAInG,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,yBAAyB,QAAO,uBAAuB,EAiBnE,CAAC;AAEF,eAAO,MAAM,oBAAoB,SAAU,MAAM,eA1F/B,GAAG,EAAE,KAAK,GA4F3B,CAAC"}
|
package/dist/helpers/registry.js
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
1
12
|
import hanldeEmailFormTypeChange from "../components/core/extension/solid-core/emailTemplate/emailFormTypeChangeHandler";
|
|
2
13
|
import hanldeEmailFormTypeLoad from "../components/core/extension/solid-core/emailTemplate/emailFormTypeLoad";
|
|
3
14
|
import { RolePermissionsManyToManyFieldWidget } from "../components/core/extension/solid-core/roleMetadata/RolePermissionsManyToManyFieldWidget";
|
|
@@ -9,6 +20,8 @@ import GenerateModelCodeRowAction from "../components/core/extension/solid-core/
|
|
|
9
20
|
import GenerateModuleCodeRowAction from "../components/core/extension/solid-core/moduleMetadata/list/GenerateModuleCodeRowAction";
|
|
10
21
|
import { ClearModulePackageRuntimeHeaderAction } from "../components/core/extension/solid-core/moduleMetadata/list/ClearModulePackageRuntimeHeaderAction";
|
|
11
22
|
import ExportModulePackageRowAction from "../components/core/extension/solid-core/moduleMetadata/list/ExportModulePackageRowAction";
|
|
23
|
+
import UpdateModulePackageRowAction from "../components/core/extension/solid-core/moduleMetadata/list/UpdateModulePackageRowAction";
|
|
24
|
+
import RestoreModulePackageRowAction from "../components/core/extension/solid-core/moduleMetadata/list/RestoreModulePackageRowAction";
|
|
12
25
|
import { ModuleImportListHeaderAction } from "../components/core/extension/solid-core/moduleMetadata/list/ModuleImportListHeaderAction";
|
|
13
26
|
import moduleMetadataListOnLoad from "../components/core/extension/solid-core/moduleMetadata/list/moduleMetadataListOnLoad";
|
|
14
27
|
import { DefaultBooleanFormEditWidget, DefaultBooleanFormViewWidget, SolidBooleanCheckboxStyleFormEditWidget, SolidBooleanSwitchStyleFormEditWidget } from "../components/core/form/fields/SolidBooleanField";
|
|
@@ -106,14 +119,16 @@ var extensionRegistry = {
|
|
|
106
119
|
components: {},
|
|
107
120
|
functions: {},
|
|
108
121
|
};
|
|
109
|
-
export var registerExtensionComponent = function (name, component, type, aliases, fieldType) {
|
|
122
|
+
export var registerExtensionComponent = function (name, component, type, aliases, fieldType, extensionMetadata) {
|
|
110
123
|
if (type === void 0) { type = ExtensionComponentTypes.formFieldViewWidget; }
|
|
111
124
|
if (aliases === void 0) { aliases = []; }
|
|
112
125
|
if (fieldType === void 0) { fieldType = ''; }
|
|
113
|
-
|
|
126
|
+
if (extensionMetadata === void 0) { extensionMetadata = {}; }
|
|
127
|
+
var metadata = { component: component, type: type, fieldType: fieldType, extensionMetadata: extensionMetadata };
|
|
128
|
+
extensionRegistry.components[name] = metadata;
|
|
114
129
|
for (var i = 0; i < aliases.length; i++) {
|
|
115
130
|
var alias = aliases[i];
|
|
116
|
-
extensionRegistry.components[alias] =
|
|
131
|
+
extensionRegistry.components[alias] = metadata;
|
|
117
132
|
}
|
|
118
133
|
};
|
|
119
134
|
export var registerExtensionFunction = function (name, fn, type) {
|
|
@@ -124,6 +139,35 @@ export function getExtensionComponent(name, type) {
|
|
|
124
139
|
var registered = extensionRegistry.components[name];
|
|
125
140
|
return registered && (!type || registered.type === type) ? registered.component : null;
|
|
126
141
|
}
|
|
142
|
+
/** Merge metadata declared at registration with optional metadata returned by the component itself. */
|
|
143
|
+
export function getExtensionComponentMetadata(name) {
|
|
144
|
+
var registered = extensionRegistry.components[name];
|
|
145
|
+
if (!registered)
|
|
146
|
+
return null;
|
|
147
|
+
var provider = registered.component.getExtensionMetadata;
|
|
148
|
+
if (typeof provider !== "function")
|
|
149
|
+
return __assign({}, registered.extensionMetadata);
|
|
150
|
+
try {
|
|
151
|
+
var dynamicMetadata = provider.call(registered.component);
|
|
152
|
+
if (!dynamicMetadata || typeof dynamicMetadata !== "object" || Array.isArray(dynamicMetadata)) {
|
|
153
|
+
return __assign({}, registered.extensionMetadata);
|
|
154
|
+
}
|
|
155
|
+
var merged_1 = __assign({}, registered.extensionMetadata);
|
|
156
|
+
Object.entries(dynamicMetadata).forEach(function (_a) {
|
|
157
|
+
var key = _a[0], value = _a[1];
|
|
158
|
+
var declared = merged_1[key];
|
|
159
|
+
merged_1[key] = declared && typeof declared === "object" && !Array.isArray(declared) &&
|
|
160
|
+
value && typeof value === "object" && !Array.isArray(value)
|
|
161
|
+
? __assign(__assign({}, declared), value) : value;
|
|
162
|
+
});
|
|
163
|
+
return merged_1;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
// Metadata is optional: a broken or absent hook must never prevent registry bootstrap.
|
|
167
|
+
console.warn("Could not read dynamic metadata for extension component \"".concat(name, "\""), error);
|
|
168
|
+
return __assign({}, registered.extensionMetadata);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
127
171
|
/** Names of every registered component of `type` (and `fieldType`, when given). Aliases are included. */
|
|
128
172
|
export var getExtensionComponents = function (type, fieldType) {
|
|
129
173
|
if (fieldType === void 0) { fieldType = ''; }
|
|
@@ -137,6 +181,25 @@ export var getExtensionComponents = function (type, fieldType) {
|
|
|
137
181
|
return name;
|
|
138
182
|
});
|
|
139
183
|
};
|
|
184
|
+
/** Discover agent-facing metadata from chat widgets that opt in through their metadata hook. */
|
|
185
|
+
export var getAgentChatWidgetCatalog = function () {
|
|
186
|
+
var seenComponents = new Set();
|
|
187
|
+
var widgets = [];
|
|
188
|
+
Object.entries(extensionRegistry.components).forEach(function (_a) {
|
|
189
|
+
var name = _a[0], registered = _a[1];
|
|
190
|
+
if (registered.type !== ExtensionComponentTypes.chatInteractionWidget || seenComponents.has(registered))
|
|
191
|
+
return;
|
|
192
|
+
seenComponents.add(registered);
|
|
193
|
+
var metadata = getExtensionComponentMetadata(name);
|
|
194
|
+
var widget = metadata === null || metadata === void 0 ? void 0 : metadata.agentWidget;
|
|
195
|
+
if (!widget || typeof widget.name !== "string" || !widget.name ||
|
|
196
|
+
typeof widget.description !== "string" || !widget.description ||
|
|
197
|
+
!widget.propsSchema || widget.propsSchema.type !== "object")
|
|
198
|
+
return;
|
|
199
|
+
widgets.push(structuredClone(widget));
|
|
200
|
+
});
|
|
201
|
+
return widgets;
|
|
202
|
+
};
|
|
140
203
|
export var getExtensionFunction = function (name) {
|
|
141
204
|
var _a;
|
|
142
205
|
return (_a = extensionRegistry.functions[name]) === null || _a === void 0 ? void 0 : _a.fn;
|
|
@@ -297,6 +360,8 @@ registerExtensionComponent("DefaultRelationOneToManyFormViewWidget", DefaultRela
|
|
|
297
360
|
registerExtensionComponent("GenerateModelCodeRowAction", GenerateModelCodeRowAction, ExtensionComponentTypes.listRowAction);
|
|
298
361
|
registerExtensionComponent("GenerateModuleCodeRowAction", GenerateModuleCodeRowAction, ExtensionComponentTypes.listRowAction);
|
|
299
362
|
registerExtensionComponent("ExportModulePackageRowAction", ExportModulePackageRowAction, ExtensionComponentTypes.listRowAction);
|
|
363
|
+
registerExtensionComponent("UpdateModulePackageRowAction", UpdateModulePackageRowAction, ExtensionComponentTypes.listRowAction);
|
|
364
|
+
registerExtensionComponent("RestoreModulePackageRowAction", RestoreModulePackageRowAction, ExtensionComponentTypes.listRowAction);
|
|
300
365
|
registerExtensionComponent("DeleteModelRowAction", DeleteModelRowAction, ExtensionComponentTypes.listRowAction);
|
|
301
366
|
registerExtensionComponent("DeleteModuleRowAction", DeleteModuleRowAction, ExtensionComponentTypes.listRowAction);
|
|
302
367
|
// 7. form widget
|