@rebasepro/studio 0.1.0 → 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.
Files changed (72) hide show
  1. package/LICENSE +17 -109
  2. package/dist/{ApiExplorer-DHVmWYfK.js → ApiExplorer-BmcdhAX0.js} +3 -4
  3. package/dist/ApiExplorer-BmcdhAX0.js.map +1 -0
  4. package/dist/{AuthSimulationSelector-CM488Eei.js → AuthSimulationSelector-DGoXkWSg.js} +2 -3
  5. package/dist/AuthSimulationSelector-DGoXkWSg.js.map +1 -0
  6. package/dist/{BranchesView-DcHZtvXo.js → BranchesView-BiTEwIhd.js} +2 -3
  7. package/dist/BranchesView-BiTEwIhd.js.map +1 -0
  8. package/dist/{CronJobsView-CijCToeK.js → CronJobsView-CNfz0etw.js} +2 -3
  9. package/dist/CronJobsView-CNfz0etw.js.map +1 -0
  10. package/dist/{JSEditor-CSHA0t_O.js → JSEditor-Ch8z8lJ4.js} +4 -5
  11. package/dist/JSEditor-Ch8z8lJ4.js.map +1 -0
  12. package/dist/{RLSEditor-BzDjqo6w.js → RLSEditor-CHEExeSB.js} +2 -3
  13. package/dist/RLSEditor-CHEExeSB.js.map +1 -0
  14. package/dist/{SQLEditor-Cr9Kg_Qg.js → SQLEditor-BELYJQRP.js} +75 -58
  15. package/dist/SQLEditor-BELYJQRP.js.map +1 -0
  16. package/dist/{StorageView-BYoslzBR.js → StorageView-B7AsN2qX.js} +2 -3
  17. package/dist/StorageView-B7AsN2qX.js.map +1 -0
  18. package/dist/common/src/util/entities.d.ts +2 -2
  19. package/dist/common/src/util/relations.d.ts +1 -1
  20. package/dist/core/src/components/LoginView/LoginView.d.ts +1 -6
  21. package/dist/core/src/contexts/SnackbarProvider.d.ts +1 -1
  22. package/dist/core/src/hooks/data/save.d.ts +2 -2
  23. package/dist/core/src/hooks/data/useEntityFetch.d.ts +5 -0
  24. package/dist/core/src/hooks/useResolvedComponent.d.ts +1 -1
  25. package/dist/index.es.js +8 -9
  26. package/dist/index.es.js.map +1 -1
  27. package/dist/index.umd.js +168 -150
  28. package/dist/index.umd.js.map +1 -1
  29. package/dist/types/src/controllers/auth.d.ts +9 -8
  30. package/dist/types/src/controllers/client.d.ts +3 -0
  31. package/dist/types/src/types/auth_adapter.d.ts +356 -0
  32. package/dist/types/src/types/collections.d.ts +67 -2
  33. package/dist/types/src/types/database_adapter.d.ts +94 -0
  34. package/dist/types/src/types/entity_actions.d.ts +7 -1
  35. package/dist/types/src/types/entity_callbacks.d.ts +1 -1
  36. package/dist/types/src/types/entity_views.d.ts +36 -1
  37. package/dist/types/src/types/index.d.ts +2 -0
  38. package/dist/types/src/types/plugins.d.ts +1 -1
  39. package/dist/types/src/types/properties.d.ts +24 -5
  40. package/dist/types/src/types/property_config.d.ts +6 -2
  41. package/dist/types/src/types/relations.d.ts +1 -1
  42. package/dist/types/src/types/translations.d.ts +8 -0
  43. package/dist/types/src/users/user.d.ts +5 -0
  44. package/dist/ui/src/components/FilterChip.d.ts +42 -0
  45. package/dist/ui/src/components/index.d.ts +5 -0
  46. package/dist/ui/src/icons/index.d.ts +2 -0
  47. package/package.json +21 -18
  48. package/src/components/ApiExplorer/ApiExplorer.tsx +1 -1
  49. package/src/components/ApiExplorer/EndpointDetail.tsx +10 -2
  50. package/src/components/ApiExplorer/TryItPanel.tsx +17 -6
  51. package/src/components/AuthSimulationSelector.tsx +1 -2
  52. package/src/components/Branches/BranchesView.tsx +24 -2
  53. package/src/components/CronJobs/CronJobsView.tsx +19 -2
  54. package/src/components/JSEditor/JSEditor.tsx +37 -6
  55. package/src/components/JSEditor/JSEditorSidebar.tsx +12 -2
  56. package/src/components/JSEditor/JSMonacoEditor.tsx +16 -3
  57. package/src/components/RLSEditor/PolicyEditor.tsx +19 -2
  58. package/src/components/RLSEditor/RLSEditor.tsx +22 -2
  59. package/src/components/SQLEditor/SQLEditor.tsx +124 -68
  60. package/src/components/SQLEditor/SQLEditorSidebar.tsx +1 -2
  61. package/src/components/SQLEditor/SchemaBrowser.tsx +14 -2
  62. package/src/components/StorageView/StorageView.tsx +39 -2
  63. package/src/components/StudioHomePage.tsx +1 -2
  64. package/src/utils/sql_utils.ts +1 -1
  65. package/dist/ApiExplorer-DHVmWYfK.js.map +0 -1
  66. package/dist/AuthSimulationSelector-CM488Eei.js.map +0 -1
  67. package/dist/BranchesView-DcHZtvXo.js.map +0 -1
  68. package/dist/CronJobsView-CijCToeK.js.map +0 -1
  69. package/dist/JSEditor-CSHA0t_O.js.map +0 -1
  70. package/dist/RLSEditor-BzDjqo6w.js.map +0 -1
  71. package/dist/SQLEditor-Cr9Kg_Qg.js.map +0 -1
  72. 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
- return localStorage.getItem("rebase_sql_selected_db") || void 0;
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
- return localStorage.getItem("rebase_sql_selected_role") || void 0;
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 saved = localStorage.getItem(STORAGE_KEY_TABS);
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("rebase_sql_selected_db") || void 0,
908
- role: localStorage.getItem("rebase_sql_selected_role") || void 0,
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
- return localStorage.getItem(STORAGE_KEY_ACTIVE_TAB) || "1";
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("rebase_sql_selected_db") || void 0;
948
- const loadedRole = localStorage.getItem("rebase_sql_selected_role") || void 0;
949
- const initialActiveTabId = localStorage.getItem(STORAGE_KEY_ACTIVE_TAB) || "1";
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(STORAGE_KEY_TABS);
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("rebase_sql_selected_db", actualDb);
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
- actualRole = roles.includes("postgres") ? "postgres" : roles[0];
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("rebase_sql_selected_role", actualRole);
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("rebase_sql_selected_db", db);
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("rebase_sql_selected_role", role);
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("rebase_sql_selected_db", newTab.database);
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("rebase_sql_selected_role", newTab.role);
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 saved_0 = localStorage.getItem("rebase_sql_column_widths");
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("rebase_sql_snippets");
1253
- if (savedSnippets) setSnippets(JSON.parse(savedSnippets));
1254
- const savedHistory = localStorage.getItem("rebase_sql_history");
1255
- if (savedHistory) setHistory(JSON.parse(savedHistory));
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(STORAGE_KEY_TABS, JSON.stringify(sanitizedTabs));
1266
- }, [tabs]);
1280
+ localStorage.setItem(`rebase_sql_tabs_${projectPrefix}`, JSON.stringify(sanitizedTabs));
1281
+ }, [tabs, projectPrefix]);
1267
1282
  useEffect(() => {
1268
- localStorage.setItem(STORAGE_KEY_ACTIVE_TAB, activeTabId);
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("rebase_sql_snippets", JSON.stringify(newSnippets));
1287
+ localStorage.setItem(`rebase_sql_snippets_${projectPrefix}`, JSON.stringify(newSnippets));
1273
1288
  };
1274
1289
  const saveHistory = (newHistory) => {
1275
1290
  setHistory(newHistory);
1276
- localStorage.setItem("rebase_sql_history", JSON.stringify(newHistory.slice(-50)));
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("rebase_sql_column_widths", JSON.stringify(newWidths));
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 saved_1 = localStorage.getItem("rebase_sql_editor_sidebar_size");
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 saved_2 = localStorage.getItem("rebase_sql_editor_height");
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("rebase_sql_editor_sidebar_size", sidebarSize.toString());
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("rebase_sql_editor_height", editorHeight.toString());
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-[80px] truncate", children: isLoadingConfig ? "..." : selectedDatabase || t("studio_sql_select_db") })
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-Cr9Kg_Qg.js.map
1797
+ //# sourceMappingURL=SQLEditor-BELYJQRP.js.map