@sqlrooms/room-shell 0.26.0-rc.3 → 0.26.0-rc.5
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/RoomBuilder.js +2 -2
- package/dist/RoomBuilder.js.map +1 -1
- package/dist/RoomShell.d.ts +3 -4
- package/dist/RoomShell.d.ts.map +1 -1
- package/dist/RoomShell.js +3 -3
- package/dist/RoomShell.js.map +1 -1
- package/dist/RoomShellSidebarButtons.js +2 -2
- package/dist/RoomShellSidebarButtons.js.map +1 -1
- package/dist/RoomShellSlice.d.ts +107 -0
- package/dist/RoomShellSlice.d.ts.map +1 -0
- package/dist/{RoomShellStore.js → RoomShellSlice.js} +70 -62
- package/dist/RoomShellSlice.js.map +1 -0
- package/dist/data-sources/FileDataSourceCard.js +1 -1
- package/dist/data-sources/FileDataSourceCard.js.map +1 -1
- package/dist/data-sources/FileDataSourcesPanel.js +1 -1
- package/dist/data-sources/FileDataSourcesPanel.js.map +1 -1
- package/dist/data-sources/TablesListPanel.js +1 -1
- package/dist/data-sources/TablesListPanel.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/panels/RoomPanelHeader.js +2 -2
- package/dist/panels/RoomPanelHeader.js.map +1 -1
- package/package.json +11 -11
- package/dist/RoomShellStore.d.ts +0 -97
- package/dist/RoomShellStore.d.ts.map +0 -1
- package/dist/RoomShellStore.js.map +0 -1
package/dist/RoomBuilder.js
CHANGED
|
@@ -2,9 +2,9 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { ProgressModal, SpinnerPane } from '@sqlrooms/ui';
|
|
3
3
|
import { MosaicLayout, getVisibleMosaicLayoutPanels } from '@sqlrooms/layout';
|
|
4
4
|
import { Suspense, useCallback, useMemo } from 'react';
|
|
5
|
-
import { useBaseRoomShellStore } from './
|
|
5
|
+
import { useBaseRoomShellStore } from './RoomShellSlice';
|
|
6
6
|
export const RoomShell = () => {
|
|
7
|
-
const layout = useBaseRoomShellStore((state) => state.config
|
|
7
|
+
const layout = useBaseRoomShellStore((state) => state.layout.config);
|
|
8
8
|
const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);
|
|
9
9
|
const panels = useBaseRoomShellStore((state) => state.layout.panels);
|
|
10
10
|
const loadingProgress = useBaseRoomShellStore((state) => state.room.getLoadingProgress());
|
package/dist/RoomBuilder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomBuilder.js","sourceRoot":"","sources":["../src/RoomBuilder.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,aAAa,EAAE,WAAW,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAC,YAAY,EAAE,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AAC5E,OAAc,EAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAC,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,SAAS,GAAa,GAAG,EAAE;IACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAChC,CAAC;IACF,MAAM,aAAa,GAAG,qBAAqB,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAC1C,CAAC;IAEF,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,CAAC,EACjD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,KAAgC,EAAE,EAAE;QACnC,oDAAoD;QACpD,SAAS,CAAC,EAAC,GAAG,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;IAChC,CAAC,EACD,CAAC,SAAS,EAAE,MAAM,CAAC,CACpB,CAAC;IAEF,MAAM,cAAc,GAAiC,OAAO,CAAC,GAAG,EAAE;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAU,EAAE,EAAE;YAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;YACxC,IAAI,SAAS,EAAE,CAAC;gBACd,GAAG,CAAC,GAAG,CACL,EAAE,EACF,KAAC,aAAa,cACZ,KAAC,SAAS,KAAG,GACC,CACjB,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,IAAI,GAAG,EAA2B,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE/C,OAAO,CACL,KAAC,aAAa,cACZ,MAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,WAAW,IAAC,CAAC,EAAC,MAAM,GAAG,aAC1C,cAAK,SAAS,EAAC,+DAA+D,YAC3E,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,YAAY,IACX,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,4BAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,GAAI,EACjD,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,QAAQ,EAAE,kBAAkB,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,GACJ,EAEN,KAAC,aAAa,IACZ,MAAM,EAAE,eAAe,KAAK,SAAS,EACrC,KAAK,EAAC,SAAS,EACf,YAAY,EAAE,eAAe,EAAE,OAAO,EACtC,aAAa,EAAE,IAAI,GAEnB,IACO,GACG,CACjB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {ProgressModal, SpinnerPane} from '@sqlrooms/ui';\nimport {MosaicLayout, getVisibleMosaicLayoutPanels} from '@sqlrooms/layout';\nimport React, {Suspense, useCallback, useMemo} from 'react';\nimport type {MosaicNode} from 'react-mosaic-component';\nimport {useBaseRoomShellStore} from './
|
|
1
|
+
{"version":3,"file":"RoomBuilder.js","sourceRoot":"","sources":["../src/RoomBuilder.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,aAAa,EAAE,WAAW,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAC,YAAY,EAAE,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AAC5E,OAAc,EAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AAE5D,OAAO,EAAC,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,SAAS,GAAa,GAAG,EAAE;IACtC,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAChC,CAAC;IACF,MAAM,aAAa,GAAG,qBAAqB,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAC1C,CAAC;IAEF,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,CAAC,EACjD,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,KAAgC,EAAE,EAAE;QACnC,oDAAoD;QACpD,SAAS,CAAC,EAAC,GAAG,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC;IAChC,CAAC,EACD,CAAC,SAAS,EAAE,MAAM,CAAC,CACpB,CAAC;IAEF,MAAM,cAAc,GAAiC,OAAO,CAAC,GAAG,EAAE;QAChE,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAU,EAAE,EAAE;YAC9D,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;YACxC,IAAI,SAAS,EAAE,CAAC;gBACd,GAAG,CAAC,GAAG,CACL,EAAE,EACF,KAAC,aAAa,cACZ,KAAC,SAAS,KAAG,GACC,CACjB,CAAC;YACJ,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,IAAI,GAAG,EAA2B,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE/C,OAAO,CACL,KAAC,aAAa,cACZ,MAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,WAAW,IAAC,CAAC,EAAC,MAAM,GAAG,aAC1C,cAAK,SAAS,EAAC,+DAA+D,YAC3E,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,YAAY,IACX,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,4BAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,GAAI,EACjD,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,QAAQ,EAAE,kBAAkB,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,GACJ,EAEN,KAAC,aAAa,IACZ,MAAM,EAAE,eAAe,KAAK,SAAS,EACrC,KAAK,EAAC,SAAS,EACf,YAAY,EAAE,eAAe,EAAE,OAAO,EACtC,aAAa,EAAE,IAAI,GAEnB,IACO,GACG,CACjB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {ProgressModal, SpinnerPane} from '@sqlrooms/ui';\nimport {MosaicLayout, getVisibleMosaicLayoutPanels} from '@sqlrooms/layout';\nimport React, {Suspense, useCallback, useMemo} from 'react';\nimport type {MosaicNode} from 'react-mosaic-component';\nimport {useBaseRoomShellStore} from './RoomShellSlice';\n\nexport const RoomShell: React.FC = () => {\n const layout = useBaseRoomShellStore((state) => state.layout.config);\n const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const loadingProgress = useBaseRoomShellStore((state) =>\n state.room.getLoadingProgress(),\n );\n const ErrorBoundary = useBaseRoomShellStore(\n (state) => state.room.CustomErrorBoundary,\n );\n\n const visibleRoomPanels = useMemo(\n () => getVisibleMosaicLayoutPanels(layout?.nodes),\n [layout],\n );\n\n const handleLayoutChange = useCallback(\n (nodes: MosaicNode<string> | null) => {\n // Keep layout properties, e.g. 'pinned' and 'fixed'\n setLayout({...layout, nodes});\n },\n [setLayout, layout],\n );\n\n const renderedPanels: Map<string, React.ReactNode> = useMemo(() => {\n return Array.from(visibleRoomPanels).reduce((acc, id: string) => {\n const PanelComp = panels[id]?.component;\n if (PanelComp) {\n acc.set(\n id,\n <ErrorBoundary>\n <PanelComp />\n </ErrorBoundary>,\n );\n }\n return acc;\n }, new Map<string, React.ReactNode>());\n }, [ErrorBoundary, panels, visibleRoomPanels]);\n\n return (\n <ErrorBoundary>\n <Suspense fallback={<SpinnerPane h=\"100%\" />}>\n <div className=\"flex h-full w-full flex-grow flex-col items-stretch px-0 pb-0\">\n {layout ? (\n <MosaicLayout\n renderTile={(id) => <>{renderedPanels.get(id)}</>}\n value={layout.nodes}\n onChange={handleLayoutChange}\n />\n ) : null}\n </div>\n\n <ProgressModal\n isOpen={loadingProgress !== undefined}\n title=\"Loading\"\n loadingStage={loadingProgress?.message}\n indeterminate={true}\n // progress={loadingProgress?.progress}\n />\n </Suspense>\n </ErrorBoundary>\n );\n};\n"]}
|
package/dist/RoomShell.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { RoomStore } from '@sqlrooms/room-store';
|
|
2
|
-
import { BaseRoomConfig } from '@sqlrooms/room-config';
|
|
3
1
|
import { FC, PropsWithChildren } from 'react';
|
|
4
|
-
|
|
2
|
+
import { RoomShellStore } from './RoomShellSlice';
|
|
3
|
+
export declare function RoomShellBase({ className, children, roomStore, }: React.PropsWithChildren<{
|
|
5
4
|
className?: string;
|
|
6
|
-
roomStore?:
|
|
5
|
+
roomStore?: RoomShellStore;
|
|
7
6
|
}>): import("react/jsx-runtime").JSX.Element;
|
|
8
7
|
export declare const RoomSidebar: FC<PropsWithChildren<{
|
|
9
8
|
className?: string;
|
package/dist/RoomShell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomShell.d.ts","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RoomShell.d.ts","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAwB,MAAM,OAAO,CAAC;AAMnE,OAAO,EAAC,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AAEvE,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B,CAAC,2CAaD;AAED,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC,CAenE,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAmDA,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAcpD,CAAC;AAEF,eAAO,MAAM,SAAS;;oBAzFsC,MAAM;;;;;;;;qBAzBnD,CAAC;;;;;oBA2CF,MAAM;wBACF,MAAM;;;oBAsDsB,MAAM;;CAqBlD,CAAC"}
|
package/dist/RoomShell.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { RoomStateProvider } from '@sqlrooms/room-store';
|
|
3
2
|
import { MosaicLayout } from '@sqlrooms/layout';
|
|
3
|
+
import { RoomStateProvider } from '@sqlrooms/room-store';
|
|
4
4
|
import { cn, ErrorBoundary, ProgressModal, SpinnerPane, Toaster, TooltipProvider, } from '@sqlrooms/ui';
|
|
5
5
|
import { Suspense, useCallback } from 'react';
|
|
6
6
|
import { RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
|
|
7
|
-
import { useBaseRoomShellStore } from './
|
|
7
|
+
import { useBaseRoomShellStore } from './RoomShellSlice';
|
|
8
8
|
export function RoomShellBase({ className, children, roomStore, }) {
|
|
9
9
|
return (_jsx(RoomStateProvider, { roomStore: roomStore, children: _jsx("div", { className: cn('flex h-full w-full', className), children: _jsx(ErrorBoundary, { children: _jsxs(Suspense, { fallback: _jsx(SpinnerPane, { h: "100%" }), children: [_jsx(TooltipProvider, { children: children }), _jsx(Toaster, {})] }) }) }) }));
|
|
10
10
|
}
|
|
@@ -12,7 +12,7 @@ export const RoomSidebar = ({ className, children, }) => {
|
|
|
12
12
|
return (_jsxs("div", { className: cn('bg-muted/70 flex h-full w-12 flex-col items-center px-1 py-4', className), children: [_jsx(RoomShellSidebarButtons, {}), children] }));
|
|
13
13
|
};
|
|
14
14
|
export const LayoutComposer = ({ className, tileClassName }) => {
|
|
15
|
-
const layout = useBaseRoomShellStore((state) => state.config
|
|
15
|
+
const layout = useBaseRoomShellStore((state) => state.layout.config);
|
|
16
16
|
const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);
|
|
17
17
|
const panels = useBaseRoomShellStore((state) => state.layout.panels);
|
|
18
18
|
const ErrorBoundary = useBaseRoomShellStore((state) => state.room.CustomErrorBoundary);
|
package/dist/RoomShell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomShell.js","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"RoomShell.js","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"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","sourcesContent":["import {MosaicLayout} from '@sqlrooms/layout';\nimport {RoomStateProvider} from '@sqlrooms/room-store';\nimport {\n cn,\n ErrorBoundary,\n ProgressModal,\n SpinnerPane,\n Toaster,\n TooltipProvider,\n} from '@sqlrooms/ui';\nimport {FC, PropsWithChildren, Suspense, useCallback} from 'react';\nimport {MosaicNode} from 'react-mosaic-component';\nimport {\n RoomShellSidebarButtons,\n SidebarButton,\n} from './RoomShellSidebarButtons';\nimport {RoomShellStore, useBaseRoomShellStore} from './RoomShellSlice';\n\nexport function RoomShellBase({\n className,\n children,\n roomStore,\n}: React.PropsWithChildren<{\n className?: string;\n roomStore?: RoomShellStore;\n}>) {\n return (\n <RoomStateProvider roomStore={roomStore}>\n <div className={cn('flex h-full w-full', className)}>\n <ErrorBoundary>\n <Suspense fallback={<SpinnerPane h=\"100%\" />}>\n <TooltipProvider>{children}</TooltipProvider>\n <Toaster />\n </Suspense>\n </ErrorBoundary>\n </div>\n </RoomStateProvider>\n );\n}\n\nexport const RoomSidebar: FC<PropsWithChildren<{className?: string}>> = ({\n className,\n children,\n}) => {\n return (\n <div\n className={cn(\n 'bg-muted/70 flex h-full w-12 flex-col items-center px-1 py-4',\n className,\n )}\n >\n <RoomShellSidebarButtons />\n {children}\n </div>\n );\n};\n\nexport const LayoutComposer: FC<{\n className?: string;\n tileClassName?: string;\n}> = ({className, tileClassName}) => {\n const layout = useBaseRoomShellStore((state) => state.layout.config);\n const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const ErrorBoundary = useBaseRoomShellStore(\n (state) => state.room.CustomErrorBoundary,\n );\n\n const handleLayoutChange = useCallback(\n (nodes: MosaicNode<string> | null) => {\n // Keep layout properties, e.g. 'pinned' and 'fixed'\n setLayout({...layout, nodes});\n },\n [setLayout, layout],\n );\n\n // const visibleRoomPanels = useMemo(\n // () => getVisibleMosaicLayoutPanels(layout?.nodes),\n // [layout],\n // );\n\n const renderTile = (panelId: string) => {\n // const panelId = visibleRoomPanels.find((p) => p === id);\n const PanelComp = panelId && panels[panelId]?.component;\n if (!PanelComp) {\n return null;\n }\n return (\n <ErrorBoundary key={panelId}>\n <PanelComp />\n </ErrorBoundary>\n );\n };\n\n return (\n <div\n className={cn(\n 'flex h-full w-full flex-grow flex-col items-stretch',\n className,\n )}\n >\n {layout ? (\n <MosaicLayout\n renderTile={renderTile}\n value={layout.nodes}\n onChange={handleLayoutChange}\n tileClassName={tileClassName}\n />\n ) : null}\n </div>\n );\n};\n\nexport const LoadingProgress: FC<{className?: string}> = ({className}) => {\n const loadingProgress = useBaseRoomShellStore((state) =>\n state.room.getLoadingProgress(),\n );\n return (\n <ProgressModal\n className={className}\n isOpen={loadingProgress !== undefined}\n title=\"Loading\"\n loadingStage={loadingProgress?.message}\n indeterminate={true}\n // progress={loadingProgress?.progress}\n />\n );\n};\n\nexport const RoomShell = Object.assign(RoomShellBase, {\n Sidebar: RoomSidebar,\n SidebarButton: SidebarButton,\n LayoutComposer: LayoutComposer,\n LoadingProgress: LoadingProgress,\n});\n"]}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { getVisibleMosaicLayoutPanels } from '@sqlrooms/layout';
|
|
3
3
|
import { Button, cn, Tooltip, TooltipContent, TooltipTrigger, } from '@sqlrooms/ui';
|
|
4
4
|
import { useMemo } from 'react';
|
|
5
|
-
import { useBaseRoomShellStore } from './
|
|
5
|
+
import { useBaseRoomShellStore } from './RoomShellSlice';
|
|
6
6
|
const SidebarButton = ({ className, title, isSelected, isDisabled = false, icon: Icon, onClick, }) => {
|
|
7
7
|
return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", className: cn('h-10 w-10 rounded-none', isSelected ? 'bg-secondary' : 'hover:bg-secondary/50',
|
|
8
8
|
// isDisabled && 'opacity-50 cursor-not-allowed',
|
|
@@ -10,7 +10,7 @@ const SidebarButton = ({ className, title, isSelected, isDisabled = false, icon:
|
|
|
10
10
|
};
|
|
11
11
|
const RoomShellSidebarButton = ({ roomPanelType, }) => {
|
|
12
12
|
const initialized = useBaseRoomShellStore((state) => state.room.initialized);
|
|
13
|
-
const layout = useBaseRoomShellStore((state) => state.config
|
|
13
|
+
const layout = useBaseRoomShellStore((state) => state.layout.config);
|
|
14
14
|
const panels = useBaseRoomShellStore((state) => state.layout.panels);
|
|
15
15
|
const visibleRoomPanels = useMemo(() => getVisibleMosaicLayoutPanels(layout?.nodes), [layout]);
|
|
16
16
|
const togglePanel = useBaseRoomShellStore((state) => state.layout.togglePanel);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomShellSidebarButtons.js","sourceRoot":"","sources":["../src/RoomShellSidebarButtons.tsx"],"names":[],"mappings":"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","sourcesContent":["import {getVisibleMosaicLayoutPanels} from '@sqlrooms/layout';\nimport {\n Button,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport React, {FC, useMemo} from 'react';\nimport {useBaseRoomShellStore} from './
|
|
1
|
+
{"version":3,"file":"RoomShellSidebarButtons.js","sourceRoot":"","sources":["../src/RoomShellSidebarButtons.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,4BAA4B,EAAC,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,MAAM,EACN,EAAE,EACF,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,cAAc,CAAC;AACtB,OAAc,EAAK,OAAO,EAAC,MAAM,OAAO,CAAC;AACzC,OAAO,EAAC,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAEvD,MAAM,aAAa,GAOd,CAAC,EACJ,SAAS,EACT,KAAK,EACL,UAAU,EACV,UAAU,GAAG,KAAK,EAClB,IAAI,EAAE,IAAI,EACV,OAAO,GACR,EAAE,EAAE;IACH,OAAO,CACL,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,EAAE,CACX,wBAAwB,EACxB,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,uBAAuB;oBACrD,iDAAiD;oBACjD,SAAS,CACV,EACD,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,OAAO,YAEf,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAK,GACrC,GACM,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,OAAO,YAC1B,sBAAI,KAAK,GAAK,GACC,IACT,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAgC,CAAC,EAC3D,aAAa,GACd,EAAE,EAAE;IACH,MAAM,WAAW,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,iBAAiB,GAAG,OAAO,CAC/B,GAAG,EAAE,CAAC,4BAA4B,CAAC,MAAM,EAAE,KAAK,CAAC,EACjD,CAAC,MAAM,CAAC,CACT,CAAC;IACF,MAAM,WAAW,GAAG,qBAAqB,CACvC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CACpC,CAAC;IACF,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAExD,OAAO,CACL,KAAC,aAAa,IAEZ,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,UAAU,EAAE,iBAAiB,CAAC,QAAQ,CAAC,aAAa,CAAC,EACrD,UAAU,EAAE,CAAC,WAAW,EACxB,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,IALpC,aAAa,CAMlB,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAA6B,CAAC,EAAC,SAAS,EAAC,EAAE,EAAE;IACxE,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAErE,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,2BAA2B,EAAE,SAAS,CAAC,aACxD,cAAK,SAAS,EAAC,qBAAqB,YACjC,MAAM;oBACL,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;yBAChB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,KAAK,SAAS,CAAC;yBACrD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACb,KAAC,sBAAsB,IAAY,aAAa,EAAE,IAAI,IAAzB,IAAI,CAAyB,CAC3D,CAAC;oBACN,CAAC,CAAC,IAAI,GACJ,EACN,cAAK,SAAS,EAAC,QAAQ,GAAG,EAC1B,cAAK,SAAS,EAAC,qBAAqB,YACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;qBACjB,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,SAAS,KAAK,gBAAgB,CAAC;qBAC5D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACb,KAAC,sBAAsB,IAAY,aAAa,EAAE,IAAI,IAAzB,IAAI,CAAyB,CAC3D,CAAC,GACA,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,sBAAsB,EAAE,uBAAuB,EAAE,aAAa,EAAC,CAAC","sourcesContent":["import {getVisibleMosaicLayoutPanels} from '@sqlrooms/layout';\nimport {\n Button,\n cn,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport React, {FC, useMemo} from 'react';\nimport {useBaseRoomShellStore} from './RoomShellSlice';\n\nconst SidebarButton: FC<{\n className?: string;\n title: string;\n isSelected: boolean;\n isDisabled?: boolean;\n icon: React.ComponentType<{className?: string}>;\n onClick: () => void;\n}> = ({\n className,\n title,\n isSelected,\n isDisabled = false,\n icon: Icon,\n onClick,\n}) => {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\n 'h-10 w-10 rounded-none',\n isSelected ? 'bg-secondary' : 'hover:bg-secondary/50',\n // isDisabled && 'opacity-50 cursor-not-allowed',\n className,\n )}\n disabled={isDisabled}\n onClick={onClick}\n >\n {Icon ? <Icon className=\"h-5 w-5\" /> : title}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"right\">\n <p>{title}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n\nconst RoomShellSidebarButton: FC<{roomPanelType: string}> = ({\n roomPanelType,\n}) => {\n const initialized = useBaseRoomShellStore((state) => state.room.initialized);\n const layout = useBaseRoomShellStore((state) => state.layout.config);\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const visibleRoomPanels = useMemo(\n () => getVisibleMosaicLayoutPanels(layout?.nodes),\n [layout],\n );\n const togglePanel = useBaseRoomShellStore(\n (state) => state.layout.togglePanel,\n );\n const {icon: Icon, title} = panels[roomPanelType] ?? {};\n\n return (\n <SidebarButton\n key={roomPanelType}\n title={title ?? ''}\n isSelected={visibleRoomPanels.includes(roomPanelType)}\n isDisabled={!initialized}\n icon={Icon ?? (() => null)}\n onClick={() => togglePanel(roomPanelType)}\n />\n );\n};\n\nconst RoomShellSidebarButtons: FC<{className?: string}> = ({className}) => {\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n\n return (\n <div className={cn('flex h-full grow flex-col', className)}>\n <div className=\"flex flex-col gap-2\">\n {panels\n ? Object.keys(panels)\n .filter((key) => panels[key]?.placement === 'sidebar')\n .map((type) => (\n <RoomShellSidebarButton key={type} roomPanelType={type} />\n ))\n : null}\n </div>\n <div className=\"flex-1\" />\n <div className=\"flex flex-col gap-2\">\n {Object.keys(panels)\n .filter((key) => panels[key]?.placement === 'sidebar-bottom')\n .map((type) => (\n <RoomShellSidebarButton key={type} roomPanelType={type} />\n ))}\n </div>\n </div>\n );\n};\n\nexport {RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton};\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { DataTable, DuckDbConnector, DuckDbSliceState, LoadFileOptions } from '@sqlrooms/duckdb';
|
|
2
|
+
import { CreateLayoutSliceProps, LayoutSliceState } from '@sqlrooms/layout';
|
|
3
|
+
import { BaseRoomConfig, DataSource, FileDataSource, LayoutConfig } from '@sqlrooms/room-config';
|
|
4
|
+
import { BaseRoomStoreState, CreateBaseRoomSliceProps } from '@sqlrooms/room-store';
|
|
5
|
+
import { ProgressInfo } from '@sqlrooms/utils';
|
|
6
|
+
import { ReactNode } from 'react';
|
|
7
|
+
import { StateCreator, StoreApi } from 'zustand';
|
|
8
|
+
import { DataSourceState, DataSourceStatus, RoomFileInfo, RoomFileState } from './types';
|
|
9
|
+
export type RoomShellSliceConfig = BaseRoomConfig;
|
|
10
|
+
export type RoomShellStore = StoreApi<RoomShellSliceState>;
|
|
11
|
+
export type TaskProgress = {
|
|
12
|
+
progress?: number | undefined;
|
|
13
|
+
message: string;
|
|
14
|
+
};
|
|
15
|
+
export type RoomShellSliceState = {
|
|
16
|
+
initialize?: () => Promise<void>;
|
|
17
|
+
room: BaseRoomStoreState['room'] & {
|
|
18
|
+
config: RoomShellSliceConfig;
|
|
19
|
+
tasksProgress: Record<string, TaskProgress>;
|
|
20
|
+
setConfig: (config: RoomShellSliceConfig) => void;
|
|
21
|
+
setTaskProgress: (id: string, taskProgress: TaskProgress | undefined) => void;
|
|
22
|
+
getLoadingProgress: () => TaskProgress | undefined;
|
|
23
|
+
roomFiles: RoomFileInfo[];
|
|
24
|
+
roomFilesProgress: {
|
|
25
|
+
[pathname: string]: RoomFileState;
|
|
26
|
+
};
|
|
27
|
+
isDataAvailable: boolean;
|
|
28
|
+
dataSourceStates: {
|
|
29
|
+
[tableName: string]: DataSourceState;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Load a file data source. A fileDataSourceLoader implementation can be passed to
|
|
33
|
+
* createRoomShellSlice to specify how file data sources should be loaded.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* ...createRoomShellSlice({
|
|
38
|
+
* config: {
|
|
39
|
+
* dataSources: [
|
|
40
|
+
* { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },
|
|
41
|
+
* ],
|
|
42
|
+
* },
|
|
43
|
+
* room: {
|
|
44
|
+
* fileDataSourceLoader: async ({fileName}, onProgress) =>
|
|
45
|
+
* await downloadFile(`https://some.url/${fileName}`, {onProgress}),
|
|
46
|
+
* },
|
|
47
|
+
* })(set, get, store)
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @param fileName - The name of the file to load.
|
|
51
|
+
* @param onProgress - A callback to report the progress of the download.
|
|
52
|
+
* @returns The loaded file.
|
|
53
|
+
*/
|
|
54
|
+
fileDataSourceLoader?: ({ fileName }: FileDataSource, onProgress: (progress: ProgressInfo) => void) => Promise<Uint8Array | File>;
|
|
55
|
+
CustomErrorBoundary: React.ComponentType<{
|
|
56
|
+
onRetry?: () => void;
|
|
57
|
+
children?: ReactNode;
|
|
58
|
+
}>;
|
|
59
|
+
setRoomTitle(title: string): void;
|
|
60
|
+
setDescription(description: string): void;
|
|
61
|
+
/**
|
|
62
|
+
* Add or update a SQL query data source.
|
|
63
|
+
* @param tableName - The name of the table to create or update.
|
|
64
|
+
* @param query - The SQL query to execute.
|
|
65
|
+
* @param oldTableName - The name of the table to replace (optional).
|
|
66
|
+
*/
|
|
67
|
+
addOrUpdateSqlQueryDataSource(tableName: string, query: string, oldTableName?: string): Promise<void>;
|
|
68
|
+
areDatasetsReady(): boolean;
|
|
69
|
+
addRoomFile(file: File | string, tableName?: string, loadFileOptions?: LoadFileOptions): Promise<DataTable | undefined>;
|
|
70
|
+
/**
|
|
71
|
+
* @deprecated Use removeDataSource or removeRoomFile instead
|
|
72
|
+
*/
|
|
73
|
+
removeSqlQueryDataSource(tableName: string): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Removes a data source from the room by tableName.
|
|
76
|
+
* @param tableName - The name of the table of the data source to remove.
|
|
77
|
+
*/
|
|
78
|
+
removeDataSource(tableName: string): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Removes a file data source from the room by pathname.
|
|
81
|
+
* @param pathname - The pathname of the file to remove.
|
|
82
|
+
*/
|
|
83
|
+
removeRoomFile(pathname: string): Promise<void>;
|
|
84
|
+
setRoomFiles(info: RoomFileInfo[]): void;
|
|
85
|
+
setRoomFileProgress(pathname: string, fileState: RoomFileState): void;
|
|
86
|
+
addDataSource: (dataSource: DataSource, status?: DataSourceStatus) => Promise<void>;
|
|
87
|
+
};
|
|
88
|
+
} & DuckDbSliceState & LayoutSliceState;
|
|
89
|
+
/**
|
|
90
|
+
* This type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.
|
|
91
|
+
*/
|
|
92
|
+
type CreateRoomShellSliceProps = CreateBaseRoomSliceProps & {
|
|
93
|
+
connector?: DuckDbConnector;
|
|
94
|
+
config?: Partial<RoomShellSliceConfig & {
|
|
95
|
+
/** @deprecated Use layout.config instead */
|
|
96
|
+
layout?: LayoutConfig;
|
|
97
|
+
}>;
|
|
98
|
+
layout?: CreateLayoutSliceProps;
|
|
99
|
+
fileDataSourceLoader?: RoomShellSliceState['room']['fileDataSourceLoader'];
|
|
100
|
+
CustomErrorBoundary?: RoomShellSliceState['room']['CustomErrorBoundary'];
|
|
101
|
+
/** @deprecated Use direct props instead e.g. layout.panels */
|
|
102
|
+
room?: Partial<Pick<LayoutSliceState['layout'], 'panels'>>;
|
|
103
|
+
};
|
|
104
|
+
export declare function createRoomShellSlice(props: CreateRoomShellSliceProps): StateCreator<RoomShellSliceState>;
|
|
105
|
+
export declare function useBaseRoomShellStore<RS extends RoomShellSliceState, T>(selector: (state: RS) => T): T;
|
|
106
|
+
export {};
|
|
107
|
+
//# sourceMappingURL=RoomShellSlice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoomShellSlice.d.ts","sourceRoot":"","sources":["../src/RoomShellSlice.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +1,49 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { DataSourceTypes,
|
|
4
|
-
import {
|
|
1
|
+
import { createDuckDbSlice, } from '@sqlrooms/duckdb';
|
|
2
|
+
import { createLayoutSlice, } from '@sqlrooms/layout';
|
|
3
|
+
import { DataSourceTypes, createDefaultBaseRoomConfig, isFileDataSource, isSqlQueryDataSource, isUrlDataSource, } from '@sqlrooms/room-config';
|
|
4
|
+
import { createBaseRoomSlice, isRoomSliceWithInitialize, useBaseRoomStore, } from '@sqlrooms/room-store';
|
|
5
5
|
import { ErrorBoundary } from '@sqlrooms/ui';
|
|
6
6
|
import { convertToUniqueColumnOrTableName, convertToValidColumnOrTableName, downloadFile, } from '@sqlrooms/utils';
|
|
7
|
-
import {
|
|
8
|
-
import { createDefaultBaseRoomConfig } from '@sqlrooms/room-config';
|
|
7
|
+
import { produce } from 'immer';
|
|
9
8
|
import { DataSourceStatus, } from './types';
|
|
10
|
-
const INITIAL_BASE_ROOM_CONFIG = {
|
|
11
|
-
...createDefaultBaseRoomConfig(),
|
|
12
|
-
...createDefaultDuckDbConfig(),
|
|
13
|
-
...createDefaultLayoutConfig(),
|
|
14
|
-
};
|
|
15
9
|
const DOWNLOAD_DATA_SOURCES_TASK = 'download-data-sources';
|
|
16
10
|
const INIT_DB_TASK = 'init-db';
|
|
17
11
|
const INIT_ROOM_TASK = 'init-room';
|
|
18
12
|
export function createRoomShellSlice(props) {
|
|
19
13
|
const slice = (set, get, store) => {
|
|
20
|
-
const { connector, config: configProps, room:
|
|
21
|
-
const
|
|
22
|
-
...
|
|
23
|
-
|
|
14
|
+
const { connector, config: configProps, layout: layoutProps, room: deprecatedRoomProps, fileDataSourceLoader, CustomErrorBoundary = ErrorBoundary, captureException = (exception) => console.error(exception), ...restProps } = props;
|
|
15
|
+
const createLayoutProps = {
|
|
16
|
+
...layoutProps,
|
|
17
|
+
config: layoutProps?.config ?? configProps?.layout,
|
|
18
|
+
panels: layoutProps?.panels ?? deprecatedRoomProps?.panels,
|
|
24
19
|
};
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
roomFiles: [],
|
|
28
|
-
roomFilesProgress: {},
|
|
29
|
-
isDataAvailable: false,
|
|
30
|
-
dataSourceStates: {},
|
|
31
|
-
...roomStateProps,
|
|
32
|
-
};
|
|
33
|
-
const roomSliceState = createRoomSlice({
|
|
34
|
-
config: initialConfig,
|
|
35
|
-
room: initialRoomState,
|
|
20
|
+
const roomSliceState = createBaseRoomSlice({
|
|
21
|
+
captureException,
|
|
36
22
|
})(set, get, store);
|
|
37
|
-
const
|
|
23
|
+
const sliceState = {
|
|
38
24
|
...roomSliceState,
|
|
39
25
|
...createDuckDbSlice({ connector })(set, get, store),
|
|
40
|
-
...createLayoutSlice(
|
|
26
|
+
...createLayoutSlice(createLayoutProps)(set, get, store),
|
|
41
27
|
room: {
|
|
42
|
-
...initialRoomState,
|
|
43
28
|
...roomSliceState.room,
|
|
29
|
+
// @ts-ignore TODO: fix this
|
|
30
|
+
config: {
|
|
31
|
+
...createDefaultBaseRoomConfig(),
|
|
32
|
+
...configProps,
|
|
33
|
+
},
|
|
34
|
+
CustomErrorBoundary,
|
|
35
|
+
roomFiles: [],
|
|
36
|
+
roomFilesProgress: {},
|
|
37
|
+
isDataAvailable: false,
|
|
38
|
+
dataSourceStates: {},
|
|
39
|
+
tasksProgress: {},
|
|
40
|
+
fileDataSourceLoader,
|
|
41
|
+
setConfig: (config) => {
|
|
42
|
+
set((state) => produce(state, (draft) => {
|
|
43
|
+
draft.room.config = config;
|
|
44
|
+
}));
|
|
45
|
+
},
|
|
44
46
|
async initialize() {
|
|
45
|
-
await roomSliceState.room.initialize();
|
|
46
47
|
const { setTaskProgress } = get().room;
|
|
47
48
|
setTaskProgress(INIT_DB_TASK, {
|
|
48
49
|
message: 'Initializing database…',
|
|
@@ -71,26 +72,35 @@ export function createRoomShellSlice(props) {
|
|
|
71
72
|
}
|
|
72
73
|
setTaskProgress(INIT_ROOM_TASK, undefined);
|
|
73
74
|
},
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
75
|
+
/** Returns the progress of the last task */
|
|
76
|
+
getLoadingProgress() {
|
|
77
|
+
const { tasksProgress } = get().room;
|
|
78
|
+
const keys = Object.keys(tasksProgress);
|
|
79
|
+
const lastKey = keys[keys.length - 1];
|
|
80
|
+
if (lastKey) {
|
|
81
|
+
return tasksProgress[lastKey];
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
},
|
|
85
|
+
setTaskProgress(id, taskProgress) {
|
|
86
|
+
set((state) => produce(state, (draft) => {
|
|
87
|
+
if (taskProgress) {
|
|
88
|
+
draft.room.tasksProgress[id] = taskProgress;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
delete draft.room.tasksProgress[id];
|
|
92
|
+
}
|
|
93
|
+
}));
|
|
84
94
|
},
|
|
85
95
|
setRoomTitle: (title) => set((state) => produce(state, (draft) => {
|
|
86
|
-
draft.config.title = title;
|
|
96
|
+
draft.room.config.title = title;
|
|
87
97
|
})),
|
|
88
98
|
setDescription: (description) => set((state) => produce(state, (draft) => {
|
|
89
|
-
draft.config.description = description;
|
|
99
|
+
draft.room.config.description = description;
|
|
90
100
|
})),
|
|
91
101
|
addDataSource: async (dataSource, status = DataSourceStatus.PENDING) => {
|
|
92
102
|
set((state) => produce(state, (draft) => {
|
|
93
|
-
const dataSources = draft.config.dataSources;
|
|
103
|
+
const dataSources = draft.room.config.dataSources;
|
|
94
104
|
const tableName = dataSource.tableName;
|
|
95
105
|
const index = dataSources.findIndex((d) => d.tableName === tableName);
|
|
96
106
|
if (index >= 0) {
|
|
@@ -118,13 +128,14 @@ export function createRoomShellSlice(props) {
|
|
|
118
128
|
tableName: newTableName,
|
|
119
129
|
};
|
|
120
130
|
if (oldTableName) {
|
|
121
|
-
draft.config.dataSources =
|
|
122
|
-
|
|
123
|
-
|
|
131
|
+
draft.room.config.dataSources =
|
|
132
|
+
draft.room.config.dataSources.map((dataSource) => dataSource.tableName === oldTableName
|
|
133
|
+
? newDataSource
|
|
134
|
+
: dataSource);
|
|
124
135
|
delete draft.room.dataSourceStates[oldTableName];
|
|
125
136
|
}
|
|
126
137
|
else {
|
|
127
|
-
draft.config.dataSources.push(newDataSource);
|
|
138
|
+
draft.room.config.dataSources.push(newDataSource);
|
|
128
139
|
}
|
|
129
140
|
draft.room.dataSourceStates[newTableName] = {
|
|
130
141
|
status: DataSourceStatus.READY,
|
|
@@ -170,10 +181,11 @@ export function createRoomShellSlice(props) {
|
|
|
170
181
|
},
|
|
171
182
|
removeDataSource: async (tableName) => {
|
|
172
183
|
const { db } = get();
|
|
173
|
-
const dataSource = get().config.dataSources.find((d) => d.tableName === tableName);
|
|
184
|
+
const dataSource = get().room.config.dataSources.find((d) => d.tableName === tableName);
|
|
174
185
|
if (dataSource) {
|
|
175
186
|
set((state) => produce(state, (draft) => {
|
|
176
|
-
draft.config.dataSources =
|
|
187
|
+
draft.room.config.dataSources =
|
|
188
|
+
draft.room.config.dataSources.filter((d) => d.tableName !== tableName);
|
|
177
189
|
if (dataSource && isFileDataSource(dataSource)) {
|
|
178
190
|
draft.room.roomFiles = draft.room.roomFiles.filter((f) => f.pathname !== dataSource.fileName);
|
|
179
191
|
}
|
|
@@ -184,7 +196,7 @@ export function createRoomShellSlice(props) {
|
|
|
184
196
|
}
|
|
185
197
|
},
|
|
186
198
|
removeRoomFile: async (pathname) => {
|
|
187
|
-
const dataSource = get().config.dataSources.find((d) => isFileDataSource(d) && d.fileName === pathname);
|
|
199
|
+
const dataSource = get().room.config.dataSources.find((d) => isFileDataSource(d) && d.fileName === pathname);
|
|
188
200
|
if (dataSource) {
|
|
189
201
|
await get().room.removeDataSource(dataSource.tableName);
|
|
190
202
|
}
|
|
@@ -202,13 +214,12 @@ export function createRoomShellSlice(props) {
|
|
|
202
214
|
}));
|
|
203
215
|
},
|
|
204
216
|
areDatasetsReady: () => {
|
|
205
|
-
const
|
|
206
|
-
const
|
|
207
|
-
const dataSources = config.dataSources;
|
|
217
|
+
const dataSourceStates = get().room.dataSourceStates;
|
|
218
|
+
const dataSources = get().room.config.dataSources;
|
|
208
219
|
return dataSources.every((ds) => dataSourceStates[ds.tableName]?.status === DataSourceStatus.READY);
|
|
209
220
|
},
|
|
210
221
|
},
|
|
211
|
-
...
|
|
222
|
+
...restProps,
|
|
212
223
|
};
|
|
213
224
|
// If the tables have changed, update the data sources
|
|
214
225
|
store.subscribe((state, prevState) => {
|
|
@@ -216,10 +227,11 @@ export function createRoomShellSlice(props) {
|
|
|
216
227
|
updateReadyDataSources();
|
|
217
228
|
}
|
|
218
229
|
});
|
|
230
|
+
return sliceState;
|
|
219
231
|
async function updateReadyDataSources() {
|
|
220
232
|
const { tables } = get().db;
|
|
221
233
|
const { dataSourceStates } = get().room;
|
|
222
|
-
const { config } = get();
|
|
234
|
+
const { config } = get().room;
|
|
223
235
|
const { dataSources } = config;
|
|
224
236
|
set((state) => produce(state, (draft) => {
|
|
225
237
|
for (const ds of dataSources) {
|
|
@@ -243,7 +255,7 @@ export function createRoomShellSlice(props) {
|
|
|
243
255
|
}
|
|
244
256
|
async function maybeDownloadDataSources() {
|
|
245
257
|
const { roomFilesProgress, dataSourceStates } = get().room;
|
|
246
|
-
const { dataSources } = get().config;
|
|
258
|
+
const { dataSources } = get().room.config;
|
|
247
259
|
const pendingDataSources = dataSources.filter((ds) => !dataSourceStates[ds.tableName] ||
|
|
248
260
|
dataSourceStates[ds.tableName]?.status === DataSourceStatus.PENDING);
|
|
249
261
|
const filesToDownload = pendingDataSources.filter((ds) => {
|
|
@@ -262,7 +274,7 @@ export function createRoomShellSlice(props) {
|
|
|
262
274
|
if (queriesToRun.length > 0) {
|
|
263
275
|
await runDataSourceQueries(queriesToRun);
|
|
264
276
|
}
|
|
265
|
-
if (get().config.dataSources.length > 0) {
|
|
277
|
+
if (get().room.config.dataSources.length > 0) {
|
|
266
278
|
set((state) => produce(state, (draft) => {
|
|
267
279
|
draft.room.isDataAvailable = true;
|
|
268
280
|
}));
|
|
@@ -394,14 +406,10 @@ export function createRoomShellSlice(props) {
|
|
|
394
406
|
message: 'Downloading data…',
|
|
395
407
|
});
|
|
396
408
|
}
|
|
397
|
-
return roomState;
|
|
398
409
|
};
|
|
399
410
|
return slice;
|
|
400
411
|
}
|
|
401
412
|
export function useBaseRoomShellStore(selector) {
|
|
402
413
|
return useBaseRoomStore(selector);
|
|
403
414
|
}
|
|
404
|
-
|
|
405
|
-
return (set, get, store) => sliceCreator(set, get, store);
|
|
406
|
-
}
|
|
407
|
-
//# sourceMappingURL=RoomShellStore.js.map
|
|
415
|
+
//# sourceMappingURL=RoomShellSlice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoomShellSlice.js","sourceRoot":"","sources":["../src/RoomShellSlice.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n DuckDbSliceState,\n LoadFileOptions,\n createDuckDbSlice,\n} from '@sqlrooms/duckdb';\nimport {\n CreateLayoutSliceProps,\n LayoutSliceState,\n createLayoutSlice,\n} from '@sqlrooms/layout';\nimport {\n BaseRoomConfig,\n DataSource,\n DataSourceTypes,\n FileDataSource,\n LayoutConfig,\n SqlQueryDataSource,\n UrlDataSource,\n createDefaultBaseRoomConfig,\n isFileDataSource,\n isSqlQueryDataSource,\n isUrlDataSource,\n} from '@sqlrooms/room-config';\nimport {\n BaseRoomStoreState,\n CreateBaseRoomSliceProps,\n createBaseRoomSlice,\n isRoomSliceWithInitialize,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport {ErrorBoundary} from '@sqlrooms/ui';\nimport {\n ProgressInfo,\n convertToUniqueColumnOrTableName,\n convertToValidColumnOrTableName,\n downloadFile,\n} from '@sqlrooms/utils';\nimport {castDraft, produce} from 'immer';\nimport {ReactNode} from 'react';\nimport {StateCreator, StoreApi} from 'zustand';\nimport {\n DataSourceState,\n DataSourceStatus,\n RoomFileInfo,\n RoomFileState,\n} from './types';\n\nexport type RoomShellSliceConfig = BaseRoomConfig;\n\nexport type RoomShellStore = StoreApi<RoomShellSliceState>;\n\nexport type TaskProgress = {\n progress?: number | undefined;\n message: string;\n};\n\nexport type RoomShellSliceState = {\n initialize?: () => Promise<void>;\n room: BaseRoomStoreState['room'] & {\n config: RoomShellSliceConfig;\n tasksProgress: Record<string, TaskProgress>;\n\n setConfig: (config: RoomShellSliceConfig) => void;\n setTaskProgress: (\n id: string,\n taskProgress: TaskProgress | undefined,\n ) => void;\n getLoadingProgress: () => TaskProgress | undefined;\n\n roomFiles: RoomFileInfo[];\n roomFilesProgress: {[pathname: string]: RoomFileState};\n isDataAvailable: boolean; // Whether the data has been loaded (on initialization)\n dataSourceStates: {[tableName: string]: DataSourceState}; // TODO\n /**\n * Load a file data source. A fileDataSourceLoader implementation can be passed to\n * createRoomShellSlice to specify how file data sources should be loaded.\n *\n * @example\n * ```ts\n * ...createRoomShellSlice({\n * config: {\n * dataSources: [\n * { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },\n * ],\n * },\n * room: {\n * fileDataSourceLoader: async ({fileName}, onProgress) =>\n * await downloadFile(`https://some.url/${fileName}`, {onProgress}),\n * },\n * })(set, get, store)\n * ```\n *\n * @param fileName - The name of the file to load.\n * @param onProgress - A callback to report the progress of the download.\n * @returns The loaded file.\n */\n fileDataSourceLoader?: (\n {fileName}: FileDataSource,\n onProgress: (progress: ProgressInfo) => void,\n ) => Promise<Uint8Array | File>;\n CustomErrorBoundary: React.ComponentType<{\n onRetry?: () => void;\n children?: ReactNode;\n }>;\n\n setRoomTitle(title: string): void;\n setDescription(description: string): void;\n\n /**\n * Add or update a SQL query data source.\n * @param tableName - The name of the table to create or update.\n * @param query - The SQL query to execute.\n * @param oldTableName - The name of the table to replace (optional).\n */\n addOrUpdateSqlQueryDataSource(\n tableName: string,\n query: string,\n oldTableName?: string,\n ): Promise<void>;\n areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n /**\n * @deprecated Use removeDataSource or removeRoomFile instead\n */\n removeSqlQueryDataSource(tableName: string): Promise<void>;\n /**\n * Removes a data source from the room by tableName.\n * @param tableName - The name of the table of the data source to remove.\n */\n removeDataSource(tableName: string): Promise<void>;\n /**\n * Removes a file data source from the room by pathname.\n * @param pathname - The pathname of the file to remove.\n */\n removeRoomFile(pathname: string): Promise<void>;\n setRoomFiles(info: RoomFileInfo[]): void;\n setRoomFileProgress(pathname: string, fileState: RoomFileState): void;\n addDataSource: (\n dataSource: DataSource,\n status?: DataSourceStatus,\n ) => Promise<void>;\n };\n} & DuckDbSliceState &\n LayoutSliceState;\n\n/**\n * \tThis type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.\n */\ntype CreateRoomShellSliceProps = CreateBaseRoomSliceProps & {\n connector?: DuckDbConnector;\n config?: Partial<\n RoomShellSliceConfig & {\n /** @deprecated Use layout.config instead */\n layout?: LayoutConfig;\n }\n >;\n layout?: CreateLayoutSliceProps;\n fileDataSourceLoader?: RoomShellSliceState['room']['fileDataSourceLoader'];\n CustomErrorBoundary?: RoomShellSliceState['room']['CustomErrorBoundary'];\n /** @deprecated Use direct props instead e.g. layout.panels */\n room?: Partial<Pick<LayoutSliceState['layout'], 'panels'>>;\n};\n\nconst DOWNLOAD_DATA_SOURCES_TASK = 'download-data-sources';\nconst INIT_DB_TASK = 'init-db';\nconst INIT_ROOM_TASK = 'init-room';\n\nexport function createRoomShellSlice(\n props: CreateRoomShellSliceProps,\n): StateCreator<RoomShellSliceState> {\n const slice: StateCreator<RoomShellSliceState> = (set, get, store) => {\n const {\n connector,\n config: configProps,\n layout: layoutProps,\n room: deprecatedRoomProps,\n fileDataSourceLoader,\n CustomErrorBoundary = ErrorBoundary,\n captureException = (exception) => console.error(exception),\n ...restProps\n } = props;\n\n const createLayoutProps: CreateLayoutSliceProps = {\n ...layoutProps,\n config: layoutProps?.config ?? configProps?.layout,\n panels: layoutProps?.panels ?? deprecatedRoomProps?.panels,\n };\n const roomSliceState = createBaseRoomSlice({\n captureException,\n })(set, get, store);\n\n const sliceState: RoomShellSliceState = {\n ...roomSliceState,\n ...createDuckDbSlice({connector})(set, get, store),\n ...createLayoutSlice(createLayoutProps)(set, get, store),\n room: {\n ...roomSliceState.room,\n // @ts-ignore TODO: fix this\n config: {\n ...createDefaultBaseRoomConfig(),\n ...configProps,\n },\n CustomErrorBoundary,\n roomFiles: [],\n roomFilesProgress: {},\n isDataAvailable: false,\n dataSourceStates: {},\n tasksProgress: {},\n fileDataSourceLoader,\n\n setConfig: (config) => {\n set((state) =>\n produce(state, (draft) => {\n draft.room.config = config;\n }),\n );\n },\n\n async initialize() {\n const {setTaskProgress} = get().room;\n setTaskProgress(INIT_DB_TASK, {\n message: 'Initializing database…',\n progress: undefined,\n });\n await get().db.initialize();\n setTaskProgress(INIT_DB_TASK, undefined);\n\n setTaskProgress(INIT_ROOM_TASK, {\n message: 'Loading data sources…',\n progress: undefined,\n });\n await updateReadyDataSources();\n await maybeDownloadDataSources();\n\n // Call initialize on all other slices that have an initialize function\n const slices = Object.entries(store.getState()).filter(\n ([key, value]) =>\n key !== 'room' &&\n key !== 'db' &&\n isRoomSliceWithInitialize(value),\n );\n for (const [_, slice] of slices) {\n if (isRoomSliceWithInitialize(slice)) {\n await slice.initialize();\n }\n }\n const state = store.getState();\n if (isRoomSliceWithInitialize(state)) {\n await state.initialize();\n }\n\n setTaskProgress(INIT_ROOM_TASK, undefined);\n },\n\n /** Returns the progress of the last task */\n getLoadingProgress() {\n const {tasksProgress} = get().room;\n const keys = Object.keys(tasksProgress);\n const lastKey = keys[keys.length - 1];\n if (lastKey) {\n return tasksProgress[lastKey];\n }\n return undefined;\n },\n\n setTaskProgress(id, taskProgress) {\n set((state) =>\n produce(state, (draft) => {\n if (taskProgress) {\n draft.room.tasksProgress[id] = taskProgress;\n } else {\n delete draft.room.tasksProgress[id];\n }\n }),\n );\n },\n\n setRoomTitle: (title) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.config.title = title;\n }),\n ),\n\n setDescription: (description) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.config.description = description;\n }),\n ),\n\n addDataSource: async (\n dataSource,\n status = DataSourceStatus.PENDING,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const dataSources = draft.room.config.dataSources;\n const tableName = dataSource.tableName;\n const index = dataSources.findIndex(\n (d) => d.tableName === tableName,\n );\n if (index >= 0) {\n dataSources[index] = dataSource;\n } else {\n dataSources.push(dataSource);\n }\n draft.room.dataSourceStates[tableName] = {status};\n }),\n );\n await maybeDownloadDataSources();\n },\n\n async addOrUpdateSqlQueryDataSource(tableName, query, oldTableName) {\n const {schema} = get().db;\n const {db} = get();\n const newTableName =\n tableName !== oldTableName\n ? convertToUniqueColumnOrTableName(\n tableName,\n await db.getTables(schema),\n )\n : tableName;\n const {rowCount} = await db.createTableFromQuery(newTableName, query);\n get().db.setTableRowCount(newTableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n const newDataSource = {\n type: DataSourceTypes.enum.sql,\n sqlQuery: query,\n tableName: newTableName,\n };\n if (oldTableName) {\n draft.room.config.dataSources =\n draft.room.config.dataSources.map((dataSource) =>\n dataSource.tableName === oldTableName\n ? newDataSource\n : dataSource,\n );\n delete draft.room.dataSourceStates[oldTableName];\n } else {\n draft.room.config.dataSources.push(newDataSource);\n }\n draft.room.dataSourceStates[newTableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n await get().db.refreshTableSchemas();\n },\n\n setRoomFiles: (roomFiles) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = roomFiles;\n }),\n ),\n\n async addRoomFile(file, desiredTableName, loadOptions) {\n const {db} = get();\n\n const pathname = file instanceof File ? file.name : file;\n const tableName =\n desiredTableName ?? convertToValidColumnOrTableName(pathname);\n\n await db.connector.loadFile(file, tableName, loadOptions);\n\n // This must come before addDataSource, as addDataSource can trigger\n // download which also adds the file\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles.push({\n pathname,\n duckdbFileName: pathname,\n size: file instanceof File ? file.size : undefined,\n file: file instanceof File ? file : undefined,\n });\n }),\n );\n await get().room.addDataSource(\n {\n type: DataSourceTypes.enum.file,\n fileName: pathname,\n tableName,\n },\n // duckdbFileName ? DataSourceStatus.READY : DataSourceStatus.PENDING,\n DataSourceStatus.READY,\n );\n await get().db.refreshTableSchemas();\n set((state) =>\n produce(state, (draft) => {\n if (\n Object.values(get().room.dataSourceStates).every(\n (ds) => ds.status === DataSourceStatus.READY,\n )\n ) {\n draft.room.isDataAvailable = true;\n }\n }),\n );\n return get().db.findTableByName(tableName);\n },\n removeSqlQueryDataSource: async (tableName) => {\n await get().room.removeDataSource(tableName);\n },\n removeDataSource: async (tableName) => {\n const {db} = get();\n const dataSource = get().room.config.dataSources.find(\n (d) => d.tableName === tableName,\n );\n if (dataSource) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.config.dataSources =\n draft.room.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n if (dataSource && isFileDataSource(dataSource)) {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== dataSource.fileName,\n );\n }\n delete draft.room.dataSourceStates[tableName];\n }),\n );\n await db.dropTable(tableName);\n await db.refreshTableSchemas();\n }\n },\n\n removeRoomFile: async (pathname) => {\n const dataSource = get().room.config.dataSources.find(\n (d) => isFileDataSource(d) && d.fileName === pathname,\n );\n if (dataSource) {\n await get().room.removeDataSource(dataSource.tableName);\n }\n },\n\n setRoomFileProgress(pathname, fileState) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFilesProgress[pathname] = fileState;\n // Update the file size in the room config from the progress info\n const fileInfo = draft.room.roomFiles.find(\n (f) => f.pathname === pathname,\n );\n if (fileInfo && fileInfo.size === undefined) {\n if (fileState.status !== 'error' && fileState.progress) {\n fileInfo.size = fileState.progress.total;\n }\n }\n }),\n );\n },\n\n areDatasetsReady: () => {\n const dataSourceStates = get().room.dataSourceStates;\n const dataSources = get().room.config.dataSources;\n return dataSources.every(\n (ds) =>\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.READY,\n );\n },\n },\n\n ...restProps,\n };\n\n // If the tables have changed, update the data sources\n store.subscribe((state, prevState) => {\n if (state.db.tables !== prevState.db.tables) {\n updateReadyDataSources();\n }\n });\n\n return sliceState;\n\n async function updateReadyDataSources() {\n const {tables} = get().db;\n const {dataSourceStates} = get().room;\n const {config} = get().room;\n const {dataSources} = config;\n set((state) =>\n produce(state, (draft) => {\n for (const ds of dataSources) {\n const tableName = ds.tableName;\n const table = tables.find((t) => t.tableName === tableName);\n if (table) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n } else {\n // Prev status could be ERROR or PENDING, don't change it then\n if (!dataSourceStates[tableName]?.status) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.PENDING,\n };\n }\n }\n }\n }),\n );\n }\n\n async function maybeDownloadDataSources() {\n const {roomFilesProgress, dataSourceStates} = get().room;\n const {dataSources} = get().room.config;\n const pendingDataSources = dataSources.filter(\n (ds) =>\n !dataSourceStates[ds.tableName] ||\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.PENDING,\n );\n\n const filesToDownload = pendingDataSources.filter((ds) => {\n if (isFileDataSource(ds)) {\n return !roomFilesProgress[ds.fileName];\n }\n if (isUrlDataSource(ds)) {\n return !roomFilesProgress[ds.url];\n }\n return false;\n }) as (FileDataSource | UrlDataSource)[];\n\n if (filesToDownload.length > 0) {\n await downloadRoomFiles(filesToDownload);\n }\n\n const queriesToRun = pendingDataSources.filter(isSqlQueryDataSource);\n\n if (queriesToRun.length > 0) {\n await runDataSourceQueries(queriesToRun);\n }\n\n if (get().room.config.dataSources.length > 0) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.isDataAvailable = true;\n }),\n );\n }\n }\n\n async function downloadRoomFiles(\n filesToDownload: (FileDataSource | UrlDataSource)[],\n ) {\n if (!filesToDownload.length) return;\n const {setTableRowCount} = get().db;\n const {captureException, setTaskProgress, setRoomFileProgress} =\n get().room;\n filesToDownload.forEach((ds) => {\n const fileName = isFileDataSource(ds) ? ds.fileName : ds.url;\n set((state) =>\n produce(state, (draft) => {\n const info = {\n duckdbFileName: fileName,\n pathname: fileName,\n file: undefined,\n size: undefined,\n };\n const index = draft.room.roomFiles.findIndex(\n (f) => f.pathname === fileName,\n );\n if (index >= 0) {\n draft.room.roomFiles[index] = info;\n } else {\n draft.room.roomFiles.push(info);\n }\n }),\n );\n setRoomFileProgress(fileName, {status: 'download'});\n });\n if (filesToDownload.length > 0) {\n updateTotalFileDownloadProgress();\n }\n\n const loadedFiles = await Promise.all(\n filesToDownload.map(async (ds) => {\n const fileName = isFileDataSource(ds) ? ds.fileName : ds.url;\n const onProgress = (progress: ProgressInfo) => {\n setRoomFileProgress(fileName, {\n status: 'download',\n progress,\n });\n updateTotalFileDownloadProgress();\n };\n try {\n let downloadedFile: Uint8Array | File;\n if (isFileDataSource(ds)) {\n const {fileDataSourceLoader} = get().room;\n if (!fileDataSourceLoader) {\n throw new Error('fileDataSourceLoader is not defined');\n }\n downloadedFile = await fileDataSourceLoader(ds, onProgress);\n } else if (isUrlDataSource(ds)) {\n const url = ds.url;\n downloadedFile = await downloadFile(url, {\n method: ds.httpMethod,\n headers: ds.headers,\n onProgress,\n });\n } else {\n // This should never happen as filesToDownload only contains FileDataSource | UrlDataSource\n throw new Error('Unsupported data source type');\n }\n setRoomFileProgress(fileName, {status: 'done'});\n updateTotalFileDownloadProgress();\n const {db} = get();\n await db.connector.loadFile(\n downloadedFile instanceof File\n ? downloadedFile\n : new File([new Uint8Array(downloadedFile)], fileName),\n ds.tableName,\n ds.loadOptions,\n );\n setTableRowCount(\n ds.tableName,\n await db.getTableRowCount(ds.tableName),\n );\n } catch (err) {\n captureException(err);\n console.error(err);\n setRoomFileProgress(fileName, {\n status: 'error',\n message: 'Download failed',\n });\n // TODO: Make sure the errors are shown\n } finally {\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, undefined);\n }\n }),\n );\n if (loadedFiles.length) {\n await get().db.refreshTableSchemas();\n }\n }\n\n async function runDataSourceQueries(queries: SqlQueryDataSource[]) {\n for (const ds of queries) {\n try {\n const {tableName, sqlQuery} = ds;\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.FETCHING,\n };\n }),\n );\n const {rowCount} = await get().db.createTableFromQuery(\n tableName,\n sqlQuery,\n );\n get().db.setTableRowCount(tableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n } catch (err) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[ds.tableName] = {\n status: DataSourceStatus.ERROR,\n message: `${err}`,\n };\n }),\n );\n // TODO: Make sure the errors are shown\n }\n }\n await get().db.refreshTableSchemas();\n await updateReadyDataSources();\n }\n\n function updateTotalFileDownloadProgress() {\n const {setTaskProgress, roomFilesProgress} = get().room;\n let total = 0,\n loaded = 0;\n for (const p of Object.values(roomFilesProgress)) {\n if (p.status === 'download' || p.status === 'done') {\n total += p.progress?.total || 0;\n loaded += p.progress?.loaded || 0;\n }\n }\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, {\n progress: total > 0 ? Math.round((loaded / total) * 100) : undefined,\n message: 'Downloading data…',\n });\n }\n };\n\n return slice;\n}\n\nexport function useBaseRoomShellStore<RS extends RoomShellSliceState, T>(\n selector: (state: RS) => T,\n): T {\n return useBaseRoomStore<RS, T>(selector as (state: RS) => T);\n}\n"]}
|
|
@@ -3,7 +3,7 @@ import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMe
|
|
|
3
3
|
import { formatBytes, splitFilePath } from '@sqlrooms/utils';
|
|
4
4
|
import { CloudDownloadIcon, CloudIcon, CloudUploadIcon, EllipsisIcon, FileDownIcon, FileTextIcon, XIcon, } from 'lucide-react';
|
|
5
5
|
import { useCallback } from 'react';
|
|
6
|
-
import { useBaseRoomShellStore } from '../
|
|
6
|
+
import { useBaseRoomShellStore } from '../RoomShellSlice';
|
|
7
7
|
const FileDataSourceCard = (props) => {
|
|
8
8
|
const { isReadOnly, fileInfo, fileState } = props;
|
|
9
9
|
const { pathname, size } = fileInfo;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileDataSourceCard.js","sourceRoot":"","sources":["../../src/data-sources/FileDataSourceCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport {formatBytes, splitFilePath} from '@sqlrooms/utils';\nimport {\n CloudDownloadIcon,\n CloudIcon,\n CloudUploadIcon,\n EllipsisIcon,\n FileDownIcon,\n FileTextIcon,\n XIcon,\n} from 'lucide-react';\nimport {FC, useCallback} from 'react';\nimport {useBaseRoomShellStore} from '../
|
|
1
|
+
{"version":3,"file":"FileDataSourceCard.js","sourceRoot":"","sources":["../../src/data-sources/FileDataSourceCard.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@sqlrooms/ui';\nimport {formatBytes, splitFilePath} from '@sqlrooms/utils';\nimport {\n CloudDownloadIcon,\n CloudIcon,\n CloudUploadIcon,\n EllipsisIcon,\n FileDownIcon,\n FileTextIcon,\n XIcon,\n} from 'lucide-react';\nimport {FC, useCallback} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellSlice';\nimport {RoomFileInfo, RoomFileState} from '../types';\nconst FileDataSourceCard: FC<{\n isReadOnly?: boolean;\n fileInfo: RoomFileInfo;\n fileState?: RoomFileState;\n}> = (props) => {\n const {isReadOnly, fileInfo, fileState} = props;\n const {pathname, size} = fileInfo;\n const {filename} = splitFilePath(pathname);\n const removeRoomFile = useBaseRoomShellStore(\n (state) => state.room.removeRoomFile,\n );\n const handleRemoveFromRoom = useCallback(() => {\n removeRoomFile(fileInfo.pathname);\n }, [fileInfo.pathname, removeRoomFile]);\n\n return (\n <div className=\"flex flex-col gap-1 p-2\">\n <div className=\"flex cursor-pointer flex-row items-center gap-1\">\n <div className=\"w-[15px] flex-none\">\n <FileTextIcon className=\"w-[15px]\" />\n </div>\n <div className=\"flex-1 overflow-hidden text-ellipsis whitespace-nowrap\">\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"break-words text-xs\">{filename}</span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n <pre className=\"w-[300px] text-wrap break-words text-xs\">\n {pathname}\n </pre>\n </TooltipContent>\n </Tooltip>\n </div>\n <div className=\"flex-none\">\n {!isReadOnly ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"ghost\"\n className=\"text-muted-foreground h-6 w-6\"\n >\n <EllipsisIcon className=\"h-5 w-5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={handleRemoveFromRoom}>\n <XIcon className=\"mr-2 h-4 w-4\" />\n Remove file\n </DropdownMenuItem>\n <DropdownMenuItem disabled>\n <FileDownIcon className=\"mr-2 h-4 w-4\" />\n Download file\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n </div>\n <div className=\"flex flex-row items-center gap-1\">\n {fileState?.status === 'error' ? (\n <div className=\"bg-destructive/15 text-destructive flex-1 rounded p-1 text-xs\">\n {fileState.message}\n </div>\n ) : fileState?.status === 'download' ||\n fileState?.status === 'upload' ? (\n <div className=\"bg-secondary h-1 w-full overflow-hidden rounded\">\n <div\n className=\"bg-primary h-full transition-all duration-300\"\n style={{\n width: `${(fileState.progress?.ratio ?? 0) * 100}%`,\n }}\n />\n </div>\n ) : null}\n <div className=\"flex-none\">\n {size !== undefined ? (\n <span className=\"text-muted-foreground min-w-[70px] text-right text-xs\">\n {formatBytes(size)}\n </span>\n ) : null}\n </div>\n <div\n className=\"cursor-pointer\"\n title={\n fileState?.status === 'done'\n ? 'File synced'\n : fileState?.status === 'download'\n ? 'Downloading file…'\n : fileState?.status === 'upload'\n ? 'Uploading file…'\n : fileState?.status === 'error'\n ? `Failed to sync file: ${fileState.message}`\n : 'File not synced'\n }\n >\n {fileState?.status === 'done' ? (\n <CloudIcon className=\"w-[15px] text-green-400\" />\n ) : fileState?.status === 'download' ? (\n <CloudDownloadIcon className=\"w-[15px] text-orange-400\" />\n ) : fileState?.status === 'upload' ? (\n <CloudUploadIcon className=\"w-[15px] text-orange-400\" />\n ) : fileState?.status === 'error' ? (\n <CloudIcon className=\"text-destructive w-[15px]\" />\n ) : (\n <CloudIcon className=\"w-[15px] text-orange-400\" />\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport {FileDataSourceCard};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { FileDataSourceCard } from './FileDataSourceCard';
|
|
3
|
-
import { useBaseRoomShellStore } from '../
|
|
3
|
+
import { useBaseRoomShellStore } from '../RoomShellSlice';
|
|
4
4
|
const FileDataSourcesPanel = ({ isReadOnly }) => {
|
|
5
5
|
const roomFiles = useBaseRoomShellStore((state) => state.room.roomFiles);
|
|
6
6
|
const roomFilesProgress = useBaseRoomShellStore((state) => state.room.roomFilesProgress);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileDataSourcesPanel.js","sourceRoot":"","sources":["../../src/data-sources/FileDataSourcesPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD,MAAM,oBAAoB,GAA+B,CAAC,EAAC,UAAU,EAAC,EAAE,EAAE;IACxE,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,iBAAiB,GAAG,qBAAqB,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CACxC,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,uCAAuC,YACnD,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,KAAC,kBAAkB,IAEjB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAH1C,CAAC,CAIN,CACH,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,oBAAoB,EAAC,CAAC","sourcesContent":["import {FC} from 'react';\nimport {FileDataSourceCard} from './FileDataSourceCard';\nimport {useBaseRoomShellStore} from '../
|
|
1
|
+
{"version":3,"file":"FileDataSourcesPanel.js","sourceRoot":"","sources":["../../src/data-sources/FileDataSourcesPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AAExD,MAAM,oBAAoB,GAA+B,CAAC,EAAC,UAAU,EAAC,EAAE,EAAE;IACxE,MAAM,SAAS,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,iBAAiB,GAAG,qBAAqB,CAC7C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CACxC,CAAC;IAEF,OAAO,CACL,cAAK,SAAS,EAAC,uCAAuC,YACnD,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,KAAC,kBAAkB,IAEjB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAH1C,CAAC,CAIN,CACH,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,oBAAoB,EAAC,CAAC","sourcesContent":["import {FC} from 'react';\nimport {FileDataSourceCard} from './FileDataSourceCard';\nimport {useBaseRoomShellStore} from '../RoomShellSlice';\n\nconst FileDataSourcesPanel: FC<{isReadOnly?: boolean}> = ({isReadOnly}) => {\n const roomFiles = useBaseRoomShellStore((state) => state.room.roomFiles);\n const roomFilesProgress = useBaseRoomShellStore(\n (state) => state.room.roomFilesProgress,\n );\n\n return (\n <div className=\"flex flex-grow flex-col overflow-auto\">\n {roomFiles.map((fileInfo, i) => (\n <FileDataSourceCard\n key={i}\n isReadOnly={isReadOnly}\n fileInfo={fileInfo}\n fileState={roomFilesProgress[fileInfo.pathname]}\n />\n ))}\n </div>\n );\n};\n\nexport {FileDataSourcesPanel};\n"]}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { DataTableModal } from '@sqlrooms/data-table';
|
|
3
3
|
import { cn, useDisclosure } from '@sqlrooms/ui';
|
|
4
4
|
import { useState } from 'react';
|
|
5
|
-
import { useBaseRoomShellStore } from '../
|
|
5
|
+
import { useBaseRoomShellStore } from '../RoomShellSlice';
|
|
6
6
|
import { TableCard } from './TableCard';
|
|
7
7
|
const TablesListPanel = ({ className, isReadOnly }) => {
|
|
8
8
|
const tables = useBaseRoomShellStore((state) => state.db.tables);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TablesListPanel.js","sourceRoot":"","sources":["../../src/data-sources/TablesListPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAC,EAAE,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAK,QAAQ,EAAC,MAAM,OAAO,CAAC;AACnC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,eAAe,GAGhB,CAAC,EAAC,SAAS,EAAE,UAAU,EAAC,EAAE,EAAE;IAC/B,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CACnC,CAAC;IAEF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,SAAS,CACV,CAAC;IACF,MAAM,EAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAC,GAAG,aAAa,EAAE,CAAC;IAElD,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAE,EAAE;QACvC,MAAM,EAAE,CAAC;QACT,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,OAAO,EAAE,CAAC;QACV,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,cACE,SAAS,EAAE,EAAE,CACX,sDAAsD,EACtD,SAAS,CACV,YAEA,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAChB,cAAK,SAAS,EAAC,qBAAqB,YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,KAAC,SAAS,IAER,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACjC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,IAJpC,CAAC,CAKN,CACH,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,GACJ,EAEN,KAAC,cAAc,IACb,SAAS,EAAC,uBAAuB,EACjC,UAAU,EAAE;oBACV,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,WAAW;iBACrB,EACD,KAAK,EAAE,aAAa,EAAE,SAAS,EAC/B,KAAK,EAAE,iBAAiB,aAAa,EAAE,SAAS,EAAE,GAClD,IACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {DataTableModal} from '@sqlrooms/data-table';\nimport {DataTable} from '@sqlrooms/duckdb';\nimport {cn, useDisclosure} from '@sqlrooms/ui';\nimport {FC, useState} from 'react';\nimport {useBaseRoomShellStore} from '../
|
|
1
|
+
{"version":3,"file":"TablesListPanel.js","sourceRoot":"","sources":["../../src/data-sources/TablesListPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAC,EAAE,EAAE,aAAa,EAAC,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAK,QAAQ,EAAC,MAAM,OAAO,CAAC;AACnC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,MAAM,eAAe,GAGhB,CAAC,EAAC,SAAS,EAAE,UAAU,EAAC,EAAE,EAAE;IAC/B,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACjE,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CACnC,CAAC;IAEF,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,SAAS,CACV,CAAC;IACF,MAAM,EAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAC,GAAG,aAAa,EAAE,CAAC;IAElD,MAAM,WAAW,GAAG,CAAC,KAAgB,EAAE,EAAE;QACvC,MAAM,EAAE,CAAC;QACT,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,OAAO,EAAE,CAAC;QACV,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,cACE,SAAS,EAAE,EAAE,CACX,sDAAsD,EACtD,SAAS,CACV,YAEA,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAChB,cAAK,SAAS,EAAC,qBAAqB,YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,KAAC,SAAS,IAER,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACjC,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,IAJpC,CAAC,CAKN,CACH,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,GACJ,EAEN,KAAC,cAAc,IACb,SAAS,EAAC,uBAAuB,EACjC,UAAU,EAAE;oBACV,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,WAAW;iBACrB,EACD,KAAK,EAAE,aAAa,EAAE,SAAS,EAC/B,KAAK,EAAE,iBAAiB,aAAa,EAAE,SAAS,EAAE,GAClD,IACD,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {DataTableModal} from '@sqlrooms/data-table';\nimport {DataTable} from '@sqlrooms/duckdb';\nimport {cn, useDisclosure} from '@sqlrooms/ui';\nimport {FC, useState} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellSlice';\nimport {TableCard} from './TableCard';\n\nconst TablesListPanel: FC<{\n className?: string;\n isReadOnly?: boolean;\n}> = ({className, isReadOnly}) => {\n const tables = useBaseRoomShellStore((state) => state.db.tables);\n const tableRowCounts = useBaseRoomShellStore(\n (state) => state.db.tableRowCounts,\n );\n\n const [selectedTable, setSelectedTable] = useState<DataTable | undefined>(\n undefined,\n );\n const {isOpen, onOpen, onClose} = useDisclosure();\n\n const handleClick = (table: DataTable) => {\n onOpen();\n setSelectedTable(table);\n };\n\n const handleClose = () => {\n onClose();\n setSelectedTable(undefined);\n };\n\n return (\n <>\n <div\n className={cn(\n 'relative flex flex-grow flex-col items-stretch gap-2',\n className,\n )}\n >\n {tables?.length ? (\n <div className=\"flex flex-col gap-2\">\n {tables.map((table, i) => (\n <TableCard\n key={i}\n onClick={() => handleClick(table)}\n isReadOnly={isReadOnly}\n value={table}\n rowCount={tableRowCounts[table.tableName]}\n />\n ))}\n </div>\n ) : null}\n </div>\n\n <DataTableModal\n className=\"h-[80vh] max-w-[75vw]\"\n tableModal={{\n isOpen: isOpen,\n onClose: handleClose,\n }}\n title={selectedTable?.tableName}\n query={`SELECT * FROM ${selectedTable?.tableName}`}\n />\n </>\n );\n};\n\nexport {TablesListPanel};\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export { PanelHeaderButton } from './panels/RoomHeaderButton';
|
|
|
11
11
|
export { RoomPanel } from './panels/RoomPanel';
|
|
12
12
|
export { RoomPanelHeader } from './panels/RoomPanelHeader';
|
|
13
13
|
export { RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
|
|
14
|
-
export { createRoomShellSlice,
|
|
14
|
+
export { createRoomShellSlice, useBaseRoomShellStore, type RoomShellSliceState, } from './RoomShellSlice';
|
|
15
15
|
export type { StateCreator, StoreApi } from 'zustand';
|
|
16
16
|
export { DataSourceStatus, type DataSourceState, type RoomFileInfo, type RoomFileState, } from './types';
|
|
17
17
|
export * from '@sqlrooms/room-store';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAC,YAAY,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEpD,OAAO,EACL,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,SAAS,CAAC;AAEjB,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAC,KAAK,aAAa,EAAC,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@ export { PanelHeaderButton } from './panels/RoomHeaderButton';
|
|
|
11
11
|
export { RoomPanel } from './panels/RoomPanel';
|
|
12
12
|
export { RoomPanelHeader } from './panels/RoomPanelHeader';
|
|
13
13
|
export { RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
|
|
14
|
-
export { createRoomShellSlice,
|
|
14
|
+
export { createRoomShellSlice, useBaseRoomShellStore, } from './RoomShellSlice';
|
|
15
15
|
export { DataSourceStatus, } from './types';
|
|
16
16
|
export * from '@sqlrooms/room-store';
|
|
17
17
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAC,oBAAoB,EAAC,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAE/D,OAAO,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAC,SAAS,EAAC,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,gBAAgB,GAIjB,MAAM,SAAS,CAAC;AAEjB,cAAc,sBAAsB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {RoomShell} from './RoomShell';\n\nexport {FileDataSourceCard} from './data-sources/FileDataSourceCard';\nexport {FileDataSourcesPanel} from './data-sources/FileDataSourcesPanel';\nexport {TableCard} from './data-sources/TableCard';\nexport {TablesListPanel} from './data-sources/TablesListPanel';\n\nexport {PanelHeaderButton} from './panels/RoomHeaderButton';\nexport {RoomPanel} from './panels/RoomPanel';\nexport {RoomPanelHeader} from './panels/RoomPanelHeader';\n\nexport {\n RoomShellSidebarButton,\n RoomShellSidebarButtons,\n SidebarButton,\n} from './RoomShellSidebarButtons';\n\nexport {\n createRoomShellSlice,\n useBaseRoomShellStore,\n type RoomShellSliceState,\n} from './RoomShellSlice';\n\nexport type {StateCreator, StoreApi} from 'zustand';\n\nexport {\n DataSourceStatus,\n type DataSourceState,\n type RoomFileInfo,\n type RoomFileState,\n} from './types';\n\nexport * from '@sqlrooms/room-store';\n\nexport {type RoomPanelInfo} from '@sqlrooms/layout';\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { PinIcon, PinOffIcon, XIcon } from 'lucide-react';
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
|
-
import { useBaseRoomShellStore } from '../
|
|
4
|
+
import { useBaseRoomShellStore } from '../RoomShellSlice';
|
|
5
5
|
import { PanelHeaderButton } from './RoomHeaderButton';
|
|
6
6
|
const RoomPanelHeader = (props) => {
|
|
7
7
|
const { showHeader = true, panelKey: type, children } = props;
|
|
@@ -9,7 +9,7 @@ const RoomPanelHeader = (props) => {
|
|
|
9
9
|
const { icon: Icon, title } = panels[type] ?? {};
|
|
10
10
|
const togglePanel = useBaseRoomShellStore((state) => state.layout.togglePanel);
|
|
11
11
|
const togglePanelPin = useBaseRoomShellStore((state) => state.layout.togglePanelPin);
|
|
12
|
-
const pinnedPanels = useBaseRoomShellStore((state) => state.config.
|
|
12
|
+
const pinnedPanels = useBaseRoomShellStore((state) => state.layout.config.pinned);
|
|
13
13
|
const isPinned = useMemo(() => pinnedPanels?.includes(type), [pinnedPanels, type]);
|
|
14
14
|
return (_jsxs("div", { className: "flex", children: [_jsxs("div", { className: "flex w-full flex-row items-center gap-2", children: [showHeader && (_jsxs(_Fragment, { children: [Icon ? _jsx(Icon, { className: "h-4 w-4" }) : null, _jsx("h2", { className: "text-muted-foreground text-xs font-semibold uppercase", children: title })] })), children] }), _jsxs("div", { className: "bg-secondary/50 flex gap-0", children: [_jsx(PanelHeaderButton, { isPinned: isPinned, icon: isPinned ? (_jsx(PinIcon, { className: "w-[18px]" })) : (_jsx(PinOffIcon, { className: "w-[18px]" })), onClick: () => togglePanelPin(type), label: "Pin panel" }), _jsx(PanelHeaderButton, { icon: _jsx(XIcon, { className: "w-[18px]" }), onClick: () => togglePanel(type), label: `Close panel "${title}"` })] })] }));
|
|
15
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RoomPanelHeader.js","sourceRoot":"","sources":["../../src/panels/RoomPanelHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAK,OAAO,EAAC,MAAM,OAAO,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AAErD,MAAM,eAAe,GAIhB,CAAC,KAAK,EAAE,EAAE;IACb,MAAM,EAAC,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAC,GAAG,KAAK,CAAC;IAC5D,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,qBAAqB,CACvC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CACpC,CAAC;IACF,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CACvC,CAAC;IACF,MAAM,YAAY,GAAG,qBAAqB,CACxC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CACtC,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAClC,CAAC,YAAY,EAAE,IAAI,CAAC,CACrB,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,eAAK,SAAS,EAAC,yCAAyC,aACrD,UAAU,IAAI,CACb,8BACG,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAC3C,aAAI,SAAS,EAAC,uDAAuD,YAClE,KAAK,GACH,IACJ,CACJ,EACA,QAAQ,IACL,EACN,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,iBAAiB,IAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EACF,QAAQ,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,SAAS,EAAC,UAAU,GAAG,CACjC,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,SAAS,EAAC,UAAU,GAAG,CACpC,EAEH,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EACnC,KAAK,EAAC,WAAW,GACjB,EACF,KAAC,iBAAiB,IAChB,IAAI,EAAE,KAAC,KAAK,IAAC,SAAS,EAAC,UAAU,GAAG,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,KAAK,EAAE,gBAAgB,KAAK,GAAG,GAC/B,IACE,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {PinIcon, PinOffIcon, XIcon} from 'lucide-react';\nimport {FC, useMemo} from 'react';\nimport {useBaseRoomShellStore} from '../
|
|
1
|
+
{"version":3,"file":"RoomPanelHeader.js","sourceRoot":"","sources":["../../src/panels/RoomPanelHeader.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAC,MAAM,cAAc,CAAC;AACxD,OAAO,EAAK,OAAO,EAAC,MAAM,OAAO,CAAC;AAClC,OAAO,EAAC,qBAAqB,EAAC,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AAErD,MAAM,eAAe,GAIhB,CAAC,KAAK,EAAE,EAAE;IACb,MAAM,EAAC,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAC,GAAG,KAAK,CAAC;IAC5D,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrE,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,qBAAqB,CACvC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CACpC,CAAC;IACF,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CACvC,CAAC;IACF,MAAM,YAAY,GAAG,qBAAqB,CACxC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CACtC,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,EAClC,CAAC,YAAY,EAAE,IAAI,CAAC,CACrB,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,eAAK,SAAS,EAAC,yCAAyC,aACrD,UAAU,IAAI,CACb,8BACG,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAC3C,aAAI,SAAS,EAAC,uDAAuD,YAClE,KAAK,GACH,IACJ,CACJ,EACA,QAAQ,IACL,EACN,eAAK,SAAS,EAAC,4BAA4B,aACzC,KAAC,iBAAiB,IAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EACF,QAAQ,CAAC,CAAC,CAAC,CACT,KAAC,OAAO,IAAC,SAAS,EAAC,UAAU,GAAG,CACjC,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,SAAS,EAAC,UAAU,GAAG,CACpC,EAEH,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EACnC,KAAK,EAAC,WAAW,GACjB,EACF,KAAC,iBAAiB,IAChB,IAAI,EAAE,KAAC,KAAK,IAAC,SAAS,EAAC,UAAU,GAAG,EACpC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,KAAK,EAAE,gBAAgB,KAAK,GAAG,GAC/B,IACE,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC","sourcesContent":["import {PinIcon, PinOffIcon, XIcon} from 'lucide-react';\nimport {FC, useMemo} from 'react';\nimport {useBaseRoomShellStore} from '../RoomShellSlice';\nimport {PanelHeaderButton} from './RoomHeaderButton';\n\nconst RoomPanelHeader: FC<{\n panelKey: string;\n showHeader?: boolean;\n children?: React.ReactNode;\n}> = (props) => {\n const {showHeader = true, panelKey: type, children} = props;\n const panels = useBaseRoomShellStore((state) => state.layout.panels);\n const {icon: Icon, title} = panels[type] ?? {};\n const togglePanel = useBaseRoomShellStore(\n (state) => state.layout.togglePanel,\n );\n const togglePanelPin = useBaseRoomShellStore(\n (state) => state.layout.togglePanelPin,\n );\n const pinnedPanels = useBaseRoomShellStore(\n (state) => state.layout.config.pinned,\n );\n const isPinned = useMemo(\n () => pinnedPanels?.includes(type),\n [pinnedPanels, type],\n );\n\n return (\n <div className=\"flex\">\n <div className=\"flex w-full flex-row items-center gap-2\">\n {showHeader && (\n <>\n {Icon ? <Icon className=\"h-4 w-4\" /> : null}\n <h2 className=\"text-muted-foreground text-xs font-semibold uppercase\">\n {title}\n </h2>\n </>\n )}\n {children}\n </div>\n <div className=\"bg-secondary/50 flex gap-0\">\n <PanelHeaderButton\n isPinned={isPinned}\n icon={\n isPinned ? (\n <PinIcon className=\"w-[18px]\" />\n ) : (\n <PinOffIcon className=\"w-[18px]\" />\n )\n }\n onClick={() => togglePanelPin(type)}\n label=\"Pin panel\"\n />\n <PanelHeaderButton\n icon={<XIcon className=\"w-[18px]\" />}\n onClick={() => togglePanel(type)}\n label={`Close panel \"${title}\"`}\n />\n </div>\n </div>\n );\n};\n\nexport {RoomPanelHeader};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sqlrooms/room-shell",
|
|
3
|
-
"version": "0.26.0-rc.
|
|
3
|
+
"version": "0.26.0-rc.5",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -25,18 +25,18 @@
|
|
|
25
25
|
"typedoc": "typedoc"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@sqlrooms/data-table": "0.26.0-rc.
|
|
29
|
-
"@sqlrooms/duckdb": "0.26.0-rc.
|
|
30
|
-
"@sqlrooms/layout": "0.26.0-rc.
|
|
31
|
-
"@sqlrooms/layout-config": "0.26.0-rc.
|
|
32
|
-
"@sqlrooms/room-config": "0.26.0-rc.
|
|
33
|
-
"@sqlrooms/room-store": "0.26.0-rc.
|
|
34
|
-
"@sqlrooms/ui": "0.26.0-rc.
|
|
35
|
-
"@sqlrooms/utils": "0.26.0-rc.
|
|
28
|
+
"@sqlrooms/data-table": "0.26.0-rc.5",
|
|
29
|
+
"@sqlrooms/duckdb": "0.26.0-rc.5",
|
|
30
|
+
"@sqlrooms/layout": "0.26.0-rc.5",
|
|
31
|
+
"@sqlrooms/layout-config": "0.26.0-rc.5",
|
|
32
|
+
"@sqlrooms/room-config": "0.26.0-rc.5",
|
|
33
|
+
"@sqlrooms/room-store": "0.26.0-rc.5",
|
|
34
|
+
"@sqlrooms/ui": "0.26.0-rc.5",
|
|
35
|
+
"@sqlrooms/utils": "0.26.0-rc.5",
|
|
36
36
|
"apache-arrow": "17.0.0",
|
|
37
37
|
"immer": "^10.1.3",
|
|
38
38
|
"lucide-react": "^0.544.0",
|
|
39
|
-
"react-mosaic-component": "
|
|
39
|
+
"react-mosaic-component": "^6.1.1",
|
|
40
40
|
"zod": "^4.1.8",
|
|
41
41
|
"zustand": "^5.0.8"
|
|
42
42
|
},
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"react": ">=18",
|
|
45
45
|
"react-dom": ">=18"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "dc1c3b765718c8748aa11cce3cc83f907d3e5963"
|
|
48
48
|
}
|
package/dist/RoomShellStore.d.ts
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { DataTable, DuckDbConnector, DuckDbSliceState, LoadFileOptions } from '@sqlrooms/duckdb';
|
|
2
|
-
import { LayoutSliceState, RoomPanelInfo } from '@sqlrooms/layout';
|
|
3
|
-
import { BaseRoomConfig, DataSource, FileDataSource } from '@sqlrooms/room-config';
|
|
4
|
-
import { RoomState, RoomStateActions, RoomStateProps } from '@sqlrooms/room-store';
|
|
5
|
-
import { ProgressInfo } from '@sqlrooms/utils';
|
|
6
|
-
import { ReactNode } from 'react';
|
|
7
|
-
import { StateCreator, StoreApi } from 'zustand';
|
|
8
|
-
import { DataSourceState, DataSourceStatus, RoomFileInfo, RoomFileState } from './types';
|
|
9
|
-
export type RoomShellStore<PC extends BaseRoomConfig> = StoreApi<RoomShellSliceState<PC>>;
|
|
10
|
-
export type RoomShellSliceStateProps<PC extends BaseRoomConfig> = RoomStateProps<PC> & {
|
|
11
|
-
roomFiles: RoomFileInfo[];
|
|
12
|
-
roomFilesProgress: {
|
|
13
|
-
[pathname: string]: RoomFileState;
|
|
14
|
-
};
|
|
15
|
-
isDataAvailable: boolean;
|
|
16
|
-
dataSourceStates: {
|
|
17
|
-
[tableName: string]: DataSourceState;
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Load a file data source. A fileDataSourceLoader implementation can be passed to
|
|
21
|
-
* createRoomShellSlice to specify how file data sources should be loaded.
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```ts
|
|
25
|
-
* ...createRoomShellSlice<RoomConfig>({
|
|
26
|
-
* config: {
|
|
27
|
-
* dataSources: [
|
|
28
|
-
* { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },
|
|
29
|
-
* ],
|
|
30
|
-
* },
|
|
31
|
-
* room: {
|
|
32
|
-
* fileDataSourceLoader: async ({fileName}, onProgress) =>
|
|
33
|
-
* await downloadFile(`https://some.url/${fileName}`, {onProgress}),
|
|
34
|
-
* },
|
|
35
|
-
* })(set, get, store)
|
|
36
|
-
* ```
|
|
37
|
-
*
|
|
38
|
-
* @param fileName - The name of the file to load.
|
|
39
|
-
* @param onProgress - A callback to report the progress of the download.
|
|
40
|
-
* @returns The loaded file.
|
|
41
|
-
*/
|
|
42
|
-
fileDataSourceLoader?: ({ fileName }: FileDataSource, onProgress: (progress: ProgressInfo) => void) => Promise<Uint8Array | File>;
|
|
43
|
-
CustomErrorBoundary: React.ComponentType<{
|
|
44
|
-
onRetry?: () => void;
|
|
45
|
-
children?: ReactNode;
|
|
46
|
-
}>;
|
|
47
|
-
};
|
|
48
|
-
export type RoomShellSliceStateActions<PC extends BaseRoomConfig> = RoomStateActions<PC> & {
|
|
49
|
-
setRoomTitle(title: string): void;
|
|
50
|
-
setDescription(description: string): void;
|
|
51
|
-
/**
|
|
52
|
-
* Add or update a SQL query data source.
|
|
53
|
-
* @param tableName - The name of the table to create or update.
|
|
54
|
-
* @param query - The SQL query to execute.
|
|
55
|
-
* @param oldTableName - The name of the table to replace (optional).
|
|
56
|
-
*/
|
|
57
|
-
addOrUpdateSqlQueryDataSource(tableName: string, query: string, oldTableName?: string): Promise<void>;
|
|
58
|
-
areDatasetsReady(): boolean;
|
|
59
|
-
addRoomFile(file: File | string, tableName?: string, loadFileOptions?: LoadFileOptions): Promise<DataTable | undefined>;
|
|
60
|
-
/**
|
|
61
|
-
* @deprecated Use removeDataSource or removeRoomFile instead
|
|
62
|
-
*/
|
|
63
|
-
removeSqlQueryDataSource(tableName: string): Promise<void>;
|
|
64
|
-
/**
|
|
65
|
-
* Removes a data source from the room by tableName.
|
|
66
|
-
* @param tableName - The name of the table of the data source to remove.
|
|
67
|
-
*/
|
|
68
|
-
removeDataSource(tableName: string): Promise<void>;
|
|
69
|
-
/**
|
|
70
|
-
* Removes a file data source from the room by pathname.
|
|
71
|
-
* @param pathname - The pathname of the file to remove.
|
|
72
|
-
*/
|
|
73
|
-
removeRoomFile(pathname: string): Promise<void>;
|
|
74
|
-
setRoomFiles(info: RoomFileInfo[]): void;
|
|
75
|
-
setRoomFileProgress(pathname: string, fileState: RoomFileState): void;
|
|
76
|
-
addDataSource: (dataSource: DataSource, status?: DataSourceStatus) => Promise<void>;
|
|
77
|
-
};
|
|
78
|
-
export type RoomShellSliceState<PC extends BaseRoomConfig = BaseRoomConfig> = RoomState<PC> & {
|
|
79
|
-
initialize?: () => Promise<void>;
|
|
80
|
-
config: PC;
|
|
81
|
-
room: RoomShellSliceStateProps<PC> & RoomShellSliceStateActions<PC>;
|
|
82
|
-
} & DuckDbSliceState & LayoutSliceState;
|
|
83
|
-
/**
|
|
84
|
-
* This type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.
|
|
85
|
-
*/
|
|
86
|
-
type InitialState<PC extends BaseRoomConfig> = {
|
|
87
|
-
connector?: DuckDbConnector;
|
|
88
|
-
config: Partial<PC>;
|
|
89
|
-
room: Partial<Omit<RoomShellSliceStateProps<PC>, 'config'>> & {
|
|
90
|
-
panels?: Record<string, RoomPanelInfo>;
|
|
91
|
-
};
|
|
92
|
-
};
|
|
93
|
-
export declare function createRoomShellSlice<PC extends BaseRoomConfig = BaseRoomConfig>(props: InitialState<PC>): StateCreator<RoomShellSliceState<PC>>;
|
|
94
|
-
export declare function useBaseRoomShellStore<PC extends BaseRoomConfig, PS extends RoomShellSliceState<PC>, T>(selector: (state: RoomShellSliceState<PC>) => T): T;
|
|
95
|
-
export declare function createSlice<PC extends BaseRoomConfig, S>(sliceCreator: (...args: Parameters<StateCreator<S & RoomShellSliceState<PC>>>) => S): StateCreator<S>;
|
|
96
|
-
export {};
|
|
97
|
-
//# sourceMappingURL=RoomShellStore.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RoomShellStore.d.ts","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RoomShellStore.js","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n DuckDbSliceConfig,\n DuckDbSliceState,\n LoadFileOptions,\n createDefaultDuckDbConfig,\n createDuckDbSlice,\n} from '@sqlrooms/duckdb';\nimport {\n LayoutSliceConfig,\n LayoutSliceState,\n RoomPanelInfo,\n createDefaultLayoutConfig,\n createLayoutSlice,\n} from '@sqlrooms/layout';\nimport {\n BaseRoomConfig,\n DataSource,\n DataSourceTypes,\n FileDataSource,\n SqlQueryDataSource,\n UrlDataSource,\n isFileDataSource,\n isUrlDataSource,\n isSqlQueryDataSource,\n} from '@sqlrooms/room-config';\nimport {\n RoomState,\n RoomStateActions,\n RoomStateProps,\n createRoomSlice,\n isRoomSliceWithInitialize,\n useBaseRoomStore,\n} from '@sqlrooms/room-store';\nimport {ErrorBoundary} from '@sqlrooms/ui';\nimport {\n ProgressInfo,\n convertToUniqueColumnOrTableName,\n convertToValidColumnOrTableName,\n downloadFile,\n} from '@sqlrooms/utils';\nimport {castDraft, produce} from 'immer';\nimport {ReactNode} from 'react';\nimport {StateCreator, StoreApi} from 'zustand';\nimport {createDefaultBaseRoomConfig} from '@sqlrooms/room-config';\nimport {\n DataSourceState,\n DataSourceStatus,\n RoomFileInfo,\n RoomFileState,\n} from './types';\n\nexport type RoomShellStore<PC extends BaseRoomConfig> = StoreApi<\n RoomShellSliceState<PC>\n>;\n\nconst INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig &\n DuckDbSliceConfig &\n LayoutSliceConfig = {\n ...createDefaultBaseRoomConfig(),\n ...createDefaultDuckDbConfig(),\n ...createDefaultLayoutConfig(),\n};\n\nexport type RoomShellSliceStateProps<PC extends BaseRoomConfig> =\n RoomStateProps<PC> & {\n roomFiles: RoomFileInfo[];\n roomFilesProgress: {[pathname: string]: RoomFileState};\n isDataAvailable: boolean; // Whether the data has been loaded (on initialization)\n dataSourceStates: {[tableName: string]: DataSourceState}; // TODO\n /**\n * Load a file data source. A fileDataSourceLoader implementation can be passed to\n * createRoomShellSlice to specify how file data sources should be loaded.\n *\n * @example\n * ```ts\n * ...createRoomShellSlice<RoomConfig>({\n * config: {\n * dataSources: [\n * { type: 'file', fileName: 'earthquakes.parquet', tableName: 'earthquakes' },\n * ],\n * },\n * room: {\n * fileDataSourceLoader: async ({fileName}, onProgress) =>\n * await downloadFile(`https://some.url/${fileName}`, {onProgress}),\n * },\n * })(set, get, store)\n * ```\n *\n * @param fileName - The name of the file to load.\n * @param onProgress - A callback to report the progress of the download.\n * @returns The loaded file.\n */\n fileDataSourceLoader?: (\n {fileName}: FileDataSource,\n onProgress: (progress: ProgressInfo) => void,\n ) => Promise<Uint8Array | File>;\n CustomErrorBoundary: React.ComponentType<{\n onRetry?: () => void;\n children?: ReactNode;\n }>;\n };\n\nexport type RoomShellSliceStateActions<PC extends BaseRoomConfig> =\n RoomStateActions<PC> & {\n setRoomTitle(title: string): void;\n setDescription(description: string): void;\n\n /**\n * Add or update a SQL query data source.\n * @param tableName - The name of the table to create or update.\n * @param query - The SQL query to execute.\n * @param oldTableName - The name of the table to replace (optional).\n */\n addOrUpdateSqlQueryDataSource(\n tableName: string,\n query: string,\n oldTableName?: string,\n ): Promise<void>;\n areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n /**\n * @deprecated Use removeDataSource or removeRoomFile instead\n */\n removeSqlQueryDataSource(tableName: string): Promise<void>;\n /**\n * Removes a data source from the room by tableName.\n * @param tableName - The name of the table of the data source to remove.\n */\n removeDataSource(tableName: string): Promise<void>;\n /**\n * Removes a file data source from the room by pathname.\n * @param pathname - The pathname of the file to remove.\n */\n removeRoomFile(pathname: string): Promise<void>;\n setRoomFiles(info: RoomFileInfo[]): void;\n setRoomFileProgress(pathname: string, fileState: RoomFileState): void;\n addDataSource: (\n dataSource: DataSource,\n status?: DataSourceStatus,\n ) => Promise<void>;\n };\n\nexport type RoomShellSliceState<PC extends BaseRoomConfig = BaseRoomConfig> =\n RoomState<PC> & {\n initialize?: () => Promise<void>;\n config: PC;\n room: RoomShellSliceStateProps<PC> & RoomShellSliceStateActions<PC>;\n } & DuckDbSliceState &\n LayoutSliceState;\n\n/**\n * \tThis type takes a union type U (for example, A | B) and transforms it into an intersection type (A & B). This is useful because if you pass in, say, two slices of type { a: number } and { b: string }, the union of the slice types would be { a: number } | { b: string }, but you really want an object that has both properties—i.e. { a: number } & { b: string }.\n */\ntype InitialState<PC extends BaseRoomConfig> = {\n connector?: DuckDbConnector;\n config: Partial<PC>;\n room: Partial<Omit<RoomShellSliceStateProps<PC>, 'config'>> & {\n panels?: Record<string, RoomPanelInfo>;\n };\n};\n\nconst DOWNLOAD_DATA_SOURCES_TASK = 'download-data-sources';\nconst INIT_DB_TASK = 'init-db';\nconst INIT_ROOM_TASK = 'init-room';\n\nexport function createRoomShellSlice<\n PC extends BaseRoomConfig = BaseRoomConfig,\n>(props: InitialState<PC>): StateCreator<RoomShellSliceState<PC>> {\n const slice: StateCreator<RoomShellSliceState<PC>> = (set, get, store) => {\n const {\n connector,\n config: configProps,\n room: roomStateProps,\n ...restState\n } = props;\n const initialConfig: PC = {\n ...INITIAL_BASE_ROOM_CONFIG,\n ...configProps,\n } as PC;\n const initialRoomState = {\n CustomErrorBoundary: ErrorBoundary,\n roomFiles: [],\n roomFilesProgress: {},\n isDataAvailable: false,\n dataSourceStates: {},\n ...roomStateProps,\n };\n const roomSliceState = createRoomSlice({\n config: initialConfig,\n room: initialRoomState,\n })(set, get, store);\n\n const roomState: RoomShellSliceState<PC> = {\n ...roomSliceState,\n ...createDuckDbSlice({connector})(set, get, store),\n ...createLayoutSlice({panels: roomStateProps.panels})(set, get, store),\n room: {\n ...initialRoomState,\n ...roomSliceState.room,\n async initialize() {\n await roomSliceState.room.initialize();\n\n const {setTaskProgress} = get().room;\n setTaskProgress(INIT_DB_TASK, {\n message: 'Initializing database…',\n progress: undefined,\n });\n await get().db.initialize();\n setTaskProgress(INIT_DB_TASK, undefined);\n\n setTaskProgress(INIT_ROOM_TASK, {\n message: 'Loading data sources…',\n progress: undefined,\n });\n await updateReadyDataSources();\n await maybeDownloadDataSources();\n\n // Call initialize on all other slices that have an initialize function\n const slices = Object.entries(store.getState()).filter(\n ([key, value]) =>\n key !== 'room' &&\n key !== 'db' &&\n isRoomSliceWithInitialize(value),\n );\n for (const [_, slice] of slices) {\n if (isRoomSliceWithInitialize(slice)) {\n await slice.initialize();\n }\n }\n const state = store.getState();\n if (isRoomSliceWithInitialize(state)) {\n await state.initialize();\n }\n\n setTaskProgress(INIT_ROOM_TASK, undefined);\n },\n\n setRoomConfig: (config) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config = castDraft(config);\n }),\n ),\n setLastSavedConfig: (config) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.lastSavedConfig = castDraft(config);\n }),\n ),\n hasUnsavedChanges: () => {\n const {lastSavedConfig} = get().room;\n const {config} = get();\n return config !== lastSavedConfig;\n },\n\n setRoomTitle: (title) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config.title = title;\n }),\n ),\n\n setDescription: (description) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config.description = description;\n }),\n ),\n\n addDataSource: async (\n dataSource,\n status = DataSourceStatus.PENDING,\n ) => {\n set((state) =>\n produce(state, (draft) => {\n const dataSources = draft.config.dataSources;\n const tableName = dataSource.tableName;\n const index = dataSources.findIndex(\n (d) => d.tableName === tableName,\n );\n if (index >= 0) {\n dataSources[index] = dataSource;\n } else {\n dataSources.push(dataSource);\n }\n draft.room.dataSourceStates[tableName] = {status};\n }),\n );\n await maybeDownloadDataSources();\n },\n\n async addOrUpdateSqlQueryDataSource(tableName, query, oldTableName) {\n const {schema} = get().db;\n const {db} = get();\n const newTableName =\n tableName !== oldTableName\n ? convertToUniqueColumnOrTableName(\n tableName,\n await db.getTables(schema),\n )\n : tableName;\n const {rowCount} = await db.createTableFromQuery(newTableName, query);\n get().db.setTableRowCount(newTableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n const newDataSource = {\n type: DataSourceTypes.enum.sql,\n sqlQuery: query,\n tableName: newTableName,\n };\n if (oldTableName) {\n draft.config.dataSources = draft.config.dataSources.map(\n (dataSource) =>\n dataSource.tableName === oldTableName\n ? newDataSource\n : dataSource,\n );\n delete draft.room.dataSourceStates[oldTableName];\n } else {\n draft.config.dataSources.push(newDataSource);\n }\n draft.room.dataSourceStates[newTableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n await get().db.refreshTableSchemas();\n },\n\n setRoomFiles: (roomFiles) =>\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = roomFiles;\n }),\n ),\n\n async addRoomFile(file, desiredTableName, loadOptions) {\n const {db} = get();\n\n const pathname = file instanceof File ? file.name : file;\n const tableName =\n desiredTableName ?? convertToValidColumnOrTableName(pathname);\n\n await db.connector.loadFile(file, tableName, loadOptions);\n\n // This must come before addDataSource, as addDataSource can trigger\n // download which also adds the file\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles.push({\n pathname,\n duckdbFileName: pathname,\n size: file instanceof File ? file.size : undefined,\n file: file instanceof File ? file : undefined,\n });\n }),\n );\n await get().room.addDataSource(\n {\n type: DataSourceTypes.enum.file,\n fileName: pathname,\n tableName,\n },\n // duckdbFileName ? DataSourceStatus.READY : DataSourceStatus.PENDING,\n DataSourceStatus.READY,\n );\n await get().db.refreshTableSchemas();\n set((state) =>\n produce(state, (draft) => {\n if (\n Object.values(get().room.dataSourceStates).every(\n (ds) => ds.status === DataSourceStatus.READY,\n )\n ) {\n draft.room.isDataAvailable = true;\n }\n }),\n );\n return get().db.findTableByName(tableName);\n },\n removeSqlQueryDataSource: async (tableName) => {\n await get().room.removeDataSource(tableName);\n },\n removeDataSource: async (tableName) => {\n const {db} = get();\n const dataSource = get().config.dataSources.find(\n (d) => d.tableName === tableName,\n );\n if (dataSource) {\n set((state) =>\n produce(state, (draft) => {\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n if (dataSource && isFileDataSource(dataSource)) {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== dataSource.fileName,\n );\n }\n delete draft.room.dataSourceStates[tableName];\n }),\n );\n await db.dropTable(tableName);\n await db.refreshTableSchemas();\n }\n },\n\n removeRoomFile: async (pathname) => {\n const dataSource = get().config.dataSources.find(\n (d) => isFileDataSource(d) && d.fileName === pathname,\n );\n if (dataSource) {\n await get().room.removeDataSource(dataSource.tableName);\n }\n },\n\n setRoomFileProgress(pathname, fileState) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFilesProgress[pathname] = fileState;\n // Update the file size in the room config from the progress info\n const fileInfo = draft.room.roomFiles.find(\n (f) => f.pathname === pathname,\n );\n if (fileInfo && fileInfo.size === undefined) {\n if (fileState.status !== 'error' && fileState.progress) {\n fileInfo.size = fileState.progress.total;\n }\n }\n }),\n );\n },\n\n areDatasetsReady: () => {\n const {dataSourceStates} = get().room;\n const {config} = get();\n const dataSources = config.dataSources;\n return dataSources.every(\n (ds) =>\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.READY,\n );\n },\n },\n\n ...restState,\n };\n\n // If the tables have changed, update the data sources\n store.subscribe((state, prevState) => {\n if (state.db.tables !== prevState.db.tables) {\n updateReadyDataSources();\n }\n });\n\n async function updateReadyDataSources() {\n const {tables} = get().db;\n const {dataSourceStates} = get().room;\n const {config} = get();\n const {dataSources} = config;\n set((state) =>\n produce(state, (draft) => {\n for (const ds of dataSources) {\n const tableName = ds.tableName;\n const table = tables.find((t) => t.tableName === tableName);\n if (table) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n } else {\n // Prev status could be ERROR or PENDING, don't change it then\n if (!dataSourceStates[tableName]?.status) {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.PENDING,\n };\n }\n }\n }\n }),\n );\n }\n\n async function maybeDownloadDataSources() {\n const {roomFilesProgress, dataSourceStates} = get().room;\n const {dataSources} = get().config;\n const pendingDataSources = dataSources.filter(\n (ds) =>\n !dataSourceStates[ds.tableName] ||\n dataSourceStates[ds.tableName]?.status === DataSourceStatus.PENDING,\n );\n\n const filesToDownload = pendingDataSources.filter((ds) => {\n if (isFileDataSource(ds)) {\n return !roomFilesProgress[ds.fileName];\n }\n if (isUrlDataSource(ds)) {\n return !roomFilesProgress[ds.url];\n }\n return false;\n }) as (FileDataSource | UrlDataSource)[];\n\n if (filesToDownload.length > 0) {\n await downloadRoomFiles(filesToDownload);\n }\n\n const queriesToRun = pendingDataSources.filter(isSqlQueryDataSource);\n\n if (queriesToRun.length > 0) {\n await runDataSourceQueries(queriesToRun);\n }\n\n if (get().config.dataSources.length > 0) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.isDataAvailable = true;\n }),\n );\n }\n }\n\n async function downloadRoomFiles(\n filesToDownload: (FileDataSource | UrlDataSource)[],\n ) {\n if (!filesToDownload.length) return;\n const {setTableRowCount} = get().db;\n const {captureException, setTaskProgress, setRoomFileProgress} =\n get().room;\n filesToDownload.forEach((ds) => {\n const fileName = isFileDataSource(ds) ? ds.fileName : ds.url;\n set((state) =>\n produce(state, (draft) => {\n const info = {\n duckdbFileName: fileName,\n pathname: fileName,\n file: undefined,\n size: undefined,\n };\n const index = draft.room.roomFiles.findIndex(\n (f) => f.pathname === fileName,\n );\n if (index >= 0) {\n draft.room.roomFiles[index] = info;\n } else {\n draft.room.roomFiles.push(info);\n }\n }),\n );\n setRoomFileProgress(fileName, {status: 'download'});\n });\n if (filesToDownload.length > 0) {\n updateTotalFileDownloadProgress();\n }\n\n const loadedFiles = await Promise.all(\n filesToDownload.map(async (ds) => {\n const fileName = isFileDataSource(ds) ? ds.fileName : ds.url;\n const onProgress = (progress: ProgressInfo) => {\n setRoomFileProgress(fileName, {\n status: 'download',\n progress,\n });\n updateTotalFileDownloadProgress();\n };\n try {\n let downloadedFile: Uint8Array | File;\n if (isFileDataSource(ds)) {\n const {fileDataSourceLoader} = get().room;\n if (!fileDataSourceLoader) {\n throw new Error('fileDataSourceLoader is not defined');\n }\n downloadedFile = await fileDataSourceLoader(ds, onProgress);\n } else if (isUrlDataSource(ds)) {\n const url = ds.url;\n downloadedFile = await downloadFile(url, {\n method: ds.httpMethod,\n headers: ds.headers,\n onProgress,\n });\n } else {\n // This should never happen as filesToDownload only contains FileDataSource | UrlDataSource\n throw new Error('Unsupported data source type');\n }\n setRoomFileProgress(fileName, {status: 'done'});\n updateTotalFileDownloadProgress();\n const {db} = get();\n await db.connector.loadFile(\n downloadedFile instanceof File\n ? downloadedFile\n : new File([new Uint8Array(downloadedFile)], fileName),\n ds.tableName,\n ds.loadOptions,\n );\n setTableRowCount(\n ds.tableName,\n await db.getTableRowCount(ds.tableName),\n );\n } catch (err) {\n captureException(err);\n console.error(err);\n setRoomFileProgress(fileName, {\n status: 'error',\n message: 'Download failed',\n });\n // TODO: Make sure the errors are shown\n } finally {\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, undefined);\n }\n }),\n );\n if (loadedFiles.length) {\n await get().db.refreshTableSchemas();\n }\n }\n\n async function runDataSourceQueries(queries: SqlQueryDataSource[]) {\n for (const ds of queries) {\n try {\n const {tableName, sqlQuery} = ds;\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.FETCHING,\n };\n }),\n );\n const {rowCount} = await get().db.createTableFromQuery(\n tableName,\n sqlQuery,\n );\n get().db.setTableRowCount(tableName, rowCount);\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[tableName] = {\n status: DataSourceStatus.READY,\n };\n }),\n );\n } catch (err) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.dataSourceStates[ds.tableName] = {\n status: DataSourceStatus.ERROR,\n message: `${err}`,\n };\n }),\n );\n // TODO: Make sure the errors are shown\n }\n }\n await get().db.refreshTableSchemas();\n await updateReadyDataSources();\n }\n\n function updateTotalFileDownloadProgress() {\n const {setTaskProgress, roomFilesProgress} = get().room;\n let total = 0,\n loaded = 0;\n for (const p of Object.values(roomFilesProgress)) {\n if (p.status === 'download' || p.status === 'done') {\n total += p.progress?.total || 0;\n loaded += p.progress?.loaded || 0;\n }\n }\n setTaskProgress(DOWNLOAD_DATA_SOURCES_TASK, {\n progress: total > 0 ? Math.round((loaded / total) * 100) : undefined,\n message: 'Downloading data…',\n });\n }\n\n return roomState;\n };\n\n return slice;\n}\n\nexport function useBaseRoomShellStore<\n PC extends BaseRoomConfig,\n PS extends RoomShellSliceState<PC>,\n T,\n>(selector: (state: RoomShellSliceState<PC>) => T): T {\n return useBaseRoomStore<PC, PS, T>(selector as (state: RoomState<PC>) => T);\n}\n\nexport function createSlice<PC extends BaseRoomConfig, S>(\n sliceCreator: (\n ...args: Parameters<StateCreator<S & RoomShellSliceState<PC>>>\n ) => S,\n): StateCreator<S> {\n return (set, get, store) =>\n sliceCreator(\n set,\n get as () => S & RoomShellSliceState<PC>,\n store as StoreApi<S & RoomShellSliceState<PC>>,\n );\n}\n"]}
|