diff --git a/packages/frontend/src/stdlib/analyses.tsx b/packages/frontend/src/stdlib/analyses.tsx index 38b19a6a0..2bb74794c 100644 --- a/packages/frontend/src/stdlib/analyses.tsx +++ b/packages/frontend/src/stdlib/analyses.tsx @@ -358,7 +358,7 @@ export function renderSQL( help, component: (props) => , initialContent: () => ({ - backend: SQLBackend.MySQL, + backend: SQLBackend.PostgresSQL, filename: "schema.sql", }), }; diff --git a/packages/frontend/src/stdlib/analyses/sql.tsx b/packages/frontend/src/stdlib/analyses/sql.tsx index 0ae68af1c..0017765a8 100644 --- a/packages/frontend/src/stdlib/analyses/sql.tsx +++ b/packages/frontend/src/stdlib/analyses/sql.tsx @@ -2,10 +2,15 @@ import download from "js-file-download"; import CircleHelp from "lucide-solid/icons/circle-help"; import Copy from "lucide-solid/icons/copy"; import Download from "lucide-solid/icons/download"; -import { For, Match, Show, Switch } from "solid-js"; +import { useContext, For, Match, Show, Switch } from "solid-js"; +import { createMemo, createEffect } from "solid-js"; +import invariant from "tiny-invariant"; import { BlockTitle, ErrorAlert, IconButton } from "catcolab-ui-components"; +import { elaborateModel, DblModelMap } from "catlog-wasm"; import type { ModelAnalysisProps } from "../../analysis"; +import { type ModelLibrary, ModelLibraryContext } from "../../model"; +import { getConfig } from "../../user/documents"; import * as SQL from "./sql_types.ts"; const copyToClipboard = (text: string) => navigator.clipboard.writeText(text); @@ -67,6 +72,25 @@ export default function SQLSchemaAnalysis( title: string; }, ) { + + const configDoc = getConfig(); + const models = useContext(ModelLibraryContext); + const otherModel = models?.useElaboratedModel(() => configDoc[0].refId); + + const sqlBackend = createMemo(() => { + const entry = otherModel(); + if (entry?.validatedModel.tag === "Valid") { + const gen = entry.validatedModel.model + .presentation() + .obGenerators.find((ob) => ob.label.includes("SQLBackend")); + if (!gen) return undefined; + const mor = entry.validatedModel.model + .presentation() + .morGenerators.find((m) => m.dom.content === gen.id); + return mor?.label?.join(".") as SQL.SQLBackend | undefined; + } + }); + const sql_script = () => { const model = props.liveModel.elaboratedModel(); if (model) { @@ -74,6 +98,15 @@ export default function SQLSchemaAnalysis( } }; + createEffect(() => { + const configBackend = sqlBackend(); + if (configBackend) { + props.changeContent((content) => { + content.backend = configBackend as SQL.SQLBackend; + }); + } + }); + const BackendConfig = () => (
Backend: diff --git a/packages/frontend/src/user/documents.tsx b/packages/frontend/src/user/documents.tsx index f5ce6a569..42fb91145 100644 --- a/packages/frontend/src/user/documents.tsx +++ b/packages/frontend/src/user/documents.tsx @@ -109,3 +109,15 @@ function DeleteButton(props: { doc: DocInfo & { refId: string } }) {
); } + +export function getConfig() { + const userState = useUserState(); + const config = createMemo(() => + filterDocuments(userState.documents, { + query: "config", + deleted: false, + }), + ); + + return config(); +}