@rebasepro/studio 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +17 -109
- package/dist/{ApiExplorer-DHVmWYfK.js → ApiExplorer-BmcdhAX0.js} +3 -4
- package/dist/ApiExplorer-BmcdhAX0.js.map +1 -0
- package/dist/{AuthSimulationSelector-CM488Eei.js → AuthSimulationSelector-DGoXkWSg.js} +2 -3
- package/dist/AuthSimulationSelector-DGoXkWSg.js.map +1 -0
- package/dist/{BranchesView-DcHZtvXo.js → BranchesView-BiTEwIhd.js} +2 -3
- package/dist/BranchesView-BiTEwIhd.js.map +1 -0
- package/dist/{CronJobsView-CijCToeK.js → CronJobsView-CNfz0etw.js} +2 -3
- package/dist/CronJobsView-CNfz0etw.js.map +1 -0
- package/dist/{JSEditor-CSHA0t_O.js → JSEditor-Ch8z8lJ4.js} +4 -5
- package/dist/JSEditor-Ch8z8lJ4.js.map +1 -0
- package/dist/{RLSEditor-BzDjqo6w.js → RLSEditor-CHEExeSB.js} +2 -3
- package/dist/RLSEditor-CHEExeSB.js.map +1 -0
- package/dist/{SQLEditor-Cr9Kg_Qg.js → SQLEditor-BELYJQRP.js} +75 -58
- package/dist/SQLEditor-BELYJQRP.js.map +1 -0
- package/dist/{StorageView-BYoslzBR.js → StorageView-B7AsN2qX.js} +2 -3
- package/dist/StorageView-B7AsN2qX.js.map +1 -0
- package/dist/common/src/util/entities.d.ts +2 -2
- package/dist/common/src/util/relations.d.ts +1 -1
- package/dist/core/src/components/LoginView/LoginView.d.ts +1 -6
- package/dist/core/src/contexts/SnackbarProvider.d.ts +1 -1
- package/dist/core/src/hooks/data/save.d.ts +2 -2
- package/dist/core/src/hooks/data/useEntityFetch.d.ts +5 -0
- package/dist/core/src/hooks/useResolvedComponent.d.ts +1 -1
- package/dist/index.es.js +8 -9
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +168 -150
- package/dist/index.umd.js.map +1 -1
- package/dist/types/src/controllers/auth.d.ts +9 -8
- package/dist/types/src/controllers/client.d.ts +3 -0
- package/dist/types/src/types/auth_adapter.d.ts +356 -0
- package/dist/types/src/types/collections.d.ts +67 -2
- package/dist/types/src/types/database_adapter.d.ts +94 -0
- package/dist/types/src/types/entity_actions.d.ts +7 -1
- package/dist/types/src/types/entity_callbacks.d.ts +1 -1
- package/dist/types/src/types/entity_views.d.ts +36 -1
- package/dist/types/src/types/index.d.ts +2 -0
- package/dist/types/src/types/plugins.d.ts +1 -1
- package/dist/types/src/types/properties.d.ts +24 -5
- package/dist/types/src/types/property_config.d.ts +6 -2
- package/dist/types/src/types/relations.d.ts +1 -1
- package/dist/types/src/types/translations.d.ts +8 -0
- package/dist/types/src/users/user.d.ts +5 -0
- package/dist/ui/src/components/FilterChip.d.ts +42 -0
- package/dist/ui/src/components/index.d.ts +5 -0
- package/dist/ui/src/icons/index.d.ts +2 -0
- package/package.json +21 -18
- package/src/components/ApiExplorer/ApiExplorer.tsx +1 -1
- package/src/components/ApiExplorer/EndpointDetail.tsx +10 -2
- package/src/components/ApiExplorer/TryItPanel.tsx +17 -6
- package/src/components/AuthSimulationSelector.tsx +1 -2
- package/src/components/Branches/BranchesView.tsx +24 -2
- package/src/components/CronJobs/CronJobsView.tsx +19 -2
- package/src/components/JSEditor/JSEditor.tsx +37 -6
- package/src/components/JSEditor/JSEditorSidebar.tsx +12 -2
- package/src/components/JSEditor/JSMonacoEditor.tsx +16 -3
- package/src/components/RLSEditor/PolicyEditor.tsx +19 -2
- package/src/components/RLSEditor/RLSEditor.tsx +22 -2
- package/src/components/SQLEditor/SQLEditor.tsx +124 -68
- package/src/components/SQLEditor/SQLEditorSidebar.tsx +1 -2
- package/src/components/SQLEditor/SchemaBrowser.tsx +14 -2
- package/src/components/StorageView/StorageView.tsx +39 -2
- package/src/components/StudioHomePage.tsx +1 -2
- package/src/utils/sql_utils.ts +1 -1
- package/dist/ApiExplorer-DHVmWYfK.js.map +0 -1
- package/dist/AuthSimulationSelector-CM488Eei.js.map +0 -1
- package/dist/BranchesView-DcHZtvXo.js.map +0 -1
- package/dist/CronJobsView-CijCToeK.js.map +0 -1
- package/dist/JSEditor-CSHA0t_O.js.map +0 -1
- package/dist/RLSEditor-BzDjqo6w.js.map +0 -1
- package/dist/SQLEditor-Cr9Kg_Qg.js.map +0 -1
- package/dist/StorageView-BYoslzBR.js.map +0 -1
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { c } from "react-compiler-runtime";
|
|
3
3
|
import { useTranslation, ErrorView, useRebaseContext, useStudioSideEntityController, useSnackbarController, useStudioCollectionRegistry, ConfirmationDialog, IconForView } from "@rebasepro/core";
|
|
4
|
-
import { useState, useRef, useCallback, useEffect } from "react";
|
|
4
|
+
import { useState, useMemo, useRef, useCallback, useEffect } from "react";
|
|
5
5
|
import { createPortal } from "react-dom";
|
|
6
|
-
import { CircularProgress, Typography, IconButton, iconSize, cls, defaultBorderMixin, Menu, MenuItem, Button, Tabs, Tab, Collapse, ResizablePanels, Tooltip, Checkbox, Dialog, DialogTitle, DialogContent, TextField, DialogActions, VirtualTable, TextareaAutosize } from "@rebasepro/ui";
|
|
7
|
-
import { RefreshCwIcon, CopyIcon, MoreVerticalIcon, Trash2Icon, TerminalIcon, XIcon, PlusIcon, MenuIcon, DatabaseIcon, PlayIcon, PencilIcon } from "lucide-react";
|
|
6
|
+
import { CircularProgress, Typography, IconButton, RefreshCwIcon, iconSize, cls, defaultBorderMixin, CopyIcon, Menu, MenuItem, MoreVerticalIcon, Button, Tabs, Tab, Trash2Icon, Collapse, ResizablePanels, TerminalIcon, XIcon, PlusIcon, Tooltip, MenuIcon, Checkbox, DatabaseIcon, PlayIcon, Dialog, DialogTitle, DialogContent, TextField, DialogActions, VirtualTable, PencilIcon, TextareaAutosize } from "@rebasepro/ui";
|
|
8
7
|
import { M as MonacoEditor } from "./MonacoEditor-CMYEjiRf.js";
|
|
9
8
|
import { parseFirst } from "pgsql-ast-parser";
|
|
10
9
|
import { toSnakeCase } from "@rebasepro/utils";
|
|
@@ -698,14 +697,6 @@ const ExplainVisualizer = (t0) => {
|
|
|
698
697
|
function _temp$1(childPlan, idx) {
|
|
699
698
|
return /* @__PURE__ */ jsx(ExplainVisualizer, { plan: childPlan, isRoot: false }, idx);
|
|
700
699
|
}
|
|
701
|
-
let VirtualTableInput = null;
|
|
702
|
-
try {
|
|
703
|
-
const cms = require("@rebasepro/admin");
|
|
704
|
-
VirtualTableInput = cms.VirtualTableInput;
|
|
705
|
-
} catch {
|
|
706
|
-
}
|
|
707
|
-
const STORAGE_KEY_TABS = "rebase_sql_tabs";
|
|
708
|
-
const STORAGE_KEY_ACTIVE_TAB = "rebase_sql_active_tab";
|
|
709
700
|
const FixedEditorOverlay = (t0) => {
|
|
710
701
|
const $ = c(26);
|
|
711
702
|
const {
|
|
@@ -863,9 +854,14 @@ const FixedEditorOverlay = (t0) => {
|
|
|
863
854
|
}
|
|
864
855
|
return t13;
|
|
865
856
|
};
|
|
857
|
+
const getStoragePrefix = (baseUrl) => {
|
|
858
|
+
if (!baseUrl) return "default";
|
|
859
|
+
return baseUrl.replace(/^https?:\/\//, "").replace(/[^a-zA-Z0-9]/g, "_");
|
|
860
|
+
};
|
|
866
861
|
const SQLEditor = () => {
|
|
867
862
|
const {
|
|
868
|
-
databaseAdmin
|
|
863
|
+
databaseAdmin,
|
|
864
|
+
client
|
|
869
865
|
} = useRebaseContext();
|
|
870
866
|
const sideEntityController = useStudioSideEntityController();
|
|
871
867
|
const snackbarController = useSnackbarController();
|
|
@@ -873,22 +869,26 @@ const SQLEditor = () => {
|
|
|
873
869
|
const {
|
|
874
870
|
t
|
|
875
871
|
} = useTranslation();
|
|
872
|
+
const projectPrefix = useMemo(() => getStoragePrefix(client?.baseUrl), [client?.baseUrl]);
|
|
876
873
|
const [schemas, setSchemas] = useState({});
|
|
877
874
|
const [isSchemaLoading, setIsSchemaLoading] = useState(true);
|
|
878
875
|
const schemaFetchedRef = useRef(false);
|
|
879
876
|
const [schemaError, setSchemaError] = useState(null);
|
|
880
877
|
const [selectedDatabase, setSelectedDatabase] = useState(() => {
|
|
881
|
-
|
|
878
|
+
const projectPrefixSync = client?.baseUrl ? client.baseUrl.replace(/^https?:\/\//, "").replace(/[^a-zA-Z0-9]/g, "_") : "default";
|
|
879
|
+
return localStorage.getItem(`rebase_sql_selected_db_${projectPrefixSync}`) || void 0;
|
|
882
880
|
});
|
|
883
881
|
const [selectedRole, setSelectedRole] = useState(() => {
|
|
884
|
-
|
|
882
|
+
const projectPrefixSync_0 = client?.baseUrl ? client.baseUrl.replace(/^https?:\/\//, "").replace(/[^a-zA-Z0-9]/g, "_") : "default";
|
|
883
|
+
return localStorage.getItem(`rebase_sql_selected_role_${projectPrefixSync_0}`) || void 0;
|
|
885
884
|
});
|
|
886
885
|
const [availableDatabases, setAvailableDatabases] = useState([]);
|
|
887
886
|
const [availableRoles, setAvailableRoles] = useState([]);
|
|
888
887
|
const [isLoadingConfig, setIsLoadingConfig] = useState(true);
|
|
889
888
|
const [connectionConfigError, setConnectionConfigError] = useState(null);
|
|
890
889
|
const [tabs, setTabs] = useState(() => {
|
|
891
|
-
const
|
|
890
|
+
const projectPrefixSync_1 = client?.baseUrl ? client.baseUrl.replace(/^https?:\/\//, "").replace(/[^a-zA-Z0-9]/g, "_") : "default";
|
|
891
|
+
const saved = localStorage.getItem(`rebase_sql_tabs_${projectPrefixSync_1}`);
|
|
892
892
|
if (saved) {
|
|
893
893
|
const parsed = JSON.parse(saved);
|
|
894
894
|
return parsed.map((t_0) => ({
|
|
@@ -904,8 +904,8 @@ const SQLEditor = () => {
|
|
|
904
904
|
id: "1",
|
|
905
905
|
name: "Query 1",
|
|
906
906
|
sql: "SELECT * FROM ",
|
|
907
|
-
database: localStorage.getItem(
|
|
908
|
-
role: localStorage.getItem(
|
|
907
|
+
database: localStorage.getItem(`rebase_sql_selected_db_${projectPrefixSync_1}`) || void 0,
|
|
908
|
+
role: localStorage.getItem(`rebase_sql_selected_role_${projectPrefixSync_1}`) || void 0,
|
|
909
909
|
results: null,
|
|
910
910
|
loading: false,
|
|
911
911
|
error: null,
|
|
@@ -914,7 +914,8 @@ const SQLEditor = () => {
|
|
|
914
914
|
}];
|
|
915
915
|
});
|
|
916
916
|
const [activeTabId, setActiveTabId] = useState(() => {
|
|
917
|
-
|
|
917
|
+
const projectPrefixSync_2 = client?.baseUrl ? client.baseUrl.replace(/^https?:\/\//, "").replace(/[^a-zA-Z0-9]/g, "_") : "default";
|
|
918
|
+
return localStorage.getItem(`rebase_sql_active_tab_${projectPrefixSync_2}`) || "1";
|
|
918
919
|
});
|
|
919
920
|
const activeTab = tabs.find((t_1) => t_1.id === activeTabId) || tabs[0];
|
|
920
921
|
const updateActiveTab = useCallback((update) => {
|
|
@@ -934,22 +935,22 @@ const SQLEditor = () => {
|
|
|
934
935
|
useEffect(() => {
|
|
935
936
|
let mounted = true;
|
|
936
937
|
const fetchConnectionConfig = async () => {
|
|
937
|
-
if (!databaseAdmin?.fetchAvailableDatabases || !databaseAdmin?.fetchAvailableRoles) {
|
|
938
|
+
if (!databaseAdmin?.fetchAvailableDatabases || !databaseAdmin?.fetchAvailableRoles || !databaseAdmin?.executeSql) {
|
|
938
939
|
setConnectionConfigError(t("studio_sql_sql_not_supported"));
|
|
939
940
|
setIsLoadingConfig(false);
|
|
940
941
|
return;
|
|
941
942
|
}
|
|
942
943
|
try {
|
|
943
|
-
const [dbs, roles, currentDbFromApi] = await Promise.all([databaseAdmin.fetchAvailableDatabases(), databaseAdmin.fetchAvailableRoles(), typeof databaseAdmin?.fetchCurrentDatabase === "function" ? databaseAdmin.fetchCurrentDatabase() : Promise.resolve(void 0)]);
|
|
944
|
+
const [dbs, roles, currentDbFromApi, currentUserResult] = await Promise.all([databaseAdmin.fetchAvailableDatabases(), databaseAdmin.fetchAvailableRoles(), typeof databaseAdmin?.fetchCurrentDatabase === "function" ? databaseAdmin.fetchCurrentDatabase() : Promise.resolve(void 0), databaseAdmin.executeSql("SELECT current_user AS role").catch(() => [])]);
|
|
944
945
|
if (mounted) {
|
|
945
946
|
setAvailableDatabases(dbs);
|
|
946
947
|
setAvailableRoles(roles);
|
|
947
|
-
const loadedDb = localStorage.getItem(
|
|
948
|
-
const loadedRole = localStorage.getItem(
|
|
949
|
-
const initialActiveTabId = localStorage.getItem(
|
|
948
|
+
const loadedDb = localStorage.getItem(`rebase_sql_selected_db_${projectPrefix}`) || void 0;
|
|
949
|
+
const loadedRole = localStorage.getItem(`rebase_sql_selected_role_${projectPrefix}`) || void 0;
|
|
950
|
+
const initialActiveTabId = localStorage.getItem(`rebase_sql_active_tab_${projectPrefix}`) || "1";
|
|
950
951
|
let initialTabs = [];
|
|
951
952
|
try {
|
|
952
|
-
const savedTabs = localStorage.getItem(
|
|
953
|
+
const savedTabs = localStorage.getItem(`rebase_sql_tabs_${projectPrefix}`);
|
|
953
954
|
if (savedTabs) initialTabs = JSON.parse(savedTabs);
|
|
954
955
|
} catch (e) {
|
|
955
956
|
}
|
|
@@ -961,21 +962,26 @@ const SQLEditor = () => {
|
|
|
961
962
|
}
|
|
962
963
|
if (actualDb) {
|
|
963
964
|
setSelectedDatabase(actualDb);
|
|
964
|
-
localStorage.setItem(
|
|
965
|
-
setTabs((prev_0) => prev_0.map((t_4) => t_4.id === initialActiveTabId && !t_4.database ? {
|
|
965
|
+
localStorage.setItem(`rebase_sql_selected_db_${projectPrefix}`, actualDb);
|
|
966
|
+
setTabs((prev_0) => prev_0.map((t_4) => t_4.id === initialActiveTabId && (!t_4.database || !dbs.includes(t_4.database)) ? {
|
|
966
967
|
...t_4,
|
|
967
968
|
database: actualDb
|
|
968
969
|
} : t_4));
|
|
969
970
|
}
|
|
971
|
+
const currentUser = currentUserResult?.[0]?.role;
|
|
970
972
|
let actualRole = currentActiveTab?.role || loadedRole;
|
|
971
973
|
if (actualRole && !roles.includes(actualRole)) actualRole = void 0;
|
|
972
974
|
if (!actualRole && roles.length > 0) {
|
|
973
|
-
|
|
975
|
+
if (currentUser && roles.includes(currentUser)) {
|
|
976
|
+
actualRole = currentUser;
|
|
977
|
+
} else {
|
|
978
|
+
actualRole = roles.includes("postgres") ? "postgres" : roles[0];
|
|
979
|
+
}
|
|
974
980
|
}
|
|
975
981
|
if (actualRole) {
|
|
976
982
|
setSelectedRole(actualRole);
|
|
977
|
-
localStorage.setItem(
|
|
978
|
-
setTabs((prev_1) => prev_1.map((t_5) => t_5.id === initialActiveTabId && !t_5.role ? {
|
|
983
|
+
localStorage.setItem(`rebase_sql_selected_role_${projectPrefix}`, actualRole);
|
|
984
|
+
setTabs((prev_1) => prev_1.map((t_5) => t_5.id === initialActiveTabId && (!t_5.role || !roles.includes(t_5.role)) ? {
|
|
979
985
|
...t_5,
|
|
980
986
|
role: actualRole
|
|
981
987
|
} : t_5));
|
|
@@ -999,10 +1005,10 @@ const SQLEditor = () => {
|
|
|
999
1005
|
return () => {
|
|
1000
1006
|
mounted = false;
|
|
1001
1007
|
};
|
|
1002
|
-
}, [databaseAdmin]);
|
|
1008
|
+
}, [databaseAdmin, projectPrefix]);
|
|
1003
1009
|
const handleDatabaseChange = (db, tabId) => {
|
|
1004
1010
|
setSelectedDatabase(db);
|
|
1005
|
-
localStorage.setItem(
|
|
1011
|
+
localStorage.setItem(`rebase_sql_selected_db_${projectPrefix}`, db);
|
|
1006
1012
|
setTabs((prev_2) => prev_2.map((t_6) => t_6.id === activeTabId ? {
|
|
1007
1013
|
...t_6,
|
|
1008
1014
|
database: db
|
|
@@ -1011,7 +1017,7 @@ const SQLEditor = () => {
|
|
|
1011
1017
|
};
|
|
1012
1018
|
const handleRoleChange = (role, tabId_0) => {
|
|
1013
1019
|
setSelectedRole(role);
|
|
1014
|
-
localStorage.setItem(
|
|
1020
|
+
localStorage.setItem(`rebase_sql_selected_role_${projectPrefix}`, role);
|
|
1015
1021
|
setTabs((prev_3) => prev_3.map((t_7) => t_7.id === activeTabId ? {
|
|
1016
1022
|
...t_7,
|
|
1017
1023
|
role
|
|
@@ -1023,7 +1029,7 @@ const SQLEditor = () => {
|
|
|
1023
1029
|
if (newTab) {
|
|
1024
1030
|
if (newTab.database && newTab.database !== selectedDatabase) {
|
|
1025
1031
|
setSelectedDatabase(newTab.database);
|
|
1026
|
-
localStorage.setItem(
|
|
1032
|
+
localStorage.setItem(`rebase_sql_selected_db_${projectPrefix}`, newTab.database);
|
|
1027
1033
|
schemaFetchedRef.current = false;
|
|
1028
1034
|
} else if (!newTab.database && selectedDatabase) {
|
|
1029
1035
|
setTabs((prev_4) => prev_4.map((t_9) => t_9.id === newTabId ? {
|
|
@@ -1033,7 +1039,7 @@ const SQLEditor = () => {
|
|
|
1033
1039
|
}
|
|
1034
1040
|
if (newTab.role && newTab.role !== selectedRole) {
|
|
1035
1041
|
setSelectedRole(newTab.role);
|
|
1036
|
-
localStorage.setItem(
|
|
1042
|
+
localStorage.setItem(`rebase_sql_selected_role_${projectPrefix}`, newTab.role);
|
|
1037
1043
|
} else if (!newTab.role && selectedRole) {
|
|
1038
1044
|
setTabs((prev_5) => prev_5.map((t_10) => t_10.id === newTabId ? {
|
|
1039
1045
|
...t_10,
|
|
@@ -1041,7 +1047,7 @@ const SQLEditor = () => {
|
|
|
1041
1047
|
} : t_10));
|
|
1042
1048
|
}
|
|
1043
1049
|
}
|
|
1044
|
-
}, [tabs, selectedDatabase, selectedRole]);
|
|
1050
|
+
}, [tabs, selectedDatabase, selectedRole, projectPrefix]);
|
|
1045
1051
|
const fetchSchema = useCallback(async () => {
|
|
1046
1052
|
if (!databaseAdmin?.executeSql) {
|
|
1047
1053
|
setSchemaError(t("studio_sql_sql_not_supported"));
|
|
@@ -1241,7 +1247,8 @@ const SQLEditor = () => {
|
|
|
1241
1247
|
}
|
|
1242
1248
|
}, [editingCell, schemas, activeTab.lastExecutedSql, activeTab.results, databaseAdmin, updateActiveTab, snackbarController, selectedDatabase, selectedRole]);
|
|
1243
1249
|
const [columnWidths, setColumnWidths] = useState(() => {
|
|
1244
|
-
const
|
|
1250
|
+
const projectPrefixSync_3 = client?.baseUrl ? client.baseUrl.replace(/^https?:\/\//, "").replace(/[^a-zA-Z0-9]/g, "_") : "default";
|
|
1251
|
+
const saved_0 = localStorage.getItem(`rebase_sql_column_widths_${projectPrefixSync_3}`);
|
|
1245
1252
|
return saved_0 ? JSON.parse(saved_0) : {};
|
|
1246
1253
|
});
|
|
1247
1254
|
const [snippets, setSnippets] = useState([]);
|
|
@@ -1249,11 +1256,19 @@ const SQLEditor = () => {
|
|
|
1249
1256
|
const [isSaveDialogOpen, setIsSaveDialogOpen] = useState(false);
|
|
1250
1257
|
const [newSnippetName, setNewSnippetName] = useState("");
|
|
1251
1258
|
useEffect(() => {
|
|
1252
|
-
const savedSnippets = localStorage.getItem(
|
|
1253
|
-
if (savedSnippets)
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1259
|
+
const savedSnippets = localStorage.getItem(`rebase_sql_snippets_${projectPrefix}`);
|
|
1260
|
+
if (savedSnippets) {
|
|
1261
|
+
setSnippets(JSON.parse(savedSnippets));
|
|
1262
|
+
} else {
|
|
1263
|
+
setSnippets([]);
|
|
1264
|
+
}
|
|
1265
|
+
const savedHistory = localStorage.getItem(`rebase_sql_history_${projectPrefix}`);
|
|
1266
|
+
if (savedHistory) {
|
|
1267
|
+
setHistory(JSON.parse(savedHistory));
|
|
1268
|
+
} else {
|
|
1269
|
+
setHistory([]);
|
|
1270
|
+
}
|
|
1271
|
+
}, [projectPrefix]);
|
|
1257
1272
|
useEffect(() => {
|
|
1258
1273
|
const sanitizedTabs = tabs.map((t_12) => ({
|
|
1259
1274
|
id: t_12.id,
|
|
@@ -1262,18 +1277,18 @@ const SQLEditor = () => {
|
|
|
1262
1277
|
database: t_12.database,
|
|
1263
1278
|
role: t_12.role
|
|
1264
1279
|
}));
|
|
1265
|
-
localStorage.setItem(
|
|
1266
|
-
}, [tabs]);
|
|
1280
|
+
localStorage.setItem(`rebase_sql_tabs_${projectPrefix}`, JSON.stringify(sanitizedTabs));
|
|
1281
|
+
}, [tabs, projectPrefix]);
|
|
1267
1282
|
useEffect(() => {
|
|
1268
|
-
localStorage.setItem(
|
|
1269
|
-
}, [activeTabId]);
|
|
1283
|
+
localStorage.setItem(`rebase_sql_active_tab_${projectPrefix}`, activeTabId);
|
|
1284
|
+
}, [activeTabId, projectPrefix]);
|
|
1270
1285
|
const saveSnippets = (newSnippets) => {
|
|
1271
1286
|
setSnippets(newSnippets);
|
|
1272
|
-
localStorage.setItem(
|
|
1287
|
+
localStorage.setItem(`rebase_sql_snippets_${projectPrefix}`, JSON.stringify(newSnippets));
|
|
1273
1288
|
};
|
|
1274
1289
|
const saveHistory = (newHistory) => {
|
|
1275
1290
|
setHistory(newHistory);
|
|
1276
|
-
localStorage.setItem(
|
|
1291
|
+
localStorage.setItem(`rebase_sql_history_${projectPrefix}`, JSON.stringify(newHistory.slice(-50)));
|
|
1277
1292
|
};
|
|
1278
1293
|
const handleDeleteSnippet = (id) => {
|
|
1279
1294
|
saveSnippets(snippets.filter((s) => s.id !== id));
|
|
@@ -1328,10 +1343,10 @@ const SQLEditor = () => {
|
|
|
1328
1343
|
[key]: width
|
|
1329
1344
|
}
|
|
1330
1345
|
};
|
|
1331
|
-
localStorage.setItem(
|
|
1346
|
+
localStorage.setItem(`rebase_sql_column_widths_${projectPrefix}`, JSON.stringify(newWidths));
|
|
1332
1347
|
return newWidths;
|
|
1333
1348
|
});
|
|
1334
|
-
}, [activeTab.sql]);
|
|
1349
|
+
}, [activeTab.sql, projectPrefix]);
|
|
1335
1350
|
const handlePrettify = () => {
|
|
1336
1351
|
const formatted = activeTab.sql.replace(/\s+/g, " ").replace(/\s?,\s?/g, ", ").replace(/\s?=\s?/g, " = ").trim();
|
|
1337
1352
|
setSql(formatted);
|
|
@@ -1410,7 +1425,7 @@ const SQLEditor = () => {
|
|
|
1410
1425
|
loading: false
|
|
1411
1426
|
});
|
|
1412
1427
|
}
|
|
1413
|
-
}, [activeTab.sql, autoLimit, databaseAdmin, history, updateActiveTab]);
|
|
1428
|
+
}, [activeTab.sql, autoLimit, databaseAdmin, history, updateActiveTab, selectedDatabase, selectedRole]);
|
|
1414
1429
|
const handleRun = useCallback(async (selectedText) => {
|
|
1415
1430
|
const sqlTarget = selectedText || activeTab.sql;
|
|
1416
1431
|
if (!sqlTarget.trim()) return;
|
|
@@ -1656,7 +1671,8 @@ const SQLEditor = () => {
|
|
|
1656
1671
|
};
|
|
1657
1672
|
const [sidebarSize, setSidebarSize] = useState(() => {
|
|
1658
1673
|
try {
|
|
1659
|
-
const
|
|
1674
|
+
const projectPrefixSync_4 = client?.baseUrl ? client.baseUrl.replace(/^https?:\/\//, "").replace(/[^a-zA-Z0-9]/g, "_") : "default";
|
|
1675
|
+
const saved_1 = localStorage.getItem(`rebase_sql_editor_sidebar_size_${projectPrefixSync_4}`);
|
|
1660
1676
|
return saved_1 !== null ? parseFloat(saved_1) : 20;
|
|
1661
1677
|
} catch (e_9) {
|
|
1662
1678
|
return 20;
|
|
@@ -1664,7 +1680,8 @@ const SQLEditor = () => {
|
|
|
1664
1680
|
});
|
|
1665
1681
|
const [editorHeight, setEditorHeight] = useState(() => {
|
|
1666
1682
|
try {
|
|
1667
|
-
const
|
|
1683
|
+
const projectPrefixSync_5 = client?.baseUrl ? client.baseUrl.replace(/^https?:\/\//, "").replace(/[^a-zA-Z0-9]/g, "_") : "default";
|
|
1684
|
+
const saved_2 = localStorage.getItem(`rebase_sql_editor_height_${projectPrefixSync_5}`);
|
|
1668
1685
|
return saved_2 !== null ? parseFloat(saved_2) : 50;
|
|
1669
1686
|
} catch (e_10) {
|
|
1670
1687
|
return 50;
|
|
@@ -1672,16 +1689,16 @@ const SQLEditor = () => {
|
|
|
1672
1689
|
});
|
|
1673
1690
|
useEffect(() => {
|
|
1674
1691
|
try {
|
|
1675
|
-
localStorage.setItem(
|
|
1692
|
+
localStorage.setItem(`rebase_sql_editor_sidebar_size_${projectPrefix}`, sidebarSize.toString());
|
|
1676
1693
|
} catch (e_11) {
|
|
1677
1694
|
}
|
|
1678
|
-
}, [sidebarSize]);
|
|
1695
|
+
}, [sidebarSize, projectPrefix]);
|
|
1679
1696
|
useEffect(() => {
|
|
1680
1697
|
try {
|
|
1681
|
-
localStorage.setItem(
|
|
1698
|
+
localStorage.setItem(`rebase_sql_editor_height_${projectPrefix}`, editorHeight.toString());
|
|
1682
1699
|
} catch (e_12) {
|
|
1683
1700
|
}
|
|
1684
|
-
}, [editorHeight]);
|
|
1701
|
+
}, [editorHeight, projectPrefix]);
|
|
1685
1702
|
const activeSnippet = snippets.find((s_0) => s_0.sql === activeTab.sql);
|
|
1686
1703
|
const isFavorite = activeSnippet?.isFavorite || false;
|
|
1687
1704
|
return /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full bg-white dark:bg-surface-950 overflow-hidden text-text-primary dark:text-text-primary-dark", children: [
|
|
@@ -1724,7 +1741,7 @@ const SQLEditor = () => {
|
|
|
1724
1741
|
/* @__PURE__ */ jsx("div", { className: "h-4 w-px bg-surface-200 dark:bg-surface-950 mx-1" }),
|
|
1725
1742
|
/* @__PURE__ */ jsx(Menu, { trigger: /* @__PURE__ */ jsxs(Button, { size: "small", variant: "outlined", className: "text-text-secondary dark:text-text-secondary-dark font-medium mr-2", children: [
|
|
1726
1743
|
/* @__PURE__ */ jsx(DatabaseIcon, { size: iconSize.small, className: "mr-1.5 text-text-disabled dark:text-text-disabled-dark" }),
|
|
1727
|
-
/* @__PURE__ */ jsx("span", { className: "max-w-[
|
|
1744
|
+
/* @__PURE__ */ jsx("span", { className: "max-w-[160px] truncate", children: isLoadingConfig ? "..." : `${selectedDatabase || t("studio_sql_select_db")}${selectedRole ? ` (${selectedRole})` : ""}` })
|
|
1728
1745
|
] }), children: /* @__PURE__ */ jsxs("div", { className: "max-h-64 overflow-y-auto", children: [
|
|
1729
1746
|
/* @__PURE__ */ jsx("div", { className: "px-3 py-1.5 border-b border-surface-200 dark:border-surface-950 mb-1", children: /* @__PURE__ */ jsx(Typography, { variant: "caption", className: "font-bold uppercase tracking-wider text-[9px] text-text-disabled dark:text-text-disabled-dark", children: t("studio_sql_database") }) }),
|
|
1730
1747
|
isLoadingConfig ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center p-4", children: /* @__PURE__ */ jsx(CircularProgress, { size: "small" }) }) : connectionConfigError ? /* @__PURE__ */ jsx("div", { className: "px-3 py-2 text-xs text-red-500 dark:text-red-400 max-w-[200px] break-words", children: connectionConfigError }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -1777,4 +1794,4 @@ function _temp(e) {
|
|
|
1777
1794
|
export {
|
|
1778
1795
|
SQLEditor
|
|
1779
1796
|
};
|
|
1780
|
-
//# sourceMappingURL=SQLEditor-
|
|
1797
|
+
//# sourceMappingURL=SQLEditor-BELYJQRP.js.map
|