@flanksource/clicky-ui 0.3.25 → 0.3.26
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/NOTICE.md +1 -0
- package/dist/ai.cjs +4 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +6 -2
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +8 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +9 -1
- package/dist/chat.js.map +1 -1
- package/dist/comments/CommentCard.cjs +89 -14
- package/dist/comments/CommentCard.cjs.map +1 -1
- package/dist/comments/CommentCard.d.ts.map +1 -1
- package/dist/comments/CommentCard.js +90 -15
- package/dist/comments/CommentCard.js.map +1 -1
- package/dist/comments/CommentComposer.cjs +25 -2
- package/dist/comments/CommentComposer.cjs.map +1 -1
- package/dist/comments/CommentComposer.d.ts.map +1 -1
- package/dist/comments/CommentComposer.js +25 -2
- package/dist/comments/CommentComposer.js.map +1 -1
- package/dist/comments/CommentProvider.cjs +21 -14
- package/dist/comments/CommentProvider.cjs.map +1 -1
- package/dist/comments/CommentProvider.d.ts +1 -1
- package/dist/comments/CommentProvider.d.ts.map +1 -1
- package/dist/comments/CommentProvider.js +21 -14
- package/dist/comments/CommentProvider.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +1 -1
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.js +1 -1
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/comment-types.cjs.map +1 -1
- package/dist/comments/comment-types.d.ts +6 -0
- package/dist/comments/comment-types.d.ts.map +1 -1
- package/dist/comments/comment-types.js.map +1 -1
- package/dist/components/DimensionField.cjs +56 -0
- package/dist/components/DimensionField.cjs.map +1 -0
- package/dist/components/DimensionField.d.ts +17 -0
- package/dist/components/DimensionField.d.ts.map +1 -0
- package/dist/components/DimensionField.js +56 -0
- package/dist/components/DimensionField.js.map +1 -0
- package/dist/components.cjs +4 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +2 -0
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +4 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -5
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -5
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/TaskExecDetails.cjs +8 -3
- package/dist/data/TaskExecDetails.cjs.map +1 -1
- package/dist/data/TaskExecDetails.d.ts +4 -0
- package/dist/data/TaskExecDetails.d.ts.map +1 -1
- package/dist/data/TaskExecDetails.js +9 -4
- package/dist/data/TaskExecDetails.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +101 -7
- package/dist/data/TaskManagerButton.cjs.map +1 -1
- package/dist/data/TaskManagerButton.d.ts +6 -1
- package/dist/data/TaskManagerButton.d.ts.map +1 -1
- package/dist/data/TaskManagerButton.js +103 -9
- package/dist/data/TaskManagerButton.js.map +1 -1
- package/dist/data/TaskProcessDetails.cjs +2 -0
- package/dist/data/TaskProcessDetails.cjs.map +1 -1
- package/dist/data/TaskProcessDetails.d.ts.map +1 -1
- package/dist/data/TaskProcessDetails.js +2 -0
- package/dist/data/TaskProcessDetails.js.map +1 -1
- package/dist/data/TaskProgress.cjs +14 -4
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.js +14 -4
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +1 -0
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +18 -23
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +19 -24
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.cjs +12 -21
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.d.ts +3 -2
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.js +12 -21
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +21 -38
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +5 -5
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.js +21 -38
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
- package/dist/data/ai/ChatWindow.types.d.ts +2 -2
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.cjs +2 -2
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
- package/dist/data/ai/ChatWindowManager.js +2 -2
- package/dist/data/ai/ChatWindowManager.js.map +1 -1
- package/dist/data/ai/ChatWindowRequestBody.cjs +4 -2
- package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -1
- package/dist/data/ai/ChatWindowRequestBody.d.ts +15 -3
- package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowRequestBody.js +4 -2
- package/dist/data/ai/ChatWindowRequestBody.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +5 -5
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +6 -5
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +5 -5
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +61 -37
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.model.d.ts +32 -13
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.model.js +62 -38
- package/dist/data/ai/ToolPreferences.model.js.map +1 -1
- package/dist/data/ai/ToolPreferencesList.cjs +17 -20
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
- package/dist/data/ai/ToolPreferencesList.d.ts +16 -7
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferencesList.js +18 -21
- package/dist/data/ai/ToolPreferencesList.js.map +1 -1
- package/dist/data/ai/chat-window-context.cjs +1 -1
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +7 -7
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +1 -1
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/index.d.ts +3 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
- package/dist/data/chat/clickyOperationsToTools.js +2 -1
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
- package/dist/data/chat/index.d.ts +2 -1
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/tool-policy.cjs +132 -0
- package/dist/data/chat/tool-policy.cjs.map +1 -0
- package/dist/data/chat/tool-policy.d.ts +81 -0
- package/dist/data/chat/tool-policy.d.ts.map +1 -0
- package/dist/data/chat/tool-policy.js +132 -0
- package/dist/data/chat/tool-policy.js.map +1 -0
- package/dist/data/chat/types.cjs +20 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +22 -2
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js +20 -0
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/debugConsoleSignal.cjs +64 -0
- package/dist/data/debugConsoleSignal.cjs.map +1 -0
- package/dist/data/debugConsoleSignal.d.ts +83 -0
- package/dist/data/debugConsoleSignal.d.ts.map +1 -0
- package/dist/data/debugConsoleSignal.js +64 -0
- package/dist/data/debugConsoleSignal.js.map +1 -0
- package/dist/data/har/HarPanel.cjs +20 -14
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +20 -14
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/har/types.d.ts +18 -0
- package/dist/data/har/types.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.cjs +4 -42
- package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
- package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.js +5 -43
- package/dist/data/query-browser/QueryBrowser.js.map +1 -1
- package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
- package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
- package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
- package/dist/data/useDebugAction.cjs +29 -0
- package/dist/data/useDebugAction.cjs.map +1 -0
- package/dist/data/useDebugAction.d.ts +16 -0
- package/dist/data/useDebugAction.d.ts.map +1 -0
- package/dist/data/useDebugAction.js +29 -0
- package/dist/data/useDebugAction.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +16 -8
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +3 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +16 -8
- package/dist/devtools/DebugConsole.cjs +138 -0
- package/dist/devtools/DebugConsole.cjs.map +1 -0
- package/dist/devtools/DebugConsole.d.ts +23 -0
- package/dist/devtools/DebugConsole.d.ts.map +1 -0
- package/dist/devtools/DebugConsole.js +138 -0
- package/dist/devtools/DebugConsole.js.map +1 -0
- package/dist/devtools/DebugConsoleButton.cjs +59 -0
- package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
- package/dist/devtools/DebugConsoleButton.d.ts +20 -0
- package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
- package/dist/devtools/DebugConsoleButton.js +59 -0
- package/dist/devtools/DebugConsoleButton.js.map +1 -0
- package/dist/devtools/DebugConsoleDock.cjs +112 -0
- package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
- package/dist/devtools/DebugConsoleDock.d.ts +26 -0
- package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
- package/dist/devtools/DebugConsoleDock.js +112 -0
- package/dist/devtools/DebugConsoleDock.js.map +1 -0
- package/dist/devtools/ExecutionDetail.cjs +135 -0
- package/dist/devtools/ExecutionDetail.cjs.map +1 -0
- package/dist/devtools/ExecutionDetail.d.ts +19 -0
- package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
- package/dist/devtools/ExecutionDetail.js +135 -0
- package/dist/devtools/ExecutionDetail.js.map +1 -0
- package/dist/devtools/debugClient.cjs +172 -0
- package/dist/devtools/debugClient.cjs.map +1 -0
- package/dist/devtools/debugClient.d.ts +98 -0
- package/dist/devtools/debugClient.d.ts.map +1 -0
- package/dist/devtools/debugClient.js +172 -0
- package/dist/devtools/debugClient.js.map +1 -0
- package/dist/devtools/debugStore.cjs +115 -0
- package/dist/devtools/debugStore.cjs.map +1 -0
- package/dist/devtools/debugStore.d.ts +83 -0
- package/dist/devtools/debugStore.d.ts.map +1 -0
- package/dist/devtools/debugStore.js +115 -0
- package/dist/devtools/debugStore.js.map +1 -0
- package/dist/devtools/dockState.cjs +51 -0
- package/dist/devtools/dockState.cjs.map +1 -0
- package/dist/devtools/dockState.d.ts +31 -0
- package/dist/devtools/dockState.d.ts.map +1 -0
- package/dist/devtools/dockState.js +51 -0
- package/dist/devtools/dockState.js.map +1 -0
- package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
- package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
- package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
- package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
- package/dist/devtools/tabs/ConsoleTab.js +36 -0
- package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
- package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
- package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
- package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
- package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
- package/dist/devtools/tabs/InspectionCaches.js +150 -0
- package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
- package/dist/devtools/tabs/InspectionTab.cjs +316 -0
- package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
- package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
- package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
- package/dist/devtools/tabs/InspectionTab.js +316 -0
- package/dist/devtools/tabs/InspectionTab.js.map +1 -0
- package/dist/devtools/tabs/NetworkTab.cjs +91 -0
- package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
- package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
- package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
- package/dist/devtools/tabs/NetworkTab.js +91 -0
- package/dist/devtools/tabs/NetworkTab.js.map +1 -0
- package/dist/devtools/tabs/QueriesTab.cjs +85 -0
- package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
- package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
- package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
- package/dist/devtools/tabs/QueriesTab.js +85 -0
- package/dist/devtools/tabs/QueriesTab.js.map +1 -0
- package/dist/devtools/types.cjs +26 -0
- package/dist/devtools/types.cjs.map +1 -0
- package/dist/devtools/types.d.ts +235 -0
- package/dist/devtools/types.d.ts.map +1 -0
- package/dist/devtools/types.js +26 -0
- package/dist/devtools/types.js.map +1 -0
- package/dist/devtools/useDebugStream.cjs +46 -0
- package/dist/devtools/useDebugStream.cjs.map +1 -0
- package/dist/devtools/useDebugStream.d.ts +23 -0
- package/dist/devtools/useDebugStream.d.ts.map +1 -0
- package/dist/devtools/useDebugStream.js +46 -0
- package/dist/devtools/useDebugStream.js.map +1 -0
- package/dist/devtools.cjs +51 -0
- package/dist/devtools.cjs.map +1 -0
- package/dist/devtools.d.ts +37 -0
- package/dist/devtools.d.ts.map +1 -0
- package/dist/devtools.js +51 -0
- package/dist/devtools.js.map +1 -0
- package/dist/icons/components/UiOpenScad.cjs +10 -0
- package/dist/icons/components/UiOpenScad.cjs.map +1 -0
- package/dist/icons/components/UiOpenScad.d.ts +9 -0
- package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
- package/dist/icons/components/UiOpenScad.js +10 -0
- package/dist/icons/components/UiOpenScad.js.map +1 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +2 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +2 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +2 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +2 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +20 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +20 -8
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +15 -10
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +11 -0
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +15 -10
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +170 -49
- package/dist/layout/AppShell.nav.cjs.map +1 -1
- package/dist/layout/AppShell.nav.d.ts.map +1 -1
- package/dist/layout/AppShell.nav.js +170 -49
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/overlay/CellActions.cjs +18 -124
- package/dist/overlay/CellActions.cjs.map +1 -1
- package/dist/overlay/CellActions.d.ts +1 -1
- package/dist/overlay/CellActions.d.ts.map +1 -1
- package/dist/overlay/CellActions.js +18 -124
- package/dist/overlay/CellActions.js.map +1 -1
- package/dist/overlay/ContextMenu.cjs +144 -0
- package/dist/overlay/ContextMenu.cjs.map +1 -0
- package/dist/overlay/ContextMenu.d.ts +8 -0
- package/dist/overlay/ContextMenu.d.ts.map +1 -0
- package/dist/overlay/ContextMenu.js +144 -0
- package/dist/overlay/ContextMenu.js.map +1 -0
- package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
- package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
- package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
- package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
- package/dist/profiles/connections/connectionBrowserModel.js +14 -65
- package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
- package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
- package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
- package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
- package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
- package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
- package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
- package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
- package/dist/profiles/connections/index.d.ts +1 -0
- package/dist/profiles/connections/index.d.ts.map +1 -1
- package/dist/profiles/connections/inspectionStatus.cjs +44 -0
- package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
- package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
- package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
- package/dist/profiles/connections/inspectionStatus.js +44 -0
- package/dist/profiles/connections/inspectionStatus.js.map +1 -0
- package/dist/profiles/connections/useInspection.cjs +123 -0
- package/dist/profiles/connections/useInspection.cjs.map +1 -0
- package/dist/profiles/connections/useInspection.d.ts +35 -0
- package/dist/profiles/connections/useInspection.d.ts.map +1 -0
- package/dist/profiles/connections/useInspection.js +123 -0
- package/dist/profiles/connections/useInspection.js.map +1 -0
- package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
- package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
- package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
- package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
- package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
- package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
- package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
- package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
- package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
- package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
- package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
- package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
- package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
- package/dist/profiles/fields/profileFieldEditor.js +137 -22
- package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
- package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
- package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
- package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
- package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
- package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
- package/dist/profiles/fields/profileFieldIcons.js +6 -3
- package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
- package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
- package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
- package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
- package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
- package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
- package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
- package/dist/profiles/query/profileSamplePayload.cjs +6 -4
- package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
- package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
- package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
- package/dist/profiles/query/profileSamplePayload.js +6 -4
- package/dist/profiles/query/profileSamplePayload.js.map +1 -1
- package/dist/profiles/query/profileSampleResult.cjs +26 -0
- package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
- package/dist/profiles/query/profileSampleResult.d.ts +11 -0
- package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
- package/dist/profiles/query/profileSampleResult.js +26 -0
- package/dist/profiles/query/profileSampleResult.js.map +1 -0
- package/dist/profiles/query/queryTargetPicker.cjs +5 -3
- package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
- package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
- package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
- package/dist/profiles/query/queryTargetPicker.js +5 -3
- package/dist/profiles/query/queryTargetPicker.js.map +1 -1
- package/dist/profiles/wizard/profileWizard.cjs +14 -5
- package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizard.js +15 -6
- package/dist/profiles/wizard/profileWizard.js.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
- package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
- package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizardModel.js +35 -6
- package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
- package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
- package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
- package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
- package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
- package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
- package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
- package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
- package/dist/profiles/wizard/profileWizardSteps.js +33 -2
- package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
- package/dist/profiles.cjs +8 -2
- package/dist/profiles.cjs.map +1 -1
- package/dist/profiles.js +10 -4
- package/dist/profiles.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +21 -237
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.d.ts +3 -1
- package/dist/rpc/FilterForm.d.ts.map +1 -1
- package/dist/rpc/FilterForm.js +21 -237
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/FilterFormFields.cjs +240 -0
- package/dist/rpc/FilterFormFields.cjs.map +1 -0
- package/dist/rpc/FilterFormFields.d.ts +12 -0
- package/dist/rpc/FilterFormFields.d.ts.map +1 -0
- package/dist/rpc/FilterFormFields.js +240 -0
- package/dist/rpc/FilterFormFields.js.map +1 -0
- package/dist/rpc/router.cjs +3 -2
- package/dist/rpc/router.cjs.map +1 -1
- package/dist/rpc/router.d.ts.map +1 -1
- package/dist/rpc/router.js +3 -2
- package/dist/rpc/router.js.map +1 -1
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +3 -1
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
- package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
- package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
- package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
- package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
- package/dist/data/query-info/QueryInfoDialog.js +0 -106
- package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
- package/dist/data/query-info/index.d.ts +0 -4
- package/dist/data/query-info/index.d.ts.map +0 -1
- package/dist/data/query-info/queryInfo.cjs +0 -42
- package/dist/data/query-info/queryInfo.cjs.map +0 -1
- package/dist/data/query-info/queryInfo.d.ts +0 -45
- package/dist/data/query-info/queryInfo.d.ts.map +0 -1
- package/dist/data/query-info/queryInfo.js +0 -42
- package/dist/data/query-info/queryInfo.js.map +0 -1
- package/dist/data/query-info/useQueryInfo.cjs +0 -48
- package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
- package/dist/data/query-info/useQueryInfo.d.ts +0 -26
- package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
- package/dist/data/query-info/useQueryInfo.js +0 -48
- package/dist/data/query-info/useQueryInfo.js.map +0 -1
|
@@ -28,8 +28,14 @@ function celExamples(fieldName) {
|
|
|
28
28
|
label: `Default ${fieldName} when missing`,
|
|
29
29
|
expression: `${field.presence} ? ${field.reference} : ""`
|
|
30
30
|
},
|
|
31
|
-
{
|
|
32
|
-
|
|
31
|
+
{
|
|
32
|
+
label: `Convert ${fieldName} to text`,
|
|
33
|
+
expression: `string(${field.reference})`
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
label: `Scale ${fieldName} by 1,000`,
|
|
37
|
+
expression: `${field.reference} / 1000.0`
|
|
38
|
+
}
|
|
33
39
|
];
|
|
34
40
|
}
|
|
35
41
|
function ProfileFieldEditorActions({
|
|
@@ -42,8 +48,28 @@ function ProfileFieldEditorActions({
|
|
|
42
48
|
onRemove
|
|
43
49
|
}) {
|
|
44
50
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
45
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
46
|
-
|
|
51
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
52
|
+
button.Button,
|
|
53
|
+
{
|
|
54
|
+
type: "button",
|
|
55
|
+
size: "sm",
|
|
56
|
+
variant: "ghost",
|
|
57
|
+
disabled: !canMoveUp,
|
|
58
|
+
onClick: onMoveUp,
|
|
59
|
+
children: "Move up"
|
|
60
|
+
}
|
|
61
|
+
),
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
63
|
+
button.Button,
|
|
64
|
+
{
|
|
65
|
+
type: "button",
|
|
66
|
+
size: "sm",
|
|
67
|
+
variant: "ghost",
|
|
68
|
+
disabled: !canMoveDown,
|
|
69
|
+
onClick: onMoveDown,
|
|
70
|
+
children: "Move down"
|
|
71
|
+
}
|
|
72
|
+
),
|
|
47
73
|
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "sm", variant: "ghost", onClick: onRemove, children: "Remove" }),
|
|
48
74
|
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-2 text-sm font-medium", children: [
|
|
49
75
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -66,8 +92,49 @@ function ProfileFieldEditorForm({
|
|
|
66
92
|
const wide = columns === 2 ? "sm:col-span-2" : "";
|
|
67
93
|
const rows = jsonPathSample.useJsonPathSampleRows();
|
|
68
94
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `grid gap-4 ${columns === 2 ? "sm:grid-cols-2" : ""}`, children: [
|
|
69
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
-
|
|
95
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
96
|
+
profileFieldFilterEditor.ProfileFieldFilterEditor,
|
|
97
|
+
{
|
|
98
|
+
field,
|
|
99
|
+
columns,
|
|
100
|
+
onChange
|
|
101
|
+
}
|
|
102
|
+
),
|
|
103
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
104
|
+
profileFieldControls.EditorField,
|
|
105
|
+
{
|
|
106
|
+
label: "Output name",
|
|
107
|
+
icon: profileFieldIcons.profileTypeIcon(field.type),
|
|
108
|
+
help: "Public field name used by tables, filters, APIs, and every export.",
|
|
109
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
110
|
+
"input",
|
|
111
|
+
{
|
|
112
|
+
"aria-label": "Output name",
|
|
113
|
+
value: field.name,
|
|
114
|
+
className: profileFieldControls.inputClassName,
|
|
115
|
+
onChange: (event) => onChange({ name: event.target.value })
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
),
|
|
120
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
121
|
+
profileFieldControls.EditorField,
|
|
122
|
+
{
|
|
123
|
+
label: "Display label",
|
|
124
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(UiTag.UiTag, {}),
|
|
125
|
+
help: "Optional table header; blank uses the field name.",
|
|
126
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
127
|
+
"input",
|
|
128
|
+
{
|
|
129
|
+
"aria-label": "Display label",
|
|
130
|
+
value: field.label ?? "",
|
|
131
|
+
className: profileFieldControls.inputClassName,
|
|
132
|
+
placeholder: field.name,
|
|
133
|
+
onChange: (event) => onChange({ label: event.target.value || void 0 })
|
|
134
|
+
}
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
),
|
|
71
138
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
72
139
|
profileFieldControls.EnumField,
|
|
73
140
|
{
|
|
@@ -89,7 +156,9 @@ function ProfileFieldEditorForm({
|
|
|
89
156
|
value: field.kind ?? "",
|
|
90
157
|
options: profileFieldIcons.profileRoleOptions,
|
|
91
158
|
placeholder: "Standard field",
|
|
92
|
-
onChange: (next) => onChange(
|
|
159
|
+
onChange: (next) => onChange(
|
|
160
|
+
next === "timestamp" ? { kind: next, type: "datetime" } : { kind: next }
|
|
161
|
+
)
|
|
93
162
|
}
|
|
94
163
|
),
|
|
95
164
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -116,7 +185,28 @@ function ProfileFieldEditorForm({
|
|
|
116
185
|
onChange: (next) => onChange({ unit: next })
|
|
117
186
|
}
|
|
118
187
|
),
|
|
119
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
188
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
189
|
+
profileFieldControls.EditorField,
|
|
190
|
+
{
|
|
191
|
+
label: "Max width (characters)",
|
|
192
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(UiColumns.UiColumns, {}),
|
|
193
|
+
help: "Maximum rendered width; blank uses the table default.",
|
|
194
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
195
|
+
"input",
|
|
196
|
+
{
|
|
197
|
+
"aria-label": "Max width (characters)",
|
|
198
|
+
type: "number",
|
|
199
|
+
min: 1,
|
|
200
|
+
value: field.width ?? "",
|
|
201
|
+
className: profileFieldControls.inputClassName,
|
|
202
|
+
placeholder: "Auto",
|
|
203
|
+
onChange: (event) => onChange({
|
|
204
|
+
width: event.target.value ? Number(event.target.value) : void 0
|
|
205
|
+
})
|
|
206
|
+
}
|
|
207
|
+
)
|
|
208
|
+
}
|
|
209
|
+
),
|
|
120
210
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: wide, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-1.5 text-sm font-medium", children: [
|
|
121
211
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
122
212
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2", children: [
|
|
@@ -149,27 +239,52 @@ function ProfileFieldEditorForm({
|
|
|
149
239
|
)
|
|
150
240
|
] })
|
|
151
241
|
] }),
|
|
152
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
242
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
243
|
+
"textarea",
|
|
244
|
+
{
|
|
245
|
+
"aria-label": "CEL expression",
|
|
246
|
+
rows: 4,
|
|
247
|
+
value: field.cel ?? "",
|
|
248
|
+
className: `${profileFieldControls.inputClassName} resize-y font-mono text-xs`,
|
|
249
|
+
placeholder: "Optional value transformation",
|
|
250
|
+
onChange: (event) => onChange({ cel: event.target.value || void 0 })
|
|
251
|
+
}
|
|
252
|
+
),
|
|
153
253
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-normal text-muted-foreground", children: "Optional expression computing the value from row." })
|
|
154
254
|
] }) }),
|
|
155
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: wide, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
156
|
-
|
|
255
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: wide, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
256
|
+
profileFieldControls.EditorField,
|
|
157
257
|
{
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
258
|
+
label: "JSONPath",
|
|
259
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(UiBraces.UiBraces, {}),
|
|
260
|
+
fullWidth: true,
|
|
261
|
+
help: "Optional path computing the value, rooted at the row or at Source; an alternative to CEL.",
|
|
262
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
263
|
+
JSONPathField.JSONPathField,
|
|
264
|
+
{
|
|
265
|
+
"aria-label": "JSONPath",
|
|
266
|
+
value: field.jsonpath ?? "",
|
|
267
|
+
onChange: (next) => onChange({ jsonpath: next || void 0 }),
|
|
268
|
+
onSelectPath: (next, { root }) => onChange({ jsonpath: next || void 0, source: root }),
|
|
269
|
+
...field.source ? { source: field.source } : {},
|
|
270
|
+
...rows.length === 0 ? {} : { json: rows[0], rows },
|
|
271
|
+
evaluate: jsonPathSample.evaluateJsonPath
|
|
272
|
+
}
|
|
273
|
+
)
|
|
165
274
|
}
|
|
166
|
-
) })
|
|
275
|
+
) }),
|
|
167
276
|
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: `flex items-center gap-2 text-sm font-medium ${wide}`, children: [
|
|
168
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
277
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
278
|
+
"input",
|
|
279
|
+
{
|
|
280
|
+
type: "checkbox",
|
|
281
|
+
checked: field.hidden ?? false,
|
|
282
|
+
onChange: (event) => onChange({ hidden: event.target.checked })
|
|
283
|
+
}
|
|
284
|
+
),
|
|
169
285
|
/* @__PURE__ */ jsxRuntime.jsx(UiEyeClosed.UiEyeClosed, { className: "text-[15px] text-muted-foreground" }),
|
|
170
286
|
"Hide this field in the default table"
|
|
171
|
-
] })
|
|
172
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: wide, children: /* @__PURE__ */ jsxRuntime.jsx(profileFieldFilterEditor.ProfileFieldFilterEditor, { field, columns, onChange }) })
|
|
287
|
+
] })
|
|
173
288
|
] });
|
|
174
289
|
}
|
|
175
290
|
function ProfileFieldEditor({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileFieldEditor.cjs","sources":["../../../src/profiles/fields/profileFieldEditor.tsx"],"sourcesContent":["import { JSONPathField } from \"../../components/JSONPathField\";\nimport { Button } from \"../../components/button\";\nimport {\n UiBraces,\n UiColumns,\n UiEyeClosed,\n UiFileType,\n UiFunctionSquare,\n UiPalette,\n UiScale,\n UiTableProperties,\n UiTag,\n} from \"../../icons\";\nimport { CelTestButton } from \"../cel/celEditor\";\nimport { celFieldAccess } from \"../cel/celPath\";\nimport { EditorField, EnumField, inputClassName } from \"./profileFieldControls\";\nimport { ProfileFieldFilterEditor } from \"./profileFieldFilterEditor\";\nimport {\n profileFormatOptions,\n profileRoleOptions,\n profileTypeIcon,\n profileTypeOptions,\n profileUnitOptions,\n} from \"./profileFieldIcons\";\nimport type { Patch, ProfileColumn } from \"../wizard/profileWizardModel\";\nimport { evaluateJsonPath, useJsonPathSampleRows } from \"../query/jsonPathSample\";\n\ntype FieldActions = {\n selected: boolean;\n canMoveUp: boolean;\n canMoveDown: boolean;\n onSelectedChange: (selected: boolean) => void;\n onMoveUp: () => void;\n onMoveDown: () => void;\n onRemove: () => void;\n};\n\nexport const profileFieldEditorEmptyMessage =\n \"Add a column or run a sample to discover fields.\";\n\n/**\n * The starting points offered before a value is in hand.\n *\n * This header has only the field's name to go on — the sampled value lives in\n * the Test dialog, which is where the examples that fit it are offered. So\n * these stay deliberately generic and lead there.\n */\nfunction celExamples(fieldName: string): Array<{ label: string; expression: string }> {\n const field = celFieldAccess(fieldName);\n return [\n { label: \"Use the entire row\", expression: \"row\" },\n { label: `Read ${fieldName}`, expression: field.reference },\n {\n label: `Default ${fieldName} when missing`,\n expression: `${field.presence} ? ${field.reference} : \"\"`,\n },\n { label: `Convert ${fieldName} to text`, expression: `string(${field.reference})` },\n { label: `Scale ${fieldName} by 1,000`, expression: `${field.reference} / 1000.0` },\n ];\n}\n\n/** Ordering, removal and inclusion — the operations that act on the field as a\n * whole rather than on one of its properties. */\nexport function ProfileFieldEditorActions({\n canMoveUp,\n canMoveDown,\n selected,\n onSelectedChange,\n onMoveUp,\n onMoveDown,\n onRemove,\n}: FieldActions) {\n return (\n <>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={!canMoveUp} onClick={onMoveUp}>\n Move up\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={!canMoveDown} onClick={onMoveDown}>\n Move down\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={onRemove}>\n Remove\n </Button>\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={(event) => onSelectedChange(event.target.checked)}\n />\n Include\n </label>\n </>\n );\n}\n\n/**\n * Everything about a column that a grid cell cannot hold: role, format, unit\n * and the CEL expression. `columns` is explicit rather than a `sm:` breakpoint\n * because the wizard mounts this in a ~380px pane on a wide viewport, where\n * viewport-based breakpoints would wrongly go two-up.\n */\nexport function ProfileFieldEditorForm({\n field,\n columns = 2,\n onChange,\n}: {\n field: ProfileColumn;\n columns?: 1 | 2;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n const wide = columns === 2 ? \"sm:col-span-2\" : \"\";\n const rows = useJsonPathSampleRows();\n return (\n <div className={`grid gap-4 ${columns === 2 ? \"sm:grid-cols-2\" : \"\"}`}>\n <EditorField label=\"Output name\" icon={profileTypeIcon(field.type)} help=\"Public field name used by tables, filters, APIs, and every export.\">\n <input aria-label=\"Output name\" value={field.name} className={inputClassName} onChange={(event) => onChange({ name: event.target.value })} />\n </EditorField>\n <EditorField label=\"Display label\" icon={<UiTag />} help=\"Optional table header; blank uses the field name.\">\n <input aria-label=\"Display label\" value={field.label ?? \"\"} className={inputClassName} placeholder={field.name} onChange={(event) => onChange({ label: event.target.value || undefined })} />\n </EditorField>\n <EnumField\n label=\"Data type\"\n icon={<UiFileType />}\n help=\"Value shape and default formatting; independent of Role.\"\n value={field.type ?? \"\"}\n options={profileTypeOptions}\n placeholder=\"Auto detect\"\n onChange={(next) => onChange({ type: next })}\n />\n <EnumField\n label=\"Role\"\n icon={<UiTableProperties />}\n help=\"Optional table behavior. Timestamp also types the field as datetime, since it is the column the date-range control reads.\"\n value={field.kind ?? \"\"}\n options={profileRoleOptions}\n placeholder=\"Standard field\"\n // Naming the time column and leaving it typed as a string is a state\n // nobody wants: the header drives a date range while the cell renders\n // raw. The wizard already couples the two (mapTimestampColumn); doing\n // it here too is what keeps the per-field editor from undoing it.\n onChange={(next) =>\n onChange(next === \"timestamp\" ? { kind: next, type: \"datetime\" } : { kind: next })\n }\n />\n <EnumField\n label=\"Format\"\n icon={<UiPalette />}\n help=\"Optional formatter; Unit takes precedence when both are set.\"\n value={field.format ?? \"\"}\n options={profileFormatOptions}\n placeholder=\"From Type\"\n onChange={(next) => onChange({ format: next })}\n />\n <EnumField\n label=\"Unit\"\n icon={<UiScale />}\n help=\"Numeric scaling for number, duration, or bytes Types.\"\n value={field.unit ?? \"\"}\n options={profileUnitOptions}\n placeholder=\"No unit\"\n onChange={(next) => onChange({ unit: next })}\n />\n <EditorField label=\"Max width (characters)\" icon={<UiColumns />} help=\"Maximum rendered width; blank uses the table default.\">\n <input aria-label=\"Max width (characters)\" type=\"number\" min={1} value={field.width ?? \"\"} className={inputClassName} placeholder=\"Auto\" onChange={(event) => onChange({ width: event.target.value ? Number(event.target.value) : undefined })} />\n </EditorField>\n <div className={wide}>\n <div className=\"grid gap-1.5 text-sm font-medium\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex items-center gap-2\">\n <UiFunctionSquare className=\"shrink-0 text-[15px] text-muted-foreground\" />\n CEL expression\n </span>\n <span className=\"flex items-center gap-2\">\n <select\n aria-label=\"CEL examples\"\n value=\"\"\n className=\"h-8 rounded-md border border-input bg-background px-2 text-xs font-normal outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\"\n onChange={(event) => onChange({ cel: event.target.value })}\n >\n <option value=\"\">Examples</option>\n {celExamples(field.source ?? field.name).map((example) => (\n <option key={example.label} value={example.expression}>{example.label}</option>\n ))}\n </select>\n <CelTestButton\n value={field.cel ?? \"\"}\n scope=\"row\"\n rows={rows}\n title={field.name}\n onChange={(next) => onChange({ cel: next || undefined })}\n />\n </span>\n </div>\n <textarea aria-label=\"CEL expression\" rows={4} value={field.cel ?? \"\"} className={`${inputClassName} resize-y font-mono text-xs`} placeholder=\"Optional value transformation\" onChange={(event) => onChange({ cel: event.target.value || undefined })} />\n <span className=\"text-xs font-normal text-muted-foreground\">\n Optional expression computing the value from row.\n </span>\n </div>\n </div>\n <div className={wide}>\n <EditorField label=\"JSONPath\" icon={<UiBraces />} fullWidth help=\"Optional path computing the value, rooted at the row or at Source; an alternative to CEL.\">\n <JSONPathField\n aria-label=\"JSONPath\"\n value={field.jsonpath ?? \"\"}\n onChange={(next) => onChange({ jsonpath: next || undefined })}\n // This editor owns the whole column, so a path picked out of a\n // JSON-encoded column sets the Source it needs in the same edit\n // rather than leaving the author to pair the two by hand. A path\n // picked outside one clears it: alongside a jsonpath, Source is the\n // root, and a stale root re-roots the new path at a column it was\n // never written against.\n onSelectPath={(next, { root }) =>\n onChange({ jsonpath: next || undefined, source: root })\n }\n {...(field.source ? { source: field.source } : {})}\n {...(rows.length === 0 ? {} : { json: rows[0], rows })}\n evaluate={evaluateJsonPath}\n />\n </EditorField>\n </div>\n <label className={`flex items-center gap-2 text-sm font-medium ${wide}`}>\n <input type=\"checkbox\" checked={field.hidden ?? false} onChange={(event) => onChange({ hidden: event.target.checked })} />\n <UiEyeClosed className=\"text-[15px] text-muted-foreground\" />\n Hide this field in the default table\n </label>\n <div className={wide}>\n <ProfileFieldFilterEditor field={field} columns={columns} onChange={onChange} />\n </div>\n </div>\n );\n}\n\n/** The wizard's carded inspector: names the field itself, because its field\n * list has no header to do it. The editor route composes the parts instead,\n * since its Workspace pane header already carries the name. */\nexport function ProfileFieldEditor({\n field,\n onChange,\n ...actions\n}: FieldActions & {\n field?: ProfileColumn | undefined;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n if (!field) {\n return (\n <section className=\"grid min-h-64 place-items-center rounded-xl border border-dashed text-sm text-muted-foreground\">\n {profileFieldEditorEmptyMessage}\n </section>\n );\n }\n\n return (\n <section className=\"overflow-auto rounded-xl border bg-card p-5\">\n <div className=\"mb-5 flex flex-wrap items-start gap-2 border-b pb-4\">\n <div className=\"mr-auto min-w-0\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Field editor\n </p>\n <h3 className=\"mt-1 truncate font-mono text-sm font-semibold\">\n {field.name}\n </h3>\n </div>\n <ProfileFieldEditorActions {...actions} />\n </div>\n <ProfileFieldEditorForm field={field} onChange={onChange} />\n </section>\n );\n}\n"],"names":["celFieldAccess","jsxs","Fragment","jsx","Button","useJsonPathSampleRows","EditorField","profileTypeIcon","inputClassName","UiTag","EnumField","UiFileType","profileTypeOptions","UiTableProperties","profileRoleOptions","UiPalette","profileFormatOptions","UiScale","profileUnitOptions","UiColumns","UiFunctionSquare","CelTestButton","UiBraces","JSONPathField","evaluateJsonPath","UiEyeClosed","ProfileFieldFilterEditor"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profileFieldEditor.cjs","sources":["../../../src/profiles/fields/profileFieldEditor.tsx"],"sourcesContent":["import { JSONPathField } from \"../../components/JSONPathField\";\nimport { Button } from \"../../components/button\";\nimport {\n UiBraces,\n UiColumns,\n UiEyeClosed,\n UiFileType,\n UiFunctionSquare,\n UiPalette,\n UiScale,\n UiTableProperties,\n UiTag,\n} from \"../../icons\";\nimport { CelTestButton } from \"../cel/celEditor\";\nimport { celFieldAccess } from \"../cel/celPath\";\nimport { EditorField, EnumField, inputClassName } from \"./profileFieldControls\";\nimport { ProfileFieldFilterEditor } from \"./profileFieldFilterEditor\";\nimport {\n profileFormatOptions,\n profileRoleOptions,\n profileTypeIcon,\n profileTypeOptions,\n profileUnitOptions,\n} from \"./profileFieldIcons\";\nimport type { Patch, ProfileColumn } from \"../wizard/profileWizardModel\";\nimport {\n evaluateJsonPath,\n useJsonPathSampleRows,\n} from \"../query/jsonPathSample\";\n\ntype FieldActions = {\n selected: boolean;\n canMoveUp: boolean;\n canMoveDown: boolean;\n onSelectedChange: (selected: boolean) => void;\n onMoveUp: () => void;\n onMoveDown: () => void;\n onRemove: () => void;\n};\n\nexport const profileFieldEditorEmptyMessage =\n \"Add a column or run a sample to discover fields.\";\n\n/**\n * The starting points offered before a value is in hand.\n *\n * This header has only the field's name to go on — the sampled value lives in\n * the Test dialog, which is where the examples that fit it are offered. So\n * these stay deliberately generic and lead there.\n */\nfunction celExamples(\n fieldName: string,\n): Array<{ label: string; expression: string }> {\n const field = celFieldAccess(fieldName);\n return [\n { label: \"Use the entire row\", expression: \"row\" },\n { label: `Read ${fieldName}`, expression: field.reference },\n {\n label: `Default ${fieldName} when missing`,\n expression: `${field.presence} ? ${field.reference} : \"\"`,\n },\n {\n label: `Convert ${fieldName} to text`,\n expression: `string(${field.reference})`,\n },\n {\n label: `Scale ${fieldName} by 1,000`,\n expression: `${field.reference} / 1000.0`,\n },\n ];\n}\n\n/** Ordering, removal and inclusion — the operations that act on the field as a\n * whole rather than on one of its properties. */\nexport function ProfileFieldEditorActions({\n canMoveUp,\n canMoveDown,\n selected,\n onSelectedChange,\n onMoveUp,\n onMoveDown,\n onRemove,\n}: FieldActions) {\n return (\n <>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={!canMoveUp}\n onClick={onMoveUp}\n >\n Move up\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={!canMoveDown}\n onClick={onMoveDown}\n >\n Move down\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={onRemove}>\n Remove\n </Button>\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={(event) => onSelectedChange(event.target.checked)}\n />\n Include\n </label>\n </>\n );\n}\n\n/**\n * Everything about a column that a grid cell cannot hold: role, format, unit\n * and the CEL expression. `columns` is explicit rather than a `sm:` breakpoint\n * because the wizard mounts this in a ~380px pane on a wide viewport, where\n * viewport-based breakpoints would wrongly go two-up.\n */\nexport function ProfileFieldEditorForm({\n field,\n columns = 2,\n onChange,\n}: {\n field: ProfileColumn;\n columns?: 1 | 2;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n const wide = columns === 2 ? \"sm:col-span-2\" : \"\";\n const rows = useJsonPathSampleRows();\n return (\n <div className={`grid gap-4 ${columns === 2 ? \"sm:grid-cols-2\" : \"\"}`}>\n <ProfileFieldFilterEditor\n field={field}\n columns={columns}\n onChange={onChange}\n />\n <EditorField\n label=\"Output name\"\n icon={profileTypeIcon(field.type)}\n help=\"Public field name used by tables, filters, APIs, and every export.\"\n >\n <input\n aria-label=\"Output name\"\n value={field.name}\n className={inputClassName}\n onChange={(event) => onChange({ name: event.target.value })}\n />\n </EditorField>\n <EditorField\n label=\"Display label\"\n icon={<UiTag />}\n help=\"Optional table header; blank uses the field name.\"\n >\n <input\n aria-label=\"Display label\"\n value={field.label ?? \"\"}\n className={inputClassName}\n placeholder={field.name}\n onChange={(event) =>\n onChange({ label: event.target.value || undefined })\n }\n />\n </EditorField>\n <EnumField\n label=\"Data type\"\n icon={<UiFileType />}\n help=\"Value shape and default formatting; independent of Role.\"\n value={field.type ?? \"\"}\n options={profileTypeOptions}\n placeholder=\"Auto detect\"\n onChange={(next) => onChange({ type: next })}\n />\n <EnumField\n label=\"Role\"\n icon={<UiTableProperties />}\n help=\"Optional table behavior. Timestamp also types the field as datetime, since it is the column the date-range control reads.\"\n value={field.kind ?? \"\"}\n options={profileRoleOptions}\n placeholder=\"Standard field\"\n // Naming the time column and leaving it typed as a string is a state\n // nobody wants: the header drives a date range while the cell renders\n // raw. The wizard already couples the two (mapTimestampColumn); doing\n // it here too is what keeps the per-field editor from undoing it.\n onChange={(next) =>\n onChange(\n next === \"timestamp\"\n ? { kind: next, type: \"datetime\" }\n : { kind: next },\n )\n }\n />\n <EnumField\n label=\"Format\"\n icon={<UiPalette />}\n help=\"Optional formatter; Unit takes precedence when both are set.\"\n value={field.format ?? \"\"}\n options={profileFormatOptions}\n placeholder=\"From Type\"\n onChange={(next) => onChange({ format: next })}\n />\n <EnumField\n label=\"Unit\"\n icon={<UiScale />}\n help=\"Numeric scaling for number, duration, or bytes Types.\"\n value={field.unit ?? \"\"}\n options={profileUnitOptions}\n placeholder=\"No unit\"\n onChange={(next) => onChange({ unit: next })}\n />\n <EditorField\n label=\"Max width (characters)\"\n icon={<UiColumns />}\n help=\"Maximum rendered width; blank uses the table default.\"\n >\n <input\n aria-label=\"Max width (characters)\"\n type=\"number\"\n min={1}\n value={field.width ?? \"\"}\n className={inputClassName}\n placeholder=\"Auto\"\n onChange={(event) =>\n onChange({\n width: event.target.value\n ? Number(event.target.value)\n : undefined,\n })\n }\n />\n </EditorField>\n <div className={wide}>\n <div className=\"grid gap-1.5 text-sm font-medium\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex items-center gap-2\">\n <UiFunctionSquare className=\"shrink-0 text-[15px] text-muted-foreground\" />\n CEL expression\n </span>\n <span className=\"flex items-center gap-2\">\n <select\n aria-label=\"CEL examples\"\n value=\"\"\n className=\"h-8 rounded-md border border-input bg-background px-2 text-xs font-normal outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\"\n onChange={(event) => onChange({ cel: event.target.value })}\n >\n <option value=\"\">Examples</option>\n {celExamples(field.source ?? field.name).map((example) => (\n <option key={example.label} value={example.expression}>\n {example.label}\n </option>\n ))}\n </select>\n <CelTestButton\n value={field.cel ?? \"\"}\n scope=\"row\"\n rows={rows}\n title={field.name}\n onChange={(next) => onChange({ cel: next || undefined })}\n />\n </span>\n </div>\n <textarea\n aria-label=\"CEL expression\"\n rows={4}\n value={field.cel ?? \"\"}\n className={`${inputClassName} resize-y font-mono text-xs`}\n placeholder=\"Optional value transformation\"\n onChange={(event) =>\n onChange({ cel: event.target.value || undefined })\n }\n />\n <span className=\"text-xs font-normal text-muted-foreground\">\n Optional expression computing the value from row.\n </span>\n </div>\n </div>\n <div className={wide}>\n <EditorField\n label=\"JSONPath\"\n icon={<UiBraces />}\n fullWidth\n help=\"Optional path computing the value, rooted at the row or at Source; an alternative to CEL.\"\n >\n <JSONPathField\n aria-label=\"JSONPath\"\n value={field.jsonpath ?? \"\"}\n onChange={(next) => onChange({ jsonpath: next || undefined })}\n // This editor owns the whole column, so a path picked out of a\n // JSON-encoded column sets the Source it needs in the same edit\n // rather than leaving the author to pair the two by hand. A path\n // picked outside one clears it: alongside a jsonpath, Source is the\n // root, and a stale root re-roots the new path at a column it was\n // never written against.\n onSelectPath={(next, { root }) =>\n onChange({ jsonpath: next || undefined, source: root })\n }\n {...(field.source ? { source: field.source } : {})}\n {...(rows.length === 0 ? {} : { json: rows[0], rows })}\n evaluate={evaluateJsonPath}\n />\n </EditorField>\n </div>\n <label className={`flex items-center gap-2 text-sm font-medium ${wide}`}>\n <input\n type=\"checkbox\"\n checked={field.hidden ?? false}\n onChange={(event) => onChange({ hidden: event.target.checked })}\n />\n <UiEyeClosed className=\"text-[15px] text-muted-foreground\" />\n Hide this field in the default table\n </label>\n </div>\n );\n}\n\n/** The wizard's carded inspector: names the field itself, because its field\n * list has no header to do it. The editor route composes the parts instead,\n * since its Workspace pane header already carries the name. */\nexport function ProfileFieldEditor({\n field,\n onChange,\n ...actions\n}: FieldActions & {\n field?: ProfileColumn | undefined;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n if (!field) {\n return (\n <section className=\"grid min-h-64 place-items-center rounded-xl border border-dashed text-sm text-muted-foreground\">\n {profileFieldEditorEmptyMessage}\n </section>\n );\n }\n\n return (\n <section className=\"overflow-auto rounded-xl border bg-card p-5\">\n <div className=\"mb-5 flex flex-wrap items-start gap-2 border-b pb-4\">\n <div className=\"mr-auto min-w-0\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Field editor\n </p>\n <h3 className=\"mt-1 truncate font-mono text-sm font-semibold\">\n {field.name}\n </h3>\n </div>\n <ProfileFieldEditorActions {...actions} />\n </div>\n <ProfileFieldEditorForm field={field} onChange={onChange} />\n </section>\n );\n}\n"],"names":["celFieldAccess","jsxs","Fragment","jsx","Button","useJsonPathSampleRows","ProfileFieldFilterEditor","EditorField","profileTypeIcon","inputClassName","UiTag","EnumField","UiFileType","profileTypeOptions","UiTableProperties","profileRoleOptions","UiPalette","profileFormatOptions","UiScale","profileUnitOptions","UiColumns","UiFunctionSquare","CelTestButton","UiBraces","JSONPathField","evaluateJsonPath","UiEyeClosed"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwCO,MAAM,iCACX;AASF,SAAS,YACP,WAC8C;AAC9C,QAAM,QAAQA,QAAAA,eAAe,SAAS;AACtC,SAAO;AAAA,IACL,EAAE,OAAO,sBAAsB,YAAY,MAAA;AAAA,IAC3C,EAAE,OAAO,QAAQ,SAAS,IAAI,YAAY,MAAM,UAAA;AAAA,IAChD;AAAA,MACE,OAAO,WAAW,SAAS;AAAA,MAC3B,YAAY,GAAG,MAAM,QAAQ,MAAM,MAAM,SAAS;AAAA,IAAA;AAAA,IAEpD;AAAA,MACE,OAAO,WAAW,SAAS;AAAA,MAC3B,YAAY,UAAU,MAAM,SAAS;AAAA,IAAA;AAAA,IAEvC;AAAA,MACE,OAAO,SAAS,SAAS;AAAA,MACzB,YAAY,GAAG,MAAM,SAAS;AAAA,IAAA;AAAA,EAChC;AAEJ;AAIO,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAiB;AACf,SACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAACC,OAAAA;AAAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,UAAU,CAAC;AAAA,QACX,SAAS;AAAA,QACV,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGDD,2BAAAA;AAAAA,MAACC,OAAAA;AAAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,UAAU,CAAC;AAAA,QACX,SAAS;AAAA,QACV,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGDD,2BAAAA,IAACC,OAAAA,QAAA,EAAO,MAAK,UAAS,MAAK,MAAK,SAAQ,SAAQ,SAAS,UAAU,UAAA,SAAA,CAEnE;AAAA,IACAH,2BAAAA,KAAC,SAAA,EAAM,WAAU,+CACf,UAAA;AAAA,MAAAE,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU,CAAC,UAAU,iBAAiB,MAAM,OAAO,OAAO;AAAA,QAAA;AAAA,MAAA;AAAA,MAC1D;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AAQO,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA,UAAU;AAAA,EACV;AACF,GAIG;AACD,QAAM,OAAO,YAAY,IAAI,kBAAkB;AAC/C,QAAM,OAAOE,eAAAA,sBAAA;AACb,SACEJ,gCAAC,SAAI,WAAW,cAAc,YAAY,IAAI,mBAAmB,EAAE,IACjE,UAAA;AAAA,IAAAE,2BAAAA;AAAAA,MAACG,yBAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEFH,2BAAAA;AAAAA,MAACI,qBAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAMC,kBAAAA,gBAAgB,MAAM,IAAI;AAAA,QAChC,MAAK;AAAA,QAEL,UAAAL,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,cAAW;AAAA,YACX,OAAO,MAAM;AAAA,YACb,WAAWM,qBAAAA;AAAAA,YACX,UAAU,CAAC,UAAU,SAAS,EAAE,MAAM,MAAM,OAAO,MAAA,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAC5D;AAAA,IAAA;AAAA,IAEFN,2BAAAA;AAAAA,MAACI,qBAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,qCAAOG,MAAAA,OAAA,EAAM;AAAA,QACb,MAAK;AAAA,QAEL,UAAAP,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,cAAW;AAAA,YACX,OAAO,MAAM,SAAS;AAAA,YACtB,WAAWM,qBAAAA;AAAAA,YACX,aAAa,MAAM;AAAA,YACnB,UAAU,CAAC,UACT,SAAS,EAAE,OAAO,MAAM,OAAO,SAAS,OAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,MAEvD;AAAA,IAAA;AAAA,IAEFN,2BAAAA;AAAAA,MAACQ,qBAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,qCAAOC,WAAAA,YAAA,EAAW;AAAA,QAClB,MAAK;AAAA,QACL,OAAO,MAAM,QAAQ;AAAA,QACrB,SAASC,kBAAAA;AAAAA,QACT,aAAY;AAAA,QACZ,UAAU,CAAC,SAAS,SAAS,EAAE,MAAM,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAE7CV,2BAAAA;AAAAA,MAACQ,qBAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,qCAAOG,kBAAAA,mBAAA,EAAkB;AAAA,QACzB,MAAK;AAAA,QACL,OAAO,MAAM,QAAQ;AAAA,QACrB,SAASC,kBAAAA;AAAAA,QACT,aAAY;AAAA,QAKZ,UAAU,CAAC,SACT;AAAA,UACE,SAAS,cACL,EAAE,MAAM,MAAM,MAAM,WAAA,IACpB,EAAE,MAAM,KAAA;AAAA,QAAK;AAAA,MACnB;AAAA,IAAA;AAAA,IAGJZ,2BAAAA;AAAAA,MAACQ,qBAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,qCAAOK,UAAAA,WAAA,EAAU;AAAA,QACjB,MAAK;AAAA,QACL,OAAO,MAAM,UAAU;AAAA,QACvB,SAASC,kBAAAA;AAAAA,QACT,aAAY;AAAA,QACZ,UAAU,CAAC,SAAS,SAAS,EAAE,QAAQ,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAE/Cd,2BAAAA;AAAAA,MAACQ,qBAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,qCAAOO,QAAAA,SAAA,EAAQ;AAAA,QACf,MAAK;AAAA,QACL,OAAO,MAAM,QAAQ;AAAA,QACrB,SAASC,kBAAAA;AAAAA,QACT,aAAY;AAAA,QACZ,UAAU,CAAC,SAAS,SAAS,EAAE,MAAM,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAE7ChB,2BAAAA;AAAAA,MAACI,qBAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,qCAAOa,UAAAA,WAAA,EAAU;AAAA,QACjB,MAAK;AAAA,QAEL,UAAAjB,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,cAAW;AAAA,YACX,MAAK;AAAA,YACL,KAAK;AAAA,YACL,OAAO,MAAM,SAAS;AAAA,YACtB,WAAWM,qBAAAA;AAAAA,YACX,aAAY;AAAA,YACZ,UAAU,CAAC,UACT,SAAS;AAAA,cACP,OAAO,MAAM,OAAO,QAChB,OAAO,MAAM,OAAO,KAAK,IACzB;AAAA,YAAA,CACL;AAAA,UAAA;AAAA,QAAA;AAAA,MAEL;AAAA,IAAA;AAAA,mCAED,OAAA,EAAI,WAAW,MACd,UAAAR,2BAAAA,KAAC,OAAA,EAAI,WAAU,oCACb,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,2CACb,UAAA;AAAA,QAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,2BACd,UAAA;AAAA,UAAAE,2BAAAA,IAACkB,iBAAAA,kBAAA,EAAiB,WAAU,6CAAA,CAA6C;AAAA,UAAE;AAAA,QAAA,GAE7E;AAAA,QACApB,2BAAAA,KAAC,QAAA,EAAK,WAAU,2BACd,UAAA;AAAA,UAAAA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,cAAW;AAAA,cACX,OAAM;AAAA,cACN,WAAU;AAAA,cACV,UAAU,CAAC,UAAU,SAAS,EAAE,KAAK,MAAM,OAAO,OAAO;AAAA,cAEzD,UAAA;AAAA,gBAAAE,2BAAAA,IAAC,UAAA,EAAO,OAAM,IAAG,UAAA,YAAQ;AAAA,gBACxB,YAAY,MAAM,UAAU,MAAM,IAAI,EAAE,IAAI,CAAC,YAC5CA,2BAAAA,IAAC,UAAA,EAA2B,OAAO,QAAQ,YACxC,kBAAQ,MAAA,GADE,QAAQ,KAErB,CACD;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEHA,2BAAAA;AAAAA,YAACmB,UAAAA;AAAAA,YAAA;AAAA,cACC,OAAO,MAAM,OAAO;AAAA,cACpB,OAAM;AAAA,cACN;AAAA,cACA,OAAO,MAAM;AAAA,cACb,UAAU,CAAC,SAAS,SAAS,EAAE,KAAK,QAAQ,QAAW;AAAA,YAAA;AAAA,UAAA;AAAA,QACzD,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MACAnB,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,MAAM;AAAA,UACN,OAAO,MAAM,OAAO;AAAA,UACpB,WAAW,GAAGM,qBAAAA,cAAc;AAAA,UAC5B,aAAY;AAAA,UACZ,UAAU,CAAC,UACT,SAAS,EAAE,KAAK,MAAM,OAAO,SAAS,OAAA,CAAW;AAAA,QAAA;AAAA,MAAA;AAAA,MAGrDN,2BAAAA,IAAC,QAAA,EAAK,WAAU,6CAA4C,UAAA,oDAAA,CAE5D;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IACAA,2BAAAA,IAAC,OAAA,EAAI,WAAW,MACd,UAAAA,2BAAAA;AAAAA,MAACI,qBAAAA;AAAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,qCAAOgB,SAAAA,UAAA,EAAS;AAAA,QAChB,WAAS;AAAA,QACT,MAAK;AAAA,QAEL,UAAApB,2BAAAA;AAAAA,UAACqB,cAAAA;AAAAA,UAAA;AAAA,YACC,cAAW;AAAA,YACX,OAAO,MAAM,YAAY;AAAA,YACzB,UAAU,CAAC,SAAS,SAAS,EAAE,UAAU,QAAQ,QAAW;AAAA,YAO5D,cAAc,CAAC,MAAM,EAAE,KAAA,MACrB,SAAS,EAAE,UAAU,QAAQ,QAAW,QAAQ,MAAM;AAAA,YAEvD,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAA,IAAW,CAAA;AAAA,YAC9C,GAAI,KAAK,WAAW,IAAI,CAAA,IAAK,EAAE,MAAM,KAAK,CAAC,GAAG,KAAA;AAAA,YAC/C,UAAUC,eAAAA;AAAAA,UAAA;AAAA,QAAA;AAAA,MACZ;AAAA,IAAA,GAEJ;AAAA,IACAxB,2BAAAA,KAAC,SAAA,EAAM,WAAW,+CAA+C,IAAI,IACnE,UAAA;AAAA,MAAAE,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,UAAU;AAAA,UACzB,UAAU,CAAC,UAAU,SAAS,EAAE,QAAQ,MAAM,OAAO,QAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,MAEhEA,2BAAAA,IAACuB,YAAAA,aAAA,EAAY,WAAU,oCAAA,CAAoC;AAAA,MAAE;AAAA,IAAA,EAAA,CAE/D;AAAA,EAAA,GACF;AAEJ;AAKO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAGG;AACD,MAAI,CAAC,OAAO;AACV,WACEvB,2BAAAA,IAAC,WAAA,EAAQ,WAAU,kGAChB,UAAA,gCACH;AAAA,EAEJ;AAEA,SACEF,2BAAAA,KAAC,WAAA,EAAQ,WAAU,+CACjB,UAAA;AAAA,IAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,uDACb,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,mBACb,UAAA;AAAA,QAAAE,2BAAAA,IAAC,KAAA,EAAE,WAAU,uEAAsE,UAAA,gBAEnF;AAAA,QACAA,2BAAAA,IAAC,MAAA,EAAG,WAAU,iDACX,gBAAM,KAAA,CACT;AAAA,MAAA,GACF;AAAA,MACAA,+BAAC,2BAAA,EAA2B,GAAG,QAAA,CAAS;AAAA,IAAA,GAC1C;AAAA,IACAA,2BAAAA,IAAC,wBAAA,EAAuB,OAAc,SAAA,CAAoB;AAAA,EAAA,GAC5D;AAEJ;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileFieldEditor.d.ts","sourceRoot":"","sources":["../../../src/profiles/fields/profileFieldEditor.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"profileFieldEditor.d.ts","sourceRoot":"","sources":["../../../src/profiles/fields/profileFieldEditor.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAMzE,KAAK,YAAY,GAAG;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,8BAA8B,qDACS,CAAC;AA+BrD;kDACkD;AAClD,wBAAgB,yBAAyB,CAAC,EACxC,SAAS,EACT,WAAW,EACX,QAAQ,EACR,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,QAAQ,GACT,EAAE,YAAY,2CAkCd;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,OAAW,EACX,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;CACjD,2CA0LA;AAED;;gEAEgE;AAChE,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,GAAG,OAAO,EACX,EAAE,YAAY,GAAG;IAChB,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;CACjD,2CAyBA"}
|
|
@@ -26,8 +26,14 @@ function celExamples(fieldName) {
|
|
|
26
26
|
label: `Default ${fieldName} when missing`,
|
|
27
27
|
expression: `${field.presence} ? ${field.reference} : ""`
|
|
28
28
|
},
|
|
29
|
-
{
|
|
30
|
-
|
|
29
|
+
{
|
|
30
|
+
label: `Convert ${fieldName} to text`,
|
|
31
|
+
expression: `string(${field.reference})`
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
label: `Scale ${fieldName} by 1,000`,
|
|
35
|
+
expression: `${field.reference} / 1000.0`
|
|
36
|
+
}
|
|
31
37
|
];
|
|
32
38
|
}
|
|
33
39
|
function ProfileFieldEditorActions({
|
|
@@ -40,8 +46,28 @@ function ProfileFieldEditorActions({
|
|
|
40
46
|
onRemove
|
|
41
47
|
}) {
|
|
42
48
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
43
|
-
/* @__PURE__ */ jsx(
|
|
44
|
-
|
|
49
|
+
/* @__PURE__ */ jsx(
|
|
50
|
+
Button,
|
|
51
|
+
{
|
|
52
|
+
type: "button",
|
|
53
|
+
size: "sm",
|
|
54
|
+
variant: "ghost",
|
|
55
|
+
disabled: !canMoveUp,
|
|
56
|
+
onClick: onMoveUp,
|
|
57
|
+
children: "Move up"
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
Button,
|
|
62
|
+
{
|
|
63
|
+
type: "button",
|
|
64
|
+
size: "sm",
|
|
65
|
+
variant: "ghost",
|
|
66
|
+
disabled: !canMoveDown,
|
|
67
|
+
onClick: onMoveDown,
|
|
68
|
+
children: "Move down"
|
|
69
|
+
}
|
|
70
|
+
),
|
|
45
71
|
/* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "ghost", onClick: onRemove, children: "Remove" }),
|
|
46
72
|
/* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 text-sm font-medium", children: [
|
|
47
73
|
/* @__PURE__ */ jsx(
|
|
@@ -64,8 +90,49 @@ function ProfileFieldEditorForm({
|
|
|
64
90
|
const wide = columns === 2 ? "sm:col-span-2" : "";
|
|
65
91
|
const rows = useJsonPathSampleRows();
|
|
66
92
|
return /* @__PURE__ */ jsxs("div", { className: `grid gap-4 ${columns === 2 ? "sm:grid-cols-2" : ""}`, children: [
|
|
67
|
-
/* @__PURE__ */ jsx(
|
|
68
|
-
|
|
93
|
+
/* @__PURE__ */ jsx(
|
|
94
|
+
ProfileFieldFilterEditor,
|
|
95
|
+
{
|
|
96
|
+
field,
|
|
97
|
+
columns,
|
|
98
|
+
onChange
|
|
99
|
+
}
|
|
100
|
+
),
|
|
101
|
+
/* @__PURE__ */ jsx(
|
|
102
|
+
EditorField,
|
|
103
|
+
{
|
|
104
|
+
label: "Output name",
|
|
105
|
+
icon: profileTypeIcon(field.type),
|
|
106
|
+
help: "Public field name used by tables, filters, APIs, and every export.",
|
|
107
|
+
children: /* @__PURE__ */ jsx(
|
|
108
|
+
"input",
|
|
109
|
+
{
|
|
110
|
+
"aria-label": "Output name",
|
|
111
|
+
value: field.name,
|
|
112
|
+
className: inputClassName,
|
|
113
|
+
onChange: (event) => onChange({ name: event.target.value })
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
),
|
|
118
|
+
/* @__PURE__ */ jsx(
|
|
119
|
+
EditorField,
|
|
120
|
+
{
|
|
121
|
+
label: "Display label",
|
|
122
|
+
icon: /* @__PURE__ */ jsx(UiTag, {}),
|
|
123
|
+
help: "Optional table header; blank uses the field name.",
|
|
124
|
+
children: /* @__PURE__ */ jsx(
|
|
125
|
+
"input",
|
|
126
|
+
{
|
|
127
|
+
"aria-label": "Display label",
|
|
128
|
+
value: field.label ?? "",
|
|
129
|
+
className: inputClassName,
|
|
130
|
+
placeholder: field.name,
|
|
131
|
+
onChange: (event) => onChange({ label: event.target.value || void 0 })
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
}
|
|
135
|
+
),
|
|
69
136
|
/* @__PURE__ */ jsx(
|
|
70
137
|
EnumField,
|
|
71
138
|
{
|
|
@@ -87,7 +154,9 @@ function ProfileFieldEditorForm({
|
|
|
87
154
|
value: field.kind ?? "",
|
|
88
155
|
options: profileRoleOptions,
|
|
89
156
|
placeholder: "Standard field",
|
|
90
|
-
onChange: (next) => onChange(
|
|
157
|
+
onChange: (next) => onChange(
|
|
158
|
+
next === "timestamp" ? { kind: next, type: "datetime" } : { kind: next }
|
|
159
|
+
)
|
|
91
160
|
}
|
|
92
161
|
),
|
|
93
162
|
/* @__PURE__ */ jsx(
|
|
@@ -114,7 +183,28 @@ function ProfileFieldEditorForm({
|
|
|
114
183
|
onChange: (next) => onChange({ unit: next })
|
|
115
184
|
}
|
|
116
185
|
),
|
|
117
|
-
/* @__PURE__ */ jsx(
|
|
186
|
+
/* @__PURE__ */ jsx(
|
|
187
|
+
EditorField,
|
|
188
|
+
{
|
|
189
|
+
label: "Max width (characters)",
|
|
190
|
+
icon: /* @__PURE__ */ jsx(UiColumns, {}),
|
|
191
|
+
help: "Maximum rendered width; blank uses the table default.",
|
|
192
|
+
children: /* @__PURE__ */ jsx(
|
|
193
|
+
"input",
|
|
194
|
+
{
|
|
195
|
+
"aria-label": "Max width (characters)",
|
|
196
|
+
type: "number",
|
|
197
|
+
min: 1,
|
|
198
|
+
value: field.width ?? "",
|
|
199
|
+
className: inputClassName,
|
|
200
|
+
placeholder: "Auto",
|
|
201
|
+
onChange: (event) => onChange({
|
|
202
|
+
width: event.target.value ? Number(event.target.value) : void 0
|
|
203
|
+
})
|
|
204
|
+
}
|
|
205
|
+
)
|
|
206
|
+
}
|
|
207
|
+
),
|
|
118
208
|
/* @__PURE__ */ jsx("div", { className: wide, children: /* @__PURE__ */ jsxs("div", { className: "grid gap-1.5 text-sm font-medium", children: [
|
|
119
209
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
|
|
120
210
|
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
|
|
@@ -147,27 +237,52 @@ function ProfileFieldEditorForm({
|
|
|
147
237
|
)
|
|
148
238
|
] })
|
|
149
239
|
] }),
|
|
150
|
-
/* @__PURE__ */ jsx(
|
|
240
|
+
/* @__PURE__ */ jsx(
|
|
241
|
+
"textarea",
|
|
242
|
+
{
|
|
243
|
+
"aria-label": "CEL expression",
|
|
244
|
+
rows: 4,
|
|
245
|
+
value: field.cel ?? "",
|
|
246
|
+
className: `${inputClassName} resize-y font-mono text-xs`,
|
|
247
|
+
placeholder: "Optional value transformation",
|
|
248
|
+
onChange: (event) => onChange({ cel: event.target.value || void 0 })
|
|
249
|
+
}
|
|
250
|
+
),
|
|
151
251
|
/* @__PURE__ */ jsx("span", { className: "text-xs font-normal text-muted-foreground", children: "Optional expression computing the value from row." })
|
|
152
252
|
] }) }),
|
|
153
|
-
/* @__PURE__ */ jsx("div", { className: wide, children: /* @__PURE__ */ jsx(
|
|
154
|
-
|
|
253
|
+
/* @__PURE__ */ jsx("div", { className: wide, children: /* @__PURE__ */ jsx(
|
|
254
|
+
EditorField,
|
|
155
255
|
{
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
256
|
+
label: "JSONPath",
|
|
257
|
+
icon: /* @__PURE__ */ jsx(UiBraces, {}),
|
|
258
|
+
fullWidth: true,
|
|
259
|
+
help: "Optional path computing the value, rooted at the row or at Source; an alternative to CEL.",
|
|
260
|
+
children: /* @__PURE__ */ jsx(
|
|
261
|
+
JSONPathField,
|
|
262
|
+
{
|
|
263
|
+
"aria-label": "JSONPath",
|
|
264
|
+
value: field.jsonpath ?? "",
|
|
265
|
+
onChange: (next) => onChange({ jsonpath: next || void 0 }),
|
|
266
|
+
onSelectPath: (next, { root }) => onChange({ jsonpath: next || void 0, source: root }),
|
|
267
|
+
...field.source ? { source: field.source } : {},
|
|
268
|
+
...rows.length === 0 ? {} : { json: rows[0], rows },
|
|
269
|
+
evaluate: evaluateJsonPath
|
|
270
|
+
}
|
|
271
|
+
)
|
|
163
272
|
}
|
|
164
|
-
) })
|
|
273
|
+
) }),
|
|
165
274
|
/* @__PURE__ */ jsxs("label", { className: `flex items-center gap-2 text-sm font-medium ${wide}`, children: [
|
|
166
|
-
/* @__PURE__ */ jsx(
|
|
275
|
+
/* @__PURE__ */ jsx(
|
|
276
|
+
"input",
|
|
277
|
+
{
|
|
278
|
+
type: "checkbox",
|
|
279
|
+
checked: field.hidden ?? false,
|
|
280
|
+
onChange: (event) => onChange({ hidden: event.target.checked })
|
|
281
|
+
}
|
|
282
|
+
),
|
|
167
283
|
/* @__PURE__ */ jsx(UiEyeClosed, { className: "text-[15px] text-muted-foreground" }),
|
|
168
284
|
"Hide this field in the default table"
|
|
169
|
-
] })
|
|
170
|
-
/* @__PURE__ */ jsx("div", { className: wide, children: /* @__PURE__ */ jsx(ProfileFieldFilterEditor, { field, columns, onChange }) })
|
|
285
|
+
] })
|
|
171
286
|
] });
|
|
172
287
|
}
|
|
173
288
|
function ProfileFieldEditor({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profileFieldEditor.js","sources":["../../../src/profiles/fields/profileFieldEditor.tsx"],"sourcesContent":["import { JSONPathField } from \"../../components/JSONPathField\";\nimport { Button } from \"../../components/button\";\nimport {\n UiBraces,\n UiColumns,\n UiEyeClosed,\n UiFileType,\n UiFunctionSquare,\n UiPalette,\n UiScale,\n UiTableProperties,\n UiTag,\n} from \"../../icons\";\nimport { CelTestButton } from \"../cel/celEditor\";\nimport { celFieldAccess } from \"../cel/celPath\";\nimport { EditorField, EnumField, inputClassName } from \"./profileFieldControls\";\nimport { ProfileFieldFilterEditor } from \"./profileFieldFilterEditor\";\nimport {\n profileFormatOptions,\n profileRoleOptions,\n profileTypeIcon,\n profileTypeOptions,\n profileUnitOptions,\n} from \"./profileFieldIcons\";\nimport type { Patch, ProfileColumn } from \"../wizard/profileWizardModel\";\nimport { evaluateJsonPath, useJsonPathSampleRows } from \"../query/jsonPathSample\";\n\ntype FieldActions = {\n selected: boolean;\n canMoveUp: boolean;\n canMoveDown: boolean;\n onSelectedChange: (selected: boolean) => void;\n onMoveUp: () => void;\n onMoveDown: () => void;\n onRemove: () => void;\n};\n\nexport const profileFieldEditorEmptyMessage =\n \"Add a column or run a sample to discover fields.\";\n\n/**\n * The starting points offered before a value is in hand.\n *\n * This header has only the field's name to go on — the sampled value lives in\n * the Test dialog, which is where the examples that fit it are offered. So\n * these stay deliberately generic and lead there.\n */\nfunction celExamples(fieldName: string): Array<{ label: string; expression: string }> {\n const field = celFieldAccess(fieldName);\n return [\n { label: \"Use the entire row\", expression: \"row\" },\n { label: `Read ${fieldName}`, expression: field.reference },\n {\n label: `Default ${fieldName} when missing`,\n expression: `${field.presence} ? ${field.reference} : \"\"`,\n },\n { label: `Convert ${fieldName} to text`, expression: `string(${field.reference})` },\n { label: `Scale ${fieldName} by 1,000`, expression: `${field.reference} / 1000.0` },\n ];\n}\n\n/** Ordering, removal and inclusion — the operations that act on the field as a\n * whole rather than on one of its properties. */\nexport function ProfileFieldEditorActions({\n canMoveUp,\n canMoveDown,\n selected,\n onSelectedChange,\n onMoveUp,\n onMoveDown,\n onRemove,\n}: FieldActions) {\n return (\n <>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={!canMoveUp} onClick={onMoveUp}>\n Move up\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" disabled={!canMoveDown} onClick={onMoveDown}>\n Move down\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={onRemove}>\n Remove\n </Button>\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={(event) => onSelectedChange(event.target.checked)}\n />\n Include\n </label>\n </>\n );\n}\n\n/**\n * Everything about a column that a grid cell cannot hold: role, format, unit\n * and the CEL expression. `columns` is explicit rather than a `sm:` breakpoint\n * because the wizard mounts this in a ~380px pane on a wide viewport, where\n * viewport-based breakpoints would wrongly go two-up.\n */\nexport function ProfileFieldEditorForm({\n field,\n columns = 2,\n onChange,\n}: {\n field: ProfileColumn;\n columns?: 1 | 2;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n const wide = columns === 2 ? \"sm:col-span-2\" : \"\";\n const rows = useJsonPathSampleRows();\n return (\n <div className={`grid gap-4 ${columns === 2 ? \"sm:grid-cols-2\" : \"\"}`}>\n <EditorField label=\"Output name\" icon={profileTypeIcon(field.type)} help=\"Public field name used by tables, filters, APIs, and every export.\">\n <input aria-label=\"Output name\" value={field.name} className={inputClassName} onChange={(event) => onChange({ name: event.target.value })} />\n </EditorField>\n <EditorField label=\"Display label\" icon={<UiTag />} help=\"Optional table header; blank uses the field name.\">\n <input aria-label=\"Display label\" value={field.label ?? \"\"} className={inputClassName} placeholder={field.name} onChange={(event) => onChange({ label: event.target.value || undefined })} />\n </EditorField>\n <EnumField\n label=\"Data type\"\n icon={<UiFileType />}\n help=\"Value shape and default formatting; independent of Role.\"\n value={field.type ?? \"\"}\n options={profileTypeOptions}\n placeholder=\"Auto detect\"\n onChange={(next) => onChange({ type: next })}\n />\n <EnumField\n label=\"Role\"\n icon={<UiTableProperties />}\n help=\"Optional table behavior. Timestamp also types the field as datetime, since it is the column the date-range control reads.\"\n value={field.kind ?? \"\"}\n options={profileRoleOptions}\n placeholder=\"Standard field\"\n // Naming the time column and leaving it typed as a string is a state\n // nobody wants: the header drives a date range while the cell renders\n // raw. The wizard already couples the two (mapTimestampColumn); doing\n // it here too is what keeps the per-field editor from undoing it.\n onChange={(next) =>\n onChange(next === \"timestamp\" ? { kind: next, type: \"datetime\" } : { kind: next })\n }\n />\n <EnumField\n label=\"Format\"\n icon={<UiPalette />}\n help=\"Optional formatter; Unit takes precedence when both are set.\"\n value={field.format ?? \"\"}\n options={profileFormatOptions}\n placeholder=\"From Type\"\n onChange={(next) => onChange({ format: next })}\n />\n <EnumField\n label=\"Unit\"\n icon={<UiScale />}\n help=\"Numeric scaling for number, duration, or bytes Types.\"\n value={field.unit ?? \"\"}\n options={profileUnitOptions}\n placeholder=\"No unit\"\n onChange={(next) => onChange({ unit: next })}\n />\n <EditorField label=\"Max width (characters)\" icon={<UiColumns />} help=\"Maximum rendered width; blank uses the table default.\">\n <input aria-label=\"Max width (characters)\" type=\"number\" min={1} value={field.width ?? \"\"} className={inputClassName} placeholder=\"Auto\" onChange={(event) => onChange({ width: event.target.value ? Number(event.target.value) : undefined })} />\n </EditorField>\n <div className={wide}>\n <div className=\"grid gap-1.5 text-sm font-medium\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex items-center gap-2\">\n <UiFunctionSquare className=\"shrink-0 text-[15px] text-muted-foreground\" />\n CEL expression\n </span>\n <span className=\"flex items-center gap-2\">\n <select\n aria-label=\"CEL examples\"\n value=\"\"\n className=\"h-8 rounded-md border border-input bg-background px-2 text-xs font-normal outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\"\n onChange={(event) => onChange({ cel: event.target.value })}\n >\n <option value=\"\">Examples</option>\n {celExamples(field.source ?? field.name).map((example) => (\n <option key={example.label} value={example.expression}>{example.label}</option>\n ))}\n </select>\n <CelTestButton\n value={field.cel ?? \"\"}\n scope=\"row\"\n rows={rows}\n title={field.name}\n onChange={(next) => onChange({ cel: next || undefined })}\n />\n </span>\n </div>\n <textarea aria-label=\"CEL expression\" rows={4} value={field.cel ?? \"\"} className={`${inputClassName} resize-y font-mono text-xs`} placeholder=\"Optional value transformation\" onChange={(event) => onChange({ cel: event.target.value || undefined })} />\n <span className=\"text-xs font-normal text-muted-foreground\">\n Optional expression computing the value from row.\n </span>\n </div>\n </div>\n <div className={wide}>\n <EditorField label=\"JSONPath\" icon={<UiBraces />} fullWidth help=\"Optional path computing the value, rooted at the row or at Source; an alternative to CEL.\">\n <JSONPathField\n aria-label=\"JSONPath\"\n value={field.jsonpath ?? \"\"}\n onChange={(next) => onChange({ jsonpath: next || undefined })}\n // This editor owns the whole column, so a path picked out of a\n // JSON-encoded column sets the Source it needs in the same edit\n // rather than leaving the author to pair the two by hand. A path\n // picked outside one clears it: alongside a jsonpath, Source is the\n // root, and a stale root re-roots the new path at a column it was\n // never written against.\n onSelectPath={(next, { root }) =>\n onChange({ jsonpath: next || undefined, source: root })\n }\n {...(field.source ? { source: field.source } : {})}\n {...(rows.length === 0 ? {} : { json: rows[0], rows })}\n evaluate={evaluateJsonPath}\n />\n </EditorField>\n </div>\n <label className={`flex items-center gap-2 text-sm font-medium ${wide}`}>\n <input type=\"checkbox\" checked={field.hidden ?? false} onChange={(event) => onChange({ hidden: event.target.checked })} />\n <UiEyeClosed className=\"text-[15px] text-muted-foreground\" />\n Hide this field in the default table\n </label>\n <div className={wide}>\n <ProfileFieldFilterEditor field={field} columns={columns} onChange={onChange} />\n </div>\n </div>\n );\n}\n\n/** The wizard's carded inspector: names the field itself, because its field\n * list has no header to do it. The editor route composes the parts instead,\n * since its Workspace pane header already carries the name. */\nexport function ProfileFieldEditor({\n field,\n onChange,\n ...actions\n}: FieldActions & {\n field?: ProfileColumn | undefined;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n if (!field) {\n return (\n <section className=\"grid min-h-64 place-items-center rounded-xl border border-dashed text-sm text-muted-foreground\">\n {profileFieldEditorEmptyMessage}\n </section>\n );\n }\n\n return (\n <section className=\"overflow-auto rounded-xl border bg-card p-5\">\n <div className=\"mb-5 flex flex-wrap items-start gap-2 border-b pb-4\">\n <div className=\"mr-auto min-w-0\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Field editor\n </p>\n <h3 className=\"mt-1 truncate font-mono text-sm font-semibold\">\n {field.name}\n </h3>\n </div>\n <ProfileFieldEditorActions {...actions} />\n </div>\n <ProfileFieldEditorForm field={field} onChange={onChange} />\n </section>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"profileFieldEditor.js","sources":["../../../src/profiles/fields/profileFieldEditor.tsx"],"sourcesContent":["import { JSONPathField } from \"../../components/JSONPathField\";\nimport { Button } from \"../../components/button\";\nimport {\n UiBraces,\n UiColumns,\n UiEyeClosed,\n UiFileType,\n UiFunctionSquare,\n UiPalette,\n UiScale,\n UiTableProperties,\n UiTag,\n} from \"../../icons\";\nimport { CelTestButton } from \"../cel/celEditor\";\nimport { celFieldAccess } from \"../cel/celPath\";\nimport { EditorField, EnumField, inputClassName } from \"./profileFieldControls\";\nimport { ProfileFieldFilterEditor } from \"./profileFieldFilterEditor\";\nimport {\n profileFormatOptions,\n profileRoleOptions,\n profileTypeIcon,\n profileTypeOptions,\n profileUnitOptions,\n} from \"./profileFieldIcons\";\nimport type { Patch, ProfileColumn } from \"../wizard/profileWizardModel\";\nimport {\n evaluateJsonPath,\n useJsonPathSampleRows,\n} from \"../query/jsonPathSample\";\n\ntype FieldActions = {\n selected: boolean;\n canMoveUp: boolean;\n canMoveDown: boolean;\n onSelectedChange: (selected: boolean) => void;\n onMoveUp: () => void;\n onMoveDown: () => void;\n onRemove: () => void;\n};\n\nexport const profileFieldEditorEmptyMessage =\n \"Add a column or run a sample to discover fields.\";\n\n/**\n * The starting points offered before a value is in hand.\n *\n * This header has only the field's name to go on — the sampled value lives in\n * the Test dialog, which is where the examples that fit it are offered. So\n * these stay deliberately generic and lead there.\n */\nfunction celExamples(\n fieldName: string,\n): Array<{ label: string; expression: string }> {\n const field = celFieldAccess(fieldName);\n return [\n { label: \"Use the entire row\", expression: \"row\" },\n { label: `Read ${fieldName}`, expression: field.reference },\n {\n label: `Default ${fieldName} when missing`,\n expression: `${field.presence} ? ${field.reference} : \"\"`,\n },\n {\n label: `Convert ${fieldName} to text`,\n expression: `string(${field.reference})`,\n },\n {\n label: `Scale ${fieldName} by 1,000`,\n expression: `${field.reference} / 1000.0`,\n },\n ];\n}\n\n/** Ordering, removal and inclusion — the operations that act on the field as a\n * whole rather than on one of its properties. */\nexport function ProfileFieldEditorActions({\n canMoveUp,\n canMoveDown,\n selected,\n onSelectedChange,\n onMoveUp,\n onMoveDown,\n onRemove,\n}: FieldActions) {\n return (\n <>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={!canMoveUp}\n onClick={onMoveUp}\n >\n Move up\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={!canMoveDown}\n onClick={onMoveDown}\n >\n Move down\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={onRemove}>\n Remove\n </Button>\n <label className=\"flex items-center gap-2 text-sm font-medium\">\n <input\n type=\"checkbox\"\n checked={selected}\n onChange={(event) => onSelectedChange(event.target.checked)}\n />\n Include\n </label>\n </>\n );\n}\n\n/**\n * Everything about a column that a grid cell cannot hold: role, format, unit\n * and the CEL expression. `columns` is explicit rather than a `sm:` breakpoint\n * because the wizard mounts this in a ~380px pane on a wide viewport, where\n * viewport-based breakpoints would wrongly go two-up.\n */\nexport function ProfileFieldEditorForm({\n field,\n columns = 2,\n onChange,\n}: {\n field: ProfileColumn;\n columns?: 1 | 2;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n const wide = columns === 2 ? \"sm:col-span-2\" : \"\";\n const rows = useJsonPathSampleRows();\n return (\n <div className={`grid gap-4 ${columns === 2 ? \"sm:grid-cols-2\" : \"\"}`}>\n <ProfileFieldFilterEditor\n field={field}\n columns={columns}\n onChange={onChange}\n />\n <EditorField\n label=\"Output name\"\n icon={profileTypeIcon(field.type)}\n help=\"Public field name used by tables, filters, APIs, and every export.\"\n >\n <input\n aria-label=\"Output name\"\n value={field.name}\n className={inputClassName}\n onChange={(event) => onChange({ name: event.target.value })}\n />\n </EditorField>\n <EditorField\n label=\"Display label\"\n icon={<UiTag />}\n help=\"Optional table header; blank uses the field name.\"\n >\n <input\n aria-label=\"Display label\"\n value={field.label ?? \"\"}\n className={inputClassName}\n placeholder={field.name}\n onChange={(event) =>\n onChange({ label: event.target.value || undefined })\n }\n />\n </EditorField>\n <EnumField\n label=\"Data type\"\n icon={<UiFileType />}\n help=\"Value shape and default formatting; independent of Role.\"\n value={field.type ?? \"\"}\n options={profileTypeOptions}\n placeholder=\"Auto detect\"\n onChange={(next) => onChange({ type: next })}\n />\n <EnumField\n label=\"Role\"\n icon={<UiTableProperties />}\n help=\"Optional table behavior. Timestamp also types the field as datetime, since it is the column the date-range control reads.\"\n value={field.kind ?? \"\"}\n options={profileRoleOptions}\n placeholder=\"Standard field\"\n // Naming the time column and leaving it typed as a string is a state\n // nobody wants: the header drives a date range while the cell renders\n // raw. The wizard already couples the two (mapTimestampColumn); doing\n // it here too is what keeps the per-field editor from undoing it.\n onChange={(next) =>\n onChange(\n next === \"timestamp\"\n ? { kind: next, type: \"datetime\" }\n : { kind: next },\n )\n }\n />\n <EnumField\n label=\"Format\"\n icon={<UiPalette />}\n help=\"Optional formatter; Unit takes precedence when both are set.\"\n value={field.format ?? \"\"}\n options={profileFormatOptions}\n placeholder=\"From Type\"\n onChange={(next) => onChange({ format: next })}\n />\n <EnumField\n label=\"Unit\"\n icon={<UiScale />}\n help=\"Numeric scaling for number, duration, or bytes Types.\"\n value={field.unit ?? \"\"}\n options={profileUnitOptions}\n placeholder=\"No unit\"\n onChange={(next) => onChange({ unit: next })}\n />\n <EditorField\n label=\"Max width (characters)\"\n icon={<UiColumns />}\n help=\"Maximum rendered width; blank uses the table default.\"\n >\n <input\n aria-label=\"Max width (characters)\"\n type=\"number\"\n min={1}\n value={field.width ?? \"\"}\n className={inputClassName}\n placeholder=\"Auto\"\n onChange={(event) =>\n onChange({\n width: event.target.value\n ? Number(event.target.value)\n : undefined,\n })\n }\n />\n </EditorField>\n <div className={wide}>\n <div className=\"grid gap-1.5 text-sm font-medium\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex items-center gap-2\">\n <UiFunctionSquare className=\"shrink-0 text-[15px] text-muted-foreground\" />\n CEL expression\n </span>\n <span className=\"flex items-center gap-2\">\n <select\n aria-label=\"CEL examples\"\n value=\"\"\n className=\"h-8 rounded-md border border-input bg-background px-2 text-xs font-normal outline-none focus:border-primary focus:ring-2 focus:ring-primary/15\"\n onChange={(event) => onChange({ cel: event.target.value })}\n >\n <option value=\"\">Examples</option>\n {celExamples(field.source ?? field.name).map((example) => (\n <option key={example.label} value={example.expression}>\n {example.label}\n </option>\n ))}\n </select>\n <CelTestButton\n value={field.cel ?? \"\"}\n scope=\"row\"\n rows={rows}\n title={field.name}\n onChange={(next) => onChange({ cel: next || undefined })}\n />\n </span>\n </div>\n <textarea\n aria-label=\"CEL expression\"\n rows={4}\n value={field.cel ?? \"\"}\n className={`${inputClassName} resize-y font-mono text-xs`}\n placeholder=\"Optional value transformation\"\n onChange={(event) =>\n onChange({ cel: event.target.value || undefined })\n }\n />\n <span className=\"text-xs font-normal text-muted-foreground\">\n Optional expression computing the value from row.\n </span>\n </div>\n </div>\n <div className={wide}>\n <EditorField\n label=\"JSONPath\"\n icon={<UiBraces />}\n fullWidth\n help=\"Optional path computing the value, rooted at the row or at Source; an alternative to CEL.\"\n >\n <JSONPathField\n aria-label=\"JSONPath\"\n value={field.jsonpath ?? \"\"}\n onChange={(next) => onChange({ jsonpath: next || undefined })}\n // This editor owns the whole column, so a path picked out of a\n // JSON-encoded column sets the Source it needs in the same edit\n // rather than leaving the author to pair the two by hand. A path\n // picked outside one clears it: alongside a jsonpath, Source is the\n // root, and a stale root re-roots the new path at a column it was\n // never written against.\n onSelectPath={(next, { root }) =>\n onChange({ jsonpath: next || undefined, source: root })\n }\n {...(field.source ? { source: field.source } : {})}\n {...(rows.length === 0 ? {} : { json: rows[0], rows })}\n evaluate={evaluateJsonPath}\n />\n </EditorField>\n </div>\n <label className={`flex items-center gap-2 text-sm font-medium ${wide}`}>\n <input\n type=\"checkbox\"\n checked={field.hidden ?? false}\n onChange={(event) => onChange({ hidden: event.target.checked })}\n />\n <UiEyeClosed className=\"text-[15px] text-muted-foreground\" />\n Hide this field in the default table\n </label>\n </div>\n );\n}\n\n/** The wizard's carded inspector: names the field itself, because its field\n * list has no header to do it. The editor route composes the parts instead,\n * since its Workspace pane header already carries the name. */\nexport function ProfileFieldEditor({\n field,\n onChange,\n ...actions\n}: FieldActions & {\n field?: ProfileColumn | undefined;\n onChange: (patch: Patch<ProfileColumn>) => void;\n}) {\n if (!field) {\n return (\n <section className=\"grid min-h-64 place-items-center rounded-xl border border-dashed text-sm text-muted-foreground\">\n {profileFieldEditorEmptyMessage}\n </section>\n );\n }\n\n return (\n <section className=\"overflow-auto rounded-xl border bg-card p-5\">\n <div className=\"mb-5 flex flex-wrap items-start gap-2 border-b pb-4\">\n <div className=\"mr-auto min-w-0\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">\n Field editor\n </p>\n <h3 className=\"mt-1 truncate font-mono text-sm font-semibold\">\n {field.name}\n </h3>\n </div>\n <ProfileFieldEditorActions {...actions} />\n </div>\n <ProfileFieldEditorForm field={field} onChange={onChange} />\n </section>\n );\n}\n"],"names":[],"mappings":"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"}
|