@rebasepro/studio 0.0.1-canary.09e5ec5

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 (361) hide show
  1. package/LICENSE +114 -0
  2. package/README.md +159 -0
  3. package/dist/ApiExplorer-gMJt5JrS.js +1053 -0
  4. package/dist/ApiExplorer-gMJt5JrS.js.map +1 -0
  5. package/dist/AuthSimulationSelector-BF4rkRGp.js +118 -0
  6. package/dist/AuthSimulationSelector-BF4rkRGp.js.map +1 -0
  7. package/dist/BranchesView-DcHZtvXo.js +292 -0
  8. package/dist/BranchesView-DcHZtvXo.js.map +1 -0
  9. package/dist/CronJobsView-CijCToeK.js +456 -0
  10. package/dist/CronJobsView-CijCToeK.js.map +1 -0
  11. package/dist/JSEditor-D8nVp3Lp.js +1308 -0
  12. package/dist/JSEditor-D8nVp3Lp.js.map +1 -0
  13. package/dist/MonacoEditor-CMYEjiRf.js +161 -0
  14. package/dist/MonacoEditor-CMYEjiRf.js.map +1 -0
  15. package/dist/RLSEditor-DBH09u9v.js +1831 -0
  16. package/dist/RLSEditor-DBH09u9v.js.map +1 -0
  17. package/dist/SQLEditor-CkVx9vgr.js +1792 -0
  18. package/dist/SQLEditor-CkVx9vgr.js.map +1 -0
  19. package/dist/SchemaVisualizer-BgD5Zb77.js +1069 -0
  20. package/dist/SchemaVisualizer-BgD5Zb77.js.map +1 -0
  21. package/dist/StorageView-CTqGFhY9.js +907 -0
  22. package/dist/StorageView-CTqGFhY9.js.map +1 -0
  23. package/dist/common/src/collections/CollectionRegistry.d.ts +56 -0
  24. package/dist/common/src/collections/index.d.ts +1 -0
  25. package/dist/common/src/data/buildRebaseData.d.ts +14 -0
  26. package/dist/common/src/index.d.ts +3 -0
  27. package/dist/common/src/util/builders.d.ts +57 -0
  28. package/dist/common/src/util/callbacks.d.ts +6 -0
  29. package/dist/common/src/util/collections.d.ts +11 -0
  30. package/dist/common/src/util/common.d.ts +2 -0
  31. package/dist/common/src/util/conditions.d.ts +26 -0
  32. package/dist/common/src/util/entities.d.ts +58 -0
  33. package/dist/common/src/util/enums.d.ts +3 -0
  34. package/dist/common/src/util/index.d.ts +16 -0
  35. package/dist/common/src/util/navigation_from_path.d.ts +34 -0
  36. package/dist/common/src/util/navigation_utils.d.ts +20 -0
  37. package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
  38. package/dist/common/src/util/paths.d.ts +14 -0
  39. package/dist/common/src/util/permissions.d.ts +5 -0
  40. package/dist/common/src/util/references.d.ts +2 -0
  41. package/dist/common/src/util/relations.d.ts +22 -0
  42. package/dist/common/src/util/resolutions.d.ts +72 -0
  43. package/dist/common/src/util/storage.d.ts +24 -0
  44. package/dist/core/src/components/AIIcon.d.ts +16 -0
  45. package/dist/core/src/components/ConfirmationDialog.d.ts +9 -0
  46. package/dist/core/src/components/Debug/UIReferenceView.d.ts +1 -0
  47. package/dist/core/src/components/Debug/UIStyleGuide.d.ts +1 -0
  48. package/dist/core/src/components/ErrorTooltip.d.ts +2 -0
  49. package/dist/core/src/components/ErrorView.d.ts +21 -0
  50. package/dist/core/src/components/LanguageToggle.d.ts +1 -0
  51. package/dist/core/src/components/LoginView/LoginView.d.ts +68 -0
  52. package/dist/core/src/components/LoginView/index.d.ts +2 -0
  53. package/dist/core/src/components/NotFoundPage.d.ts +1 -0
  54. package/dist/core/src/components/RebaseAuth.d.ts +10 -0
  55. package/dist/core/src/components/RebaseLogo.d.ts +7 -0
  56. package/dist/core/src/components/UnsavedChangesDialog.d.ts +9 -0
  57. package/dist/core/src/components/UserDisplay.d.ts +7 -0
  58. package/dist/core/src/components/UserSelectPopover.d.ts +62 -0
  59. package/dist/core/src/components/UserSettingsView.d.ts +1 -0
  60. package/dist/core/src/components/common/index.d.ts +6 -0
  61. package/dist/core/src/components/common/table_height.d.ts +5 -0
  62. package/dist/core/src/components/common/types.d.ts +63 -0
  63. package/dist/core/src/components/common/useColumnsIds.d.ts +9 -0
  64. package/dist/core/src/components/common/useDataTableController.d.ts +45 -0
  65. package/dist/core/src/components/common/useDebouncedData.d.ts +9 -0
  66. package/dist/core/src/components/common/useScrollRestoration.d.ts +14 -0
  67. package/dist/core/src/components/index.d.ts +16 -0
  68. package/dist/core/src/contexts/AdminModeController.d.ts +4 -0
  69. package/dist/core/src/contexts/AnalyticsContext.d.ts +3 -0
  70. package/dist/core/src/contexts/AuthControllerContext.d.ts +3 -0
  71. package/dist/core/src/contexts/CustomizationControllerContext.d.ts +3 -0
  72. package/dist/core/src/contexts/DataDriverContext.d.ts +3 -0
  73. package/dist/core/src/contexts/DatabaseAdminContext.d.ts +3 -0
  74. package/dist/core/src/contexts/DialogsProvider.d.ts +4 -0
  75. package/dist/core/src/contexts/EffectiveRoleController.d.ts +4 -0
  76. package/dist/core/src/contexts/InternalUserManagementContext.d.ts +3 -0
  77. package/dist/core/src/contexts/ModeController.d.ts +4 -0
  78. package/dist/core/src/contexts/RebaseClientInstanceContext.d.ts +6 -0
  79. package/dist/core/src/contexts/RebaseDataContext.d.ts +3 -0
  80. package/dist/core/src/contexts/SnackbarProvider.d.ts +2 -0
  81. package/dist/core/src/contexts/StorageSourceContext.d.ts +3 -0
  82. package/dist/core/src/contexts/UserConfigurationPersistenceContext.d.ts +3 -0
  83. package/dist/core/src/contexts/index.d.ts +13 -0
  84. package/dist/core/src/core/PluginLifecycleManager.d.ts +17 -0
  85. package/dist/core/src/core/PluginProviderStack.d.ts +21 -0
  86. package/dist/core/src/core/Rebase.d.ts +14 -0
  87. package/dist/core/src/core/RebaseProps.d.ts +136 -0
  88. package/dist/core/src/core/RebaseRouter.d.ts +4 -0
  89. package/dist/core/src/core/RebaseRoutes.d.ts +17 -0
  90. package/dist/core/src/core/index.d.ts +4 -0
  91. package/dist/core/src/hooks/ApiConfigContext.d.ts +24 -0
  92. package/dist/core/src/hooks/data/delete.d.ts +31 -0
  93. package/dist/core/src/hooks/data/save.d.ts +34 -0
  94. package/dist/core/src/hooks/data/useCollectionFetch.d.ts +51 -0
  95. package/dist/core/src/hooks/data/useData.d.ts +13 -0
  96. package/dist/core/src/hooks/data/useDataOrder.d.ts +12 -0
  97. package/dist/core/src/hooks/data/useEntityFetch.d.ts +38 -0
  98. package/dist/core/src/hooks/data/useRelationSelector.d.ts +52 -0
  99. package/dist/core/src/hooks/data/useUserSelector.d.ts +31 -0
  100. package/dist/core/src/hooks/index.d.ts +37 -0
  101. package/dist/core/src/hooks/useAdminModeController.d.ts +19 -0
  102. package/dist/core/src/hooks/useAnalyticsController.d.ts +5 -0
  103. package/dist/core/src/hooks/useAuthController.d.ts +11 -0
  104. package/dist/core/src/hooks/useAuthSubscription.d.ts +2 -0
  105. package/dist/core/src/hooks/useBackendStorageSource.d.ts +30 -0
  106. package/dist/core/src/hooks/useBridgeRegistration.d.ts +18 -0
  107. package/dist/core/src/hooks/useBrowserTitleAndIcon.d.ts +6 -0
  108. package/dist/core/src/hooks/useBuildAdminModeController.d.ts +6 -0
  109. package/dist/core/src/hooks/useBuildEffectiveRoleController.d.ts +8 -0
  110. package/dist/core/src/hooks/useBuildLocalConfigurationPersistence.d.ts +2 -0
  111. package/dist/core/src/hooks/useBuildModeController.d.ts +6 -0
  112. package/dist/core/src/hooks/useClipboard.d.ts +57 -0
  113. package/dist/core/src/hooks/useCollapsedGroups.d.ts +12 -0
  114. package/dist/core/src/hooks/useCustomizationController.d.ts +11 -0
  115. package/dist/core/src/hooks/useDialogsController.d.ts +11 -0
  116. package/dist/core/src/hooks/useEffectiveRoleController.d.ts +7 -0
  117. package/dist/core/src/hooks/useInternalUserManagementController.d.ts +12 -0
  118. package/dist/core/src/hooks/useLargeLayout.d.ts +1 -0
  119. package/dist/core/src/hooks/useModeController.d.ts +19 -0
  120. package/dist/core/src/hooks/usePermissions.d.ts +12 -0
  121. package/dist/core/src/hooks/useRebaseClient.d.ts +5 -0
  122. package/dist/core/src/hooks/useRebaseContext.d.ts +11 -0
  123. package/dist/core/src/hooks/useRebaseRegistry.d.ts +34 -0
  124. package/dist/core/src/hooks/useSlot.d.ts +18 -0
  125. package/dist/core/src/hooks/useSnackbarController.d.ts +20 -0
  126. package/dist/core/src/hooks/useStorageSource.d.ts +7 -0
  127. package/dist/core/src/hooks/useStudioBridge.d.ts +91 -0
  128. package/dist/core/src/hooks/useTranslation.d.ts +17 -0
  129. package/dist/core/src/hooks/useUnsavedChangesDialog.d.ts +12 -0
  130. package/dist/core/src/hooks/useUserConfigurationPersistence.d.ts +8 -0
  131. package/dist/core/src/hooks/useValidateAuthenticator.d.ts +21 -0
  132. package/dist/core/src/i18n/RebaseI18nProvider.d.ts +33 -0
  133. package/dist/core/src/index.d.ts +15 -0
  134. package/dist/core/src/internal/common.d.ts +3 -0
  135. package/dist/core/src/internal/useRestoreScroll.d.ts +6 -0
  136. package/dist/core/src/locales/de.d.ts +2 -0
  137. package/dist/core/src/locales/en.d.ts +10 -0
  138. package/dist/core/src/locales/es.d.ts +10 -0
  139. package/dist/core/src/locales/fr.d.ts +2 -0
  140. package/dist/core/src/locales/hi.d.ts +2 -0
  141. package/dist/core/src/locales/it.d.ts +2 -0
  142. package/dist/core/src/locales/pt.d.ts +7 -0
  143. package/dist/core/src/util/constants.d.ts +1 -0
  144. package/dist/core/src/util/createFormexStub.d.ts +2 -0
  145. package/dist/core/src/util/entity_cache.d.ts +27 -0
  146. package/dist/core/src/util/enums.d.ts +5 -0
  147. package/dist/core/src/util/icon_list.d.ts +5 -0
  148. package/dist/core/src/util/icon_synonyms.d.ts +1 -0
  149. package/dist/core/src/util/icons.d.ts +20 -0
  150. package/dist/core/src/util/index.d.ts +10 -0
  151. package/dist/core/src/util/previews.d.ts +4 -0
  152. package/dist/core/src/util/useStorageUploadController.d.ts +38 -0
  153. package/dist/core/src/util/useTraceUpdate.d.ts +2 -0
  154. package/dist/formex/src/Field.d.ts +52 -0
  155. package/dist/formex/src/Formex.d.ts +7 -0
  156. package/dist/formex/src/index.d.ts +5 -0
  157. package/dist/formex/src/types.d.ts +40 -0
  158. package/dist/formex/src/useCreateFormex.d.ts +14 -0
  159. package/dist/formex/src/utils.d.ts +16 -0
  160. package/dist/index.es.js +726 -0
  161. package/dist/index.es.js.map +1 -0
  162. package/dist/index.umd.js +9647 -0
  163. package/dist/index.umd.js.map +1 -0
  164. package/dist/studio/src/components/ApiExplorer/ApiExplorer.d.ts +9 -0
  165. package/dist/studio/src/components/ApiExplorer/EndpointDetail.d.ts +9 -0
  166. package/dist/studio/src/components/ApiExplorer/TryItPanel.d.ts +15 -0
  167. package/dist/studio/src/components/ApiExplorer/parseSpec.d.ts +16 -0
  168. package/dist/studio/src/components/ApiExplorer/types.d.ts +90 -0
  169. package/dist/studio/src/components/AuthSimulationSelector.d.ts +11 -0
  170. package/dist/studio/src/components/Branches/BranchesView.d.ts +1 -0
  171. package/dist/studio/src/components/CronJobs/CronJobsView.d.ts +1 -0
  172. package/dist/studio/src/components/JSEditor/JSEditor.d.ts +1 -0
  173. package/dist/studio/src/components/JSEditor/JSEditorSidebar.d.ts +21 -0
  174. package/dist/studio/src/components/JSEditor/JSMonacoEditor.d.ts +18 -0
  175. package/dist/studio/src/components/RLSEditor/PolicyEditor.d.ts +9 -0
  176. package/dist/studio/src/components/RLSEditor/RLSEditor.d.ts +19 -0
  177. package/dist/studio/src/components/RLSEditor/index.d.ts +1 -0
  178. package/dist/studio/src/components/RebaseStudio.d.ts +2 -0
  179. package/dist/studio/src/components/SQLEditor/ExplainVisualizer.d.ts +24 -0
  180. package/dist/studio/src/components/SQLEditor/MonacoEditor.d.ts +17 -0
  181. package/dist/studio/src/components/SQLEditor/SQLEditor.d.ts +11 -0
  182. package/dist/studio/src/components/SQLEditor/SQLEditorSidebar.d.ts +21 -0
  183. package/dist/studio/src/components/SQLEditor/SchemaBrowser.d.ts +8 -0
  184. package/dist/studio/src/components/SchemaVisualizer/RelationEdge.d.ts +3 -0
  185. package/dist/studio/src/components/SchemaVisualizer/SchemaVisualizer.d.ts +2 -0
  186. package/dist/studio/src/components/SchemaVisualizer/TableNode.d.ts +3 -0
  187. package/dist/studio/src/components/SchemaVisualizer/index.d.ts +5 -0
  188. package/dist/studio/src/components/SchemaVisualizer/schema-visualizer.utils.d.ts +42 -0
  189. package/dist/studio/src/components/SchemaVisualizer/useSchemaGraph.d.ts +37 -0
  190. package/dist/studio/src/components/StorageView/StorageView.d.ts +1 -0
  191. package/dist/studio/src/components/StudioHomePage.d.ts +9 -0
  192. package/dist/studio/src/index.d.ts +4 -0
  193. package/dist/studio/src/utils/entities.d.ts +0 -0
  194. package/dist/studio/src/utils/pgColumnToProperty.d.ts +6 -0
  195. package/dist/studio/src/utils/sql_utils.d.ts +52 -0
  196. package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
  197. package/dist/types/src/controllers/auth.d.ts +119 -0
  198. package/dist/types/src/controllers/client.d.ts +170 -0
  199. package/dist/types/src/controllers/collection_registry.d.ts +45 -0
  200. package/dist/types/src/controllers/customization_controller.d.ts +60 -0
  201. package/dist/types/src/controllers/data.d.ts +168 -0
  202. package/dist/types/src/controllers/data_driver.d.ts +160 -0
  203. package/dist/types/src/controllers/database_admin.d.ts +11 -0
  204. package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
  205. package/dist/types/src/controllers/effective_role.d.ts +4 -0
  206. package/dist/types/src/controllers/email.d.ts +34 -0
  207. package/dist/types/src/controllers/index.d.ts +18 -0
  208. package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
  209. package/dist/types/src/controllers/navigation.d.ts +213 -0
  210. package/dist/types/src/controllers/registry.d.ts +54 -0
  211. package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
  212. package/dist/types/src/controllers/side_entity_controller.d.ts +90 -0
  213. package/dist/types/src/controllers/snackbar.d.ts +24 -0
  214. package/dist/types/src/controllers/storage.d.ts +171 -0
  215. package/dist/types/src/index.d.ts +4 -0
  216. package/dist/types/src/rebase_context.d.ts +105 -0
  217. package/dist/types/src/types/backend.d.ts +536 -0
  218. package/dist/types/src/types/builders.d.ts +15 -0
  219. package/dist/types/src/types/chips.d.ts +5 -0
  220. package/dist/types/src/types/collections.d.ts +856 -0
  221. package/dist/types/src/types/cron.d.ts +102 -0
  222. package/dist/types/src/types/data_source.d.ts +64 -0
  223. package/dist/types/src/types/entities.d.ts +145 -0
  224. package/dist/types/src/types/entity_actions.d.ts +98 -0
  225. package/dist/types/src/types/entity_callbacks.d.ts +173 -0
  226. package/dist/types/src/types/entity_link_builder.d.ts +7 -0
  227. package/dist/types/src/types/entity_overrides.d.ts +10 -0
  228. package/dist/types/src/types/entity_views.d.ts +61 -0
  229. package/dist/types/src/types/export_import.d.ts +21 -0
  230. package/dist/types/src/types/index.d.ts +23 -0
  231. package/dist/types/src/types/locales.d.ts +4 -0
  232. package/dist/types/src/types/modify_collections.d.ts +5 -0
  233. package/dist/types/src/types/plugins.d.ts +279 -0
  234. package/dist/types/src/types/properties.d.ts +1176 -0
  235. package/dist/types/src/types/property_config.d.ts +70 -0
  236. package/dist/types/src/types/relations.d.ts +336 -0
  237. package/dist/types/src/types/slots.d.ts +252 -0
  238. package/dist/types/src/types/translations.d.ts +870 -0
  239. package/dist/types/src/types/user_management_delegate.d.ts +121 -0
  240. package/dist/types/src/types/websockets.d.ts +78 -0
  241. package/dist/types/src/users/index.d.ts +2 -0
  242. package/dist/types/src/users/roles.d.ts +22 -0
  243. package/dist/types/src/users/user.d.ts +46 -0
  244. package/dist/ui/src/components/Alert.d.ts +12 -0
  245. package/dist/ui/src/components/Autocomplete.d.ts +21 -0
  246. package/dist/ui/src/components/Avatar.d.ts +11 -0
  247. package/dist/ui/src/components/Badge.d.ts +8 -0
  248. package/dist/ui/src/components/BooleanSwitch.d.ts +14 -0
  249. package/dist/ui/src/components/BooleanSwitchWithLabel.d.ts +17 -0
  250. package/dist/ui/src/components/Button.d.ts +14 -0
  251. package/dist/ui/src/components/Card.d.ts +9 -0
  252. package/dist/ui/src/components/CenteredView.d.ts +9 -0
  253. package/dist/ui/src/components/Checkbox.d.ts +13 -0
  254. package/dist/ui/src/components/Chip.d.ts +26 -0
  255. package/dist/ui/src/components/CircularProgress.d.ts +5 -0
  256. package/dist/ui/src/components/CircularProgressCenter.d.ts +11 -0
  257. package/dist/ui/src/components/Collapse.d.ts +9 -0
  258. package/dist/ui/src/components/ColorPicker.d.ts +30 -0
  259. package/dist/ui/src/components/Container.d.ts +8 -0
  260. package/dist/ui/src/components/DateTimeField.d.ts +24 -0
  261. package/dist/ui/src/components/DebouncedTextField.d.ts +2 -0
  262. package/dist/ui/src/components/Dialog.d.ts +39 -0
  263. package/dist/ui/src/components/DialogActions.d.ts +7 -0
  264. package/dist/ui/src/components/DialogContent.d.ts +7 -0
  265. package/dist/ui/src/components/DialogTitle.d.ts +10 -0
  266. package/dist/ui/src/components/ErrorBoundary.d.ts +11 -0
  267. package/dist/ui/src/components/ExpandablePanel.d.ts +12 -0
  268. package/dist/ui/src/components/FileUpload.d.ts +23 -0
  269. package/dist/ui/src/components/IconButton.d.ts +12 -0
  270. package/dist/ui/src/components/InfoLabel.d.ts +5 -0
  271. package/dist/ui/src/components/InputLabel.d.ts +11 -0
  272. package/dist/ui/src/components/Label.d.ts +7 -0
  273. package/dist/ui/src/components/LoadingButton.d.ts +7 -0
  274. package/dist/ui/src/components/Markdown.d.ts +10 -0
  275. package/dist/ui/src/components/Menu.d.ts +23 -0
  276. package/dist/ui/src/components/Menubar.d.ts +80 -0
  277. package/dist/ui/src/components/MultiSelect.d.ts +48 -0
  278. package/dist/ui/src/components/Paper.d.ts +6 -0
  279. package/dist/ui/src/components/Popover.d.ts +24 -0
  280. package/dist/ui/src/components/RadioGroup.d.ts +28 -0
  281. package/dist/ui/src/components/ResizablePanels.d.ts +18 -0
  282. package/dist/ui/src/components/SearchBar.d.ts +22 -0
  283. package/dist/ui/src/components/Select.d.ts +43 -0
  284. package/dist/ui/src/components/Separator.d.ts +5 -0
  285. package/dist/ui/src/components/Sheet.d.ts +22 -0
  286. package/dist/ui/src/components/Skeleton.d.ts +6 -0
  287. package/dist/ui/src/components/Slider.d.ts +21 -0
  288. package/dist/ui/src/components/Table.d.ts +34 -0
  289. package/dist/ui/src/components/Tabs.d.ts +19 -0
  290. package/dist/ui/src/components/TextField.d.ts +58 -0
  291. package/dist/ui/src/components/TextareaAutosize.d.ts +43 -0
  292. package/dist/ui/src/components/ToggleButtonGroup.d.ts +30 -0
  293. package/dist/ui/src/components/Tooltip.d.ts +19 -0
  294. package/dist/ui/src/components/Typography.d.ts +36 -0
  295. package/dist/ui/src/components/VirtualTable/VirtualTable.d.ts +11 -0
  296. package/dist/ui/src/components/VirtualTable/VirtualTableCell.d.ts +21 -0
  297. package/dist/ui/src/components/VirtualTable/VirtualTableHeader.d.ts +29 -0
  298. package/dist/ui/src/components/VirtualTable/VirtualTableHeaderRow.d.ts +2 -0
  299. package/dist/ui/src/components/VirtualTable/VirtualTableProps.d.ts +243 -0
  300. package/dist/ui/src/components/VirtualTable/VirtualTableRow.d.ts +3 -0
  301. package/dist/ui/src/components/VirtualTable/index.d.ts +3 -0
  302. package/dist/ui/src/components/VirtualTable/types.d.ts +38 -0
  303. package/dist/ui/src/components/common/SelectInputLabel.d.ts +5 -0
  304. package/dist/ui/src/components/index.d.ts +53 -0
  305. package/dist/ui/src/hooks/PortalContainerContext.d.ts +31 -0
  306. package/dist/ui/src/hooks/index.d.ts +6 -0
  307. package/dist/ui/src/hooks/useDebounceCallback.d.ts +1 -0
  308. package/dist/ui/src/hooks/useDebounceValue.d.ts +1 -0
  309. package/dist/ui/src/hooks/useDebouncedCallback.d.ts +1 -0
  310. package/dist/ui/src/hooks/useInjectStyles.d.ts +7 -0
  311. package/dist/ui/src/hooks/useOutsideAlerter.d.ts +5 -0
  312. package/dist/ui/src/icons/GitHubIcon.d.ts +2 -0
  313. package/dist/ui/src/icons/HandleIcon.d.ts +1 -0
  314. package/dist/ui/src/icons/Icon.d.ts +20 -0
  315. package/dist/ui/src/icons/cool_icon_keys.d.ts +1 -0
  316. package/dist/ui/src/icons/icon_keys.d.ts +1 -0
  317. package/dist/ui/src/icons/index.d.ts +6 -0
  318. package/dist/ui/src/index.d.ts +5 -0
  319. package/dist/ui/src/styles.d.ts +12 -0
  320. package/dist/ui/src/util/chip_colors.d.ts +4 -0
  321. package/dist/ui/src/util/cls.d.ts +2 -0
  322. package/dist/ui/src/util/debounce.d.ts +10 -0
  323. package/dist/ui/src/util/hash.d.ts +1 -0
  324. package/dist/ui/src/util/index.d.ts +4 -0
  325. package/dist/ui/src/util/key_to_icon_component.d.ts +1 -0
  326. package/package.json +84 -0
  327. package/src/components/ApiExplorer/ApiExplorer.tsx +290 -0
  328. package/src/components/ApiExplorer/EndpointDetail.tsx +271 -0
  329. package/src/components/ApiExplorer/TryItPanel.tsx +510 -0
  330. package/src/components/ApiExplorer/parseSpec.ts +104 -0
  331. package/src/components/ApiExplorer/types.ts +84 -0
  332. package/src/components/AuthSimulationSelector.tsx +77 -0
  333. package/src/components/Branches/BranchesView.tsx +370 -0
  334. package/src/components/CronJobs/CronJobsView.tsx +346 -0
  335. package/src/components/JSEditor/JSEditor.tsx +1033 -0
  336. package/src/components/JSEditor/JSEditorSidebar.tsx +340 -0
  337. package/src/components/JSEditor/JSMonacoEditor.tsx +390 -0
  338. package/src/components/RLSEditor/PolicyEditor.tsx +444 -0
  339. package/src/components/RLSEditor/RLSEditor.tsx +692 -0
  340. package/src/components/RLSEditor/index.ts +1 -0
  341. package/src/components/RebaseStudio.tsx +121 -0
  342. package/src/components/SQLEditor/ExplainVisualizer.tsx +128 -0
  343. package/src/components/SQLEditor/MonacoEditor.tsx +203 -0
  344. package/src/components/SQLEditor/SQLEditor.tsx +1419 -0
  345. package/src/components/SQLEditor/SQLEditorSidebar.tsx +174 -0
  346. package/src/components/SQLEditor/SchemaBrowser.tsx +158 -0
  347. package/src/components/SchemaVisualizer/RelationEdge.tsx +102 -0
  348. package/src/components/SchemaVisualizer/SchemaVisualizer.tsx +665 -0
  349. package/src/components/SchemaVisualizer/TableNode.tsx +257 -0
  350. package/src/components/SchemaVisualizer/index.ts +5 -0
  351. package/src/components/SchemaVisualizer/schema-visualizer.utils.ts +140 -0
  352. package/src/components/SchemaVisualizer/useSchemaGraph.ts +397 -0
  353. package/src/components/StorageView/StorageView.tsx +1035 -0
  354. package/src/components/StudioHomePage.tsx +357 -0
  355. package/src/index.ts +31 -0
  356. package/src/utils/entities.ts +2 -0
  357. package/src/utils/pgColumnToProperty.test.ts +401 -0
  358. package/src/utils/pgColumnToProperty.ts +275 -0
  359. package/src/utils/sql_utils.test.ts +265 -0
  360. package/src/utils/sql_utils.ts +291 -0
  361. package/src/vite-env.d.ts +1 -0
@@ -0,0 +1,444 @@
1
+
2
+ import React, { useState, useEffect } from "react";
3
+ import { Button, Paper, Typography, TextField, Select, SelectItem, MultiSelect, MultiSelectItem, cls, defaultBorderMixin, IconButton, Dialog, DialogTitle, DialogContent, DialogActions , iconSize } from "@rebasepro/ui";
4
+ import { HelpCircleIcon } from "lucide-react";
5
+ import { useTranslation } from "@rebasepro/core";
6
+ import { MonacoEditor } from "../SQLEditor/MonacoEditor";
7
+ import { PostgresPolicy } from "./RLSEditor";
8
+
9
+ export interface PolicyEditorProps {
10
+ policy?: PostgresPolicy;
11
+ schema: string;
12
+ table: string;
13
+ onSave: (policyData: Partial<PostgresPolicy>) => void;
14
+ onCancel: () => void;
15
+ }
16
+
17
+ type PolicyCommand = "ALL" | "SELECT" | "INSERT" | "UPDATE" | "DELETE";
18
+ const COMMAND_OPTIONS: PolicyCommand[] = ["ALL", "SELECT", "INSERT", "UPDATE", "DELETE"];
19
+ const ROLE_OPTIONS = ["public", "authenticated", "anon", "admin"];
20
+
21
+ interface PolicyPreset {
22
+ id: string;
23
+ label: string;
24
+ description: string;
25
+ policyname: string;
26
+ cmd: PolicyCommand;
27
+ permissive: "PERMISSIVE" | "RESTRICTIVE";
28
+ roles: string[];
29
+ qual: string;
30
+ with_check: string;
31
+ }
32
+
33
+ const POLICY_PRESETS: PolicyPreset[] = [
34
+ {
35
+ id: "public_read",
36
+ label: "Enable read access to everyone",
37
+ description: "Anyone can read data, regardless of authentication status.",
38
+ policyname: "Enable read access for all users",
39
+ cmd: "SELECT",
40
+ permissive: "PERMISSIVE",
41
+ roles: ["public"],
42
+ qual: "true",
43
+ with_check: ""
44
+ },
45
+ {
46
+ id: "auth_read",
47
+ label: "Enable read access for authenticated users only",
48
+ description: "Only logged-in users are allowed to read data.",
49
+ policyname: "Enable read access for authenticated users",
50
+ cmd: "SELECT",
51
+ permissive: "PERMISSIVE",
52
+ roles: ["authenticated"],
53
+ qual: "true",
54
+ with_check: ""
55
+ },
56
+ {
57
+ id: "auth_insert",
58
+ label: "Enable insert for authenticated users only",
59
+ description: "Only logged-in users are allowed to insert new data.",
60
+ policyname: "Enable insert for authenticated users only",
61
+ cmd: "INSERT",
62
+ permissive: "PERMISSIVE",
63
+ roles: ["authenticated"],
64
+ qual: "",
65
+ with_check: "true"
66
+ },
67
+ {
68
+ id: "user_select_own",
69
+ label: "Users can read their own rows",
70
+ description: "Users can only read rows where the user_id matches their auth.uid()",
71
+ policyname: "Users can select their own data",
72
+ cmd: "SELECT",
73
+ permissive: "PERMISSIVE",
74
+ roles: ["authenticated"],
75
+ qual: "auth.uid() = user_id",
76
+ with_check: ""
77
+ },
78
+ {
79
+ id: "user_update_own",
80
+ label: "Users can update their own rows",
81
+ description: "Users can only update rows where the user_id matches their auth.uid()",
82
+ policyname: "Users can update their own data",
83
+ cmd: "UPDATE",
84
+ permissive: "PERMISSIVE",
85
+ roles: ["authenticated"],
86
+ qual: "auth.uid() = user_id",
87
+ with_check: "auth.uid() = user_id"
88
+ },
89
+ {
90
+ id: "user_delete_own",
91
+ label: "Users can delete their own rows",
92
+ description: "Users can only delete rows where the user_id matches their auth.uid()",
93
+ policyname: "Users can delete their own data",
94
+ cmd: "DELETE",
95
+ permissive: "PERMISSIVE",
96
+ roles: ["authenticated"],
97
+ qual: "auth.uid() = user_id",
98
+ with_check: ""
99
+ }
100
+ ];
101
+
102
+ export const PolicyEditor = ({
103
+ policy,
104
+ schema,
105
+ table,
106
+ onSave,
107
+ onCancel
108
+ }: PolicyEditorProps) => {
109
+
110
+ const { t } = useTranslation();
111
+ const [name, setName] = useState("");
112
+ const [helpOpen, setHelpOpen] = useState(false);
113
+ const [behavior, setBehavior] = useState<"PERMISSIVE" | "RESTRICTIVE">("PERMISSIVE");
114
+ const [command, setCommand] = useState<PolicyCommand>("ALL");
115
+ const [roles, setRoles] = useState<string[]>(["public"]);
116
+ const [usingExpr, setUsingExpr] = useState<string>("");
117
+ const [checkExpr, setCheckExpr] = useState<string>("");
118
+
119
+ const [selectedPreset, setSelectedPreset] = useState<string>("");
120
+
121
+ useEffect(() => {
122
+ if (policy) {
123
+ setName(policy.policyname || "");
124
+ setBehavior(policy.permissive || "PERMISSIVE");
125
+ setCommand((policy.cmd as PolicyCommand) || "ALL");
126
+
127
+ const initialRoles = policy.roles
128
+ ? (Array.isArray(policy.roles) ? policy.roles : [policy.roles])
129
+ : ["public"];
130
+ setRoles(initialRoles as string[]);
131
+
132
+ setUsingExpr(policy.qual || "");
133
+ setCheckExpr(policy.with_check || "");
134
+ } else {
135
+ setName("");
136
+ setBehavior("PERMISSIVE");
137
+ setCommand("ALL");
138
+ setRoles(["public"]);
139
+ setUsingExpr("");
140
+ setCheckExpr("");
141
+ setSelectedPreset("");
142
+ }
143
+ }, [policy]);
144
+
145
+ const handlePresetChange = (presetId: string) => {
146
+ const preset = POLICY_PRESETS.find(p => p.id === presetId);
147
+ if (!preset) return;
148
+
149
+ setSelectedPreset(presetId);
150
+ setName(preset.policyname);
151
+ setBehavior(preset.permissive);
152
+ setCommand(preset.cmd);
153
+ setRoles(preset.roles);
154
+ setUsingExpr(preset.qual);
155
+ setCheckExpr(preset.with_check);
156
+ };
157
+
158
+ const showCheck = command === "ALL" || command === "INSERT" || command === "UPDATE";
159
+
160
+ const handleSave = () => {
161
+ onSave({
162
+ policyname: name,
163
+ permissive: behavior,
164
+ cmd: command,
165
+ roles: roles,
166
+ qual: usingExpr,
167
+ with_check: showCheck ? checkExpr : null
168
+ });
169
+ };
170
+
171
+ return (
172
+ <>
173
+ <DialogTitle className="flex justify-between items-center w-full" variant="h6">
174
+ <div>
175
+ <div>{policy ? t("studio_policy_edit") : t("studio_policy_create")}</div>
176
+ <div className="text-sm font-normal text-text-secondary dark:text-text-secondary-dark tracking-wide mt-1">
177
+ {t("studio_policy_defining_rules")} <span className="font-mono text-primary bg-primary-bg dark:bg-primary-bg-dark px-1 py-0.5 rounded">{schema}.{table}</span>
178
+ </div>
179
+ </div>
180
+ <IconButton size="small" onClick={() => setHelpOpen(true)}>
181
+ <HelpCircleIcon size={iconSize.smallest}/>
182
+ </IconButton>
183
+ </DialogTitle>
184
+
185
+ <DialogContent className="p-4 md:p-6 border-t dark:border-surface-950 bg-surface-50 dark:bg-surface-950" includeMargin={false}>
186
+ <div className="max-w-4xl mx-auto">
187
+ <Paper className={cls("p-4 md:p-6 flex flex-col gap-6 bg-white dark:bg-surface-900 border-none sm:border-solid rounded-none sm:rounded-xl", defaultBorderMixin)}>
188
+
189
+ {/* Presets - only for new policies */}
190
+ {!policy && (
191
+ <div className="flex flex-col gap-1.5 bg-primary/5 dark:bg-primary-bg-dark/20 p-3 sm:p-4 rounded-lg border border-primary/10 dark:border-primary/20">
192
+ <Typography variant="caption" className="text-primary dark:text-primary-light uppercase tracking-wider">{t("studio_policy_template")}</Typography>
193
+ <Select
194
+ size="small"
195
+ value={selectedPreset}
196
+ onValueChange={handlePresetChange}
197
+ position="item-aligned"
198
+ placeholder={t("studio_policy_select_template")}
199
+ className="bg-white dark:bg-surface-950"
200
+ >
201
+ {POLICY_PRESETS.map((preset) => (
202
+ <SelectItem key={preset.id} value={preset.id}>
203
+ <div className="flex flex-col text-left">
204
+ <span className="text-sm">{preset.label}</span>
205
+ <span className="text-xs text-text-secondary dark:text-text-secondary-dark">{preset.description}</span>
206
+ </div>
207
+ </SelectItem>
208
+ ))}
209
+ </Select>
210
+ </div>
211
+ )}
212
+
213
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-4 sm:gap-6">
214
+ {/* Policy Name */}
215
+ <div className="flex flex-col gap-1.5">
216
+ <Typography variant="caption" className="uppercase tracking-wider text-text-secondary">{t("studio_policy_name")}</Typography>
217
+ <TextField
218
+ // @ts-ignore
219
+ value={name}
220
+ onChange={(e) => setName(e.target.value)}
221
+ placeholder={t("studio_policy_name_placeholder")}
222
+ className="w-full"
223
+ />
224
+ </div>
225
+
226
+ {/* Behavior */}
227
+ <div className="flex flex-col gap-1.5">
228
+ <Typography variant="caption" className="uppercase tracking-wider text-text-secondary">
229
+ {t("studio_policy_behavior")} <code className="text-[10px] bg-surface-200 dark:bg-surface-950 text-text-secondary dark:text-text-secondary-dark px-1 py-0.5 rounded ml-1">AS</code>
230
+ </Typography>
231
+ <Select
232
+ value={behavior}
233
+ onValueChange={(val) => setBehavior(val as "PERMISSIVE" | "RESTRICTIVE")}
234
+ position="item-aligned"
235
+ >
236
+ <SelectItem value="PERMISSIVE">
237
+ <div className="flex flex-col text-left">
238
+ <span className="">{t("studio_policy_permissive")}</span>
239
+ <span className="text-xs text-text-secondary dark:text-text-secondary-dark">{t("studio_policy_permissive_desc")}</span>
240
+ </div>
241
+ </SelectItem>
242
+ <SelectItem value="RESTRICTIVE">
243
+ <div className="flex flex-col text-left">
244
+ <span className="">{t("studio_policy_restrictive")}</span>
245
+ <span className="text-xs text-text-secondary dark:text-text-secondary-dark">{t("studio_policy_restrictive_desc")}</span>
246
+ </div>
247
+ </SelectItem>
248
+ </Select>
249
+ </div>
250
+ </div>
251
+
252
+ {/* Command */}
253
+ <div className="flex flex-col gap-1.5">
254
+ <Typography variant="caption" className="uppercase tracking-wider text-text-secondary">
255
+ {t("studio_policy_command")} <code className="text-[10px] bg-surface-200 dark:bg-surface-950 text-text-secondary dark:text-text-secondary-dark px-1 py-0.5 rounded ml-1">FOR</code>
256
+ </Typography>
257
+ <div className="flex flex-wrap gap-1.5">
258
+ {COMMAND_OPTIONS.map(cmd => (
259
+ <Button
260
+ key={cmd}
261
+ size="small"
262
+ variant={command === cmd ? "filled" : "text"}
263
+ color="neutral"
264
+ onClick={() => setCommand(cmd)}
265
+ className="min-w-[80px]"
266
+ >
267
+ {cmd}
268
+ </Button>
269
+ ))}
270
+ </div>
271
+ </div>
272
+
273
+ {/* Roles */}
274
+ <div className="flex flex-col gap-1.5">
275
+ <Typography variant="caption" className="uppercase tracking-wider text-text-secondary">
276
+ {t("studio_policy_target_roles")} <code className="text-[10px] bg-surface-200 dark:bg-surface-950 text-text-secondary dark:text-text-secondary-dark px-1 py-0.5 rounded ml-1">TO</code>
277
+ </Typography>
278
+ <MultiSelect
279
+ size="small"
280
+ value={roles}
281
+ onValueChange={setRoles}
282
+ placeholder={t("studio_policy_roles_placeholder")}
283
+ >
284
+ {ROLE_OPTIONS.map(role => (
285
+ <MultiSelectItem key={role} value={role}>
286
+ {role}
287
+ </MultiSelectItem>
288
+ ))}
289
+ </MultiSelect>
290
+ </div>
291
+
292
+ </Paper>
293
+
294
+ <div className="mt-8 flex flex-col gap-4">
295
+ {/* USING Expression */}
296
+ {command !== "INSERT" && (
297
+ <div className="flex flex-col gap-1.5">
298
+ <div className="flex flex-col gap-0.5">
299
+ <Typography variant="caption" className="uppercase tracking-wider text-text-secondary">{t("studio_policy_using_expr")}</Typography>
300
+ <Typography variant="caption" className="text-text-secondary opacity-70">{t("studio_policy_using_expr_desc")}</Typography>
301
+ </div>
302
+ <div className={cls("h-32 border rounded-md overflow-hidden bg-white dark:bg-[#1e1e1e]", defaultBorderMixin)}>
303
+ <MonacoEditor
304
+ value={usingExpr}
305
+ onChange={(v) => setUsingExpr(v || "")}
306
+ readOnly={false}
307
+ autoFocus={true}
308
+ />
309
+ </div>
310
+ </div>
311
+ )}
312
+
313
+ {/* WITH CHECK Expression */}
314
+ {showCheck && (
315
+ <div className="flex flex-col gap-1.5 mt-2">
316
+ <div className="flex flex-col gap-0.5">
317
+ <Typography variant="caption" className="uppercase tracking-wider text-text-secondary">{t("studio_policy_check_expr")}</Typography>
318
+ <Typography variant="caption" className="text-text-secondary opacity-70">{t("studio_policy_check_expr_desc")}</Typography>
319
+ </div>
320
+ <div className={cls("h-32 border rounded-md overflow-hidden bg-white dark:bg-[#1e1e1e]", defaultBorderMixin)}>
321
+ <MonacoEditor
322
+ value={checkExpr}
323
+ onChange={(v) => setCheckExpr(v || "")}
324
+ readOnly={false}
325
+ autoFocus={command === "INSERT"}
326
+ />
327
+ </div>
328
+ </div>
329
+ )}
330
+ </div>
331
+
332
+ </div>
333
+ </DialogContent>
334
+
335
+ <DialogActions>
336
+ <Button size="small" variant="text" color="neutral" onClick={onCancel}>
337
+ {t("studio_policy_cancel")}
338
+ </Button>
339
+ <Button size="small" variant="filled" color="primary" onClick={handleSave} disabled={!name}>
340
+ {t("studio_policy_save")}
341
+ </Button>
342
+ </DialogActions>
343
+
344
+ <Dialog open={helpOpen} onOpenChange={setHelpOpen} maxWidth="3xl">
345
+ <DialogContent className="p-4 sm:p-6 lg:p-8 flex flex-col gap-6">
346
+ <div>
347
+ <Typography variant="h5" className="mb-2">{t("studio_policy_help_title")}</Typography>
348
+ <Typography className="text-text-secondary dark:text-text-secondary-dark">
349
+ {t("studio_policy_help_intro")}
350
+ </Typography>
351
+ </div>
352
+
353
+ <div className="flex flex-col gap-4">
354
+ <Paper className={cls("p-4 sm:p-5 flex flex-col gap-1", defaultBorderMixin)}>
355
+ <Typography variant="subtitle2" className="text-primary dark:text-primary-light font-medium">{t("studio_policy_help_step1_title")}</Typography>
356
+ <Typography variant="body2" className="text-text-secondary dark:text-text-secondary-dark">
357
+ {t("studio_policy_help_step1_desc")}
358
+ </Typography>
359
+ </Paper>
360
+
361
+ <Paper className={cls("p-4 sm:p-5 flex flex-col gap-1", defaultBorderMixin)}>
362
+ <Typography variant="subtitle2" className="text-primary dark:text-primary-light font-medium">{t("studio_policy_help_step2_title")}</Typography>
363
+ <Typography variant="body2" className="text-text-secondary dark:text-text-secondary-dark mb-1">
364
+ {t("studio_policy_help_step2_desc")}
365
+ </Typography>
366
+ <ul className="list-disc pl-5 space-y-1 text-sm text-text-secondary dark:text-text-secondary-dark">
367
+ <li><strong>public</strong>: {t("studio_policy_help_role_public")}</li>
368
+ <li><strong>authenticated</strong>: {t("studio_policy_help_role_authenticated")}</li>
369
+ <li><strong>anon</strong>: {t("studio_policy_help_role_anon")}</li>
370
+ </ul>
371
+ </Paper>
372
+
373
+ <Paper className={cls("p-4 sm:p-5 flex flex-col gap-1", defaultBorderMixin)}>
374
+ <Typography variant="subtitle2" className="text-primary dark:text-primary-light font-medium">{t("studio_policy_help_step3_title")}</Typography>
375
+ <Typography variant="body2" className="text-text-secondary dark:text-text-secondary-dark mb-1">
376
+ {t("studio_policy_help_step3_desc")}
377
+ </Typography>
378
+ <div className={cls("bg-surface-100 dark:bg-surface-950 px-3 py-2 rounded-md font-mono text-sm my-2", defaultBorderMixin)}>
379
+ Example: auth.uid() = user_id
380
+ </div>
381
+ <Typography variant="caption" className="text-text-secondary dark:text-text-secondary-dark">
382
+ {t("studio_policy_help_step3_example")}
383
+ </Typography>
384
+ </Paper>
385
+
386
+ <Paper className={cls("p-4 sm:p-5 flex flex-col gap-1", defaultBorderMixin)}>
387
+ <Typography variant="subtitle2" className="text-primary dark:text-primary-light font-medium">{t("studio_policy_help_step4_title")}</Typography>
388
+ <Typography variant="body2" className="text-text-secondary dark:text-text-secondary-dark mb-1">
389
+ {t("studio_policy_help_step4_desc")}
390
+ </Typography>
391
+ <div className={cls("bg-surface-100 dark:bg-surface-950 px-3 py-2 rounded-md font-mono text-sm my-2", defaultBorderMixin)}>
392
+ Example: auth.uid() = user_id
393
+ </div>
394
+ <Typography variant="caption" className="text-text-secondary dark:text-text-secondary-dark">
395
+ {t("studio_policy_help_step4_example")}
396
+ </Typography>
397
+ </Paper>
398
+
399
+ <Paper className={cls("p-4 sm:p-5 flex flex-col gap-2 bg-primary/5 dark:bg-primary-bg-dark/10", defaultBorderMixin)}>
400
+ <Typography variant="subtitle2" className="text-primary dark:text-primary-light font-medium">{t("studio_policy_help_auth_vars_title")}</Typography>
401
+ <Typography variant="body2" className="text-text-secondary dark:text-text-secondary-dark">
402
+ {t("studio_policy_help_auth_vars_desc")}
403
+ </Typography>
404
+ <ul className="list-disc pl-5 space-y-2 text-sm text-text-secondary dark:text-text-secondary-dark font-normal">
405
+ <li>
406
+ <code className="bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded mr-1 whitespace-nowrap">auth.uid()</code>
407
+ <span className="block mt-0.5">Returns the current user&apos;s ID as text. Example: <code className="bg-surface-100 dark:bg-surface-950 px-1 py-0.5 rounded text-[11px]">auth.uid() = user_id</code></span>
408
+ </li>
409
+ <li>
410
+ <code className="bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded mr-1 whitespace-nowrap">auth.jwt()</code>
411
+ <span className="block mt-0.5">Returns the full JWT payload as JSONB so you can check custom claims. Example: <code className="bg-surface-100 dark:bg-surface-950 px-1 py-0.5 rounded text-[11px]">auth.jwt() -&gt;&gt; &apos;email&apos; = &apos;admin@example.com&apos;</code></span>
412
+ </li>
413
+ <li>
414
+ <code className="bg-surface-100 dark:bg-surface-950 px-1.5 py-0.5 rounded mr-1 whitespace-nowrap">auth.roles()</code>
415
+ <span className="block mt-0.5">Returns the user&apos;s role IDs as a comma-separated string. Best used with: <code className="bg-surface-100 dark:bg-surface-950 px-1 py-0.5 rounded text-[11px]">string_to_array(auth.roles(), &apos;,&apos;) @&gt; ARRAY[&apos;admin&apos;]</code></span>
416
+ </li>
417
+ </ul>
418
+ </Paper>
419
+ </div>
420
+
421
+ <div className={cls("mt-2 flex flex-col sm:flex-row justify-between items-start sm:items-center bg-primary/5 dark:bg-primary-bg-dark/10 p-4 rounded-xl border border-primary/10 dark:border-primary/20", defaultBorderMixin)}>
422
+ <Typography variant="body2" className="text-primary dark:text-primary-light mb-4 sm:mb-0 max-w-md">
423
+ {t("studio_policy_help_docs_cta")}
424
+ </Typography>
425
+ <Button
426
+ component="a"
427
+ href="https://www.postgresql.org/docs/current/sql-createpolicy.html"
428
+ target="_blank"
429
+ variant="outlined"
430
+ color="primary"
431
+ size="small"
432
+ className="whitespace-nowrap flex-shrink-0"
433
+ >
434
+ {t("studio_policy_help_read_docs")}
435
+ </Button>
436
+ </div>
437
+ </DialogContent>
438
+ <DialogActions className="p-4 sm:px-6 sm:pb-6 pt-0 border-t-0">
439
+ <Button onClick={() => setHelpOpen(false)} variant="filled" color="primary">{t("studio_policy_help_got_it")}</Button>
440
+ </DialogActions>
441
+ </Dialog>
442
+ </>
443
+ );
444
+ };