@sqlrooms/room-shell 0.18.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,8 +5,8 @@ import { Suspense, useCallback, useMemo } from 'react';
5
5
  import { useBaseRoomShellStore } from './RoomShellStore';
6
6
  export const RoomShell = () => {
7
7
  const layout = useBaseRoomShellStore((state) => state.config.layout);
8
- const setLayout = useBaseRoomShellStore((state) => state.room.setLayout);
9
- const panels = useBaseRoomShellStore((state) => state.room.panels);
8
+ const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);
9
+ const panels = useBaseRoomShellStore((state) => state.layout.panels);
10
10
  const loadingProgress = useBaseRoomShellStore((state) => state.room.getLoadingProgress());
11
11
  const ErrorBoundary = useBaseRoomShellStore((state) => state.room.CustomErrorBoundary);
12
12
  const visibleRoomPanels = useMemo(() => getVisibleMosaicLayoutPanels(layout?.nodes), [layout]);
@@ -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,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,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 './RoomShellStore';\n\nexport const RoomShell: React.FC = () => {\n const layout = useBaseRoomShellStore((state) => state.config.layout);\n const setLayout = useBaseRoomShellStore((state) => state.room.setLayout);\n const panels = useBaseRoomShellStore((state) => state.room.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"]}
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 './RoomShellStore';\n\nexport const RoomShell: React.FC = () => {\n const layout = useBaseRoomShellStore((state) => state.config.layout);\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"]}
@@ -1,4 +1,4 @@
1
- import { RoomStore } from '@sqlrooms/core';
1
+ import { RoomStore } from '../../room-store/dist';
2
2
  import { BaseRoomConfig } from '@sqlrooms/room-config';
3
3
  import { FC, PropsWithChildren } from 'react';
4
4
  export declare function RoomShellBase<PC extends BaseRoomConfig>({ className, children, roomStore, }: React.PropsWithChildren<{
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShell.d.ts","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAE5D,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AASrD,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAwB,MAAM,OAAO,CAAC;AAQnE,wBAAgB,aAAa,CAAC,EAAE,SAAS,cAAc,EAAE,EACvD,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;CAC3B,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;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAkDnD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAcpD,CAAC;AAEF,eAAO,MAAM,SAAS;;oBArFsC,MAAM;;;;;;;;qBA3BhE,CAAD;;;;;oBA4C4C,MAAM;;;oBAoDL,MAAM;;CAqBlD,CAAC"}
1
+ {"version":3,"file":"RoomShell.d.ts","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AASrD,OAAO,EAAC,EAAE,EAAE,iBAAiB,EAAwB,MAAM,OAAO,CAAC;AAQnE,wBAAgB,aAAa,CAAC,EAAE,SAAS,cAAc,EAAE,EACvD,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,KAAK,CAAC,iBAAiB,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;CAC3B,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;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAkDnD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAcpD,CAAC;AAEF,eAAO,MAAM,SAAS;;oBArFsC,MAAM;;;;;;;;qBA5BhE,CAAC;;;;;oBA6C0C,MAAM;;;oBAoDL,MAAM;;CAqBlD,CAAC"}
package/dist/RoomShell.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { RoomStateProvider } from '@sqlrooms/core';
2
+ import { RoomStateProvider } from '../../room-store/dist';
3
3
  import { MosaicLayout } from '@sqlrooms/layout';
4
4
  import { cn, ErrorBoundary, ProgressModal, SpinnerPane, Toaster, TooltipProvider, } from '@sqlrooms/ui';
5
5
  import { Suspense, useCallback } from 'react';
@@ -13,8 +13,8 @@ export const RoomSidebar = ({ className, children, }) => {
13
13
  };
14
14
  export const LayoutComposer = ({ className }) => {
15
15
  const layout = useBaseRoomShellStore((state) => state.config.layout);
16
- const setLayout = useBaseRoomShellStore((state) => state.room.setLayout);
17
- const panels = useBaseRoomShellStore((state) => state.room.panels);
16
+ const setLayout = useBaseRoomShellStore((state) => state.layout.setLayout);
17
+ const panels = useBaseRoomShellStore((state) => state.layout.panels);
18
18
  const ErrorBoundary = useBaseRoomShellStore((state) => state.room.CustomErrorBoundary);
19
19
  const handleLayoutChange = useCallback((nodes) => {
20
20
  // Keep layout properties, e.g. 'pinned' and 'fixed'
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShell.js","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,iBAAiB,EAAY,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EACL,EAAE,EACF,aAAa,EACb,aAAa,EACb,WAAW,EACX,OAAO,EACP,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAwB,QAAQ,EAAE,WAAW,EAAC,MAAM,OAAO,CAAC;AAEnE,OAAO,EACL,uBAAuB,EACvB,aAAa,GACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAC,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AAEvD,MAAM,UAAU,aAAa,CAA4B,EACvD,SAAS,EACT,QAAQ,EACR,SAAS,GAIT;IACA,OAAO,CACL,KAAC,iBAAiB,IAAC,SAAS,EAAE,SAAS,YACrC,cAAK,SAAS,EAAE,EAAE,CAAC,oBAAoB,EAAE,SAAS,CAAC,YACjD,KAAC,aAAa,cACZ,MAAC,QAAQ,IAAC,QAAQ,EAAE,KAAC,WAAW,IAAC,CAAC,EAAC,MAAM,GAAG,aAC1C,KAAC,eAAe,cAAE,QAAQ,GAAmB,EAC7C,KAAC,OAAO,KAAG,IACF,GACG,GACZ,GACY,CACrB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAgD,CAAC,EACvE,SAAS,EACT,QAAQ,GACT,EAAE,EAAE;IACH,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,8DAA8D,EAC9D,SAAS,CACV,aAED,KAAC,uBAAuB,KAAG,EAC1B,QAAQ,IACL,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAA6B,CAAC,EAAC,SAAS,EAAC,EAAE,EAAE;IACtE,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,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,qBAAqB,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAC1C,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,qCAAqC;IACrC,uDAAuD;IACvD,cAAc;IACd,KAAK;IAEL,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,EAAE;QACrC,2DAA2D;QAC3D,MAAM,SAAS,GAAG,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;QACxD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CACL,KAAC,aAAa,cACZ,KAAC,SAAS,KAAG,IADK,OAAO,CAEX,CACjB,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CACX,qDAAqD,EACrD,SAAS,CACV,YAEA,MAAM,CAAC,CAAC,CAAC,CACR,KAAC,YAAY,IACX,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,QAAQ,EAAE,kBAAkB,GAC5B,CACH,CAAC,CAAC,CAAC,IAAI,GACJ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAA6B,CAAC,EAAC,SAAS,EAAC,EAAE,EAAE;IACvE,MAAM,eAAe,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAChC,CAAC;IACF,OAAO,CACL,KAAC,aAAa,IACZ,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,eAAe,KAAK,SAAS,EACrC,KAAK,EAAC,SAAS,EACf,YAAY,EAAE,eAAe,EAAE,OAAO,EACtC,aAAa,EAAE,IAAI,GAEnB,CACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE;IACpD,OAAO,EAAE,WAAW;IACpB,aAAa,EAAE,aAAa;IAC5B,cAAc,EAAE,cAAc;IAC9B,eAAe,EAAE,eAAe;CACjC,CAAC,CAAC","sourcesContent":["import {RoomStateProvider, RoomStore} from '@sqlrooms/core';\nimport {MosaicLayout} from '@sqlrooms/layout';\nimport {BaseRoomConfig} from '@sqlrooms/room-config';\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 {useBaseRoomShellStore} from './RoomShellStore';\n\nexport function RoomShellBase<PC extends BaseRoomConfig>({\n className,\n children,\n roomStore,\n}: React.PropsWithChildren<{\n className?: string;\n roomStore?: RoomStore<PC>;\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<{className?: string}> = ({className}) => {\n const layout = useBaseRoomShellStore((state) => state.config.layout);\n const setLayout = useBaseRoomShellStore((state) => state.room.setLayout);\n const panels = useBaseRoomShellStore((state) => state.room.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 />\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"]}
1
+ {"version":3,"file":"RoomShell.js","sourceRoot":"","sources":["../src/RoomShell.tsx"],"names":[],"mappings":"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","sourcesContent":["import {RoomStateProvider, RoomStore} from '../../room-store/dist';\nimport {MosaicLayout} from '@sqlrooms/layout';\nimport {BaseRoomConfig} from '@sqlrooms/room-config';\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 {useBaseRoomShellStore} from './RoomShellStore';\n\nexport function RoomShellBase<PC extends BaseRoomConfig>({\n className,\n children,\n roomStore,\n}: React.PropsWithChildren<{\n className?: string;\n roomStore?: RoomStore<PC>;\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<{className?: string}> = ({className}) => {\n const layout = useBaseRoomShellStore((state) => state.config.layout);\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 />\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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShellSidebarButtons.d.ts","sourceRoot":"","sources":["../src/RoomShellSidebarButtons.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,EAAC,EAAE,EAAU,MAAM,OAAO,CAAC;AAGzC,QAAA,MAAM,aAAa,EAAE,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAChD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA+BA,CAAC;AAEF,QAAA,MAAM,sBAAsB,EAAE,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAC,CAuBvD,CAAC;AAEF,QAAA,MAAM,uBAAuB,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAwBrD,CAAC;AAEF,OAAO,EAAC,sBAAsB,EAAE,uBAAuB,EAAE,aAAa,EAAC,CAAC"}
1
+ {"version":3,"file":"RoomShellSidebarButtons.d.ts","sourceRoot":"","sources":["../src/RoomShellSidebarButtons.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,EAAC,EAAE,EAAU,MAAM,OAAO,CAAC;AAGzC,QAAA,MAAM,aAAa,EAAE,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAChD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CA+BA,CAAC;AAEF,QAAA,MAAM,sBAAsB,EAAE,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAC,CAyBvD,CAAC;AAEF,QAAA,MAAM,uBAAuB,EAAE,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAC,CAwBrD,CAAC;AAEF,OAAO,EAAC,sBAAsB,EAAE,uBAAuB,EAAE,aAAa,EAAC,CAAC"}
@@ -11,14 +11,14 @@ const SidebarButton = ({ className, title, isSelected, isDisabled = false, icon:
11
11
  const RoomShellSidebarButton = ({ roomPanelType, }) => {
12
12
  const initialized = useBaseRoomShellStore((state) => state.room.initialized);
13
13
  const layout = useBaseRoomShellStore((state) => state.config.layout);
14
- const panels = useBaseRoomShellStore((state) => state.room.panels);
14
+ const panels = useBaseRoomShellStore((state) => state.layout.panels);
15
15
  const visibleRoomPanels = useMemo(() => getVisibleMosaicLayoutPanels(layout?.nodes), [layout]);
16
- const togglePanel = useBaseRoomShellStore((state) => state.room.togglePanel);
16
+ const togglePanel = useBaseRoomShellStore((state) => state.layout.togglePanel);
17
17
  const { icon: Icon, title } = panels[roomPanelType] ?? {};
18
18
  return (_jsx(SidebarButton, { title: title ?? '', isSelected: visibleRoomPanels.includes(roomPanelType), isDisabled: !initialized, icon: Icon ?? (() => null), onClick: () => togglePanel(roomPanelType) }, roomPanelType));
19
19
  };
20
20
  const RoomShellSidebarButtons = ({ className }) => {
21
- const panels = useBaseRoomShellStore((state) => state.room.panels);
21
+ const panels = useBaseRoomShellStore((state) => state.layout.panels);
22
22
  return (_jsxs("div", { className: cn('flex h-full grow flex-col', className), children: [_jsx("div", { className: "flex flex-col gap-2", children: panels
23
23
  ? Object.keys(panels)
24
24
  .filter((key) => panels[key]?.placement === 'sidebar')
@@ -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 './RoomShellStore';\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.config.layout);\n const panels = useBaseRoomShellStore((state) => state.room.panels);\n const visibleRoomPanels = useMemo(\n () => getVisibleMosaicLayoutPanels(layout?.nodes),\n [layout],\n );\n const togglePanel = useBaseRoomShellStore((state) => state.room.togglePanel);\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.room.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"]}
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 './RoomShellStore';\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.config.layout);\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"]}
@@ -1,20 +1,12 @@
1
1
  import { DataTable, DuckDbConnector, DuckDbSliceConfig, DuckDbSliceState, LoadFileOptions } from '@sqlrooms/duckdb';
2
- import { RoomState, RoomStateActions, RoomStateProps } from '@sqlrooms/core';
3
- import { DataSource, LayoutConfig } from '@sqlrooms/room-config';
2
+ import { LayoutSliceConfig, LayoutSliceState, RoomPanelInfo } from '@sqlrooms/layout';
3
+ import { BaseRoomConfig, DataSource } from '@sqlrooms/room-config';
4
+ import { RoomState, RoomStateActions, RoomStateProps } from '@sqlrooms/room-store';
4
5
  import { ReactNode } from 'react';
5
6
  import { StateCreator, StoreApi } from 'zustand';
6
- import { BaseRoomConfig } from '@sqlrooms/room-config/src/BaseRoomConfig';
7
7
  import { DataSourceState, DataSourceStatus, RoomFileInfo, RoomFileState } from './types';
8
8
  export type RoomShellStore<PC extends BaseRoomConfig> = StoreApi<RoomShellSliceState<PC>>;
9
- export type RoomPanelInfo = {
10
- title?: string;
11
- icon?: React.ComponentType<{
12
- className?: string;
13
- }>;
14
- component: React.ComponentType;
15
- placement: 'sidebar' | 'sidebar-bottom' | 'main' | 'top-bar';
16
- };
17
- export declare const INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig & DuckDbSliceConfig;
9
+ export declare const INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig & DuckDbSliceConfig & LayoutSliceConfig;
18
10
  export type RoomShellSliceStateProps<PC extends BaseRoomConfig> = RoomStateProps<PC> & {
19
11
  initialized: boolean;
20
12
  roomFiles: RoomFileInfo[];
@@ -25,7 +17,6 @@ export type RoomShellSliceStateProps<PC extends BaseRoomConfig> = RoomStateProps
25
17
  dataSourceStates: {
26
18
  [tableName: string]: DataSourceState;
27
19
  };
28
- panels: Record<string, RoomPanelInfo>;
29
20
  CustomErrorBoundary: React.ComponentType<{
30
21
  onRetry?: () => void;
31
22
  children?: ReactNode;
@@ -37,22 +28,6 @@ export type RoomShellSliceStateActions<PC extends BaseRoomConfig> = RoomStateAct
37
28
  * @returns A promise that resolves when the room state has been initialized.
38
29
  */
39
30
  initialize: () => Promise<void>;
40
- /**
41
- * Set the layout of the room.
42
- * @param layout - The layout to set.
43
- */
44
- setLayout(layout: LayoutConfig): void;
45
- /**
46
- * Toggle a panel.
47
- * @param panel - The panel to toggle.
48
- * @param show - Whether to show the panel.
49
- */
50
- togglePanel: (panel: string, show?: boolean) => void;
51
- /**
52
- * Toggle the pin state of a panel.
53
- * @param panel - The panel to toggle the pin state of.
54
- */
55
- togglePanelPin: (panel: string) => void;
56
31
  setRoomTitle(title: string): void;
57
32
  setDescription(description: string): void;
58
33
  /**
@@ -73,15 +48,15 @@ export type RoomShellSliceStateActions<PC extends BaseRoomConfig> = RoomStateAct
73
48
  export type RoomShellSliceState<PC extends BaseRoomConfig> = RoomState<PC> & {
74
49
  config: PC;
75
50
  room: RoomShellSliceStateProps<PC> & RoomShellSliceStateActions<PC>;
76
- } & DuckDbSliceState;
51
+ } & DuckDbSliceState & LayoutSliceState;
77
52
  /**
78
53
  * 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 }.
79
54
  */
80
55
  type InitialState<PC extends BaseRoomConfig> = {
81
56
  connector?: DuckDbConnector;
82
57
  config: Partial<PC>;
83
- room: Partial<Omit<RoomShellSliceStateProps<PC>, 'config' | 'panels'>> & {
84
- panels?: RoomShellSliceStateProps<PC>['panels'];
58
+ room: Partial<Omit<RoomShellSliceStateProps<PC>, 'config'>> & {
59
+ panels?: Record<string, RoomPanelInfo>;
85
60
  };
86
61
  };
87
62
  export declare function createRoomShellSlice<PC extends BaseRoomConfig>(props: InitialState<PC>): StateCreator<RoomShellSliceState<PC>>;
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShellStore.d.ts","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RoomShellStore.d.ts","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,21 @@
1
1
  import { createDefaultDuckDbConfig, createDuckDbSlice, } from '@sqlrooms/duckdb';
2
- import { makeMosaicStack, removeMosaicNodeByKey } from '@sqlrooms/layout';
3
- import { RoomStateContext, createRoomSlice, } from '@sqlrooms/core';
4
- import { DEFAULT_MOSAIC_LAYOUT, DataSourceTypes, MAIN_VIEW, isMosaicLayoutParent, } from '@sqlrooms/room-config';
2
+ import { createDefaultLayoutConfig, createLayoutSlice, } from '@sqlrooms/layout';
3
+ import { DataSourceTypes, } from '@sqlrooms/room-config';
4
+ import { DEFAULT_MOSAIC_LAYOUT } from '@sqlrooms/layout-config';
5
+ import { RoomStateContext, createRoomSlice, } from '@sqlrooms/room-store';
5
6
  import { ErrorBoundary } from '@sqlrooms/ui';
7
+ import { convertToUniqueColumnOrTableName, convertToValidColumnOrTableName, downloadFile, } from '@sqlrooms/utils';
6
8
  import { castDraft, produce } from 'immer';
7
9
  import { useContext } from 'react';
8
10
  import { useStore } from 'zustand';
9
11
  import { DataSourceStatus, } from './types';
10
- import { convertToUniqueColumnOrTableName, convertToValidColumnOrTableName, downloadFile, } from '@sqlrooms/utils';
11
12
  export const INITIAL_BASE_ROOM_CONFIG = {
12
13
  title: '',
13
- description: '',
14
14
  layout: DEFAULT_MOSAIC_LAYOUT,
15
+ description: '',
15
16
  dataSources: [],
16
17
  ...createDefaultDuckDbConfig(),
18
+ ...createDefaultLayoutConfig(),
17
19
  };
18
20
  const DOWNLOAD_DATA_SOURCES_TASK = 'download-data-sources';
19
21
  const INIT_DB_TASK = 'init-db';
@@ -29,7 +31,6 @@ export function createRoomShellSlice(props) {
29
31
  initialized: false,
30
32
  CustomErrorBoundary: ErrorBoundary,
31
33
  roomFiles: [],
32
- panels: {},
33
34
  roomFilesProgress: {},
34
35
  isDataAvailable: false,
35
36
  dataSourceStates: {},
@@ -42,6 +43,7 @@ export function createRoomShellSlice(props) {
42
43
  const roomState = {
43
44
  ...roomSliceState,
44
45
  ...createDuckDbSlice({ connector })(set, get, store),
46
+ ...createLayoutSlice({ panels: roomStateProps.panels })(set, get, store),
45
47
  room: {
46
48
  ...initialRoomState,
47
49
  ...roomSliceState.room,
@@ -82,80 +84,6 @@ export function createRoomShellSlice(props) {
82
84
  setDescription: (description) => set((state) => produce(state, (draft) => {
83
85
  draft.config.description = description;
84
86
  })),
85
- setLayout: (layout) => set((state) => produce(state, (draft) => {
86
- draft.config.layout = layout;
87
- })),
88
- togglePanel: (panel, show) => {
89
- const { config } = get();
90
- if (config.layout?.nodes === panel) {
91
- // don't hide the view if it's the only one
92
- return;
93
- }
94
- const result = removeMosaicNodeByKey(config.layout?.nodes, panel);
95
- const isShown = result.success;
96
- if (isShown) {
97
- if (show || panel === MAIN_VIEW /*&& areViewsReadyToRender()*/) {
98
- return;
99
- }
100
- set((state) => produce(state, (draft) => {
101
- const layout = draft.config.layout;
102
- layout.nodes = result.nextTree;
103
- if (layout.pinned?.includes(panel)) {
104
- layout.pinned = layout.pinned.filter((p) => p !== panel);
105
- }
106
- }));
107
- }
108
- else {
109
- if (show === false) {
110
- return;
111
- }
112
- set((state) => produce(state, (draft) => {
113
- const layout = draft.config.layout;
114
- const root = layout.nodes;
115
- const placement = draft.room.panels[panel]?.placement;
116
- const side = placement === 'sidebar' ? 'first' : 'second';
117
- const toReplace = isMosaicLayoutParent(root)
118
- ? root[side]
119
- : undefined;
120
- if (toReplace &&
121
- isMosaicLayoutParent(root) &&
122
- !isMosaicLayoutParent(toReplace) &&
123
- toReplace !== MAIN_VIEW &&
124
- !layout.fixed?.includes(toReplace) &&
125
- !layout.pinned?.includes(toReplace)) {
126
- // replace first un-pinned leaf
127
- root[side] = panel;
128
- }
129
- else {
130
- const panelNode = { node: panel, weight: 1 };
131
- const restNode = {
132
- node: config.layout?.nodes,
133
- weight: 3,
134
- };
135
- // add to to the left
136
- layout.nodes = makeMosaicStack(placement === 'sidebar-bottom' ? 'column' : 'row', side === 'first'
137
- ? [panelNode, restNode]
138
- : [restNode, panelNode]);
139
- }
140
- }));
141
- }
142
- },
143
- /**
144
- * Toggle the pin state of a panel.
145
- * @param panel - The panel to toggle the pin state of.
146
- */
147
- togglePanelPin: (panel) => {
148
- set((state) => produce(state, (draft) => {
149
- const layout = draft.config.layout;
150
- const pinned = layout.pinned ?? [];
151
- if (pinned.includes(panel)) {
152
- layout.pinned = pinned.filter((p) => p !== panel);
153
- }
154
- else {
155
- layout.pinned = [...pinned, panel];
156
- }
157
- }));
158
- },
159
87
  addDataSource: async (dataSource, status = DataSourceStatus.PENDING) => {
160
88
  set((state) => produce(state, (draft) => {
161
89
  const dataSources = draft.config.dataSources;
@@ -1 +1 @@
1
- {"version":3,"file":"RoomShellStore.js","sourceRoot":"","sources":["../src/RoomShellStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,eAAe,EAAE,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAGL,gBAAgB,EAEhB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,qBAAqB,EAErB,eAAe,EAGf,SAAS,EAGT,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAC,SAAS,EAAE,OAAO,EAAC,MAAM,OAAO,CAAC;AACzC,OAAO,EAAY,UAAU,EAAC,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAyB,QAAQ,EAAC,MAAM,SAAS,CAAC;AAEzD,OAAO,EAEL,gBAAgB,GAGjB,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,gCAAgC,EAChC,+BAA+B,EAC/B,YAAY,GAEb,MAAM,iBAAiB,CAAC;AAazB,MAAM,CAAC,MAAM,wBAAwB,GAAuC;IAC1E,KAAK,EAAE,EAAE;IACT,WAAW,EAAE,EAAE;IACf,MAAM,EAAE,qBAAqB;IAC7B,WAAW,EAAE,EAAE;IACf,GAAG,yBAAyB,EAAE;CAC/B,CAAC;AAyFF,MAAM,0BAA0B,GAAG,uBAAuB,CAAC;AAC3D,MAAM,YAAY,GAAG,SAAS,CAAC;AAC/B,MAAM,cAAc,GAAG,WAAW,CAAC;AAEnC,MAAM,UAAU,oBAAoB,CAClC,KAAuB;IAEvB,MAAM,KAAK,GAA0C,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACvE,MAAM,EACJ,SAAS,EACT,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,cAAc,EACpB,GAAG,SAAS,EACb,GAAG,KAAK,CAAC;QACV,MAAM,aAAa,GAAO;YACxB,GAAG,wBAAwB;YAC3B,GAAG,WAAW;SACT,CAAC;QACR,MAAM,gBAAgB,GAAG;YACvB,WAAW,EAAE,KAAK;YAClB,mBAAmB,EAAE,aAAa;YAClC,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,EAAE;YACV,iBAAiB,EAAE,EAAE;YACrB,eAAe,EAAE,KAAK;YACtB,gBAAgB,EAAE,EAAE;YACpB,GAAG,cAAc;SAClB,CAAC;QACF,MAAM,cAAc,GAAG,eAAe,CAAC;YACrC,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,gBAAgB;SACvB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEpB,MAAM,SAAS,GAA4B;YACzC,GAAG,cAAc;YACjB,GAAG,iBAAiB,CAAC,EAAC,SAAS,EAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;YAClD,IAAI,EAAE;gBACJ,GAAG,gBAAgB;gBACnB,GAAG,cAAc,CAAC,IAAI;gBACtB,KAAK,CAAC,UAAU;oBACd,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBAEjC,MAAM,EAAC,eAAe,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;oBACrC,eAAe,CAAC,YAAY,EAAE;wBAC5B,OAAO,EAAE,wBAAwB;wBACjC,QAAQ,EAAE,SAAS;qBACpB,CAAC,CAAC;oBACH,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;oBAC5B,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;oBAEzC,eAAe,CAAC,cAAc,EAAE;wBAC9B,OAAO,EAAE,uBAAuB;wBAChC,QAAQ,EAAE,SAAS;qBACpB,CAAC,CAAC;oBACH,MAAM,sBAAsB,EAAE,CAAC;oBAC/B,MAAM,wBAAwB,EAAE,CAAC;oBACjC,eAAe,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;oBAE3C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;oBAChC,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC;gBAED,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CACxB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBACnC,CAAC,CAAC,CACH;gBACH,kBAAkB,EAAE,CAAC,MAAM,EAAE,EAAE,CAC7B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBACjD,CAAC,CAAC,CACH;gBACH,iBAAiB,EAAE,GAAG,EAAE;oBACtB,MAAM,EAAC,eAAe,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;oBACrC,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC;oBACvB,OAAO,MAAM,KAAK,eAAe,CAAC;gBACpC,CAAC;gBAED,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,CACtB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;gBAC7B,CAAC,CAAC,CACH;gBAEH,cAAc,EAAE,CAAC,WAAW,EAAE,EAAE,CAC9B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;gBACzC,CAAC,CAAC,CACH;gBACH,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACpB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;gBAC/B,CAAC,CAAC,CACH;gBAEH,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;oBAC3B,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC;oBACvB,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC;wBACnC,2CAA2C;wBAC3C,OAAO;oBACT,CAAC;oBACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;oBAClE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;oBAC/B,IAAI,OAAO,EAAE,CAAC;wBACZ,IAAI,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC,8BAA8B,EAAE,CAAC;4BAC/D,OAAO;wBACT,CAAC;wBACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;4BACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;4BACnC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;4BAC/B,IAAI,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gCACnC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;4BAC3D,CAAC;wBACH,CAAC,CAAC,CACH,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;4BACnB,OAAO;wBACT,CAAC;wBACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;4BACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;4BACnC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;4BAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;4BACtD,MAAM,IAAI,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;4BAC1D,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,CAAC;gCAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gCACZ,CAAC,CAAC,SAAS,CAAC;4BACd,IACE,SAAS;gCACT,oBAAoB,CAAC,IAAI,CAAC;gCAC1B,CAAC,oBAAoB,CAAC,SAAS,CAAC;gCAChC,SAAS,KAAK,SAAS;gCACvB,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC;gCAClC,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,EACnC,CAAC;gCACD,+BAA+B;gCAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;4BACrB,CAAC;iCAAM,CAAC;gCACN,MAAM,SAAS,GAAG,EAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAC,CAAC;gCAC3C,MAAM,QAAQ,GAAG;oCACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK;oCAC1B,MAAM,EAAE,CAAC;iCACV,CAAC;gCACF,qBAAqB;gCACrB,MAAM,CAAC,KAAK,GAAG,eAAe,CAC5B,SAAS,KAAK,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EACjD,IAAI,KAAK,OAAO;oCACd,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC;oCACvB,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAC1B,CAAC;4BACJ,CAAC;wBACH,CAAC,CAAC,CACH,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED;;;mBAGG;gBACH,cAAc,EAAE,CAAC,KAAa,EAAE,EAAE;oBAChC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;wBACnC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;wBACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC3B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;wBACpD,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,CAAC;wBACrC,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC;gBAED,aAAa,EAAE,KAAK,EAClB,UAAU,EACV,MAAM,GAAG,gBAAgB,CAAC,OAAO,EACjC,EAAE;oBACF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC;wBAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;wBACvC,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,CAAC;wBACF,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;4BACf,WAAW,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC;wBAClC,CAAC;6BAAM,CAAC;4BACN,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC/B,CAAC;wBACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,EAAC,MAAM,EAAC,CAAC;oBACpD,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,wBAAwB,EAAE,CAAC;gBACnC,CAAC;gBAED,KAAK,CAAC,6BAA6B,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY;oBAChE,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;oBAC1B,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,EAAE,CAAC;oBACnB,MAAM,YAAY,GAChB,SAAS,KAAK,YAAY;wBACxB,CAAC,CAAC,gCAAgC,CAC9B,SAAS,EACT,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAC3B;wBACH,CAAC,CAAC,SAAS,CAAC;oBAChB,MAAM,EAAC,QAAQ,EAAC,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;oBACtE,GAAG,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;oBAClD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,MAAM,aAAa,GAAG;4BACpB,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG;4BAC9B,QAAQ,EAAE,KAAK;4BACf,SAAS,EAAE,YAAY;yBACxB,CAAC;wBACF,IAAI,YAAY,EAAE,CAAC;4BACjB,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CACrD,CAAC,UAAU,EAAE,EAAE,CACb,UAAU,CAAC,SAAS,KAAK,YAAY;gCACnC,CAAC,CAAC,aAAa;gCACf,CAAC,CAAC,UAAU,CACjB,CAAC;4BACF,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;wBACnD,CAAC;6BAAM,CAAC;4BACN,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;wBAC/C,CAAC;wBACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG;4BAC1C,MAAM,EAAE,gBAAgB,CAAC,KAAK;yBAC/B,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;gBACvC,CAAC;gBAED,wBAAwB,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;oBAC5C,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,EAAE,CAAC;oBACnB,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;oBAC9B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACjC,CAAC;wBACF,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;oBAChD,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;gBACvC,CAAC;gBAED,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAC1B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;gBACnC,CAAC,CAAC,CACH;gBAEH,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,WAAW;oBACnD,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,EAAE,CAAC;oBAEnB,MAAM,QAAQ,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBACzD,MAAM,SAAS,GACb,gBAAgB,IAAI,+BAA+B,CAAC,QAAQ,CAAC,CAAC;oBAEhE,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;oBAE1D,oEAAoE;oBACpE,oCAAoC;oBACpC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;4BACxB,QAAQ;4BACR,cAAc,EAAE,QAAQ;4BACxB,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;4BAClD,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;yBAC9C,CAAC,CAAC;oBACL,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAC5B;wBACE,IAAI,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI;wBAC/B,QAAQ,EAAE,QAAQ;wBAClB,SAAS;qBACV;oBACD,sEAAsE;oBACtE,gBAAgB,CAAC,KAAK,CACvB,CAAC;oBACF,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;oBACrC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,IACE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAC9C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,gBAAgB,CAAC,KAAK,CAC7C,EACD,CAAC;4BACD,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;wBACpC,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;oBACF,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;gBAC7C,CAAC;gBAED,cAAc,CAAC,QAAQ;oBACrB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC/B,CAAC;wBACF,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI;4BACpC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC1B,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC;gBAED,mBAAmB,CAAC,QAAQ,EAAE,SAAS;oBACrC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;wBACnD,iEAAiE;wBACjE,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC/B,CAAC;wBACF,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BAC5C,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;gCACvD,QAAQ,CAAC,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;4BAC3C,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC;gBAED,gBAAgB,EAAE,GAAG,EAAE;oBACrB,MAAM,EAAC,gBAAgB,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;oBACtC,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC;oBACvB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;oBACvC,OAAO,WAAW,CAAC,KAAK,CACtB,CAAC,EAAE,EAAE,EAAE,CACL,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,gBAAgB,CAAC,KAAK,CACpE,CAAC;gBACJ,CAAC;aACF;YAED,GAAG,SAAS;SACb,CAAC;QAEF,sDAAsD;QACtD,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACnC,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;gBAC5C,sBAAsB,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,UAAU,sBAAsB;YACnC,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;YAC1B,MAAM,EAAC,gBAAgB,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YACtC,MAAM,EAAC,MAAM,EAAC,GAAG,GAAG,EAAE,CAAC;YACvB,MAAM,EAAC,WAAW,EAAC,GAAG,MAAM,CAAC;YAC7B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvB,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;oBAC7B,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;oBAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;oBAC5D,IAAI,KAAK,EAAE,CAAC;wBACV,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG;4BACvC,MAAM,EAAE,gBAAgB,CAAC,KAAK;yBAC/B,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,8DAA8D;wBAC9D,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;4BACzC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG;gCACvC,MAAM,EAAE,gBAAgB,CAAC,OAAO;6BACjC,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CACH,CAAC;QACJ,CAAC;QAED,KAAK,UAAU,wBAAwB;YACrC,MAAM,EAAC,iBAAiB,EAAE,gBAAgB,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YACzD,MAAM,EAAC,WAAW,EAAC,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;YACnC,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAC3C,CAAC,EAAE,EAAE,EAAE,CACL,CAAC,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC;gBAC/B,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,gBAAgB,CAAC,OAAO,CACtE,CAAC;YAEF,MAAM,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;gBACvD,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;oBAChB,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI;wBAC5B,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;oBACzC,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG;wBAC3B,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;oBACpC;wBACE,OAAO,KAAK,CAAC;gBACjB,CAAC;YACH,CAAC,CAAuC,CAAC;YAEzC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,iBAAiB,CAAC,eAAe,CAAC,CAAC;YAC3C,CAAC;YAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAC5C,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG,CAC7C,CAAC;YAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBACpC,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;QAED,KAAK,UAAU,iBAAiB,CAC9B,eAAmD;YAEnD,IAAI,CAAC,eAAe,CAAC,MAAM;gBAAE,OAAO;YACpC,MAAM,EAAC,gBAAgB,EAAC,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC;YACpC,MAAM,EAAC,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAC,GAC5D,GAAG,EAAE,CAAC,IAAI,CAAC;YACb,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;gBAC7B,MAAM,QAAQ,GACZ,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;gBAC/D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACvB,MAAM,IAAI,GAAG;wBACX,cAAc,EAAE,QAAQ;wBACxB,QAAQ,EAAE,QAAQ;wBAClB,IAAI,EAAE,SAAS;wBACf,IAAI,EAAE,SAAS;qBAChB,CAAC;oBACF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAC/B,CAAC;oBACF,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;wBACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBACrC,CAAC;yBAAM,CAAC;wBACN,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC,CAAC,CACH,CAAC;gBACF,mBAAmB,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,UAAU,EAAC,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YACH,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,+BAA+B,EAAE,CAAC;YACpC,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC/B,MAAM,QAAQ,GACZ,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;gBAC/D,IAAI,CAAC;oBACH,IAAI,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC1C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;oBACvD,CAAC;oBACD,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;oBACnB,mBAAmB,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,UAAU,EAAC,CAAC,CAAC;oBACpD,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE;wBAC7C,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI;4BAC1C,MAAM,EAAE,EAAE,CAAC,UAAU;4BACrB,OAAO,EAAE,EAAE,CAAC,OAAO;yBACpB,CAAC;wBACF,UAAU,EAAE,CAAC,QAAsB,EAAE,EAAE;4BACrC,mBAAmB,CAAC,QAAQ,EAAE;gCAC5B,MAAM,EAAE,UAAU;gCAClB,QAAQ;6BACT,CAAC,CAAC;4BACH,+BAA+B,EAAE,CAAC;wBACpC,CAAC;qBACF,CAAC,CAAC;oBACH,mBAAmB,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAE,MAAM,EAAC,CAAC,CAAC;oBAChD,+BAA+B,EAAE,CAAC;oBAClC,MAAM,EAAC,EAAE,EAAC,GAAG,GAAG,EAAE,CAAC;oBACnB,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,CACzB,IAAI,IAAI,CAAC,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,EACpC,EAAE,CAAC,SAAS,EACZ,EAAE,CAAC,WAAW,CACf,CAAC;oBACF,gBAAgB,CACd,EAAE,CAAC,SAAS,EACZ,MAAM,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,CACxC,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACnB,mBAAmB,CAAC,QAAQ,EAAE;wBAC5B,MAAM,EAAE,OAAO;wBACf,OAAO,EAAE,iBAAiB;qBAC3B,CAAC,CAAC;oBACH,uCAAuC;gBACzC,CAAC;wBAAS,CAAC;oBACT,eAAe,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC,CAAC,CACH,CAAC;YACF,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;QAED,KAAK,UAAU,oBAAoB,CAAC,OAA6B;YAC/D,KAAK,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACH,MAAM,EAAC,SAAS,EAAE,QAAQ,EAAC,GAAG,EAAE,CAAC;oBACjC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG;4BACvC,MAAM,EAAE,gBAAgB,CAAC,QAAQ;yBAClC,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBACF,MAAM,EAAC,QAAQ,EAAC,GAAG,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,oBAAoB,CACpD,SAAS,EACT,QAAQ,CACT,CAAC;oBACF,GAAG,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAC/C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG;4BACvC,MAAM,EAAE,gBAAgB,CAAC,KAAK;yBAC/B,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;wBACvB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG;4BAC1C,MAAM,EAAE,gBAAgB,CAAC,KAAK;4BAC9B,OAAO,EAAE,GAAG,GAAG,EAAE;yBAClB,CAAC;oBACJ,CAAC,CAAC,CACH,CAAC;oBACF,uCAAuC;gBACzC,CAAC;YACH,CAAC;YACD,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC;YACrC,MAAM,sBAAsB,EAAE,CAAC;QACjC,CAAC;QAED,SAAS,+BAA+B;YACtC,MAAM,EAAC,eAAe,EAAE,iBAAiB,EAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC;YACxD,IAAI,KAAK,GAAG,CAAC,EACX,MAAM,GAAG,CAAC,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACjD,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACnD,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,CAAC,CAAC;oBAChC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YACD,eAAe,CAAC,0BAA0B,EAAE;gBAC1C,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;gBACpE,OAAO,EAAE,mBAAmB;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CAInC,QAA+C;IAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,QAAQ,CAAC,KAAgC,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,YAEM;IAEN,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CACzB,YAAY,CACV,GAAG,EACH,GAAwC,EACxC,KAA8C,CAC/C,CAAC;AACN,CAAC","sourcesContent":["import {\n DataTable,\n DuckDbConnector,\n DuckDbSliceConfig,\n DuckDbSliceState,\n LoadFileOptions,\n createDefaultDuckDbConfig,\n createDuckDbSlice,\n} from '@sqlrooms/duckdb';\nimport {makeMosaicStack, removeMosaicNodeByKey} from '@sqlrooms/layout';\nimport {\n RoomState,\n RoomStateActions,\n RoomStateContext,\n RoomStateProps,\n createRoomSlice,\n} from '@sqlrooms/core';\nimport {\n DEFAULT_MOSAIC_LAYOUT,\n DataSource,\n DataSourceTypes,\n FileDataSource,\n LayoutConfig,\n MAIN_VIEW,\n SqlQueryDataSource,\n UrlDataSource,\n isMosaicLayoutParent,\n} from '@sqlrooms/room-config';\nimport {ErrorBoundary} from '@sqlrooms/ui';\nimport {castDraft, produce} from 'immer';\nimport {ReactNode, useContext} from 'react';\nimport {StateCreator, StoreApi, useStore} from 'zustand';\nimport {BaseRoomConfig} from '@sqlrooms/room-config/src/BaseRoomConfig';\nimport {\n DataSourceState,\n DataSourceStatus,\n RoomFileInfo,\n RoomFileState,\n} from './types';\nimport {\n convertToUniqueColumnOrTableName,\n convertToValidColumnOrTableName,\n downloadFile,\n ProgressInfo,\n} from '@sqlrooms/utils';\n\nexport type RoomShellStore<PC extends BaseRoomConfig> = StoreApi<\n RoomShellSliceState<PC>\n>;\n\nexport type RoomPanelInfo = {\n title?: string;\n icon?: React.ComponentType<{className?: string}>;\n component: React.ComponentType;\n placement: 'sidebar' | 'sidebar-bottom' | 'main' | 'top-bar';\n};\n\nexport const INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig & DuckDbSliceConfig = {\n title: '',\n description: '',\n layout: DEFAULT_MOSAIC_LAYOUT,\n dataSources: [],\n ...createDefaultDuckDbConfig(),\n};\n\nexport type RoomShellSliceStateProps<PC extends BaseRoomConfig> =\n RoomStateProps<PC> & {\n initialized: boolean;\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 panels: Record<string, RoomPanelInfo>;\n CustomErrorBoundary: React.ComponentType<{\n onRetry?: () => void;\n children?: ReactNode;\n }>;\n };\n\nexport type RoomShellSliceStateActions<PC extends BaseRoomConfig> =\n RoomStateActions<PC> & {\n /**\n * Initialize the room state.\n * @returns A promise that resolves when the room state has been initialized.\n */\n initialize: () => Promise<void>;\n\n /**\n * Set the layout of the room.\n * @param layout - The layout to set.\n */\n setLayout(layout: LayoutConfig): void;\n /**\n * Toggle a panel.\n * @param panel - The panel to toggle.\n * @param show - Whether to show the panel.\n */\n togglePanel: (panel: string, show?: boolean) => void;\n /**\n * Toggle the pin state of a panel.\n * @param panel - The panel to toggle the pin state of.\n */\n togglePanelPin: (panel: string) => void;\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 removeSqlQueryDataSource(tableName: string): Promise<void>;\n areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n removeRoomFile(pathname: string): 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> = RoomState<PC> & {\n config: PC;\n room: RoomShellSliceStateProps<PC> & RoomShellSliceStateActions<PC>;\n} & DuckDbSliceState;\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' | 'panels'>> & {\n panels?: RoomShellSliceStateProps<PC>['panels'];\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<PC extends BaseRoomConfig>(\n props: InitialState<PC>,\n): 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 initialized: false,\n CustomErrorBoundary: ErrorBoundary,\n roomFiles: [],\n panels: {},\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 room: {\n ...initialRoomState,\n ...roomSliceState.room,\n async initialize() {\n 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 setTaskProgress(INIT_ROOM_TASK, undefined);\n\n set((state) =>\n produce(state, (draft) => {\n draft.room.initialized = true;\n }),\n );\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 setLayout: (layout) =>\n set((state) =>\n produce(state, (draft) => {\n draft.config.layout = layout;\n }),\n ),\n\n togglePanel: (panel, show) => {\n const {config} = get();\n if (config.layout?.nodes === panel) {\n // don't hide the view if it's the only one\n return;\n }\n const result = removeMosaicNodeByKey(config.layout?.nodes, panel);\n const isShown = result.success;\n if (isShown) {\n if (show || panel === MAIN_VIEW /*&& areViewsReadyToRender()*/) {\n return;\n }\n set((state) =>\n produce(state, (draft) => {\n const layout = draft.config.layout;\n layout.nodes = result.nextTree;\n if (layout.pinned?.includes(panel)) {\n layout.pinned = layout.pinned.filter((p) => p !== panel);\n }\n }),\n );\n } else {\n if (show === false) {\n return;\n }\n set((state) =>\n produce(state, (draft) => {\n const layout = draft.config.layout;\n const root = layout.nodes;\n const placement = draft.room.panels[panel]?.placement;\n const side = placement === 'sidebar' ? 'first' : 'second';\n const toReplace = isMosaicLayoutParent(root)\n ? root[side]\n : undefined;\n if (\n toReplace &&\n isMosaicLayoutParent(root) &&\n !isMosaicLayoutParent(toReplace) &&\n toReplace !== MAIN_VIEW &&\n !layout.fixed?.includes(toReplace) &&\n !layout.pinned?.includes(toReplace)\n ) {\n // replace first un-pinned leaf\n root[side] = panel;\n } else {\n const panelNode = {node: panel, weight: 1};\n const restNode = {\n node: config.layout?.nodes,\n weight: 3,\n };\n // add to to the left\n layout.nodes = makeMosaicStack(\n placement === 'sidebar-bottom' ? 'column' : 'row',\n side === 'first'\n ? [panelNode, restNode]\n : [restNode, panelNode],\n );\n }\n }),\n );\n }\n },\n\n /**\n * Toggle the pin state of a panel.\n * @param panel - The panel to toggle the pin state of.\n */\n togglePanelPin: (panel: string) => {\n set((state) =>\n produce(state, (draft) => {\n const layout = draft.config.layout;\n const pinned = layout.pinned ?? [];\n if (pinned.includes(panel)) {\n layout.pinned = pinned.filter((p) => p !== panel);\n } else {\n layout.pinned = [...pinned, panel];\n }\n }),\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 removeSqlQueryDataSource: async (tableName) => {\n const {db} = get();\n await db.dropTable(tableName);\n set((state) =>\n produce(state, (draft) => {\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n delete draft.room.dataSourceStates[tableName];\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\n removeRoomFile(pathname) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== pathname,\n );\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) =>\n d.type !== DataSourceTypes.Enum.file ||\n d.fileName !== pathname,\n );\n }),\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 switch (ds.type) {\n case DataSourceTypes.Enum.file:\n return !roomFilesProgress[ds.fileName];\n case DataSourceTypes.Enum.url:\n return !roomFilesProgress[ds.url];\n default:\n return false;\n }\n }) as (FileDataSource | UrlDataSource)[];\n\n if (filesToDownload.length > 0) {\n await downloadRoomFiles(filesToDownload);\n }\n\n const queriesToRun = pendingDataSources.filter(\n (ds) => ds.type === DataSourceTypes.Enum.sql,\n );\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 =\n ds.type === DataSourceTypes.Enum.file ? 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 =\n ds.type === DataSourceTypes.Enum.file ? ds.fileName : ds.url;\n try {\n if (ds.type === DataSourceTypes.Enum.file) {\n throw new Error('File data source is not supported');\n }\n const url = ds.url;\n setRoomFileProgress(fileName, {status: 'download'});\n const downloadedFile = await downloadFile(url, {\n ...(ds.type === DataSourceTypes.Enum.url && {\n method: ds.httpMethod,\n headers: ds.headers,\n }),\n onProgress: (progress: ProgressInfo) => {\n setRoomFileProgress(fileName, {\n status: 'download',\n progress,\n });\n updateTotalFileDownloadProgress();\n },\n });\n setRoomFileProgress(fileName, {status: 'done'});\n updateTotalFileDownloadProgress();\n const {db} = get();\n await db.connector.loadFile(\n new File([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 const store = useContext(RoomStateContext);\n if (!store) {\n throw new Error('Missing RoomStateProvider in the tree');\n }\n return useStore(store as unknown as StoreApi<PS>, selector);\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"]}
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} from '@sqlrooms/room-config';\nimport {DEFAULT_MOSAIC_LAYOUT} from '@sqlrooms/layout-config';\nimport {\n RoomState,\n RoomStateActions,\n RoomStateContext,\n RoomStateProps,\n createRoomSlice,\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, useContext} from 'react';\nimport {StateCreator, StoreApi, useStore} from 'zustand';\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\nexport const INITIAL_BASE_ROOM_CONFIG: BaseRoomConfig &\n DuckDbSliceConfig &\n LayoutSliceConfig = {\n title: '',\n layout: DEFAULT_MOSAIC_LAYOUT,\n description: '',\n dataSources: [],\n ...createDefaultDuckDbConfig(),\n ...createDefaultLayoutConfig(),\n};\n\nexport type RoomShellSliceStateProps<PC extends BaseRoomConfig> =\n RoomStateProps<PC> & {\n initialized: boolean;\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 CustomErrorBoundary: React.ComponentType<{\n onRetry?: () => void;\n children?: ReactNode;\n }>;\n };\n\nexport type RoomShellSliceStateActions<PC extends BaseRoomConfig> =\n RoomStateActions<PC> & {\n /**\n * Initialize the room state.\n * @returns A promise that resolves when the room state has been initialized.\n */\n initialize: () => Promise<void>;\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 removeSqlQueryDataSource(tableName: string): Promise<void>;\n areDatasetsReady(): boolean;\n\n addRoomFile(\n file: File | string,\n tableName?: string,\n loadFileOptions?: LoadFileOptions,\n ): Promise<DataTable | undefined>;\n removeRoomFile(pathname: string): 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> = RoomState<PC> & {\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<PC extends BaseRoomConfig>(\n props: InitialState<PC>,\n): 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 initialized: false,\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 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 setTaskProgress(INIT_ROOM_TASK, undefined);\n\n set((state) =>\n produce(state, (draft) => {\n draft.room.initialized = true;\n }),\n );\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 removeSqlQueryDataSource: async (tableName) => {\n const {db} = get();\n await db.dropTable(tableName);\n set((state) =>\n produce(state, (draft) => {\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) => d.tableName !== tableName,\n );\n delete draft.room.dataSourceStates[tableName];\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\n removeRoomFile(pathname) {\n set((state) =>\n produce(state, (draft) => {\n draft.room.roomFiles = draft.room.roomFiles.filter(\n (f) => f.pathname !== pathname,\n );\n draft.config.dataSources = draft.config.dataSources.filter(\n (d) =>\n d.type !== DataSourceTypes.Enum.file ||\n d.fileName !== pathname,\n );\n }),\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 switch (ds.type) {\n case DataSourceTypes.Enum.file:\n return !roomFilesProgress[ds.fileName];\n case DataSourceTypes.Enum.url:\n return !roomFilesProgress[ds.url];\n default:\n return false;\n }\n }) as (FileDataSource | UrlDataSource)[];\n\n if (filesToDownload.length > 0) {\n await downloadRoomFiles(filesToDownload);\n }\n\n const queriesToRun = pendingDataSources.filter(\n (ds) => ds.type === DataSourceTypes.Enum.sql,\n );\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 =\n ds.type === DataSourceTypes.Enum.file ? 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 =\n ds.type === DataSourceTypes.Enum.file ? ds.fileName : ds.url;\n try {\n if (ds.type === DataSourceTypes.Enum.file) {\n throw new Error('File data source is not supported');\n }\n const url = ds.url;\n setRoomFileProgress(fileName, {status: 'download'});\n const downloadedFile = await downloadFile(url, {\n ...(ds.type === DataSourceTypes.Enum.url && {\n method: ds.httpMethod,\n headers: ds.headers,\n }),\n onProgress: (progress: ProgressInfo) => {\n setRoomFileProgress(fileName, {\n status: 'download',\n progress,\n });\n updateTotalFileDownloadProgress();\n },\n });\n setRoomFileProgress(fileName, {status: 'done'});\n updateTotalFileDownloadProgress();\n const {db} = get();\n await db.connector.loadFile(\n new File([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 const store = useContext(RoomStateContext);\n if (!store) {\n throw new Error('Missing RoomStateProvider in the tree');\n }\n return useStore(store as unknown as StoreApi<PS>, selector);\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"]}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  * {@include ../README.md}
3
3
  * @packageDocumentation
4
4
  */
5
+ export { RoomShell } from './RoomShell';
5
6
  export { FileDataSourceCard } from './data-sources/FileDataSourceCard';
6
7
  export { FileDataSourcesPanel } from './data-sources/FileDataSourcesPanel';
7
8
  export { TableCard } from './data-sources/TableCard';
@@ -10,10 +11,9 @@ export { PanelHeaderButton } from './panels/RoomHeaderButton';
10
11
  export { RoomPanel } from './panels/RoomPanel';
11
12
  export { RoomPanelHeader } from './panels/RoomPanelHeader';
12
13
  export { RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
13
- export { type TaskProgress, createRoomStore } from '@sqlrooms/core';
14
- export { createRoomShellSlice, createSlice, useBaseRoomShellStore, type RoomShellSliceState, type RoomPanelInfo, } from './RoomShellStore';
14
+ export { createRoomShellSlice, createSlice, useBaseRoomShellStore, type RoomShellSliceState, } from './RoomShellStore';
15
15
  export type { StateCreator, StoreApi } from 'zustand';
16
16
  export { DataSourceStatus, type DataSourceState, type RoomFileInfo, type RoomFileState, } from './types';
17
- export * from '@sqlrooms/room-config';
18
- export { RoomShell } from './RoomShell';
17
+ export * from '@sqlrooms/room-store';
18
+ export { type RoomPanelInfo } from '@sqlrooms/layout';
19
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,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,EAAC,KAAK,YAAY,EAAE,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,KAAK,mBAAmB,EACxB,KAAK,aAAa,GACnB,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;AAGjB,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC"}
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,WAAW,EACX,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
@@ -2,6 +2,7 @@
2
2
  * {@include ../README.md}
3
3
  * @packageDocumentation
4
4
  */
5
+ export { RoomShell } from './RoomShell';
5
6
  export { FileDataSourceCard } from './data-sources/FileDataSourceCard';
6
7
  export { FileDataSourcesPanel } from './data-sources/FileDataSourcesPanel';
7
8
  export { TableCard } from './data-sources/TableCard';
@@ -10,10 +11,7 @@ export { PanelHeaderButton } from './panels/RoomHeaderButton';
10
11
  export { RoomPanel } from './panels/RoomPanel';
11
12
  export { RoomPanelHeader } from './panels/RoomPanelHeader';
12
13
  export { RoomShellSidebarButton, RoomShellSidebarButtons, SidebarButton, } from './RoomShellSidebarButtons';
13
- export { createRoomStore } from '@sqlrooms/core';
14
14
  export { createRoomShellSlice, createSlice, useBaseRoomShellStore, } from './RoomShellStore';
15
15
  export { DataSourceStatus, } from './types';
16
- // Re-export all room-config types
17
- export * from '@sqlrooms/room-config';
18
- export { RoomShell } from './RoomShell';
16
+ export * from '@sqlrooms/room-store';
19
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,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,EAAoB,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAElE,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,qBAAqB,GAGtB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,gBAAgB,GAIjB,MAAM,SAAS,CAAC;AAEjB,kCAAkC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\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 {type TaskProgress, createRoomStore} from '@sqlrooms/core';\n\nexport {\n createRoomShellSlice,\n createSlice,\n useBaseRoomShellStore,\n type RoomShellSliceState,\n type RoomPanelInfo,\n} from './RoomShellStore';\n\nexport type {StateCreator, StoreApi} from 'zustand';\n\nexport {\n DataSourceStatus,\n type DataSourceState,\n type RoomFileInfo,\n type RoomFileState,\n} from './types';\n\n// Re-export all room-config types\nexport * from '@sqlrooms/room-config';\nexport {RoomShell} from './RoomShell';\n"]}
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,WAAW,EACX,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 createSlice,\n useBaseRoomShellStore,\n type RoomShellSliceState,\n} from './RoomShellStore';\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 +1 @@
1
- {"version":3,"file":"RoomPanelHeader.d.ts","sourceRoot":"","sources":["../../src/panels/RoomPanelHeader.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,EAAE,EAAU,MAAM,OAAO,CAAC;AAIlC,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAkDA,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC"}
1
+ {"version":3,"file":"RoomPanelHeader.d.ts","sourceRoot":"","sources":["../../src/panels/RoomPanelHeader.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,EAAE,EAAU,MAAM,OAAO,CAAC;AAIlC,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAoDA,CAAC;AAEF,OAAO,EAAC,eAAe,EAAC,CAAC"}
@@ -5,10 +5,10 @@ import { useBaseRoomShellStore } from '../RoomShellStore';
5
5
  import { PanelHeaderButton } from './RoomHeaderButton';
6
6
  const RoomPanelHeader = (props) => {
7
7
  const { showHeader = true, panelKey: type, children } = props;
8
- const panels = useBaseRoomShellStore((state) => state.room.panels);
8
+ const panels = useBaseRoomShellStore((state) => state.layout.panels);
9
9
  const { icon: Icon, title } = panels[type] ?? {};
10
- const togglePanel = useBaseRoomShellStore((state) => state.room.togglePanel);
11
- const togglePanelPin = useBaseRoomShellStore((state) => state.room.togglePanelPin);
10
+ const togglePanel = useBaseRoomShellStore((state) => state.layout.togglePanel);
11
+ const togglePanelPin = useBaseRoomShellStore((state) => state.layout.togglePanelPin);
12
12
  const pinnedPanels = useBaseRoomShellStore((state) => state.config.layout.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}"` })] })] }));
@@ -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,IAAI,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC7E,MAAM,cAAc,GAAG,qBAAqB,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CACrC,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 '../RoomShellStore';\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.room.panels);\n const {icon: Icon, title} = panels[type] ?? {};\n const togglePanel = useBaseRoomShellStore((state) => state.room.togglePanel);\n const togglePanelPin = useBaseRoomShellStore(\n (state) => state.room.togglePanelPin,\n );\n const pinnedPanels = useBaseRoomShellStore(\n (state) => state.config.layout.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"]}
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 '../RoomShellStore';\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.config.layout.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.18.0",
3
+ "version": "0.19.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "module": "dist/index.js",
@@ -25,13 +25,14 @@
25
25
  "typedoc": "typedoc"
26
26
  },
27
27
  "dependencies": {
28
- "@sqlrooms/core": "0.18.0",
29
- "@sqlrooms/data-table": "0.18.0",
30
- "@sqlrooms/duckdb": "0.18.0",
31
- "@sqlrooms/layout": "0.18.0",
32
- "@sqlrooms/room-config": "0.18.0",
33
- "@sqlrooms/ui": "0.18.0",
34
- "@sqlrooms/utils": "0.18.0",
28
+ "@sqlrooms/data-table": "0.19.0",
29
+ "@sqlrooms/duckdb": "0.19.0",
30
+ "@sqlrooms/layout": "0.19.0",
31
+ "@sqlrooms/layout-config": "0.19.0",
32
+ "@sqlrooms/room-config": "0.19.0",
33
+ "@sqlrooms/room-store": "0.19.0",
34
+ "@sqlrooms/ui": "0.19.0",
35
+ "@sqlrooms/utils": "0.19.0",
35
36
  "apache-arrow": "17.0.0",
36
37
  "immer": "^10.1.1",
37
38
  "lucide-react": "^0.474.0",
@@ -42,5 +43,5 @@
42
43
  "peerDependencies": {
43
44
  "react": ">=18"
44
45
  },
45
- "gitHead": "c1c06c9549ca74b9d4f515f6667b77d3196652df"
46
+ "gitHead": "ba6000f1e06d3ab01e309d805b5d187b32c9ff06"
46
47
  }