From e7aef7fc9c9e588a12ea03273f4dc2be86cf811a Mon Sep 17 00:00:00 2001 From: "kemal.earth" <606977+kemaldotearth@users.noreply.github.com> Date: Wed, 30 Jul 2025 11:43:17 +0100 Subject: [PATCH 1/2] fix(studio): empty team drop downs (#37537) * fix: empty team drop downs This fixes dropdowns returning empty on team invites when a user is signed in as a developer. For now it adds conditionals to show the option is not available for that role, but perhaps we can handle a little more gracefully. * fix: change from inline to tooltips on dropdowns This updates the members table dropdown to use the tooltip as opposed to inline message for disabled items. * Tiny clean up * Biiiit more nit --------- Co-authored-by: kemal Co-authored-by: Joshen Lim --- .../TeamSettings/MemberActions.tsx | 77 ++++++++++--------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx b/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx index 51d711b12a193..112f830292f80 100644 --- a/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx +++ b/apps/studio/components/interfaces/Organization/TeamSettings/MemberActions.tsx @@ -5,6 +5,7 @@ import { toast } from 'sonner' import { useParams } from 'common' import { ButtonTooltip } from 'components/ui/ButtonTooltip' +import { DropdownMenuItemTooltip } from 'components/ui/DropdownMenuItemTooltip' import { useOrganizationCreateInvitationMutation } from 'data/organization-members/organization-invitation-create-mutation' import { useOrganizationDeleteInvitationMutation } from 'data/organization-members/organization-invitation-delete-mutation' import { useOrganizationRolesV2Query } from 'data/organization-members/organization-roles-query' @@ -17,13 +18,12 @@ import { usePermissionsQuery } from 'data/permissions/permissions-query' import { useProjectsQuery } from 'data/projects/projects-query' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' -import { useSelectedOrganization } from 'hooks/misc/useSelectedOrganization' +import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { useProfile } from 'lib/profile' import { Button, DropdownMenu, DropdownMenuContent, - DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from 'ui' @@ -43,7 +43,7 @@ export const MemberActions = ({ member }: MemberActionsProps) => { const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false) const organizationMembersDeletionEnabled = useIsFeatureEnabled('organization_members:delete') - const selectedOrganization = useSelectedOrganization() + const { data: selectedOrganization } = useSelectedOrganizationQuery() const { data: permissions } = usePermissionsQuery() const { data: allProjects } = useProjectsQuery() const { data: members } = useOrganizationMembersQuery({ slug }) @@ -186,47 +186,54 @@ export const MemberActions = ({ member }: MemberActionsProps) => { icon={} /> - + <> {isPendingInviteAcceptance ? ( <> - {canRevokeInvite && ( - handleRevokeInvitation(member)}> -
-

Cancel invitation

-

Revoke this invitation.

-
-
- )} - {canResendInvite && ( - <> - - handleResendInvite(member)}> -
-

Resend invitation

-

Invites expire after 24hrs.

-
-
- - )} + handleRevokeInvitation(member)} + tooltip={{ + content: { + side: 'left', + text: 'Additional permissions required to cancel invitation', + }, + }} + > +

Cancel invitation

+
+ + handleResendInvite(member)} + tooltip={{ + content: { + side: 'left', + text: 'Additional permissions required to resend invitation', + }, + }} + > +

Resend invitation

+
) : ( organizationMembersDeletionEnabled && ( - { - setIsDeleteModalOpen(true) + onClick={() => setIsDeleteModalOpen(true)} + tooltip={{ + content: { + side: 'left', + text: 'Additional permissions required to remove member', + }, }} > - -
-

Remove member

- {!canRemoveMember && ( -

Additional permissions required

- )} -
-
+ +

Remove member

+ ) )} From fbef43fbbcefea1cbb03c8e932681a5ad4adbcbf Mon Sep 17 00:00:00 2001 From: Lenny Date: Wed, 30 Jul 2025 10:05:14 -0400 Subject: [PATCH 2/2] fix: use storage endpoint in S3 settings (#37469) * fix: use storage endpoint in S3 settings * Update retrieval of endpoint for analytics bucket related components --------- Co-authored-by: Joshen Lim --- .../AnalyticBucketDetails/SimpleConfigurationDetails.tsx | 2 +- .../interfaces/Storage/StorageSettings/S3Connection.tsx | 2 +- .../Storage/StorageSettings/StorageSettings.utils.ts | 4 +++- .../studio/data/storage/iceberg-wrapper-create-mutation.ts | 7 ++----- apps/studio/pages/api/platform/projects/[ref]/settings.ts | 1 + packages/api-types/types/platform.d.ts | 1 + 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/studio/components/interfaces/Storage/AnalyticBucketDetails/SimpleConfigurationDetails.tsx b/apps/studio/components/interfaces/Storage/AnalyticBucketDetails/SimpleConfigurationDetails.tsx index d08489cf2e07c..476cce89dd7ca 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticBucketDetails/SimpleConfigurationDetails.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticBucketDetails/SimpleConfigurationDetails.tsx @@ -24,7 +24,7 @@ export const SimpleConfigurationDetails = ({ bucketName }: { bucketName: string const { data: apiKeys } = useAPIKeysQuery({ projectRef: project?.ref }) const { data: settings } = useProjectSettingsV2Query({ projectRef: project?.ref }) const protocol = settings?.app_config?.protocol ?? 'https' - const endpoint = settings?.app_config?.endpoint + const endpoint = settings?.app_config?.storage_endpoint || settings?.app_config?.endpoint const { serviceKey } = getKeys(apiKeys) const serviceApiKey = serviceKey?.api_key ?? 'SUPABASE_CLIENT_SERVICE_KEY' diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx index 4368ee7dd8218..69b2e4d297cf0 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx @@ -80,7 +80,7 @@ export const S3Connection = () => { }) const protocol = settings?.app_config?.protocol ?? 'https' - const endpoint = settings?.app_config?.endpoint + const endpoint = settings?.app_config?.storage_endpoint || settings?.app_config?.endpoint const hasStorageCreds = storageCreds?.data && storageCreds.data.length > 0 const s3connectionUrl = getConnectionURL(projectRef ?? '', protocol, endpoint) diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.utils.ts b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.utils.ts index e57efdba891dc..60c104e641ea2 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.utils.ts +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.utils.ts @@ -26,7 +26,9 @@ export const convertToBytes = (size: number, unit: StorageSizeUnits = StorageSiz } function getStorageURL(projectRef: string, protocol: string, endpoint?: string) { - const projUrl = endpoint ? `${protocol}://${endpoint}` : `https://${projectRef}.supabase.co` + const projUrl = endpoint + ? `${protocol}://${endpoint}` + : `https://${projectRef}.storage.supabase.co` const url = new URL(projUrl) return url } diff --git a/apps/studio/data/storage/iceberg-wrapper-create-mutation.ts b/apps/studio/data/storage/iceberg-wrapper-create-mutation.ts index b2d558fbddced..254297a3ca0c3 100644 --- a/apps/studio/data/storage/iceberg-wrapper-create-mutation.ts +++ b/apps/studio/data/storage/iceberg-wrapper-create-mutation.ts @@ -1,4 +1,5 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' +import { snakeCase } from 'lodash' import { WRAPPERS } from 'components/interfaces/Integrations/Wrappers/Wrappers.constants' import { @@ -8,10 +9,8 @@ import { import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { getKeys, useAPIKeysQuery } from 'data/api-keys/api-keys-query' import { useProjectSettingsV2Query } from 'data/config/project-settings-v2-query' -import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' import { FDWCreateVariables, useFDWCreateMutation } from 'data/fdw/fdw-create-mutation' import { useCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { snakeCase } from 'lodash' import { useS3AccessKeyCreateMutation } from './s3-access-key-create-mutation' export const useIcebergWrapperCreateMutation = () => { @@ -22,7 +21,7 @@ export const useIcebergWrapperCreateMutation = () => { const { data: settings } = useProjectSettingsV2Query({ projectRef: project?.ref }) const protocol = settings?.app_config?.protocol ?? 'https' - const endpoint = settings?.app_config?.endpoint + const endpoint = settings?.app_config?.storage_endpoint || settings?.app_config?.endpoint const apiKey = secretKey?.api_key ?? serviceKey?.api_key ?? 'SUPABASE_CLIENT_API_KEY' @@ -30,8 +29,6 @@ export const useIcebergWrapperCreateMutation = () => { const canCreateCredentials = useCheckPermissions(PermissionAction.STORAGE_ADMIN_WRITE, '*') - const { data: config } = useProjectStorageConfigQuery({ projectRef: project?.ref }) - const { mutateAsync: createS3AccessKey, isLoading: isCreatingS3AccessKey } = useS3AccessKeyCreateMutation() diff --git a/apps/studio/pages/api/platform/projects/[ref]/settings.ts b/apps/studio/pages/api/platform/projects/[ref]/settings.ts index c0ed53f99df54..192d8506cd9ac 100644 --- a/apps/studio/pages/api/platform/projects/[ref]/settings.ts +++ b/apps/studio/pages/api/platform/projects/[ref]/settings.ts @@ -30,6 +30,7 @@ const handleGetAll = async (req: NextApiRequest, res: NextApiResponse) => { app_config: { db_schema: 'public', endpoint: PROJECT_ENDPOINT, + storage_endpoint: PROJECT_ENDPOINT, // manually added to force the frontend to use the correct URL protocol: PROJECT_ENDPOINT_PROTOCOL, }, diff --git a/packages/api-types/types/platform.d.ts b/packages/api-types/types/platform.d.ts index 0eff38d7b2126..1064e1a8f1781 100644 --- a/packages/api-types/types/platform.d.ts +++ b/packages/api-types/types/platform.d.ts @@ -7225,6 +7225,7 @@ export interface components { app_config?: { db_schema: string endpoint: string + storage_endpoint: string } cloud_provider: string db_dns_name: string