diff --git a/.eslintrc.cjs b/.eslintrc.cjs index d6c9537..a146c92 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -2,17 +2,18 @@ module.exports = { root: true, env: { browser: true, es2020: true }, extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parser: "@typescript-eslint/parser", + plugins: ["react-refresh"], rules: { - 'react-refresh/only-export-components': [ - 'warn', + "react-refresh/only-export-components": [ + "warn", { allowConstantExport: true }, ], + "@typescript-eslint/no-explicit-any": "off", }, -} +}; diff --git a/src/modules/editor/QueryEditor.tsx b/src/modules/editor/QueryEditor.tsx index f622a80..c4684e6 100644 --- a/src/modules/editor/QueryEditor.tsx +++ b/src/modules/editor/QueryEditor.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef } from "react"; import { EditorView, basicSetup } from "codemirror"; import { sql } from "@codemirror/lang-sql"; -import { resultStore } from "./data/store"; +import { resultStore } from "./data/resultStore"; const QueryEditor = () => { const editorRef = useRef(null); diff --git a/src/modules/editor/Results.tsx b/src/modules/editor/Results.tsx index 581d3a6..fbe7a72 100644 --- a/src/modules/editor/Results.tsx +++ b/src/modules/editor/Results.tsx @@ -9,7 +9,7 @@ import { TableRow, } from "@/components/table"; -import { useResultStore } from "./data/store"; +import { useResultStore } from "./data/resultStore"; const Results = () => { const [state] = useResultStore(); @@ -18,7 +18,7 @@ const Results = () => { if (state.isLoading) { return (
- +
); } diff --git a/src/modules/editor/Sidebar.tsx b/src/modules/editor/Sidebar.tsx index 2cbdadb..d45272a 100644 --- a/src/modules/editor/Sidebar.tsx +++ b/src/modules/editor/Sidebar.tsx @@ -1,15 +1,13 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/tabs"; -import { useSetResultStore, useSqlStore } from "./data/store"; +import SavedQueries from "./tabs/SavedQueries"; +import SchemaTable from "./tabs/SchemaTable"; const Sidebar = () => { - const { state } = useSqlStore(); - const setResultState = useSetResultStore(); - return (
SQL Editor
- +
Saved @@ -20,31 +18,14 @@ const Sidebar = () => { value="saved" className="h-[calc(100%-85px)] overflow-y-auto" > - {state.saved.map((query) => ( -
{ - setResultState({ - pendingQuery: query.query, - queryName: query.name, - }); - - const event = new CustomEvent("query", { - detail: { - pendingQuery: query.query, - queryName: query.name, - }, - }); - - window.dispatchEvent(event); - }} - > - {query.name} -
- ))} + + + + - Change your password here.
); diff --git a/src/modules/editor/components/Header.tsx b/src/modules/editor/components/Header.tsx index 2b6a5d3..e73896b 100644 --- a/src/modules/editor/components/Header.tsx +++ b/src/modules/editor/components/Header.tsx @@ -4,7 +4,7 @@ import memoize from "memoize"; import { Button } from "@/components/button"; import { respository } from "@/db/respository"; -import { ResultState, resultStore, useResultStore } from "../data/store"; +import { ResultState, resultStore, useResultStore } from "../data/resultStore"; const counter = (state: ResultState) => { return { diff --git a/src/modules/editor/data/store.ts b/src/modules/editor/data/resultStore.ts similarity index 53% rename from src/modules/editor/data/store.ts rename to src/modules/editor/data/resultStore.ts index 4838406..eaaa314 100644 --- a/src/modules/editor/data/store.ts +++ b/src/modules/editor/data/resultStore.ts @@ -1,41 +1,5 @@ -import { useSyncExternalStore } from "react"; - import { createStore, useStore } from "@/core/store"; -export const sqlStore = createStore({ - saved: [ - { - id: "1", - name: "Select Books", - query: "SELECT * FROM books;", - }, - { - id: "2", - name: "Select Authors", - query: "SELECT * FROM authors;", - }, - { - id: "3", - name: "Insert Authors", - query: "Insert into authors (first_name,last_name) values ('Madhu','R');", - }, - ], -}); - -export const useSqlStore = () => { - const state = useSyncExternalStore( - (cb) => { - return sqlStore.subscribe(cb); - }, - () => sqlStore.getState() - ); - - return { - state, - setState: sqlStore.setState, - }; -}; - export type ResultState = { data: Record[] | string; isLoading: boolean; diff --git a/src/modules/editor/data/sqlStore.ts b/src/modules/editor/data/sqlStore.ts new file mode 100644 index 0000000..44d3ff7 --- /dev/null +++ b/src/modules/editor/data/sqlStore.ts @@ -0,0 +1,33 @@ +import { createStore, useStore } from "@/core/store"; + +export type SqlState = { + saved: { + id: string; + name: string; + query: string; + }[]; +}; + +export const sqlStore = createStore({ + saved: [ + { + id: "1", + name: "Select Books", + query: "SELECT * FROM books;", + }, + { + id: "2", + name: "Select Authors", + query: "SELECT * FROM authors;", + }, + { + id: "3", + name: "Insert Authors", + query: "Insert into authors (first_name,last_name) values ('Madhu','R');", + }, + ], +}); + +export const useSqlStore = () => { + return useStore(sqlStore); +}; diff --git a/src/modules/editor/data/useSchema.ts b/src/modules/editor/data/useSchema.ts new file mode 100644 index 0000000..303be66 --- /dev/null +++ b/src/modules/editor/data/useSchema.ts @@ -0,0 +1,25 @@ +import alasql from "alasql"; + +import { tableSchemas } from "@/db/seed"; + +type SchemaState = { + columns: { + columnid: string; + dbtypeid: string; + }[]; + table: { + tableid: string; + }; +}; + +type Result = ReturnType & { + statements: SchemaState[]; +}; + +export const useSchema = () => { + const result = alasql.parse(tableSchemas.create.join(";")) as Result; + + const state = result.statements as SchemaState[]; + + return state; +}; diff --git a/src/modules/editor/index.tsx b/src/modules/editor/index.tsx index e2b5c67..c2f268d 100644 --- a/src/modules/editor/index.tsx +++ b/src/modules/editor/index.tsx @@ -1,4 +1,6 @@ -import { lazy } from "react"; +import { Suspense, lazy } from "react"; +import { Loader2 } from "lucide-react"; + import Results from "./Results"; import Sidebar from "./Sidebar"; import Header from "./components/Header"; @@ -12,7 +14,15 @@ const Layout = () => {
- + + +
+ } + > + +
diff --git a/src/modules/editor/tabs/SavedQueries.tsx b/src/modules/editor/tabs/SavedQueries.tsx new file mode 100644 index 0000000..44fce78 --- /dev/null +++ b/src/modules/editor/tabs/SavedQueries.tsx @@ -0,0 +1,37 @@ +import { useSetResultStore } from "../data/resultStore"; +import { useSqlStore } from "../data/sqlStore"; + +const SavedQueries = () => { + const [state] = useSqlStore(); + const setResultState = useSetResultStore(); + + return ( +
+ {state.saved.map((query) => ( +
{ + setResultState({ + pendingQuery: query.query, + queryName: query.name, + }); + + const event = new CustomEvent("query", { + detail: { + pendingQuery: query.query, + queryName: query.name, + }, + }); + + window.dispatchEvent(event); + }} + > + {query.name} +
+ ))} +
+ ); +}; + +export default SavedQueries; diff --git a/src/modules/editor/tabs/SchemaTable.tsx b/src/modules/editor/tabs/SchemaTable.tsx new file mode 100644 index 0000000..7a38623 --- /dev/null +++ b/src/modules/editor/tabs/SchemaTable.tsx @@ -0,0 +1,40 @@ +import { useSchema } from "../data/useSchema"; + +const SchemaTable = () => { + const statements = useSchema(); + + return ( +
+ {statements.map((statement) => { + return ( +
+
+ + {statement.table.tableid} + +
    + {statement.columns.map((column) => { + return ( +
  • + + {column.columnid} + + + {column.dbtypeid} + +
  • + ); + })} +
+
+
+ ); + })} +
+ ); +}; + +export default SchemaTable;