@tetrascience-npm/tetrascience-react-ui 0.5.0-beta.19.1 → 0.5.0-beta.21.1
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/charts/AreaGraph/AreaGraph.cjs +2 -0
- package/dist/components/charts/AreaGraph/AreaGraph.cjs.map +1 -0
- package/dist/components/charts/AreaGraph/AreaGraph.js +209 -0
- package/dist/components/charts/AreaGraph/AreaGraph.js.map +1 -0
- package/dist/components/charts/BarGraph/BarGraph.cjs +2 -0
- package/dist/components/charts/BarGraph/BarGraph.cjs.map +1 -0
- package/dist/components/charts/BarGraph/BarGraph.js +175 -0
- package/dist/components/charts/BarGraph/BarGraph.js.map +1 -0
- package/dist/components/charts/Boxplot/Boxplot.cjs +2 -0
- package/dist/components/charts/Boxplot/Boxplot.cjs.map +1 -0
- package/dist/components/charts/Boxplot/Boxplot.js +171 -0
- package/dist/components/charts/Boxplot/Boxplot.js.map +1 -0
- package/dist/components/charts/Chromatogram/Chromatogram.cjs +2 -0
- package/dist/components/charts/Chromatogram/Chromatogram.cjs.map +1 -0
- package/dist/components/charts/Chromatogram/Chromatogram.js +164 -0
- package/dist/components/charts/Chromatogram/Chromatogram.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js +219 -0
- package/dist/components/charts/ChromatogramChart/ChromatogramChart.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/annotations.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/annotations.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/annotations.js +73 -0
- package/dist/components/charts/ChromatogramChart/annotations.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js +34 -0
- package/dist/components/charts/ChromatogramChart/boundaryMarkers.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/constants.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/constants.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/constants.js +24 -0
- package/dist/components/charts/ChromatogramChart/constants.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/dataProcessing.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/dataProcessing.js +90 -0
- package/dist/components/charts/ChromatogramChart/dataProcessing.js.map +1 -0
- package/dist/components/charts/ChromatogramChart/peakDetection.cjs +2 -0
- package/dist/components/charts/ChromatogramChart/peakDetection.cjs.map +1 -0
- package/dist/components/charts/ChromatogramChart/peakDetection.js +89 -0
- package/dist/components/charts/ChromatogramChart/peakDetection.js.map +1 -0
- package/dist/components/charts/DotPlot/DotPlot.cjs +2 -0
- package/dist/components/charts/DotPlot/DotPlot.cjs.map +1 -0
- package/dist/components/charts/DotPlot/DotPlot.js +184 -0
- package/dist/components/charts/DotPlot/DotPlot.js.map +1 -0
- package/dist/components/charts/Heatmap/Heatmap.cjs +2 -0
- package/dist/components/charts/Heatmap/Heatmap.cjs.map +1 -0
- package/dist/components/charts/Heatmap/Heatmap.js +67 -0
- package/dist/components/charts/Heatmap/Heatmap.js.map +1 -0
- package/dist/components/charts/Histogram/Histogram.cjs +2 -0
- package/dist/components/charts/Histogram/Histogram.cjs.map +1 -0
- package/dist/components/charts/Histogram/Histogram.js +209 -0
- package/dist/components/charts/Histogram/Histogram.js.map +1 -0
- package/dist/components/charts/LineGraph/LineGraph.cjs +2 -0
- package/dist/components/charts/LineGraph/LineGraph.cjs.map +1 -0
- package/dist/components/charts/LineGraph/LineGraph.js +185 -0
- package/dist/components/charts/LineGraph/LineGraph.js.map +1 -0
- package/dist/components/charts/PieChart/PieChart.cjs +2 -0
- package/dist/components/charts/PieChart/PieChart.cjs.map +1 -0
- package/dist/components/charts/PieChart/PieChart.js +106 -0
- package/dist/components/charts/PieChart/PieChart.js.map +1 -0
- package/dist/components/charts/PlateMap/PlateMap.cjs +2 -0
- package/dist/components/charts/PlateMap/PlateMap.cjs.map +1 -0
- package/dist/components/charts/PlateMap/PlateMap.js +450 -0
- package/dist/components/charts/PlateMap/PlateMap.js.map +1 -0
- package/dist/components/charts/PlateMap/constants.cjs +2 -0
- package/dist/components/charts/PlateMap/constants.cjs.map +1 -0
- package/dist/components/charts/PlateMap/constants.js +137 -0
- package/dist/components/charts/PlateMap/constants.js.map +1 -0
- package/dist/components/charts/PlateMap/types.cjs +2 -0
- package/dist/components/charts/PlateMap/types.cjs.map +1 -0
- package/dist/components/charts/PlateMap/types.js +8 -0
- package/dist/components/charts/PlateMap/types.js.map +1 -0
- package/dist/components/charts/PlateMap/utils.cjs +2 -0
- package/dist/components/charts/PlateMap/utils.cjs.map +1 -0
- package/dist/components/charts/PlateMap/utils.js +235 -0
- package/dist/components/charts/PlateMap/utils.js.map +1 -0
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs +2 -0
- package/dist/components/charts/ScatterGraph/ScatterGraph.cjs.map +1 -0
- package/dist/components/charts/ScatterGraph/ScatterGraph.js +186 -0
- package/dist/components/charts/ScatterGraph/ScatterGraph.js.map +1 -0
- package/dist/components/composed/AppHeader/AppHeader.cjs +2 -0
- package/dist/components/composed/AppHeader/AppHeader.cjs.map +1 -0
- package/dist/components/composed/AppHeader/AppHeader.js +35 -0
- package/dist/components/composed/AppHeader/AppHeader.js.map +1 -0
- package/dist/components/composed/AppLayout/AppLayout.cjs +2 -0
- package/dist/components/composed/AppLayout/AppLayout.cjs.map +1 -0
- package/dist/components/composed/AppLayout/AppLayout.js +65 -0
- package/dist/components/composed/AppLayout/AppLayout.js.map +1 -0
- package/dist/components/composed/AssistantModal/AssistantModal.cjs +2 -0
- package/dist/components/composed/AssistantModal/AssistantModal.cjs.map +1 -0
- package/dist/components/composed/AssistantModal/AssistantModal.js +75 -0
- package/dist/components/composed/AssistantModal/AssistantModal.js.map +1 -0
- package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.cjs +3 -0
- package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.cjs.map +1 -0
- package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.js +74 -0
- package/dist/components/composed/CodeScriptEditorButton/CodeScriptEditorButton.js.map +1 -0
- package/dist/components/composed/LaunchContent/LaunchContent.cjs +6 -0
- package/dist/components/composed/LaunchContent/LaunchContent.cjs.map +1 -0
- package/dist/components/composed/LaunchContent/LaunchContent.js +66 -0
- package/dist/components/composed/LaunchContent/LaunchContent.js.map +1 -0
- package/dist/components/composed/Main/LaunchContentPanel.cjs +6 -0
- package/dist/components/composed/Main/LaunchContentPanel.cjs.map +1 -0
- package/dist/components/composed/Main/LaunchContentPanel.js +63 -0
- package/dist/components/composed/Main/LaunchContentPanel.js.map +1 -0
- package/dist/components/composed/Main/Main.cjs +2 -0
- package/dist/components/composed/Main/Main.cjs.map +1 -0
- package/dist/components/composed/Main/Main.js +276 -0
- package/dist/components/composed/Main/Main.js.map +1 -0
- package/dist/components/composed/Main/MainHeader.cjs +2 -0
- package/dist/components/composed/Main/MainHeader.cjs.map +1 -0
- package/dist/components/composed/Main/MainHeader.js +36 -0
- package/dist/components/composed/Main/MainHeader.js.map +1 -0
- package/dist/components/composed/Main/MainNavbar.cjs +2 -0
- package/dist/components/composed/Main/MainNavbar.cjs.map +1 -0
- package/dist/components/composed/Main/MainNavbar.js +25 -0
- package/dist/components/composed/Main/MainNavbar.js.map +1 -0
- package/dist/components/composed/Main/MainSidebar.cjs +2 -0
- package/dist/components/composed/Main/MainSidebar.cjs.map +1 -0
- package/dist/components/composed/Main/MainSidebar.js +12 -0
- package/dist/components/composed/Main/MainSidebar.js.map +1 -0
- package/dist/components/composed/Main/MainTabBar.cjs +2 -0
- package/dist/components/composed/Main/MainTabBar.cjs.map +1 -0
- package/dist/components/composed/Main/MainTabBar.js +7 -0
- package/dist/components/composed/Main/MainTabBar.js.map +1 -0
- package/dist/components/composed/Main/ProtocolConfigurationPanel.cjs +2 -0
- package/dist/components/composed/Main/ProtocolConfigurationPanel.cjs.map +1 -0
- package/dist/components/composed/Main/ProtocolConfigurationPanel.js +30 -0
- package/dist/components/composed/Main/ProtocolConfigurationPanel.js.map +1 -0
- package/dist/components/composed/Main/TemplateSidebarCard.cjs +2 -0
- package/dist/components/composed/Main/TemplateSidebarCard.cjs.map +1 -0
- package/dist/components/composed/Main/TemplateSidebarCard.js +71 -0
- package/dist/components/composed/Main/TemplateSidebarCard.js.map +1 -0
- package/dist/components/composed/Navbar/Navbar.cjs +2 -0
- package/dist/components/composed/Navbar/Navbar.cjs.map +1 -0
- package/dist/components/composed/Navbar/Navbar.js +25 -0
- package/dist/components/composed/Navbar/Navbar.js.map +1 -0
- package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.cjs +2 -0
- package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.cjs.map +1 -0
- package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.js +44 -0
- package/dist/components/composed/ProtocolConfiguration/ProtocolConfiguration.js.map +1 -0
- package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.cjs +2 -0
- package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.cjs.map +1 -0
- package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.js +53 -0
- package/dist/components/composed/ProtocolYamlCard/ProtocolYamlCard.js.map +1 -0
- package/dist/components/composed/PythonEditorModal/PythonEditorModal.cjs +2 -0
- package/dist/components/composed/PythonEditorModal/PythonEditorModal.cjs.map +1 -0
- package/dist/components/composed/PythonEditorModal/PythonEditorModal.js +51 -0
- package/dist/components/composed/PythonEditorModal/PythonEditorModal.js.map +1 -0
- package/dist/components/composed/Sidebar/Sidebar.cjs +2 -0
- package/dist/components/composed/Sidebar/Sidebar.cjs.map +1 -0
- package/dist/components/composed/Sidebar/Sidebar.js +46 -0
- package/dist/components/composed/Sidebar/Sidebar.js.map +1 -0
- package/dist/components/composed/TdpSearch/TdpSearch.cjs +2 -0
- package/dist/components/composed/TdpSearch/TdpSearch.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/TdpSearch.js +97 -0
- package/dist/components/composed/TdpSearch/TdpSearch.js.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs +2 -0
- package/dist/components/composed/TdpSearch/components/DefaultFilters.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js +31 -0
- package/dist/components/composed/TdpSearch/components/DefaultFilters.js.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultResults.cjs +2 -0
- package/dist/components/composed/TdpSearch/components/DefaultResults.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultResults.js +107 -0
- package/dist/components/composed/TdpSearch/components/DefaultResults.js.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs +2 -0
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js +32 -0
- package/dist/components/composed/TdpSearch/components/DefaultSearchBar.js.map +1 -0
- package/dist/components/composed/TdpSearch/constants.cjs +2 -0
- package/dist/components/composed/TdpSearch/constants.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/constants.js +7 -0
- package/dist/components/composed/TdpSearch/constants.js.map +1 -0
- package/dist/components/composed/TdpSearch/hooks/useSearch.cjs +2 -0
- package/dist/components/composed/TdpSearch/hooks/useSearch.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/hooks/useSearch.js +52 -0
- package/dist/components/composed/TdpSearch/hooks/useSearch.js.map +1 -0
- package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.cjs +2 -0
- package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.js +29 -0
- package/dist/components/composed/TdpSearch/hooks/useTdpCredentials.js.map +1 -0
- package/dist/components/composed/TdpSearch/utils.cjs +2 -0
- package/dist/components/composed/TdpSearch/utils.cjs.map +1 -0
- package/dist/components/composed/TdpSearch/utils.js +15 -0
- package/dist/components/composed/TdpSearch/utils.js.map +1 -0
- package/dist/components/composed/tdp-link.cjs +2 -0
- package/dist/components/composed/tdp-link.cjs.map +1 -0
- package/dist/components/composed/tdp-link.js +84 -0
- package/dist/components/composed/tdp-link.js.map +1 -0
- package/dist/components/composed/tdp-url.cjs +2 -0
- package/dist/components/composed/tdp-url.cjs.map +1 -0
- package/dist/components/composed/tdp-url.js +76 -0
- package/dist/components/composed/tdp-url.js.map +1 -0
- package/dist/components/ui/accordion.cjs +2 -0
- package/dist/components/ui/accordion.cjs.map +1 -0
- package/dist/components/ui/accordion.js +83 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/alert-dialog.cjs +2 -0
- package/dist/components/ui/alert-dialog.cjs.map +1 -0
- package/dist/components/ui/alert-dialog.js +181 -0
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/alert.cjs +2 -0
- package/dist/components/ui/alert.cjs.map +1 -0
- package/dist/components/ui/alert.js +78 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/aspect-ratio.cjs +2 -0
- package/dist/components/ui/aspect-ratio.cjs.map +1 -0
- package/dist/components/ui/aspect-ratio.js +11 -0
- package/dist/components/ui/aspect-ratio.js.map +1 -0
- package/dist/components/ui/avatar.cjs +2 -0
- package/dist/components/ui/avatar.cjs.map +1 -0
- package/dist/components/ui/avatar.js +107 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.cjs +2 -0
- package/dist/components/ui/badge.cjs.map +1 -0
- package/dist/components/ui/badge.js +44 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/breadcrumb.cjs +2 -0
- package/dist/components/ui/breadcrumb.cjs.map +1 -0
- package/dist/components/ui/breadcrumb.js +118 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button-group.cjs +2 -0
- package/dist/components/ui/button-group.cjs.map +1 -0
- package/dist/components/ui/button-group.js +77 -0
- package/dist/components/ui/button-group.js.map +1 -0
- package/dist/components/ui/button.cjs +2 -0
- package/dist/components/ui/button.cjs.map +1 -0
- package/dist/components/ui/button.js +57 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/calendar.cjs +2 -0
- package/dist/components/ui/calendar.cjs.map +1 -0
- package/dist/components/ui/calendar.js +174 -0
- package/dist/components/ui/calendar.js.map +1 -0
- package/dist/components/ui/card.cjs +2 -0
- package/dist/components/ui/card.cjs.map +1 -0
- package/dist/components/ui/card.js +102 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/carousel.cjs +2 -0
- package/dist/components/ui/carousel.cjs.map +1 -0
- package/dist/components/ui/carousel.js +179 -0
- package/dist/components/ui/carousel.js.map +1 -0
- package/dist/components/ui/checkbox.cjs +2 -0
- package/dist/components/ui/checkbox.cjs.map +1 -0
- package/dist/components/ui/checkbox.js +35 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/code-editor.cjs +2 -0
- package/dist/components/ui/code-editor.cjs.map +1 -0
- package/dist/components/ui/code-editor.js +103 -0
- package/dist/components/ui/code-editor.js.map +1 -0
- package/dist/components/ui/collapsible.cjs +2 -0
- package/dist/components/ui/collapsible.cjs.map +1 -0
- package/dist/components/ui/collapsible.js +35 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/combobox.cjs +2 -0
- package/dist/components/ui/combobox.cjs.map +1 -0
- package/dist/components/ui/combobox.js +278 -0
- package/dist/components/ui/combobox.js.map +1 -0
- package/dist/components/ui/command.cjs +2 -0
- package/dist/components/ui/command.cjs.map +1 -0
- package/dist/components/ui/command.js +174 -0
- package/dist/components/ui/command.js.map +1 -0
- package/dist/components/ui/context-menu.cjs +2 -0
- package/dist/components/ui/context-menu.cjs.map +1 -0
- package/dist/components/ui/context-menu.js +236 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/dialog.cjs +2 -0
- package/dist/components/ui/dialog.cjs.map +1 -0
- package/dist/components/ui/dialog.js +154 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/drawer.cjs +2 -0
- package/dist/components/ui/drawer.cjs.map +1 -0
- package/dist/components/ui/drawer.js +125 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.cjs +2 -0
- package/dist/components/ui/dropdown-menu.cjs.map +1 -0
- package/dist/components/ui/dropdown-menu.js +252 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/field.cjs +2 -0
- package/dist/components/ui/field.cjs.map +1 -0
- package/dist/components/ui/field.js +210 -0
- package/dist/components/ui/field.js.map +1 -0
- package/dist/components/ui/hover-card.cjs +2 -0
- package/dist/components/ui/hover-card.cjs.map +1 -0
- package/dist/components/ui/hover-card.js +39 -0
- package/dist/components/ui/hover-card.js.map +1 -0
- package/dist/components/ui/input-group.cjs +2 -0
- package/dist/components/ui/input-group.cjs.map +1 -0
- package/dist/components/ui/input-group.js +145 -0
- package/dist/components/ui/input-group.js.map +1 -0
- package/dist/components/ui/input-otp.cjs +2 -0
- package/dist/components/ui/input-otp.cjs.map +1 -0
- package/dist/components/ui/input-otp.js +82 -0
- package/dist/components/ui/input-otp.js.map +1 -0
- package/dist/components/ui/input.cjs +2 -0
- package/dist/components/ui/input.cjs.map +1 -0
- package/dist/components/ui/input.js +20 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/item.cjs +2 -0
- package/dist/components/ui/item.cjs.map +1 -0
- package/dist/components/ui/item.js +191 -0
- package/dist/components/ui/item.js.map +1 -0
- package/dist/components/ui/kbd.cjs +2 -0
- package/dist/components/ui/kbd.cjs.map +1 -0
- package/dist/components/ui/kbd.js +30 -0
- package/dist/components/ui/kbd.js.map +1 -0
- package/dist/components/ui/label.cjs +2 -0
- package/dist/components/ui/label.cjs.map +1 -0
- package/dist/components/ui/label.js +23 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/menubar.cjs +2 -0
- package/dist/components/ui/menubar.cjs.map +1 -0
- package/dist/components/ui/menubar.js +256 -0
- package/dist/components/ui/menubar.js.map +1 -0
- package/dist/components/ui/navigation-menu.cjs +2 -0
- package/dist/components/ui/navigation-menu.cjs.map +1 -0
- package/dist/components/ui/navigation-menu.js +164 -0
- package/dist/components/ui/navigation-menu.js.map +1 -0
- package/dist/components/ui/radio-group.cjs +2 -0
- package/dist/components/ui/radio-group.cjs.map +1 -0
- package/dist/components/ui/radio-group.js +45 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/resizable.cjs +2 -0
- package/dist/components/ui/resizable.cjs.map +1 -0
- package/dist/components/ui/resizable.js +46 -0
- package/dist/components/ui/resizable.js.map +1 -0
- package/dist/components/ui/scroll-area.cjs +2 -0
- package/dist/components/ui/scroll-area.cjs.map +1 -0
- package/dist/components/ui/scroll-area.js +60 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.cjs +2 -0
- package/dist/components/ui/select.cjs.map +1 -0
- package/dist/components/ui/select.js +184 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.cjs +2 -0
- package/dist/components/ui/separator.cjs.map +1 -0
- package/dist/components/ui/separator.js +27 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/sheet.cjs +2 -0
- package/dist/components/ui/sheet.cjs.map +1 -0
- package/dist/components/ui/sheet.js +137 -0
- package/dist/components/ui/sheet.js.map +1 -0
- package/dist/components/ui/sidebar.cjs +2 -0
- package/dist/components/ui/sidebar.cjs.map +1 -0
- package/dist/components/ui/sidebar.js +579 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.cjs +2 -0
- package/dist/components/ui/skeleton.cjs.map +1 -0
- package/dist/components/ui/skeleton.js +16 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.cjs +2 -0
- package/dist/components/ui/slider.cjs.map +1 -0
- package/dist/components/ui/slider.js +60 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/sonner.cjs +2 -0
- package/dist/components/ui/sonner.cjs.map +1 -0
- package/dist/components/ui/sonner.js +37 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/spinner.cjs +2 -0
- package/dist/components/ui/spinner.cjs.map +1 -0
- package/dist/components/ui/spinner.js +10 -0
- package/dist/components/ui/spinner.js.map +1 -0
- package/dist/components/ui/switch.cjs +2 -0
- package/dist/components/ui/switch.cjs.map +1 -0
- package/dist/components/ui/switch.js +32 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.cjs +2 -0
- package/dist/components/ui/table.cjs.map +1 -0
- package/dist/components/ui/table.js +115 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.cjs +2 -0
- package/dist/components/ui/tabs.cjs.map +1 -0
- package/dist/components/ui/tabs.js +91 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/tetrascience-icon.cjs +2 -0
- package/dist/components/ui/tetrascience-icon.cjs.map +1 -0
- package/dist/components/ui/tetrascience-icon.js +46 -0
- package/dist/components/ui/tetrascience-icon.js.map +1 -0
- package/dist/components/ui/textarea.cjs +2 -0
- package/dist/components/ui/textarea.cjs.map +1 -0
- package/dist/components/ui/textarea.js +19 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toggle-group.cjs +2 -0
- package/dist/components/ui/toggle-group.cjs.map +1 -0
- package/dist/components/ui/toggle-group.js +77 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/toggle.cjs +2 -0
- package/dist/components/ui/toggle.cjs.map +1 -0
- package/dist/components/ui/toggle.js +44 -0
- package/dist/components/ui/toggle.js.map +1 -0
- package/dist/components/ui/tooltip.cjs +2 -0
- package/dist/components/ui/tooltip.cjs.map +1 -0
- package/dist/components/ui/tooltip.js +56 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/hooks/use-code-editor-theme.cjs +2 -0
- package/dist/hooks/use-code-editor-theme.cjs.map +1 -0
- package/dist/hooks/use-code-editor-theme.js +31 -0
- package/dist/hooks/use-code-editor-theme.js.map +1 -0
- package/dist/hooks/use-is-dark.cjs +2 -0
- package/dist/hooks/use-is-dark.cjs.map +1 -0
- package/dist/hooks/use-is-dark.js +18 -0
- package/dist/hooks/use-is-dark.js.map +1 -0
- package/dist/hooks/use-mobile.cjs +2 -0
- package/dist/hooks/use-mobile.cjs.map +1 -0
- package/dist/hooks/use-mobile.js +15 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-plotly-theme.cjs +2 -0
- package/dist/hooks/use-plotly-theme.cjs.map +1 -0
- package/dist/hooks/use-plotly-theme.js +33 -0
- package/dist/hooks/use-plotly-theme.js.map +1 -0
- package/dist/index.cjs +1 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +389 -9435
- package/dist/index.js.map +1 -1
- package/dist/lib/utils.cjs +2 -0
- package/dist/lib/utils.cjs.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/providers/athena.cjs +1 -1
- package/dist/providers/athena.cjs.map +1 -1
- package/dist/providers/athena.js +9 -157
- package/dist/providers/athena.js.map +1 -1
- package/dist/providers/databricks.cjs +1 -1
- package/dist/providers/databricks.cjs.map +1 -1
- package/dist/providers/databricks.js +9 -82
- package/dist/providers/databricks.js.map +1 -1
- package/dist/providers/snowflake.cjs +1 -1
- package/dist/providers/snowflake.cjs.map +1 -1
- package/dist/providers/snowflake.js +8 -118
- package/dist/providers/snowflake.js.map +1 -1
- package/dist/server/auth/JwtTokenManager.cjs +2 -0
- package/dist/server/auth/JwtTokenManager.cjs.map +1 -0
- package/dist/server/auth/JwtTokenManager.js +134 -0
- package/dist/server/auth/JwtTokenManager.js.map +1 -0
- package/dist/server/providers/AthenaProvider.cjs +2 -0
- package/dist/server/providers/AthenaProvider.cjs.map +1 -0
- package/dist/server/providers/AthenaProvider.js +154 -0
- package/dist/server/providers/AthenaProvider.js.map +1 -0
- package/dist/server/providers/DatabricksProvider.cjs +2 -0
- package/dist/server/providers/DatabricksProvider.cjs.map +1 -0
- package/dist/server/providers/DatabricksProvider.js +79 -0
- package/dist/server/providers/DatabricksProvider.js.map +1 -0
- package/dist/server/providers/SnowflakeProvider.cjs +2 -0
- package/dist/server/providers/SnowflakeProvider.cjs.map +1 -0
- package/dist/server/providers/SnowflakeProvider.js +116 -0
- package/dist/server/providers/SnowflakeProvider.js.map +1 -0
- package/dist/server/providers/buildProvider.cjs +2 -0
- package/dist/server/providers/buildProvider.cjs.map +1 -0
- package/dist/server/providers/buildProvider.js +22 -0
- package/dist/server/providers/buildProvider.js.map +1 -0
- package/dist/server/providers/exceptions.cjs +2 -0
- package/dist/server/providers/exceptions.cjs.map +1 -0
- package/dist/{exceptions-jCQ6h5C8.js → server/providers/exceptions.js} +11 -11
- package/dist/server/providers/exceptions.js.map +1 -0
- package/dist/server/providers/getProviderConfigurations.cjs +2 -0
- package/dist/server/providers/getProviderConfigurations.cjs.map +1 -0
- package/dist/server/providers/getProviderConfigurations.js +78 -0
- package/dist/server/providers/getProviderConfigurations.js.map +1 -0
- package/dist/server/providers/providerDiscovery.cjs +2 -0
- package/dist/server/providers/providerDiscovery.cjs.map +1 -0
- package/dist/server/providers/providerDiscovery.js +28 -0
- package/dist/server/providers/providerDiscovery.js.map +1 -0
- package/dist/server.cjs +1 -1
- package/dist/server.cjs.map +1 -1
- package/dist/server.js +27 -262
- package/dist/server.js.map +1 -1
- package/dist/utils/colors.cjs +2 -0
- package/dist/utils/colors.cjs.map +1 -0
- package/dist/utils/colors.js +98 -0
- package/dist/utils/colors.js.map +1 -0
- package/package.json +15 -1
- package/dist/exceptions-DN25pCDi.cjs +0 -2
- package/dist/exceptions-DN25pCDi.cjs.map +0 -1
- package/dist/exceptions-jCQ6h5C8.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TdpSearch.js","sources":["../../../../src/components/composed/TdpSearch/TdpSearch.tsx"],"sourcesContent":["import { AlertCircle, Search } from \"lucide-react\";\nimport React, { useState } from \"react\";\n\nimport { DefaultFilters } from \"./components/DefaultFilters\";\nimport { DefaultResults } from \"./components/DefaultResults\";\nimport { DefaultSearchBar } from \"./components/DefaultSearchBar\";\nimport { useSearch } from \"./hooks/useSearch\";\nimport { useTdpCredentials } from \"./hooks/useTdpCredentials\";\n\nimport type { TdpSearchProps, SearchEqlExpression } from \"./types\";\nimport type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\nimport { Alert, AlertDescription, AlertTitle } from \"@/components/ui/alert\";\n\nimport \"./TdpSearch.scss\";\n\n/**\n * TdpSearch Component\n *\n * A reusable search component for querying the TDP.\n *\n * @example\n * ```tsx\n * <TdpSearch\n * columns={[\n * { key: \"id\", header: \"ID\" },\n * { key: \"filePath\", header: \"File Path\", sortable: true }\n * ]}\n * defaultQuery=\"sample-data\"\n * pageSize={20}\n * />\n * ```\n */\n\nexport const TdpSearch: React.FC<TdpSearchProps> = ({\n defaultQuery = \"\",\n columns,\n filters = [],\n defaultSort,\n advancedSearchParams,\n pageSize = 10,\n searchPlaceholder = \"Enter search term...\",\n className,\n onSearch,\n renderSearchBar,\n renderFilters,\n renderResults,\n ...props\n}) => {\n const { authToken, orgSlug } = useTdpCredentials(props.authToken, props.orgSlug);\n\n const { results, total, currentPage, isLoading, error, executeSearch } = useSearch({\n ...props,\n authToken: authToken ?? \"\",\n orgSlug: orgSlug ?? \"\",\n pageSize,\n });\n\n // UI state\n const [query, setQuery] = useState(defaultQuery);\n const [filterValues, setFilterValues] = useState<Record<string, string>>({});\n const [sortKey, setSortKey] = useState<string | null>(null);\n const [sortDirection, setSortDirection] = useState<\"asc\" | \"desc\">(\"asc\");\n const [hasSearched, setHasSearched] = useState(false);\n\n // Execute search with current UI state. Optional sortOverride avoids stale state when called from handleSort.\n const handleExecuteSearch = async (\n page: number = 1,\n sortOverride?: { sortKey: string; sortDirection: \"asc\" | \"desc\" },\n ) => {\n if (!query.trim()) {\n return;\n }\n\n setHasSearched(true);\n\n const effectiveSortKey = sortOverride?.sortKey ?? sortKey ?? defaultSort?.field;\n const effectiveOrder =\n sortOverride == null\n ? sortKey\n ? sortDirection\n : (defaultSort?.order ?? sortDirection)\n : sortOverride.sortDirection;\n\n const filterExpressions = Object.entries(filterValues)\n .filter(([, value]) => value !== \"\")\n .map(([key, value]) => ({ field: key, operator: \"eq\", value }));\n\n let expression: SearchEqlExpression | undefined = advancedSearchParams?.expression as\n | SearchEqlExpression\n | undefined;\n\n if (filterExpressions.length > 0) {\n expression = {\n g: \"AND\",\n e: expression ? [...filterExpressions, expression] : filterExpressions,\n };\n }\n\n const searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\"> = {\n searchTerm: query.trim(),\n sort: effectiveSortKey ?? undefined,\n order: effectiveOrder,\n ...advancedSearchParams,\n ...(expression !== undefined && { expression }),\n };\n\n const newResults = await executeSearch(searchRequest, page);\n\n // Call onSearch with the freshly fetched results (not stale state)\n if (onSearch) {\n onSearch({ ...searchRequest, from: (page - 1) * pageSize, size: pageSize }, newResults);\n }\n };\n\n // Handle search button click\n const handleSearch = () => {\n handleExecuteSearch(1);\n };\n\n // Handle filter change\n const handleFilterChange = (filterKey: string, value: string) => {\n setFilterValues((prev) => ({\n ...prev,\n [filterKey]: value,\n }));\n };\n\n // Handle page change\n const handlePageChange = (page: number) => {\n handleExecuteSearch(page);\n };\n\n // Handle sort\n const handleSort = (key: string, direction: \"asc\" | \"desc\") => {\n setSortKey(key);\n setSortDirection(direction);\n handleExecuteSearch(1, { sortKey: key, sortDirection: direction });\n };\n\n const emptyState = (\n <div className=\"tdp-search__empty-state\">\n <div className=\"tdp-search__empty-state-icon\">\n <Search />\n </div>\n <div className=\"tdp-search__empty-state-text\">No results found. Try adjusting your search query or filters.</div>\n </div>\n );\n\n const searchBarProps = { query, setQuery, onSearch: handleSearch, isLoading, placeholder: searchPlaceholder };\n const filtersProps = { filters, filterValues, onFilterChange: handleFilterChange };\n const resultsProps = {\n results,\n total,\n currentPage,\n pageSize,\n columns,\n onPageChange: handlePageChange,\n sortKey,\n sortDirection,\n onSort: handleSort,\n };\n\n return (\n <div className={`tdp-search ${className || \"\"}`}>\n {renderSearchBar ? renderSearchBar(searchBarProps) : <DefaultSearchBar {...searchBarProps} />}\n\n {filters.length > 0 && (renderFilters ? renderFilters(filtersProps) : <DefaultFilters {...filtersProps} />)}\n\n {error && (\n <>\n <Alert variant=\"destructive\">\n <AlertCircle />\n <AlertTitle>Error</AlertTitle>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n {emptyState}\n </>\n )}\n\n {isLoading && <div className=\"tdp-search__loading-overlay\">Loading results...</div>}\n\n {!isLoading && !hasSearched && (\n <div className=\"tdp-search__empty-state\">\n <div className=\"tdp-search__empty-state-icon\">\n <Search />\n </div>\n <div className=\"tdp-search__empty-state-text\">Enter a search query and click Search to get started.</div>\n </div>\n )}\n\n {!isLoading &&\n !error &&\n hasSearched &&\n results.length > 0 &&\n (renderResults ? renderResults(resultsProps) : <DefaultResults {...resultsProps} />)}\n\n {!isLoading && !error && hasSearched && results.length === 0 && emptyState}\n </div>\n );\n};\n\nexport default TdpSearch;\n"],"names":["TdpSearch","defaultQuery","columns","filters","defaultSort","advancedSearchParams","pageSize","searchPlaceholder","className","onSearch","renderSearchBar","renderFilters","renderResults","props","authToken","orgSlug","useTdpCredentials","results","total","currentPage","isLoading","error","executeSearch","useSearch","query","setQuery","useState","filterValues","setFilterValues","sortKey","setSortKey","sortDirection","setSortDirection","hasSearched","setHasSearched","handleExecuteSearch","page","sortOverride","effectiveSortKey","effectiveOrder","filterExpressions","value","key","expression","searchRequest","newResults","handleSearch","handleFilterChange","filterKey","prev","handlePageChange","handleSort","direction","emptyState","jsxs","jsx","Search","searchBarProps","filtersProps","resultsProps","DefaultSearchBar","DefaultFilters","Fragment","Alert","AlertCircle","AlertTitle","AlertDescription","DefaultResults"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),t=require("../../../ui/select.cjs"),p="__tdp-search-empty__",h=c=>`${p}:${c}`,m=({filters:c,filterValues:d,onFilterChange:o})=>l.jsx("div",{className:"tdp-search__filters-row",children:c.map(s=>{const a=h(s.key),r=s.options.some(e=>e.value===""),n=d[s.key]??"",u=s.options.some(e=>e.value===n),i=n===""?r?a:void 0:u?n:void 0;return l.jsxs("div",{className:"tdp-search__filter-wrapper",children:[l.jsx("label",{className:"tdp-search__filter-label",children:s.label}),l.jsxs(t.Select,{value:i,onValueChange:e=>o(s.key,e===a?"":e),children:[l.jsx(t.SelectTrigger,{className:"h-[38px] w-full justify-between rounded-md",children:l.jsx(t.SelectValue,{placeholder:"Select an option"})}),l.jsx(t.SelectContent,{children:s.options.map(e=>l.jsx(t.SelectItem,{value:e.value===""?a:e.value,disabled:e.disabled,children:e.label},`${s.key}-${e.value||a}`))})]})]},s.key)})});exports.DefaultFilters=m;
|
|
2
|
+
//# sourceMappingURL=DefaultFilters.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultFilters.cjs","sources":["../../../../../src/components/composed/TdpSearch/components/DefaultFilters.tsx"],"sourcesContent":["import React from \"react\";\n\nimport type { TdpFiltersRenderProps } from \"../types\";\n\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\n\nconst EMPTY_OPTION_SENTINEL_PREFIX = \"__tdp-search-empty__\";\n\nconst getEmptyOptionValue = (filterKey: string) => `${EMPTY_OPTION_SENTINEL_PREFIX}:${filterKey}`;\n\nexport const DefaultFilters: React.FC<TdpFiltersRenderProps> = ({ filters, filterValues, onFilterChange }) => (\n <div className=\"tdp-search__filters-row\">\n {filters.map((filter) => {\n const emptyOptionValue = getEmptyOptionValue(filter.key);\n const hasEmptyOption = filter.options.some((option) => option.value === \"\");\n const selectedValue = filterValues[filter.key] ?? \"\";\n const hasSelectedOption = filter.options.some((option) => option.value === selectedValue);\n const selectValue =\n selectedValue === \"\"\n ? hasEmptyOption\n ? emptyOptionValue\n : undefined\n : hasSelectedOption\n ? selectedValue\n : undefined;\n\n return (\n <div key={filter.key} className=\"tdp-search__filter-wrapper\">\n <label className=\"tdp-search__filter-label\">{filter.label}</label>\n <Select\n value={selectValue}\n onValueChange={(value) => onFilterChange(filter.key, value === emptyOptionValue ? \"\" : value)}\n >\n <SelectTrigger className=\"h-[38px] w-full justify-between rounded-md\">\n <SelectValue placeholder=\"Select an option\" />\n </SelectTrigger>\n <SelectContent>\n {filter.options.map((option) => (\n <SelectItem\n key={`${filter.key}-${option.value || emptyOptionValue}`}\n value={option.value === \"\" ? emptyOptionValue : option.value}\n disabled={option.disabled}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n })}\n </div>\n);\n"],"names":["EMPTY_OPTION_SENTINEL_PREFIX","getEmptyOptionValue","filterKey","DefaultFilters","filters","filterValues","onFilterChange","jsx","filter","emptyOptionValue","hasEmptyOption","option","selectedValue","hasSelectedOption","selectValue","jsxs","Select","value","SelectTrigger","SelectValue","SelectContent","SelectItem"],"mappings":"yJAYMA,EAA+B,uBAE/BC,EAAuBC,GAAsB,GAAGF,CAA4B,IAAIE,CAAS,GAElFC,EAAkD,CAAC,CAAE,QAAAC,EAAS,aAAAC,EAAc,eAAAC,CAAA,IACvFC,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACZ,SAAAH,EAAQ,IAAKI,GAAW,CACvB,MAAMC,EAAmBR,EAAoBO,EAAO,GAAG,EACjDE,EAAiBF,EAAO,QAAQ,KAAMG,GAAWA,EAAO,QAAU,EAAE,EACpEC,EAAgBP,EAAaG,EAAO,GAAG,GAAK,GAC5CK,EAAoBL,EAAO,QAAQ,KAAMG,GAAWA,EAAO,QAAUC,CAAa,EAClFE,EACJF,IAAkB,GACdF,EACED,EACA,OACFI,EACED,EACA,OAER,OACEG,EAAAA,KAAC,MAAA,CAAqB,UAAU,6BAC9B,SAAA,CAAAR,EAAAA,IAAC,QAAA,CAAM,UAAU,2BAA4B,SAAAC,EAAO,MAAM,EAC1DO,EAAAA,KAACC,EAAAA,OAAA,CACC,MAAOF,EACP,cAAgBG,GAAUX,EAAeE,EAAO,IAAKS,IAAUR,EAAmB,GAAKQ,CAAK,EAE5F,SAAA,CAAAV,EAAAA,IAACW,EAAAA,eAAc,UAAU,6CACvB,eAACC,EAAAA,YAAA,CAAY,YAAY,mBAAmB,CAAA,CAC9C,QACCC,EAAAA,cAAA,CACE,SAAAZ,EAAO,QAAQ,IAAKG,GACnBJ,EAAAA,IAACc,EAAAA,WAAA,CAEC,MAAOV,EAAO,QAAU,GAAKF,EAAmBE,EAAO,MACvD,SAAUA,EAAO,SAEhB,SAAAA,EAAO,KAAA,EAJH,GAAGH,EAAO,GAAG,IAAIG,EAAO,OAASF,CAAgB,EAAA,CAMzD,CAAA,CACH,CAAA,CAAA,CAAA,CACF,CAAA,EApBQD,EAAO,GAqBjB,CAEJ,CAAC,CAAA,CACH"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as a, jsxs as n } from "react/jsx-runtime";
|
|
2
|
+
import { Select as i, SelectTrigger as u, SelectValue as h, SelectContent as _, SelectItem as v } from "../../../ui/select.js";
|
|
3
|
+
const y = "__tdp-search-empty__", S = (t) => `${y}:${t}`, E = ({ filters: t, filterValues: o, onFilterChange: d }) => /* @__PURE__ */ a("div", { className: "tdp-search__filters-row", children: t.map((l) => {
|
|
4
|
+
const s = S(l.key), p = l.options.some((e) => e.value === ""), c = o[l.key] ?? "", r = l.options.some((e) => e.value === c), m = c === "" ? p ? s : void 0 : r ? c : void 0;
|
|
5
|
+
return /* @__PURE__ */ n("div", { className: "tdp-search__filter-wrapper", children: [
|
|
6
|
+
/* @__PURE__ */ a("label", { className: "tdp-search__filter-label", children: l.label }),
|
|
7
|
+
/* @__PURE__ */ n(
|
|
8
|
+
i,
|
|
9
|
+
{
|
|
10
|
+
value: m,
|
|
11
|
+
onValueChange: (e) => d(l.key, e === s ? "" : e),
|
|
12
|
+
children: [
|
|
13
|
+
/* @__PURE__ */ a(u, { className: "h-[38px] w-full justify-between rounded-md", children: /* @__PURE__ */ a(h, { placeholder: "Select an option" }) }),
|
|
14
|
+
/* @__PURE__ */ a(_, { children: l.options.map((e) => /* @__PURE__ */ a(
|
|
15
|
+
v,
|
|
16
|
+
{
|
|
17
|
+
value: e.value === "" ? s : e.value,
|
|
18
|
+
disabled: e.disabled,
|
|
19
|
+
children: e.label
|
|
20
|
+
},
|
|
21
|
+
`${l.key}-${e.value || s}`
|
|
22
|
+
)) })
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
] }, l.key);
|
|
27
|
+
}) });
|
|
28
|
+
export {
|
|
29
|
+
E as DefaultFilters
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=DefaultFilters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultFilters.js","sources":["../../../../../src/components/composed/TdpSearch/components/DefaultFilters.tsx"],"sourcesContent":["import React from \"react\";\n\nimport type { TdpFiltersRenderProps } from \"../types\";\n\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\n\nconst EMPTY_OPTION_SENTINEL_PREFIX = \"__tdp-search-empty__\";\n\nconst getEmptyOptionValue = (filterKey: string) => `${EMPTY_OPTION_SENTINEL_PREFIX}:${filterKey}`;\n\nexport const DefaultFilters: React.FC<TdpFiltersRenderProps> = ({ filters, filterValues, onFilterChange }) => (\n <div className=\"tdp-search__filters-row\">\n {filters.map((filter) => {\n const emptyOptionValue = getEmptyOptionValue(filter.key);\n const hasEmptyOption = filter.options.some((option) => option.value === \"\");\n const selectedValue = filterValues[filter.key] ?? \"\";\n const hasSelectedOption = filter.options.some((option) => option.value === selectedValue);\n const selectValue =\n selectedValue === \"\"\n ? hasEmptyOption\n ? emptyOptionValue\n : undefined\n : hasSelectedOption\n ? selectedValue\n : undefined;\n\n return (\n <div key={filter.key} className=\"tdp-search__filter-wrapper\">\n <label className=\"tdp-search__filter-label\">{filter.label}</label>\n <Select\n value={selectValue}\n onValueChange={(value) => onFilterChange(filter.key, value === emptyOptionValue ? \"\" : value)}\n >\n <SelectTrigger className=\"h-[38px] w-full justify-between rounded-md\">\n <SelectValue placeholder=\"Select an option\" />\n </SelectTrigger>\n <SelectContent>\n {filter.options.map((option) => (\n <SelectItem\n key={`${filter.key}-${option.value || emptyOptionValue}`}\n value={option.value === \"\" ? emptyOptionValue : option.value}\n disabled={option.disabled}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n })}\n </div>\n);\n"],"names":["EMPTY_OPTION_SENTINEL_PREFIX","getEmptyOptionValue","filterKey","DefaultFilters","filters","filterValues","onFilterChange","jsx","filter","emptyOptionValue","hasEmptyOption","option","selectedValue","hasSelectedOption","selectValue","jsxs","Select","value","SelectTrigger","SelectValue","SelectContent","SelectItem"],"mappings":";;AAYA,MAAMA,IAA+B,wBAE/BC,IAAsB,CAACC,MAAsB,GAAGF,CAA4B,IAAIE,CAAS,IAElFC,IAAkD,CAAC,EAAE,SAAAC,GAAS,cAAAC,GAAc,gBAAAC,EAAA,MACvF,gBAAAC,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAAH,EAAQ,IAAI,CAACI,MAAW;AACvB,QAAMC,IAAmBR,EAAoBO,EAAO,GAAG,GACjDE,IAAiBF,EAAO,QAAQ,KAAK,CAACG,MAAWA,EAAO,UAAU,EAAE,GACpEC,IAAgBP,EAAaG,EAAO,GAAG,KAAK,IAC5CK,IAAoBL,EAAO,QAAQ,KAAK,CAACG,MAAWA,EAAO,UAAUC,CAAa,GAClFE,IACJF,MAAkB,KACdF,IACED,IACA,SACFI,IACED,IACA;AAER,SACE,gBAAAG,EAAC,OAAA,EAAqB,WAAU,8BAC9B,UAAA;AAAA,IAAA,gBAAAR,EAAC,SAAA,EAAM,WAAU,4BAA4B,UAAAC,EAAO,OAAM;AAAA,IAC1D,gBAAAO;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,OAAOF;AAAA,QACP,eAAe,CAACG,MAAUX,EAAeE,EAAO,KAAKS,MAAUR,IAAmB,KAAKQ,CAAK;AAAA,QAE5F,UAAA;AAAA,UAAA,gBAAAV,EAACW,KAAc,WAAU,8CACvB,4BAACC,GAAA,EAAY,aAAY,oBAAmB,EAAA,CAC9C;AAAA,4BACCC,GAAA,EACE,UAAAZ,EAAO,QAAQ,IAAI,CAACG,MACnB,gBAAAJ;AAAA,YAACc;AAAA,YAAA;AAAA,cAEC,OAAOV,EAAO,UAAU,KAAKF,IAAmBE,EAAO;AAAA,cACvD,UAAUA,EAAO;AAAA,cAEhB,UAAAA,EAAO;AAAA,YAAA;AAAA,YAJH,GAAGH,EAAO,GAAG,IAAIG,EAAO,SAASF,CAAgB;AAAA,UAAA,CAMzD,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,EAAA,GApBQD,EAAO,GAqBjB;AAEJ,CAAC,EAAA,CACH;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("react/jsx-runtime"),d=require("lucide-react"),x=require("react"),j=require("../../../ui/button.cjs"),a=require("../../../ui/table.cjs"),y=({results:v,total:c,currentPage:i,pageSize:o,columns:p,onPageChange:b,sortKey:u,sortDirection:h,onSort:f})=>{const n=x.useMemo(()=>Math.max(1,Math.ceil(c/o)),[c,o]),N=x.useMemo(()=>{const e=[];if(n<=5)for(let t=1;t<=n;t++)e.push(t);else{e.push(1),i>3&&e.push("...");const t=Math.max(2,i-1),m=Math.min(n-1,i+1);for(let r=t;r<=m;r++)e.push(r);i<n-2&&e.push("..."),e.push(n)}return e},[n,i]),k=x.useCallback(e=>{f(e,u===e&&h==="asc"?"desc":"asc")},[u,h,f]),w=x.useCallback(e=>u!==e?s.jsx(d.ArrowUpDown,{className:"ml-1 inline size-3.5 text-muted-foreground"}):h==="asc"?s.jsx(d.ArrowUp,{className:"ml-1 inline size-3.5"}):s.jsx(d.ArrowDown,{className:"ml-1 inline size-3.5"}),[u,h]);return s.jsxs(s.Fragment,{children:[s.jsx("div",{className:"tdp-search__results-header",children:s.jsxs("div",{className:"tdp-search__results-count",children:["Showing ",(i-1)*o+1,"-",Math.min(i*o,c)," of ",c," results"]})}),s.jsx("div",{className:"rounded-lg border",children:s.jsxs(a.Table,{children:[s.jsx(a.TableHeader,{children:s.jsx(a.TableRow,{children:p.map(e=>s.jsxs(a.TableHead,{style:{width:e.width,textAlign:e.align},className:e.sortable?"cursor-pointer select-none":void 0,onClick:e.sortable?()=>k(e.key):void 0,children:[e.header,e.sortable&&w(e.key)]},e.key))})}),s.jsx(a.TableBody,{children:v.map((e,l)=>s.jsx(a.TableRow,{children:p.map(t=>{const m=e[t.key],r=t.render?t.render(m,e,l):m;return s.jsx(a.TableCell,{style:{textAlign:t.align},children:r},t.key)})},e.id||l))})]})}),n>1&&s.jsxs("div",{className:"flex items-center justify-center gap-2 py-2.5",children:[s.jsx(j.Button,{variant:"outline",size:"icon-sm",disabled:i===1,onClick:()=>b(i-1),"aria-label":"Previous page",children:s.jsx(d.ChevronLeft,{})}),N.map((e,l)=>typeof e=="number"?s.jsx(j.Button,{variant:e===i?"default":"ghost",size:"icon-sm",onClick:()=>b(e),children:e},l):s.jsx("span",{className:"px-1 text-sm text-muted-foreground",children:e},l)),s.jsx(j.Button,{variant:"outline",size:"icon-sm",disabled:i===n,onClick:()=>b(i+1),"aria-label":"Next page",children:s.jsx(d.ChevronRight,{})})]})]})};exports.DefaultResults=y;
|
|
2
|
+
//# sourceMappingURL=DefaultResults.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultResults.cjs","sources":["../../../../../src/components/composed/TdpSearch/components/DefaultResults.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, ArrowUpDown, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport React, { useCallback, useMemo } from \"react\";\n\nimport type { TdpResultsRenderProps } from \"../types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\n\nexport const DefaultResults: React.FC<TdpResultsRenderProps> = ({\n results,\n total,\n currentPage,\n pageSize,\n columns,\n onPageChange,\n sortKey,\n sortDirection,\n onSort,\n}) => {\n const totalPages = useMemo(() => Math.max(1, Math.ceil(total / pageSize)), [total, pageSize]);\n\n const pageNumbers = useMemo(() => {\n const pages: (number | string)[] = [];\n const maxVisible = 5;\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) pages.push(i);\n } else {\n pages.push(1);\n if (currentPage > 3) pages.push(\"...\");\n const start = Math.max(2, currentPage - 1);\n const end = Math.min(totalPages - 1, currentPage + 1);\n for (let i = start; i <= end; i++) pages.push(i);\n if (currentPage < totalPages - 2) pages.push(\"...\");\n pages.push(totalPages);\n }\n\n return pages;\n }, [totalPages, currentPage]);\n\n const handleSort = useCallback(\n (key: string) => {\n const newDirection = sortKey === key ? (sortDirection === \"asc\" ? \"desc\" : \"asc\") : \"asc\";\n onSort(key, newDirection);\n },\n [sortKey, sortDirection, onSort],\n );\n\n const sortIcon = useCallback(\n (columnKey: string) => {\n if (sortKey !== columnKey) return <ArrowUpDown className=\"ml-1 inline size-3.5 text-muted-foreground\" />;\n return sortDirection === \"asc\" ? (\n <ArrowUp className=\"ml-1 inline size-3.5\" />\n ) : (\n <ArrowDown className=\"ml-1 inline size-3.5\" />\n );\n },\n [sortKey, sortDirection],\n );\n\n return (\n <>\n <div className=\"tdp-search__results-header\">\n <div className=\"tdp-search__results-count\">\n Showing {(currentPage - 1) * pageSize + 1}-{Math.min(currentPage * pageSize, total)} of {total} results\n </div>\n </div>\n\n <div className=\"rounded-lg border\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((col) => (\n <TableHead\n key={col.key}\n style={{ width: col.width, textAlign: col.align }}\n className={col.sortable ? \"cursor-pointer select-none\" : undefined}\n onClick={col.sortable ? () => handleSort(col.key) : undefined}\n >\n {col.header}\n {col.sortable && sortIcon(col.key)}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n\n <TableBody>\n {results.map((row, rowIndex) => (\n <TableRow key={row.id || rowIndex}>\n {columns.map((col) => {\n const value = row[col.key];\n const content = col.render ? col.render(value, row, rowIndex) : value;\n return (\n <TableCell key={col.key} style={{ textAlign: col.align }}>\n {content}\n </TableCell>\n );\n })}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {totalPages > 1 && (\n <div className=\"flex items-center justify-center gap-2 py-2.5\">\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={currentPage === 1}\n onClick={() => onPageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n <ChevronLeft />\n </Button>\n\n {pageNumbers.map((page, i) =>\n typeof page === \"number\" ? (\n <Button\n key={i}\n variant={page === currentPage ? \"default\" : \"ghost\"}\n size=\"icon-sm\"\n onClick={() => onPageChange(page)}\n >\n {page}\n </Button>\n ) : (\n <span key={i} className=\"px-1 text-sm text-muted-foreground\">\n {page}\n </span>\n ),\n )}\n\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={currentPage === totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n <ChevronRight />\n </Button>\n </div>\n )}\n </>\n );\n};\n"],"names":["DefaultResults","results","total","currentPage","pageSize","columns","onPageChange","sortKey","sortDirection","onSort","totalPages","useMemo","pageNumbers","pages","i","start","end","handleSort","useCallback","key","sortIcon","columnKey","jsx","ArrowUpDown","ArrowUp","ArrowDown","jsxs","Fragment","Table","TableHeader","TableRow","col","TableHead","TableBody","row","rowIndex","value","content","TableCell","Button","ChevronLeft","page","ChevronRight"],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { jsx as s, jsxs as r, Fragment as M } from "react/jsx-runtime";
|
|
2
|
+
import { ArrowUpDown as T, ArrowUp as A, ArrowDown as _, ChevronLeft as j, ChevronRight as z } from "lucide-react";
|
|
3
|
+
import { useMemo as x, useCallback as v } from "react";
|
|
4
|
+
import { Button as u } from "../../../ui/button.js";
|
|
5
|
+
import { Table as R, TableHeader as B, TableRow as N, TableHead as D, TableBody as H, TableCell as U } from "../../../ui/table.js";
|
|
6
|
+
const G = ({
|
|
7
|
+
results: k,
|
|
8
|
+
total: d,
|
|
9
|
+
currentPage: i,
|
|
10
|
+
pageSize: m,
|
|
11
|
+
columns: f,
|
|
12
|
+
onPageChange: p,
|
|
13
|
+
sortKey: o,
|
|
14
|
+
sortDirection: h,
|
|
15
|
+
onSort: b
|
|
16
|
+
}) => {
|
|
17
|
+
const l = x(() => Math.max(1, Math.ceil(d / m)), [d, m]), w = x(() => {
|
|
18
|
+
const e = [];
|
|
19
|
+
if (l <= 5)
|
|
20
|
+
for (let n = 1; n <= l; n++) e.push(n);
|
|
21
|
+
else {
|
|
22
|
+
e.push(1), i > 3 && e.push("...");
|
|
23
|
+
const n = Math.max(2, i - 1), c = Math.min(l - 1, i + 1);
|
|
24
|
+
for (let a = n; a <= c; a++) e.push(a);
|
|
25
|
+
i < l - 2 && e.push("..."), e.push(l);
|
|
26
|
+
}
|
|
27
|
+
return e;
|
|
28
|
+
}, [l, i]), y = v(
|
|
29
|
+
(e) => {
|
|
30
|
+
b(e, o === e && h === "asc" ? "desc" : "asc");
|
|
31
|
+
},
|
|
32
|
+
[o, h, b]
|
|
33
|
+
), C = v(
|
|
34
|
+
(e) => o !== e ? /* @__PURE__ */ s(T, { className: "ml-1 inline size-3.5 text-muted-foreground" }) : h === "asc" ? /* @__PURE__ */ s(A, { className: "ml-1 inline size-3.5" }) : /* @__PURE__ */ s(_, { className: "ml-1 inline size-3.5" }),
|
|
35
|
+
[o, h]
|
|
36
|
+
);
|
|
37
|
+
return /* @__PURE__ */ r(M, { children: [
|
|
38
|
+
/* @__PURE__ */ s("div", { className: "tdp-search__results-header", children: /* @__PURE__ */ r("div", { className: "tdp-search__results-count", children: [
|
|
39
|
+
"Showing ",
|
|
40
|
+
(i - 1) * m + 1,
|
|
41
|
+
"-",
|
|
42
|
+
Math.min(i * m, d),
|
|
43
|
+
" of ",
|
|
44
|
+
d,
|
|
45
|
+
" results"
|
|
46
|
+
] }) }),
|
|
47
|
+
/* @__PURE__ */ s("div", { className: "rounded-lg border", children: /* @__PURE__ */ r(R, { children: [
|
|
48
|
+
/* @__PURE__ */ s(B, { children: /* @__PURE__ */ s(N, { children: f.map((e) => /* @__PURE__ */ r(
|
|
49
|
+
D,
|
|
50
|
+
{
|
|
51
|
+
style: { width: e.width, textAlign: e.align },
|
|
52
|
+
className: e.sortable ? "cursor-pointer select-none" : void 0,
|
|
53
|
+
onClick: e.sortable ? () => y(e.key) : void 0,
|
|
54
|
+
children: [
|
|
55
|
+
e.header,
|
|
56
|
+
e.sortable && C(e.key)
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
e.key
|
|
60
|
+
)) }) }),
|
|
61
|
+
/* @__PURE__ */ s(H, { children: k.map((e, t) => /* @__PURE__ */ s(N, { children: f.map((n) => {
|
|
62
|
+
const c = e[n.key], a = n.render ? n.render(c, e, t) : c;
|
|
63
|
+
return /* @__PURE__ */ s(U, { style: { textAlign: n.align }, children: a }, n.key);
|
|
64
|
+
}) }, e.id || t)) })
|
|
65
|
+
] }) }),
|
|
66
|
+
l > 1 && /* @__PURE__ */ r("div", { className: "flex items-center justify-center gap-2 py-2.5", children: [
|
|
67
|
+
/* @__PURE__ */ s(
|
|
68
|
+
u,
|
|
69
|
+
{
|
|
70
|
+
variant: "outline",
|
|
71
|
+
size: "icon-sm",
|
|
72
|
+
disabled: i === 1,
|
|
73
|
+
onClick: () => p(i - 1),
|
|
74
|
+
"aria-label": "Previous page",
|
|
75
|
+
children: /* @__PURE__ */ s(j, {})
|
|
76
|
+
}
|
|
77
|
+
),
|
|
78
|
+
w.map(
|
|
79
|
+
(e, t) => typeof e == "number" ? /* @__PURE__ */ s(
|
|
80
|
+
u,
|
|
81
|
+
{
|
|
82
|
+
variant: e === i ? "default" : "ghost",
|
|
83
|
+
size: "icon-sm",
|
|
84
|
+
onClick: () => p(e),
|
|
85
|
+
children: e
|
|
86
|
+
},
|
|
87
|
+
t
|
|
88
|
+
) : /* @__PURE__ */ s("span", { className: "px-1 text-sm text-muted-foreground", children: e }, t)
|
|
89
|
+
),
|
|
90
|
+
/* @__PURE__ */ s(
|
|
91
|
+
u,
|
|
92
|
+
{
|
|
93
|
+
variant: "outline",
|
|
94
|
+
size: "icon-sm",
|
|
95
|
+
disabled: i === l,
|
|
96
|
+
onClick: () => p(i + 1),
|
|
97
|
+
"aria-label": "Next page",
|
|
98
|
+
children: /* @__PURE__ */ s(z, {})
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
] })
|
|
102
|
+
] });
|
|
103
|
+
};
|
|
104
|
+
export {
|
|
105
|
+
G as DefaultResults
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=DefaultResults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultResults.js","sources":["../../../../../src/components/composed/TdpSearch/components/DefaultResults.tsx"],"sourcesContent":["import { ArrowDown, ArrowUp, ArrowUpDown, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport React, { useCallback, useMemo } from \"react\";\n\nimport type { TdpResultsRenderProps } from \"../types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\";\n\nexport const DefaultResults: React.FC<TdpResultsRenderProps> = ({\n results,\n total,\n currentPage,\n pageSize,\n columns,\n onPageChange,\n sortKey,\n sortDirection,\n onSort,\n}) => {\n const totalPages = useMemo(() => Math.max(1, Math.ceil(total / pageSize)), [total, pageSize]);\n\n const pageNumbers = useMemo(() => {\n const pages: (number | string)[] = [];\n const maxVisible = 5;\n\n if (totalPages <= maxVisible) {\n for (let i = 1; i <= totalPages; i++) pages.push(i);\n } else {\n pages.push(1);\n if (currentPage > 3) pages.push(\"...\");\n const start = Math.max(2, currentPage - 1);\n const end = Math.min(totalPages - 1, currentPage + 1);\n for (let i = start; i <= end; i++) pages.push(i);\n if (currentPage < totalPages - 2) pages.push(\"...\");\n pages.push(totalPages);\n }\n\n return pages;\n }, [totalPages, currentPage]);\n\n const handleSort = useCallback(\n (key: string) => {\n const newDirection = sortKey === key ? (sortDirection === \"asc\" ? \"desc\" : \"asc\") : \"asc\";\n onSort(key, newDirection);\n },\n [sortKey, sortDirection, onSort],\n );\n\n const sortIcon = useCallback(\n (columnKey: string) => {\n if (sortKey !== columnKey) return <ArrowUpDown className=\"ml-1 inline size-3.5 text-muted-foreground\" />;\n return sortDirection === \"asc\" ? (\n <ArrowUp className=\"ml-1 inline size-3.5\" />\n ) : (\n <ArrowDown className=\"ml-1 inline size-3.5\" />\n );\n },\n [sortKey, sortDirection],\n );\n\n return (\n <>\n <div className=\"tdp-search__results-header\">\n <div className=\"tdp-search__results-count\">\n Showing {(currentPage - 1) * pageSize + 1}-{Math.min(currentPage * pageSize, total)} of {total} results\n </div>\n </div>\n\n <div className=\"rounded-lg border\">\n <Table>\n <TableHeader>\n <TableRow>\n {columns.map((col) => (\n <TableHead\n key={col.key}\n style={{ width: col.width, textAlign: col.align }}\n className={col.sortable ? \"cursor-pointer select-none\" : undefined}\n onClick={col.sortable ? () => handleSort(col.key) : undefined}\n >\n {col.header}\n {col.sortable && sortIcon(col.key)}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n\n <TableBody>\n {results.map((row, rowIndex) => (\n <TableRow key={row.id || rowIndex}>\n {columns.map((col) => {\n const value = row[col.key];\n const content = col.render ? col.render(value, row, rowIndex) : value;\n return (\n <TableCell key={col.key} style={{ textAlign: col.align }}>\n {content}\n </TableCell>\n );\n })}\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </div>\n\n {totalPages > 1 && (\n <div className=\"flex items-center justify-center gap-2 py-2.5\">\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={currentPage === 1}\n onClick={() => onPageChange(currentPage - 1)}\n aria-label=\"Previous page\"\n >\n <ChevronLeft />\n </Button>\n\n {pageNumbers.map((page, i) =>\n typeof page === \"number\" ? (\n <Button\n key={i}\n variant={page === currentPage ? \"default\" : \"ghost\"}\n size=\"icon-sm\"\n onClick={() => onPageChange(page)}\n >\n {page}\n </Button>\n ) : (\n <span key={i} className=\"px-1 text-sm text-muted-foreground\">\n {page}\n </span>\n ),\n )}\n\n <Button\n variant=\"outline\"\n size=\"icon-sm\"\n disabled={currentPage === totalPages}\n onClick={() => onPageChange(currentPage + 1)}\n aria-label=\"Next page\"\n >\n <ChevronRight />\n </Button>\n </div>\n )}\n </>\n );\n};\n"],"names":["DefaultResults","results","total","currentPage","pageSize","columns","onPageChange","sortKey","sortDirection","onSort","totalPages","useMemo","pageNumbers","pages","i","start","end","handleSort","useCallback","key","sortIcon","columnKey","jsx","ArrowUpDown","ArrowUp","ArrowDown","jsxs","Fragment","Table","TableHeader","TableRow","col","TableHead","TableBody","row","rowIndex","value","content","TableCell","Button","ChevronLeft","page","ChevronRight"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),l=require("lucide-react"),u=require("../../../ui/button.cjs"),o=require("../../../ui/input.cjs"),d=({query:r,setQuery:n,onSearch:a,isLoading:s,placeholder:c})=>{const i=t=>{t.key==="Enter"&&a()};return e.jsxs("div",{className:"tdp-search__search-bar",children:[e.jsx("div",{className:"tdp-search__search-input-wrapper",children:e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-2.5 text-muted-foreground",children:e.jsx(l.Search,{})}),e.jsx(o.Input,{value:r,onChange:t=>n(t.target.value),onKeyDown:i,placeholder:c,className:"pl-9"})]})}),e.jsx(u.Button,{variant:"default",onClick:a,disabled:!r.trim()||s,children:s?"Searching...":"Search"})]})};exports.DefaultSearchBar=d;
|
|
2
|
+
//# sourceMappingURL=DefaultSearchBar.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultSearchBar.cjs","sources":["../../../../../src/components/composed/TdpSearch/components/DefaultSearchBar.tsx"],"sourcesContent":["import { Search } from \"lucide-react\";\nimport React from \"react\";\n\nimport type { TdpSearchBarRenderProps } from \"../types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\n\nexport const DefaultSearchBar: React.FC<TdpSearchBarRenderProps> = ({\n query,\n setQuery,\n onSearch,\n isLoading,\n placeholder,\n}) => {\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n onSearch();\n }\n };\n\n return (\n <div className=\"tdp-search__search-bar\">\n <div className=\"tdp-search__search-input-wrapper\">\n <div className=\"relative\">\n <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-2.5 text-muted-foreground\">\n <Search />\n </div>\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className=\"pl-9\"\n />\n </div>\n </div>\n <Button variant=\"default\" onClick={onSearch} disabled={!query.trim() || isLoading}>\n {isLoading ? \"Searching...\" : \"Search\"}\n </Button>\n </div>\n );\n};\n"],"names":["DefaultSearchBar","query","setQuery","onSearch","isLoading","placeholder","handleKeyDown","e","jsxs","jsx","Search","Input","Button"],"mappings":"sNASaA,EAAsD,CAAC,CAClE,MAAAC,EACA,SAAAC,EACA,SAAAC,EACA,UAAAC,EACA,YAAAC,CACF,IAAM,CACJ,MAAMC,EAAiBC,GAA2B,CAC5CA,EAAE,MAAQ,SACZJ,EAAA,CAEJ,EAEA,OACEK,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACb,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,mCACb,SAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,WACb,SAAA,CAAAC,MAAC,MAAA,CAAI,UAAU,+FACb,SAAAA,MAACC,EAAAA,SAAO,EACV,EACAD,EAAAA,IAACE,EAAAA,MAAA,CACC,MAAOV,EACP,SAAWM,GAAML,EAASK,EAAE,OAAO,KAAK,EACxC,UAAWD,EACX,YAAAD,EACA,UAAU,MAAA,CAAA,CACZ,CAAA,CACF,CAAA,CACF,EACAI,EAAAA,IAACG,EAAAA,OAAA,CAAO,QAAQ,UAAU,QAAST,EAAU,SAAU,CAACF,EAAM,KAAA,GAAUG,EACrE,SAAAA,EAAY,eAAiB,QAAA,CAChC,CAAA,EACF,CAEJ"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsxs as l, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { Search as c } from "lucide-react";
|
|
3
|
+
import { Button as o } from "../../../ui/button.js";
|
|
4
|
+
import { Input as d } from "../../../ui/input.js";
|
|
5
|
+
const v = ({
|
|
6
|
+
query: a,
|
|
7
|
+
setQuery: s,
|
|
8
|
+
onSearch: t,
|
|
9
|
+
isLoading: n,
|
|
10
|
+
placeholder: i
|
|
11
|
+
}) => /* @__PURE__ */ l("div", { className: "tdp-search__search-bar", children: [
|
|
12
|
+
/* @__PURE__ */ e("div", { className: "tdp-search__search-input-wrapper", children: /* @__PURE__ */ l("div", { className: "relative", children: [
|
|
13
|
+
/* @__PURE__ */ e("div", { className: "pointer-events-none absolute inset-y-0 left-0 flex items-center pl-2.5 text-muted-foreground", children: /* @__PURE__ */ e(c, {}) }),
|
|
14
|
+
/* @__PURE__ */ e(
|
|
15
|
+
d,
|
|
16
|
+
{
|
|
17
|
+
value: a,
|
|
18
|
+
onChange: (r) => s(r.target.value),
|
|
19
|
+
onKeyDown: (r) => {
|
|
20
|
+
r.key === "Enter" && t();
|
|
21
|
+
},
|
|
22
|
+
placeholder: i,
|
|
23
|
+
className: "pl-9"
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
] }) }),
|
|
27
|
+
/* @__PURE__ */ e(o, { variant: "default", onClick: t, disabled: !a.trim() || n, children: n ? "Searching..." : "Search" })
|
|
28
|
+
] });
|
|
29
|
+
export {
|
|
30
|
+
v as DefaultSearchBar
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=DefaultSearchBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DefaultSearchBar.js","sources":["../../../../../src/components/composed/TdpSearch/components/DefaultSearchBar.tsx"],"sourcesContent":["import { Search } from \"lucide-react\";\nimport React from \"react\";\n\nimport type { TdpSearchBarRenderProps } from \"../types\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\n\n\nexport const DefaultSearchBar: React.FC<TdpSearchBarRenderProps> = ({\n query,\n setQuery,\n onSearch,\n isLoading,\n placeholder,\n}) => {\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n onSearch();\n }\n };\n\n return (\n <div className=\"tdp-search__search-bar\">\n <div className=\"tdp-search__search-input-wrapper\">\n <div className=\"relative\">\n <div className=\"pointer-events-none absolute inset-y-0 left-0 flex items-center pl-2.5 text-muted-foreground\">\n <Search />\n </div>\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n className=\"pl-9\"\n />\n </div>\n </div>\n <Button variant=\"default\" onClick={onSearch} disabled={!query.trim() || isLoading}>\n {isLoading ? \"Searching...\" : \"Search\"}\n </Button>\n </div>\n );\n};\n"],"names":["DefaultSearchBar","query","setQuery","onSearch","isLoading","placeholder","jsxs","jsx","Search","Input","e","Button"],"mappings":";;;;AASO,MAAMA,IAAsD,CAAC;AAAA,EAClE,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AACF,MAQI,gBAAAC,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,EAAA,gBAAAC,EAAC,SAAI,WAAU,oCACb,UAAA,gBAAAD,EAAC,OAAA,EAAI,WAAU,YACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,gGACb,UAAA,gBAAAA,EAACC,KAAO,GACV;AAAA,IACA,gBAAAD;AAAA,MAACE;AAAA,MAAA;AAAA,QACC,OAAOR;AAAA,QACP,UAAU,CAACS,MAAMR,EAASQ,EAAE,OAAO,KAAK;AAAA,QACxC,WAhBY,CAACA,MAA2B;AAChD,UAAIA,EAAE,QAAQ,WACZP,EAAA;AAAA,QAEJ;AAAA,QAaU,aAAAE;AAAA,QACA,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EACZ,EAAA,CACF,EAAA,CACF;AAAA,EACA,gBAAAE,EAACI,GAAA,EAAO,SAAQ,WAAU,SAASR,GAAU,UAAU,CAACF,EAAM,KAAA,KAAUG,GACrE,UAAAA,IAAY,iBAAiB,SAAA,CAChC;AAAA,GACF;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.cjs","sources":["../../../../src/components/composed/TdpSearch/constants.ts"],"sourcesContent":["export const AUTH_TOKEN_HEADER = \"ts-auth-token\";\nexport const ORG_SLUG_HEADER = \"x-org-slug\";\n\nexport const STANDALONE_SEARCH_PATH = \"/v1/datalake/searchEql\";"],"names":["AUTH_TOKEN_HEADER","ORG_SLUG_HEADER","STANDALONE_SEARCH_PATH"],"mappings":"gFAAO,MAAMA,EAAoB,gBACpBC,EAAkB,aAElBC,EAAyB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../../src/components/composed/TdpSearch/constants.ts"],"sourcesContent":["export const AUTH_TOKEN_HEADER = \"ts-auth-token\";\nexport const ORG_SLUG_HEADER = \"x-org-slug\";\n\nexport const STANDALONE_SEARCH_PATH = \"/v1/datalake/searchEql\";"],"names":["AUTH_TOKEN_HEADER","ORG_SLUG_HEADER","STANDALONE_SEARCH_PATH"],"mappings":"AAAO,MAAMA,IAAoB,iBACpBC,IAAkB,cAElBC,IAAyB;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("react"),s=require("../constants.cjs"),D=require("../utils.cjs");function N(y){const[A,l]=r.useState([]),[m,d]=r.useState(0),[w,H]=r.useState(1),[O,h]=r.useState(!1),[R,S]=r.useState(null);return{results:A,total:m,currentPage:w,isLoading:O,error:R,executeSearch:async(E,f=1)=>{h(!0),S(null);const{pageSize:c,standalone:T,baseUrl:g,apiEndpoint:b="/api/search",authToken:o,orgSlug:n}=y,p=(f-1)*c;let i,u;if(T){if(!g)throw new Error("baseUrl is required when standalone is true");i=`${g.replace(/\/$/,"")}${s.STANDALONE_SEARCH_PATH}`,u={method:"POST",headers:{"Content-Type":"application/json",...o&&{[s.AUTH_TOKEN_HEADER]:o},...n&&{[s.ORG_SLUG_HEADER]:n}},body:JSON.stringify(D.buildEsBody(E,p,c))}}else{const e={"Content-Type":"application/json"};o&&n&&(e[s.AUTH_TOKEN_HEADER]=o,e[s.ORG_SLUG_HEADER]=n),i=b,u={method:"POST",headers:e,credentials:"include",body:JSON.stringify({...E,size:c,from:p})}}try{const e=await fetch(i,u);if(!e.ok){const t=await e.json().catch(()=>({error:"Unknown error"})),U=T&&t.error?.message||t.error;throw new Error(U||`HTTP ${e.status}: ${e.statusText}`)}const a=await e.json(),_=(a.hits?.hits||[]).map(t=>({id:t._id,...t._source,_score:t._score})),P=typeof a.hits?.total=="number"?a.hits.total:a.hits?.total?.value||0;return l(_),d(P),H(f),_}catch(e){return S(e.message||"An error occurred while searching"),l([]),d(0),[]}finally{h(!1)}}}}exports.useSearch=N;
|
|
2
|
+
//# sourceMappingURL=useSearch.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSearch.cjs","sources":["../../../../../src/components/composed/TdpSearch/hooks/useSearch.ts"],"sourcesContent":["import { useState } from \"react\";\n\nimport { AUTH_TOKEN_HEADER, ORG_SLUG_HEADER, STANDALONE_SEARCH_PATH } from \"../constants\";\nimport { buildEsBody } from \"../utils\";\n\nimport type { SearchResult, UseSearchConfig, UseSearchResult } from \"../types\";\nimport type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\nexport function useSearch(config: UseSearchConfig): UseSearchResult {\n const [results, setResults] = useState<SearchResult[]>([]);\n const [total, setTotal] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const executeSearch = async (\n searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\">,\n page: number = 1,\n ): Promise<SearchResult[]> => {\n setIsLoading(true);\n setError(null);\n\n const { pageSize, standalone, baseUrl, apiEndpoint = \"/api/search\", authToken, orgSlug } = config;\n const from = (page - 1) * pageSize;\n\n let url: string;\n let fetchInit: RequestInit;\n\n if (standalone) {\n if (!baseUrl) throw new Error(\"baseUrl is required when standalone is true\");\n url = `${baseUrl.replace(/\\/$/, \"\")}${STANDALONE_SEARCH_PATH}`;\n fetchInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(authToken && { [AUTH_TOKEN_HEADER]: authToken }),\n ...(orgSlug && { [ORG_SLUG_HEADER]: orgSlug }),\n },\n body: JSON.stringify(buildEsBody(searchRequest, from, pageSize)),\n };\n } else {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (authToken && orgSlug) {\n headers[AUTH_TOKEN_HEADER] = authToken;\n headers[ORG_SLUG_HEADER] = orgSlug;\n }\n url = apiEndpoint;\n fetchInit = {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify({ ...searchRequest, size: pageSize, from }),\n };\n }\n\n try {\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: \"Unknown error\" }));\n const message = standalone ? errorData.error?.message || errorData.error : errorData.error;\n throw new Error(message || `HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n const transformedResults: SearchResult[] = (data.hits?.hits || []).map((hit: any) => ({\n id: hit._id,\n ...hit._source,\n _score: hit._score,\n }));\n\n const totalHits = typeof data.hits?.total === \"number\" ? data.hits.total : data.hits?.total?.value || 0;\n\n setResults(transformedResults);\n setTotal(totalHits);\n setCurrentPage(page);\n return transformedResults;\n } catch (err: any) {\n setError(err.message || \"An error occurred while searching\");\n setResults([]);\n setTotal(0);\n return [];\n } finally {\n setIsLoading(false);\n }\n };\n\n return { results, total, currentPage, isLoading, error, executeSearch };\n}\n"],"names":["useSearch","config","results","setResults","useState","total","setTotal","currentPage","setCurrentPage","isLoading","setIsLoading","error","setError","searchRequest","page","pageSize","standalone","baseUrl","apiEndpoint","authToken","orgSlug","from","url","fetchInit","STANDALONE_SEARCH_PATH","AUTH_TOKEN_HEADER","ORG_SLUG_HEADER","buildEsBody","headers","response","errorData","message","data","transformedResults","hit","totalHits","err"],"mappings":"iKAQO,SAASA,EAAUC,EAA0C,CAClE,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAyB,CAAA,CAAE,EACnD,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAS,CAAC,EAC9B,CAACG,EAAaC,CAAc,EAAIJ,EAAAA,SAAS,CAAC,EAC1C,CAACK,EAAWC,CAAY,EAAIN,EAAAA,SAAS,EAAK,EAC1C,CAACO,EAAOC,CAAQ,EAAIR,EAAAA,SAAwB,IAAI,EA2EtD,MAAO,CAAE,QAAAF,EAAS,MAAAG,EAAO,YAAAE,EAAa,UAAAE,EAAW,MAAAE,EAAO,cAzElC,MACpBE,EACAC,EAAe,IACa,CAC5BJ,EAAa,EAAI,EACjBE,EAAS,IAAI,EAEb,KAAM,CAAE,SAAAG,EAAU,WAAAC,EAAY,QAAAC,EAAS,YAAAC,EAAc,cAAe,UAAAC,EAAW,QAAAC,GAAYnB,EACrFoB,GAAQP,EAAO,GAAKC,EAE1B,IAAIO,EACAC,EAEJ,GAAIP,EAAY,CACd,GAAI,CAACC,EAAS,MAAM,IAAI,MAAM,6CAA6C,EAC3EK,EAAM,GAAGL,EAAQ,QAAQ,MAAO,EAAE,CAAC,GAAGO,EAAAA,sBAAsB,GAC5DD,EAAY,CACV,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,GAAIJ,GAAa,CAAE,CAACM,EAAAA,iBAAiB,EAAGN,CAAA,EACxC,GAAIC,GAAW,CAAE,CAACM,EAAAA,eAAe,EAAGN,CAAA,CAAQ,EAE9C,KAAM,KAAK,UAAUO,EAAAA,YAAYd,EAAeQ,EAAMN,CAAQ,CAAC,CAAA,CAEnE,KAAO,CACL,MAAMa,EAAkC,CAAE,eAAgB,kBAAA,EACtDT,GAAaC,IACfQ,EAAQH,EAAAA,iBAAiB,EAAIN,EAC7BS,EAAQF,EAAAA,eAAe,EAAIN,GAE7BE,EAAMJ,EACNK,EAAY,CACV,OAAQ,OACR,QAAAK,EACA,YAAa,UACb,KAAM,KAAK,UAAU,CAAE,GAAGf,EAAe,KAAME,EAAU,KAAAM,CAAA,CAAM,CAAA,CAEnE,CAEA,GAAI,CACF,MAAMQ,EAAW,MAAM,MAAMP,EAAKC,CAAS,EAE3C,GAAI,CAACM,EAAS,GAAI,CAChB,MAAMC,EAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,KAAO,CAAE,MAAO,eAAA,EAAkB,EAC1EE,EAAUf,GAAac,EAAU,OAAO,SAAWA,EAAU,MACnE,MAAM,IAAI,MAAMC,GAAW,QAAQF,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE,CAC9E,CAEA,MAAMG,EAAO,MAAMH,EAAS,KAAA,EAEtBI,GAAsCD,EAAK,MAAM,MAAQ,IAAI,IAAKE,IAAc,CACpF,GAAIA,EAAI,IACR,GAAGA,EAAI,QACP,OAAQA,EAAI,MAAA,EACZ,EAEIC,EAAY,OAAOH,EAAK,MAAM,OAAU,SAAWA,EAAK,KAAK,MAAQA,EAAK,MAAM,OAAO,OAAS,EAEtG,OAAA7B,EAAW8B,CAAkB,EAC7B3B,EAAS6B,CAAS,EAClB3B,EAAeM,CAAI,EACZmB,CACT,OAASG,EAAU,CACjB,OAAAxB,EAASwB,EAAI,SAAW,mCAAmC,EAC3DjC,EAAW,CAAA,CAAE,EACbG,EAAS,CAAC,EACH,CAAA,CACT,QAAA,CACEI,EAAa,EAAK,CACpB,CACF,CAEwD,CAC1D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { useState as r } from "react";
|
|
2
|
+
import { STANDALONE_SEARCH_PATH as $, ORG_SLUG_HEADER as E, AUTH_TOKEN_HEADER as y } from "../constants.js";
|
|
3
|
+
import { buildEsBody as j } from "../utils.js";
|
|
4
|
+
function k(w) {
|
|
5
|
+
const [_, l] = r([]), [A, u] = r(0), [H, O] = r(1), [b, d] = r(!1), [P, h] = r(null);
|
|
6
|
+
return { results: _, total: A, currentPage: H, isLoading: b, error: P, executeSearch: async (f, p = 1) => {
|
|
7
|
+
d(!0), h(null);
|
|
8
|
+
const { pageSize: a, standalone: m, baseUrl: S, apiEndpoint: N = "/api/search", authToken: s, orgSlug: o } = w, T = (p - 1) * a;
|
|
9
|
+
let i, c;
|
|
10
|
+
if (m) {
|
|
11
|
+
if (!S) throw new Error("baseUrl is required when standalone is true");
|
|
12
|
+
i = `${S.replace(/\/$/, "")}${$}`, c = {
|
|
13
|
+
method: "POST",
|
|
14
|
+
headers: {
|
|
15
|
+
"Content-Type": "application/json",
|
|
16
|
+
...s && { [y]: s },
|
|
17
|
+
...o && { [E]: o }
|
|
18
|
+
},
|
|
19
|
+
body: JSON.stringify(j(f, T, a))
|
|
20
|
+
};
|
|
21
|
+
} else {
|
|
22
|
+
const e = { "Content-Type": "application/json" };
|
|
23
|
+
s && o && (e[y] = s, e[E] = o), i = N, c = {
|
|
24
|
+
method: "POST",
|
|
25
|
+
headers: e,
|
|
26
|
+
credentials: "include",
|
|
27
|
+
body: JSON.stringify({ ...f, size: a, from: T })
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const e = await fetch(i, c);
|
|
32
|
+
if (!e.ok) {
|
|
33
|
+
const t = await e.json().catch(() => ({ error: "Unknown error" })), U = m && t.error?.message || t.error;
|
|
34
|
+
throw new Error(U || `HTTP ${e.status}: ${e.statusText}`);
|
|
35
|
+
}
|
|
36
|
+
const n = await e.json(), g = (n.hits?.hits || []).map((t) => ({
|
|
37
|
+
id: t._id,
|
|
38
|
+
...t._source,
|
|
39
|
+
_score: t._score
|
|
40
|
+
})), R = typeof n.hits?.total == "number" ? n.hits.total : n.hits?.total?.value || 0;
|
|
41
|
+
return l(g), u(R), O(p), g;
|
|
42
|
+
} catch (e) {
|
|
43
|
+
return h(e.message || "An error occurred while searching"), l([]), u(0), [];
|
|
44
|
+
} finally {
|
|
45
|
+
d(!1);
|
|
46
|
+
}
|
|
47
|
+
} };
|
|
48
|
+
}
|
|
49
|
+
export {
|
|
50
|
+
k as useSearch
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=useSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSearch.js","sources":["../../../../../src/components/composed/TdpSearch/hooks/useSearch.ts"],"sourcesContent":["import { useState } from \"react\";\n\nimport { AUTH_TOKEN_HEADER, ORG_SLUG_HEADER, STANDALONE_SEARCH_PATH } from \"../constants\";\nimport { buildEsBody } from \"../utils\";\n\nimport type { SearchResult, UseSearchConfig, UseSearchResult } from \"../types\";\nimport type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\nexport function useSearch(config: UseSearchConfig): UseSearchResult {\n const [results, setResults] = useState<SearchResult[]>([]);\n const [total, setTotal] = useState(0);\n const [currentPage, setCurrentPage] = useState(1);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const executeSearch = async (\n searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\">,\n page: number = 1,\n ): Promise<SearchResult[]> => {\n setIsLoading(true);\n setError(null);\n\n const { pageSize, standalone, baseUrl, apiEndpoint = \"/api/search\", authToken, orgSlug } = config;\n const from = (page - 1) * pageSize;\n\n let url: string;\n let fetchInit: RequestInit;\n\n if (standalone) {\n if (!baseUrl) throw new Error(\"baseUrl is required when standalone is true\");\n url = `${baseUrl.replace(/\\/$/, \"\")}${STANDALONE_SEARCH_PATH}`;\n fetchInit = {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(authToken && { [AUTH_TOKEN_HEADER]: authToken }),\n ...(orgSlug && { [ORG_SLUG_HEADER]: orgSlug }),\n },\n body: JSON.stringify(buildEsBody(searchRequest, from, pageSize)),\n };\n } else {\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (authToken && orgSlug) {\n headers[AUTH_TOKEN_HEADER] = authToken;\n headers[ORG_SLUG_HEADER] = orgSlug;\n }\n url = apiEndpoint;\n fetchInit = {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify({ ...searchRequest, size: pageSize, from }),\n };\n }\n\n try {\n const response = await fetch(url, fetchInit);\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({ error: \"Unknown error\" }));\n const message = standalone ? errorData.error?.message || errorData.error : errorData.error;\n throw new Error(message || `HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n const transformedResults: SearchResult[] = (data.hits?.hits || []).map((hit: any) => ({\n id: hit._id,\n ...hit._source,\n _score: hit._score,\n }));\n\n const totalHits = typeof data.hits?.total === \"number\" ? data.hits.total : data.hits?.total?.value || 0;\n\n setResults(transformedResults);\n setTotal(totalHits);\n setCurrentPage(page);\n return transformedResults;\n } catch (err: any) {\n setError(err.message || \"An error occurred while searching\");\n setResults([]);\n setTotal(0);\n return [];\n } finally {\n setIsLoading(false);\n }\n };\n\n return { results, total, currentPage, isLoading, error, executeSearch };\n}\n"],"names":["useSearch","config","results","setResults","useState","total","setTotal","currentPage","setCurrentPage","isLoading","setIsLoading","error","setError","searchRequest","page","pageSize","standalone","baseUrl","apiEndpoint","authToken","orgSlug","from","url","fetchInit","STANDALONE_SEARCH_PATH","AUTH_TOKEN_HEADER","ORG_SLUG_HEADER","buildEsBody","headers","response","errorData","message","data","transformedResults","hit","totalHits","err"],"mappings":";;;AAQO,SAASA,EAAUC,GAA0C;AAClE,QAAM,CAACC,GAASC,CAAU,IAAIC,EAAyB,CAAA,CAAE,GACnD,CAACC,GAAOC,CAAQ,IAAIF,EAAS,CAAC,GAC9B,CAACG,GAAaC,CAAc,IAAIJ,EAAS,CAAC,GAC1C,CAACK,GAAWC,CAAY,IAAIN,EAAS,EAAK,GAC1C,CAACO,GAAOC,CAAQ,IAAIR,EAAwB,IAAI;AA2EtD,SAAO,EAAE,SAAAF,GAAS,OAAAG,GAAO,aAAAE,GAAa,WAAAE,GAAW,OAAAE,GAAO,eAzElC,OACpBE,GACAC,IAAe,MACa;AAC5B,IAAAJ,EAAa,EAAI,GACjBE,EAAS,IAAI;AAEb,UAAM,EAAE,UAAAG,GAAU,YAAAC,GAAY,SAAAC,GAAS,aAAAC,IAAc,eAAe,WAAAC,GAAW,SAAAC,MAAYnB,GACrFoB,KAAQP,IAAO,KAAKC;AAE1B,QAAIO,GACAC;AAEJ,QAAIP,GAAY;AACd,UAAI,CAACC,EAAS,OAAM,IAAI,MAAM,6CAA6C;AAC3E,MAAAK,IAAM,GAAGL,EAAQ,QAAQ,OAAO,EAAE,CAAC,GAAGO,CAAsB,IAC5DD,IAAY;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,GAAIJ,KAAa,EAAE,CAACM,CAAiB,GAAGN,EAAA;AAAA,UACxC,GAAIC,KAAW,EAAE,CAACM,CAAe,GAAGN,EAAA;AAAA,QAAQ;AAAA,QAE9C,MAAM,KAAK,UAAUO,EAAYd,GAAeQ,GAAMN,CAAQ,CAAC;AAAA,MAAA;AAAA,IAEnE,OAAO;AACL,YAAMa,IAAkC,EAAE,gBAAgB,mBAAA;AAC1D,MAAIT,KAAaC,MACfQ,EAAQH,CAAiB,IAAIN,GAC7BS,EAAQF,CAAe,IAAIN,IAE7BE,IAAMJ,GACNK,IAAY;AAAA,QACV,QAAQ;AAAA,QACR,SAAAK;AAAA,QACA,aAAa;AAAA,QACb,MAAM,KAAK,UAAU,EAAE,GAAGf,GAAe,MAAME,GAAU,MAAAM,EAAA,CAAM;AAAA,MAAA;AAAA,IAEnE;AAEA,QAAI;AACF,YAAMQ,IAAW,MAAM,MAAMP,GAAKC,CAAS;AAE3C,UAAI,CAACM,EAAS,IAAI;AAChB,cAAMC,IAAY,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,EAAE,OAAO,gBAAA,EAAkB,GAC1EE,IAAUf,KAAac,EAAU,OAAO,WAAWA,EAAU;AACnE,cAAM,IAAI,MAAMC,KAAW,QAAQF,EAAS,MAAM,KAAKA,EAAS,UAAU,EAAE;AAAA,MAC9E;AAEA,YAAMG,IAAO,MAAMH,EAAS,KAAA,GAEtBI,KAAsCD,EAAK,MAAM,QAAQ,IAAI,IAAI,CAACE,OAAc;AAAA,QACpF,IAAIA,EAAI;AAAA,QACR,GAAGA,EAAI;AAAA,QACP,QAAQA,EAAI;AAAA,MAAA,EACZ,GAEIC,IAAY,OAAOH,EAAK,MAAM,SAAU,WAAWA,EAAK,KAAK,QAAQA,EAAK,MAAM,OAAO,SAAS;AAEtG,aAAA7B,EAAW8B,CAAkB,GAC7B3B,EAAS6B,CAAS,GAClB3B,EAAeM,CAAI,GACZmB;AAAA,IACT,SAASG,GAAU;AACjB,aAAAxB,EAASwB,EAAI,WAAW,mCAAmC,GAC3DjC,EAAW,CAAA,CAAE,GACbG,EAAS,CAAC,GACH,CAAA;AAAA,IACT,UAAA;AACE,MAAAI,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,EAEwD;AAC1D;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../constants.cjs");function a(o){try{return localStorage.getItem(o)??void 0}catch{return}}function s(o){try{const e=document.cookie.match(new RegExp("(?:^|; )"+o+"=([^;]*)"));return e?decodeURIComponent(e[1]):void 0}catch{return}}function d(o,e){if(o&&e)return{authToken:o,orgSlug:e};const n=a(t.AUTH_TOKEN_HEADER),r=a(t.ORG_SLUG_HEADER);if(n&&r)return{authToken:n,orgSlug:r};const u=s(t.AUTH_TOKEN_HEADER),c=s(t.ORG_SLUG_HEADER);return u&&c?{authToken:u,orgSlug:c}:{authToken:o,orgSlug:e}}exports.useTdpCredentials=d;
|
|
2
|
+
//# sourceMappingURL=useTdpCredentials.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTdpCredentials.cjs","sources":["../../../../../src/components/composed/TdpSearch/hooks/useTdpCredentials.ts"],"sourcesContent":["/**\n * Resolves TDP auth credentials with the following priority:\n * 1. Explicitly passed props\n * 2. localStorage\n * 3. Browser cookies\n */\n\nimport { AUTH_TOKEN_HEADER, ORG_SLUG_HEADER } from \"../constants\";\n\nfunction readLocalStorage(key: string): string | undefined {\n try {\n return localStorage.getItem(key) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readCookie(name: string): string | undefined {\n try {\n const match = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return match ? decodeURIComponent(match[1]) : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface TdpCredentials {\n authToken: string | undefined;\n orgSlug: string | undefined;\n}\n\n/**\n * Resolves TDP auth credentials from explicit props → localStorage → cookies\n */\nexport function useTdpCredentials(explicitToken?: string, explicitOrgSlug?: string): TdpCredentials {\n if (explicitToken && explicitOrgSlug) {\n return { authToken: explicitToken, orgSlug: explicitOrgSlug };\n }\n\n const lsToken = readLocalStorage(AUTH_TOKEN_HEADER);\n const lsOrgSlug = readLocalStorage(ORG_SLUG_HEADER);\n if (lsToken && lsOrgSlug) {\n return { authToken: lsToken, orgSlug: lsOrgSlug };\n }\n\n const cookieToken = readCookie(AUTH_TOKEN_HEADER);\n const cookieOrgSlug = readCookie(ORG_SLUG_HEADER);\n if (cookieToken && cookieOrgSlug) {\n return { authToken: cookieToken, orgSlug: cookieOrgSlug };\n }\n\n return { authToken: explicitToken, orgSlug: explicitOrgSlug };\n}\n"],"names":["readLocalStorage","key","readCookie","name","match","useTdpCredentials","explicitToken","explicitOrgSlug","lsToken","AUTH_TOKEN_HEADER","lsOrgSlug","ORG_SLUG_HEADER","cookieToken","cookieOrgSlug"],"mappings":"oHASA,SAASA,EAAiBC,EAAiC,CACzD,GAAI,CACF,OAAO,aAAa,QAAQA,CAAG,GAAK,MACtC,MAAQ,CACN,MACF,CACF,CAEA,SAASC,EAAWC,EAAkC,CACpD,GAAI,CACF,MAAMC,EAAQ,SAAS,OAAO,MAAM,IAAI,OAAO,WAAaD,EAAO,UAAU,CAAC,EAC9E,OAAOC,EAAQ,mBAAmBA,EAAM,CAAC,CAAC,EAAI,MAChD,MAAQ,CACN,MACF,CACF,CAUO,SAASC,EAAkBC,EAAwBC,EAA0C,CAClG,GAAID,GAAiBC,EACnB,MAAO,CAAE,UAAWD,EAAe,QAASC,CAAA,EAG9C,MAAMC,EAAUR,EAAiBS,mBAAiB,EAC5CC,EAAYV,EAAiBW,iBAAe,EAClD,GAAIH,GAAWE,EACb,MAAO,CAAE,UAAWF,EAAS,QAASE,CAAA,EAGxC,MAAME,EAAcV,EAAWO,mBAAiB,EAC1CI,EAAgBX,EAAWS,iBAAe,EAChD,OAAIC,GAAeC,EACV,CAAE,UAAWD,EAAa,QAASC,CAAA,EAGrC,CAAE,UAAWP,EAAe,QAASC,CAAA,CAC9C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AUTH_TOKEN_HEADER as c, ORG_SLUG_HEADER as a } from "../constants.js";
|
|
2
|
+
function g(o) {
|
|
3
|
+
try {
|
|
4
|
+
return localStorage.getItem(o) ?? void 0;
|
|
5
|
+
} catch {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function d(o) {
|
|
10
|
+
try {
|
|
11
|
+
const t = document.cookie.match(new RegExp("(?:^|; )" + o + "=([^;]*)"));
|
|
12
|
+
return t ? decodeURIComponent(t[1]) : void 0;
|
|
13
|
+
} catch {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function h(o, t) {
|
|
18
|
+
if (o && t)
|
|
19
|
+
return { authToken: o, orgSlug: t };
|
|
20
|
+
const r = g(c), e = g(a);
|
|
21
|
+
if (r && e)
|
|
22
|
+
return { authToken: r, orgSlug: e };
|
|
23
|
+
const n = d(c), u = d(a);
|
|
24
|
+
return n && u ? { authToken: n, orgSlug: u } : { authToken: o, orgSlug: t };
|
|
25
|
+
}
|
|
26
|
+
export {
|
|
27
|
+
h as useTdpCredentials
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=useTdpCredentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTdpCredentials.js","sources":["../../../../../src/components/composed/TdpSearch/hooks/useTdpCredentials.ts"],"sourcesContent":["/**\n * Resolves TDP auth credentials with the following priority:\n * 1. Explicitly passed props\n * 2. localStorage\n * 3. Browser cookies\n */\n\nimport { AUTH_TOKEN_HEADER, ORG_SLUG_HEADER } from \"../constants\";\n\nfunction readLocalStorage(key: string): string | undefined {\n try {\n return localStorage.getItem(key) ?? undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readCookie(name: string): string | undefined {\n try {\n const match = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return match ? decodeURIComponent(match[1]) : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport interface TdpCredentials {\n authToken: string | undefined;\n orgSlug: string | undefined;\n}\n\n/**\n * Resolves TDP auth credentials from explicit props → localStorage → cookies\n */\nexport function useTdpCredentials(explicitToken?: string, explicitOrgSlug?: string): TdpCredentials {\n if (explicitToken && explicitOrgSlug) {\n return { authToken: explicitToken, orgSlug: explicitOrgSlug };\n }\n\n const lsToken = readLocalStorage(AUTH_TOKEN_HEADER);\n const lsOrgSlug = readLocalStorage(ORG_SLUG_HEADER);\n if (lsToken && lsOrgSlug) {\n return { authToken: lsToken, orgSlug: lsOrgSlug };\n }\n\n const cookieToken = readCookie(AUTH_TOKEN_HEADER);\n const cookieOrgSlug = readCookie(ORG_SLUG_HEADER);\n if (cookieToken && cookieOrgSlug) {\n return { authToken: cookieToken, orgSlug: cookieOrgSlug };\n }\n\n return { authToken: explicitToken, orgSlug: explicitOrgSlug };\n}\n"],"names":["readLocalStorage","key","readCookie","name","match","useTdpCredentials","explicitToken","explicitOrgSlug","lsToken","AUTH_TOKEN_HEADER","lsOrgSlug","ORG_SLUG_HEADER","cookieToken","cookieOrgSlug"],"mappings":";AASA,SAASA,EAAiBC,GAAiC;AACzD,MAAI;AACF,WAAO,aAAa,QAAQA,CAAG,KAAK;AAAA,EACtC,QAAQ;AACN;AAAA,EACF;AACF;AAEA,SAASC,EAAWC,GAAkC;AACpD,MAAI;AACF,UAAMC,IAAQ,SAAS,OAAO,MAAM,IAAI,OAAO,aAAaD,IAAO,UAAU,CAAC;AAC9E,WAAOC,IAAQ,mBAAmBA,EAAM,CAAC,CAAC,IAAI;AAAA,EAChD,QAAQ;AACN;AAAA,EACF;AACF;AAUO,SAASC,EAAkBC,GAAwBC,GAA0C;AAClG,MAAID,KAAiBC;AACnB,WAAO,EAAE,WAAWD,GAAe,SAASC,EAAA;AAG9C,QAAMC,IAAUR,EAAiBS,CAAiB,GAC5CC,IAAYV,EAAiBW,CAAe;AAClD,MAAIH,KAAWE;AACb,WAAO,EAAE,WAAWF,GAAS,SAASE,EAAA;AAGxC,QAAME,IAAcV,EAAWO,CAAiB,GAC1CI,IAAgBX,EAAWS,CAAe;AAChD,SAAIC,KAAeC,IACV,EAAE,WAAWD,GAAa,SAASC,EAAA,IAGrC,EAAE,WAAWP,GAAe,SAASC,EAAA;AAC9C;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=(s,d,u)=>{const{searchTerm:o,sort:e,order:t,...n}=s,r={from:d,size:u};return o!==void 0&&o!==""&&(r.query={simple_query_string:{query:o,default_operator:"and"}}),e!==void 0&&e!==""&&(r.sort=t?[{[e]:t}]:[e]),Object.entries(n).forEach(([c,i])=>{i!==void 0&&(r[c]=i)}),r};exports.buildEsBody=y;
|
|
2
|
+
//# sourceMappingURL=utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.cjs","sources":["../../../../src/components/composed/TdpSearch/utils.ts"],"sourcesContent":["import type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\n/** Build Elasticsearch-style body from SearchEqlRequest (TDP API does not accept searchTerm key). */\nexport const buildEsBody = (\n searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\">,\n from: number,\n size: number,\n): Record<string, unknown> => {\n const { searchTerm, sort, order, ...rest } = searchRequest;\n const body: Record<string, unknown> = { from, size };\n if (searchTerm !== undefined && searchTerm !== \"\") {\n body.query = {\n simple_query_string: {\n query: searchTerm,\n default_operator: \"and\",\n },\n };\n }\n if (sort !== undefined && sort !== \"\") {\n body.sort = order ? [{ [sort]: order }] : [sort];\n }\n Object.entries(rest).forEach(([k, v]) => {\n if (v !== undefined) body[k] = v;\n });\n return body;\n};\n"],"names":["buildEsBody","searchRequest","from","size","searchTerm","sort","order","rest","body","k","v"],"mappings":"gFAGO,MAAMA,EAAc,CACzBC,EACAC,EACAC,IAC4B,CAC5B,KAAM,CAAE,WAAAC,EAAY,KAAAC,EAAM,MAAAC,EAAO,GAAGC,GAASN,EACvCO,EAAgC,CAAE,KAAAN,EAAM,KAAAC,CAAA,EAC9C,OAAIC,IAAe,QAAaA,IAAe,KAC7CI,EAAK,MAAQ,CACX,oBAAqB,CACnB,MAAOJ,EACP,iBAAkB,KAAA,CACpB,GAGAC,IAAS,QAAaA,IAAS,KACjCG,EAAK,KAAOF,EAAQ,CAAC,CAAE,CAACD,CAAI,EAAGC,CAAA,CAAO,EAAI,CAACD,CAAI,GAEjD,OAAO,QAAQE,CAAI,EAAE,QAAQ,CAAC,CAACE,EAAGC,CAAC,IAAM,CACnCA,IAAM,SAAWF,EAAKC,CAAC,EAAIC,EACjC,CAAC,EACMF,CACT"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const a = (i, d, n) => {
|
|
2
|
+
const { searchTerm: o, sort: r, order: t, ...c } = i, e = { from: d, size: n };
|
|
3
|
+
return o !== void 0 && o !== "" && (e.query = {
|
|
4
|
+
simple_query_string: {
|
|
5
|
+
query: o,
|
|
6
|
+
default_operator: "and"
|
|
7
|
+
}
|
|
8
|
+
}), r !== void 0 && r !== "" && (e.sort = t ? [{ [r]: t }] : [r]), Object.entries(c).forEach(([u, s]) => {
|
|
9
|
+
s !== void 0 && (e[u] = s);
|
|
10
|
+
}), e;
|
|
11
|
+
};
|
|
12
|
+
export {
|
|
13
|
+
a as buildEsBody
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/components/composed/TdpSearch/utils.ts"],"sourcesContent":["import type { SearchEqlRequest } from \"@tetrascience-npm/ts-connectors-sdk\";\n\n/** Build Elasticsearch-style body from SearchEqlRequest (TDP API does not accept searchTerm key). */\nexport const buildEsBody = (\n searchRequest: Omit<SearchEqlRequest, \"from\" | \"size\">,\n from: number,\n size: number,\n): Record<string, unknown> => {\n const { searchTerm, sort, order, ...rest } = searchRequest;\n const body: Record<string, unknown> = { from, size };\n if (searchTerm !== undefined && searchTerm !== \"\") {\n body.query = {\n simple_query_string: {\n query: searchTerm,\n default_operator: \"and\",\n },\n };\n }\n if (sort !== undefined && sort !== \"\") {\n body.sort = order ? [{ [sort]: order }] : [sort];\n }\n Object.entries(rest).forEach(([k, v]) => {\n if (v !== undefined) body[k] = v;\n });\n return body;\n};\n"],"names":["buildEsBody","searchRequest","from","size","searchTerm","sort","order","rest","body","k","v"],"mappings":"AAGO,MAAMA,IAAc,CACzBC,GACAC,GACAC,MAC4B;AAC5B,QAAM,EAAE,YAAAC,GAAY,MAAAC,GAAM,OAAAC,GAAO,GAAGC,MAASN,GACvCO,IAAgC,EAAE,MAAAN,GAAM,MAAAC,EAAA;AAC9C,SAAIC,MAAe,UAAaA,MAAe,OAC7CI,EAAK,QAAQ;AAAA,IACX,qBAAqB;AAAA,MACnB,OAAOJ;AAAA,MACP,kBAAkB;AAAA,IAAA;AAAA,EACpB,IAGAC,MAAS,UAAaA,MAAS,OACjCG,EAAK,OAAOF,IAAQ,CAAC,EAAE,CAACD,CAAI,GAAGC,EAAA,CAAO,IAAI,CAACD,CAAI,IAEjD,OAAO,QAAQE,CAAI,EAAE,QAAQ,CAAC,CAACE,GAAGC,CAAC,MAAM;AACvC,IAAIA,MAAM,WAAWF,EAAKC,CAAC,IAAIC;AAAA,EACjC,CAAC,GACMF;AACT;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const T=require("react/jsx-runtime"),u=require("react"),n=require("./tdp-url.cjs"),l=u.createContext(null);function p(){const r=u.useContext(l);if(!r)throw new Error("useTdpNavigationContext must be used within a TdpNavigationProvider. Wrap your app with <TdpNavigationProvider> or use the standalone useTdpNavigation() hook instead.");return r}const f=({tdpBaseUrl:r,children:t})=>{const e=u.useMemo(()=>r?r.replace(/\/$/u,""):n.getTdpBaseUrlFromReferrer(),[r]),o=u.useMemo(()=>({tdpBaseUrl:e,getTdpUrl:i=>e?n.buildTdpUrl(e,i):null,navigateToTdp:(i,a)=>{if(!e){console.warn("[TdpNavigation] Cannot navigate: TDP base URL not resolved");return}const d=n.buildTdpUrl(e,i);d&&n.navigateToTdpUrl(d,a)}}),[e]);return T.jsx(l.Provider,{value:o,children:t})};function b(r={}){const{tdpBaseUrl:t}=r,e=u.useMemo(()=>t?t.replace(/\/$/u,""):n.getTdpBaseUrlFromReferrer(),[t]);return u.useMemo(()=>({tdpBaseUrl:e,getTdpUrl:o=>e?n.buildTdpUrl(e,o):null,navigateToTdp:(o,i)=>{if(!e){console.warn("[useTdpNavigation] Cannot navigate: TDP base URL not resolved");return}const a=n.buildTdpUrl(e,o);a&&n.navigateToTdpUrl(a,i)}}),[e])}const U=({path:r,navigationOptions:t={newTab:!0},children:e,onClick:o,className:i,...a})=>{const{getTdpUrl:d,navigateToTdp:v}=p(),c=d(r),g=s=>{s.metaKey||s.ctrlKey||s.shiftKey||(s.preventDefault(),o?.(s),v(r,t))};return T.jsx("a",{href:c??"#",target:t.newTab?"_blank":void 0,rel:t.newTab?"noopener noreferrer":void 0,onClick:g,className:`no-underline cursor-pointer hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:rounded-[2px] ${i??""}`,style:{color:"var(--primary)",outlineColor:"var(--border)"},...a,children:e})};exports.TDPLink=U;exports.TdpNavigationContext=l;exports.TdpNavigationProvider=f;exports.useTdpNavigation=b;exports.useTdpNavigationContext=p;
|
|
2
|
+
//# sourceMappingURL=tdp-link.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tdp-link.cjs","sources":["../../../src/components/composed/tdp-link.tsx"],"sourcesContent":["import React, { createContext, useContext, useMemo } from 'react';\n\nimport { buildTdpUrl, getTdpBaseUrlFromReferrer, navigateToTdpUrl } from './tdp-url';\n\nimport type { TdpNavigationOptions } from './tdp-url';\n\nexport interface TdpNavigationContextValue {\n /** The resolved TDP base URL (origin + org path prefix), or null if not resolved */\n tdpBaseUrl: string | null;\n /** Construct a full TDP URL from a path. Returns null if base URL is not resolved. */\n getTdpUrl: (path: string) => string | null;\n /** Navigate to a TDP page. */\n navigateToTdp: (path: string, options?: TdpNavigationOptions) => void;\n}\n\nexport const TdpNavigationContext = createContext<TdpNavigationContextValue | null>(null);\n\n/**\n * Access TDP navigation helpers from the nearest TdpNavigationProvider.\n *\n * @throws Error if used outside a TdpNavigationProvider\n *\n * @example\n * ```tsx\n * const { getTdpUrl, navigateToTdp } = useTdpNavigationContext();\n * ```\n */\nexport function useTdpNavigationContext(): TdpNavigationContextValue {\n const context = useContext(TdpNavigationContext);\n if (!context) {\n throw new Error(\n 'useTdpNavigationContext must be used within a TdpNavigationProvider. ' +\n 'Wrap your app with <TdpNavigationProvider> or use the standalone useTdpNavigation() hook instead.',\n );\n }\n return context;\n}\n\n/** Props for the TdpNavigationProvider component */\nexport interface TdpNavigationProviderProps {\n /**\n * Explicit TDP base URL override. Skips auto-detection when provided.\n */\n tdpBaseUrl?: string;\n children: React.ReactNode;\n}\n\n/**\n * Provider that resolves the TDP base URL and exposes navigation helpers.\n *\n * Resolution order:\n * 1. Explicit `tdpBaseUrl` prop (if provided)\n * 2. `document.referrer` parsing (production iframe)\n *\n * @example\n * ```tsx\n * <TdpNavigationProvider tdpBaseUrl=\"https://tetrascience.com/my-org\">\n * <App />\n * </TdpNavigationProvider>\n * ```\n */\nexport const TdpNavigationProvider: React.FC<TdpNavigationProviderProps> = ({\n tdpBaseUrl: explicitBaseUrl,\n children,\n}) => {\n const tdpBaseUrl = useMemo(() => {\n if (explicitBaseUrl) {\n return explicitBaseUrl.replace(/\\/$/u, '');\n }\n return getTdpBaseUrlFromReferrer();\n }, [explicitBaseUrl]);\n\n const contextValue = useMemo<TdpNavigationContextValue>(\n () => ({\n tdpBaseUrl,\n getTdpUrl: (path: string) => {\n if (!tdpBaseUrl) return null;\n return buildTdpUrl(tdpBaseUrl, path);\n },\n navigateToTdp: (path: string, options?: TdpNavigationOptions) => {\n if (!tdpBaseUrl) {\n console.warn('[TdpNavigation] Cannot navigate: TDP base URL not resolved');\n return;\n }\n const url = buildTdpUrl(tdpBaseUrl, path);\n if (url) {\n navigateToTdpUrl(url, options);\n }\n },\n }),\n [tdpBaseUrl],\n );\n\n return <TdpNavigationContext.Provider value={contextValue}>{children}</TdpNavigationContext.Provider>;\n};\n\nexport interface UseTdpNavigationOptions {\n /** Explicit TDP base URL override */\n tdpBaseUrl?: string;\n}\n\nexport interface UseTdpNavigationReturn {\n /** The resolved TDP base URL, or null */\n tdpBaseUrl: string | null;\n /** Construct a full TDP URL from a path */\n getTdpUrl: (path: string) => string | null;\n /** Navigate to a TDP page */\n navigateToTdp: (path: string, options?: TdpNavigationOptions) => void;\n}\n\n/**\n * Standalone hook for TDP navigation (no provider required).\n *\n * For simple use cases where you don't need a TdpNavigationProvider.\n * If multiple components need navigation, prefer the provider approach.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { getTdpUrl, navigateToTdp } = useTdpNavigation({\n * tdpBaseUrl: \"https://tetrascience.com/my-org\",\n * });\n *\n * return (\n * <a href={getTdpUrl(\"/file/abc\") ?? \"#\"} target=\"_blank\" rel=\"noopener noreferrer\">\n * View File\n * </a>\n * );\n * }\n * ```\n */\nexport function useTdpNavigation(options: UseTdpNavigationOptions = {}): UseTdpNavigationReturn {\n const { tdpBaseUrl: explicitBaseUrl } = options;\n\n const tdpBaseUrl = useMemo(() => {\n if (explicitBaseUrl) return explicitBaseUrl.replace(/\\/$/u, '');\n return getTdpBaseUrlFromReferrer();\n }, [explicitBaseUrl]);\n\n return useMemo(\n () => ({\n tdpBaseUrl,\n getTdpUrl: (path: string) => (tdpBaseUrl ? buildTdpUrl(tdpBaseUrl, path) : null),\n navigateToTdp: (path: string, opts?: TdpNavigationOptions) => {\n if (!tdpBaseUrl) {\n console.warn('[useTdpNavigation] Cannot navigate: TDP base URL not resolved');\n return;\n }\n const url = buildTdpUrl(tdpBaseUrl, path);\n if (url) navigateToTdpUrl(url, opts);\n },\n }),\n [tdpBaseUrl],\n );\n}\n\n/** Props for the TDPLink component */\nexport interface TDPLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, 'href'> {\n /** TDP page path (e.g., \"/file/abc-123\" or use tdpPaths helpers) */\n path: string;\n /** Navigation behavior. Default: { newTab: true } */\n navigationOptions?: TdpNavigationOptions;\n children: React.ReactNode;\n ref?: React.Ref<HTMLAnchorElement>;\n}\n\n/**\n * A link component that navigates to TDP pages.\n *\n * Renders a standard `<a>` tag with the correct href for right-click\n * \"Open in new tab\" support, accessibility, and SEO.\n *\n * Must be used inside a `<TdpNavigationProvider>`.\n *\n * @example\n * ```tsx\n * import { TDPLink, tdpPaths } from '@tetrascience-npm/tetrascience-react-ui';\n *\n * <TDPLink path={tdpPaths.fileDetails(\"abc-123\")}>\n * View File Details\n * </TDPLink>\n *\n * <TDPLink path=\"/search?q=test\" navigationOptions={{ newTab: false }}>\n * Search in TDP (same tab)\n * </TDPLink>\n * ```\n */\nexport const TDPLink: React.FC<TDPLinkProps> = ({\n path,\n navigationOptions = { newTab: true },\n children,\n onClick,\n className,\n ...rest\n}) => {\n const { getTdpUrl, navigateToTdp } = useTdpNavigationContext();\n const href = getTdpUrl(path);\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n // Let modifier-key clicks through for native \"open in new tab\" behavior\n if (e.metaKey || e.ctrlKey || e.shiftKey) {\n return;\n }\n\n e.preventDefault();\n onClick?.(e);\n navigateToTdp(path, navigationOptions);\n };\n\n return (\n <a\n href={href ?? '#'}\n target={navigationOptions.newTab ? '_blank' : undefined}\n rel={navigationOptions.newTab ? 'noopener noreferrer' : undefined}\n onClick={handleClick}\n className={`no-underline cursor-pointer hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:rounded-[2px] ${className ?? ''}`}\n style={{ color: 'var(--primary)', outlineColor: 'var(--border)' }}\n {...rest}\n >\n {children}\n </a>\n );\n};\n"],"names":["TdpNavigationContext","createContext","useTdpNavigationContext","context","useContext","TdpNavigationProvider","explicitBaseUrl","children","tdpBaseUrl","useMemo","getTdpBaseUrlFromReferrer","contextValue","path","buildTdpUrl","options","url","navigateToTdpUrl","useTdpNavigation","opts","TDPLink","navigationOptions","onClick","className","rest","getTdpUrl","navigateToTdp","href","handleClick","e","jsx"],"mappings":"mKAeaA,EAAuBC,EAAAA,cAAgD,IAAI,EAYjF,SAASC,GAAqD,CACnE,MAAMC,EAAUC,EAAAA,WAAWJ,CAAoB,EAC/C,GAAI,CAACG,EACH,MAAM,IAAI,MACR,wKAAA,EAIJ,OAAOA,CACT,CAyBO,MAAME,EAA8D,CAAC,CAC1E,WAAYC,EACZ,SAAAC,CACF,IAAM,CACJ,MAAMC,EAAaC,EAAAA,QAAQ,IACrBH,EACKA,EAAgB,QAAQ,OAAQ,EAAE,EAEpCI,4BAAA,EACN,CAACJ,CAAe,CAAC,EAEdK,EAAeF,EAAAA,QACnB,KAAO,CACL,WAAAD,EACA,UAAYI,GACLJ,EACEK,EAAAA,YAAYL,EAAYI,CAAI,EADX,KAG1B,cAAe,CAACA,EAAcE,IAAmC,CAC/D,GAAI,CAACN,EAAY,CACf,QAAQ,KAAK,4DAA4D,EACzE,MACF,CACA,MAAMO,EAAMF,EAAAA,YAAYL,EAAYI,CAAI,EACpCG,GACFC,EAAAA,iBAAiBD,EAAKD,CAAO,CAEjC,CAAA,GAEF,CAACN,CAAU,CAAA,EAGb,aAAQR,EAAqB,SAArB,CAA8B,MAAOW,EAAe,SAAAJ,EAAS,CACvE,EAqCO,SAASU,EAAiBH,EAAmC,GAA4B,CAC9F,KAAM,CAAE,WAAYR,CAAA,EAAoBQ,EAElCN,EAAaC,EAAAA,QAAQ,IACrBH,EAAwBA,EAAgB,QAAQ,OAAQ,EAAE,EACvDI,4BAAA,EACN,CAACJ,CAAe,CAAC,EAEpB,OAAOG,EAAAA,QACL,KAAO,CACL,WAAAD,EACA,UAAYI,GAAkBJ,EAAaK,EAAAA,YAAYL,EAAYI,CAAI,EAAI,KAC3E,cAAe,CAACA,EAAcM,IAAgC,CAC5D,GAAI,CAACV,EAAY,CACf,QAAQ,KAAK,+DAA+D,EAC5E,MACF,CACA,MAAMO,EAAMF,EAAAA,YAAYL,EAAYI,CAAI,EACpCG,GAAKC,EAAAA,iBAAiBD,EAAKG,CAAI,CACrC,CAAA,GAEF,CAACV,CAAU,CAAA,CAEf,CAiCO,MAAMW,EAAkC,CAAC,CAC9C,KAAAP,EACA,kBAAAQ,EAAoB,CAAE,OAAQ,EAAA,EAC9B,SAAAb,EACA,QAAAc,EACA,UAAAC,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CAAE,UAAAC,EAAW,cAAAC,CAAA,EAAkBvB,EAAA,EAC/BwB,EAAOF,EAAUZ,CAAI,EAErBe,EAAeC,GAA2C,CAE1DA,EAAE,SAAWA,EAAE,SAAWA,EAAE,WAIhCA,EAAE,eAAA,EACFP,IAAUO,CAAC,EACXH,EAAcb,EAAMQ,CAAiB,EACvC,EAEA,OACES,EAAAA,IAAC,IAAA,CACC,KAAMH,GAAQ,IACd,OAAQN,EAAkB,OAAS,SAAW,OAC9C,IAAKA,EAAkB,OAAS,sBAAwB,OACxD,QAASO,EACT,UAAW,kIAAkIL,GAAa,EAAE,GAC5J,MAAO,CAAE,MAAO,iBAAkB,aAAc,eAAA,EAC/C,GAAGC,EAEH,SAAAhB,CAAA,CAAA,CAGP"}
|