Skip to content

Commit 39e0054

Browse files
authored
Merge pull request #236 from outerbase/develop
deployment 2025-01-10
2 parents 9f6834e + 0decc76 commit 39e0054

File tree

16 files changed

+253
-41
lines changed

16 files changed

+253
-41
lines changed

package-lock.json

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/app/(theme)/connect/connection-string-input.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
} from "./saved-connection-storage";
77
import { Input } from "@/components/ui/input";
88
import FileHandlerPicker from "@/components/filehandler-picker";
9+
import { CommonDialogProvider } from "@/components/common-dialog";
910

1011
export default function ConnectionStringInput({
1112
value,
@@ -68,12 +69,14 @@ export default function ConnectionStringInput({
6869
);
6970
} else if (field.type === "filehandler") {
7071
inputDom = (
71-
<FileHandlerPicker
72-
value={value[field.name]}
73-
onChange={(fileId) => {
74-
onChange({ ...value, [field.name]: fileId });
75-
}}
76-
/>
72+
<CommonDialogProvider>
73+
<FileHandlerPicker
74+
value={value[field.name]}
75+
onChange={(fileId) => {
76+
onChange({ ...value, [field.name]: fileId });
77+
}}
78+
/>
79+
</CommonDialogProvider>
7780
);
7881
}
7982

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"use client";
2+
import { Studio } from "@/components/gui/studio";
3+
import { IframeSQLiteDriver } from "@/drivers/iframe-driver";
4+
import { useSearchParams } from "next/navigation";
5+
import { useEffect, useMemo } from "react";
6+
7+
export default function EmbedPageClient() {
8+
const searchParams = useSearchParams();
9+
10+
const driver = useMemo(
11+
() =>
12+
new IframeSQLiteDriver({
13+
supportPragmaList: false,
14+
supportBigInt: true,
15+
}),
16+
[]
17+
);
18+
19+
useEffect(() => {
20+
return driver.listen();
21+
}, [driver]);
22+
23+
return (
24+
<Studio
25+
driver={driver}
26+
name={searchParams.get("name") || "Unnamed Connection"}
27+
color={searchParams.get("color") || "gray"}
28+
/>
29+
);
30+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { createEmbedPage } from "../embed-page";
2+
import EmbedPageClient from "./page-client";
3+
4+
export default createEmbedPage(() => <EmbedPageClient />);

src/app/(theme)/playground/client/page-client.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
DropdownMenuSeparator,
1818
} from "@/components/ui/dropdown-menu";
1919
import { Button } from "@/components/ui/button";
20+
import { CommonDialogProvider } from "@/components/common-dialog";
2021

2122
function OverlayAround({
2223
x,
@@ -324,10 +325,12 @@ export default function PlaygroundEditorBody({
324325

325326
return (
326327
<>
327-
<Script src="/sqljs/sql-wasm.js" onReady={onReady} />
328-
<ScreenDropZone onFileDrop={setHandler} />
329-
<Onboarding />
330-
{dom}
328+
<CommonDialogProvider>
329+
<Script src="/sqljs/sql-wasm.js" onReady={onReady} />
330+
<ScreenDropZone onFileDrop={setHandler} />
331+
<Onboarding />
332+
{dom}
333+
</CommonDialogProvider>
331334
</>
332335
);
333336
}

src/app/api/events/route.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export async function OPTIONS() {
2626
headers: {
2727
"Access-Control-Allow-Origin": "*",
2828
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
29-
"Access-Control-Allow-Headers": "Content-Type, Authorization, x-ob-id",
29+
"Access-Control-Allow-Headers": "Content-Type, Authorization, x-od-id",
3030
},
3131
});
3232
}
@@ -61,7 +61,16 @@ export const POST = async (req: NextRequest) => {
6161
.catch();
6262
});
6363

64-
return NextResponse.json({
65-
success: true,
66-
});
64+
return NextResponse.json(
65+
{
66+
success: true,
67+
},
68+
{
69+
headers: {
70+
"Access-Control-Allow-Origin": "*",
71+
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
72+
"Access-Control-Allow-Headers": "Content-Type, Authorization, x-od-id",
73+
},
74+
}
75+
);
6776
};

src/components/filehandler-picker.tsx

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { localDb } from "@/indexdb";
44
import { LucideFile, LucideFolderClosed } from "lucide-react";
55
import { cn } from "@/lib/utils";
66
import { SavedConnectionLocalStorage } from "@/app/(theme)/connect/saved-connection-storage";
7+
import { unsupportFileHandlerDialogContent } from "./screen-dropzone";
8+
import { useCommonDialog } from "./common-dialog";
79

810
/**
911
* Cleanup file handler from indexdb database when
@@ -64,6 +66,7 @@ export default function FileHandlerPicker({
6466
onChange: (file: string) => void;
6567
}) {
6668
const [handler, setHandler] = useState<FileSystemHandle>();
69+
const { showDialog } = useCommonDialog();
6770

6871
useEffect(() => {
6972
if (value) {
@@ -76,11 +79,17 @@ export default function FileHandlerPicker({
7679
}, [value]);
7780

7881
const onChangeFile = useCallback(() => {
79-
cleanupFileHandler()
80-
.then(openFileHandler)
81-
.then(onChange)
82-
.catch(console.error);
83-
}, [onChange]);
82+
try {
83+
cleanupFileHandler()
84+
.then(openFileHandler)
85+
.then(onChange)
86+
.catch(() => {
87+
showDialog(unsupportFileHandlerDialogContent);
88+
});
89+
} catch {
90+
showDialog(unsupportFileHandlerDialogContent);
91+
}
92+
}, [onChange, showDialog]);
8493

8594
if (handler) {
8695
return (

src/components/gui/schema-editor/column-type-selector.tsx

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,22 @@ export default function ColumnTypeSelector({
9898
{
9999
return {
100100
...group,
101-
suggestions: group.suggestions.filter((type) => {
102-
return type.name.toLowerCase().startsWith(parsedType.toLowerCase());
103-
}),
101+
suggestions: group.suggestions
102+
.filter((type) => {
103+
return (
104+
type.name.toLowerCase().startsWith(parsedType.toLowerCase()) &&
105+
type.name !== "uuid"
106+
);
107+
})
108+
.map((x) => {
109+
if (["enum", "set"].includes(x.name)) {
110+
return {
111+
...x,
112+
parameters: [{ name: "", default: "'Y','N'" }],
113+
};
114+
}
115+
return x;
116+
}),
104117
};
105118
}
106119
})

src/components/gui/schema-editor/schema-editor-column-list.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,16 @@ function ColumnItemType({
110110
databaseDriver.columnTypeSelector.type === "dropdown" &&
111111
databaseDriver.columnTypeSelector.dropdownOptions
112112
) {
113+
const normalizedValue = databaseDriver.columnTypeSelector.dropdownNormalized
114+
? databaseDriver.columnTypeSelector.dropdownNormalized(value) || value
115+
: value;
116+
113117
return (
114-
<Select value={value} onValueChange={onChange} disabled={disabled}>
118+
<Select
119+
value={normalizedValue}
120+
onValueChange={onChange}
121+
disabled={disabled}
122+
>
115123
<SelectTrigger className="bg-inherit border-0 rounded-none shadow-none text-sm">
116124
<SelectValue placeholder="Select datatype" />
117125
</SelectTrigger>

src/components/gui/sidebar-tab.tsx

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useConfig } from "@/context/config-provider";
22
import { useTheme } from "@/context/theme-provider";
33
import { cn } from "@/lib/utils";
4-
import { ReactElement, useState } from "react";
4+
import { ReactElement, useMemo, useState } from "react";
55
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip";
66
import Link from "next/link";
77
import {
@@ -35,8 +35,38 @@ export default function SidebarTab({ tabs }: Readonly<SidebarTabProps>) {
3535

3636
const config = useConfig();
3737

38+
/**
39+
* Adding color to help identify the database.
40+
* Some people have multiple databases open at the same time.
41+
* This will help them identify the database they are working on.
42+
*
43+
* https://github.com/outerbase/studio/issues/234
44+
*/
45+
const databaseColorIndicatorClassName = useMemo(() => {
46+
if (config.color === "red") {
47+
return `border-l-8 border-red-400 dark:border-red-800`;
48+
} else if (config.color === "blue") {
49+
return `border-l-8 border-blue-400 dark:border-blue-800`;
50+
} else if (config.color === "green") {
51+
return `border-l-8 border-green-400 dark:border-green-800`;
52+
} else if (config.color === "yellow") {
53+
return `border-l-8 border-yellow-400 dark:border-yellow-800`;
54+
} else if (config.color === "purple") {
55+
return `border-l-8 border-purple-400 dark:border-purple-800`;
56+
} else if (config.color === "gray") {
57+
return `border-l-8 border-gray-400 dark:border-gray-800`;
58+
}
59+
60+
return "";
61+
}, [config.color]);
62+
3863
return (
39-
<div className={cn("flex h-full bg-neutral-50 dark:bg-neutral-950")}>
64+
<div
65+
className={cn(
66+
"flex h-full bg-neutral-50 dark:bg-neutral-950",
67+
databaseColorIndicatorClassName
68+
)}
69+
>
4070
<div className={cn("shrink-0")}>
4171
<div className="flex flex-col border-r border-neutral-200 dark:border-neutral-800 h-full p-3 gap-4">
4272
<DropdownMenu modal={false}>

0 commit comments

Comments
 (0)