diff --git a/apps/studio/components/interfaces/Storage/BucketRow.tsx b/apps/studio/components/interfaces/Storage/BucketRow.tsx deleted file mode 100644 index 8024003444f..00000000000 --- a/apps/studio/components/interfaces/Storage/BucketRow.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import { PermissionAction } from '@supabase/shared-types/out/constants' -import { Columns3, Edit2, MoreVertical, Trash, XCircle } from 'lucide-react' -import Link from 'next/link' -import type { CSSProperties } from 'react' -import { useState } from 'react' - -import { DeleteBucketModal } from 'components/interfaces/Storage/DeleteBucketModal' -import { EditBucketModal } from 'components/interfaces/Storage/EditBucketModal' -import { EmptyBucketModal } from 'components/interfaces/Storage/EmptyBucketModal' -import type { Bucket } from 'data/storage/buckets-query' -import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' -import { - Badge, - Button, - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger, - Tooltip, - TooltipContent, - TooltipTrigger, - cn, -} from 'ui' - -export interface BucketRowProps { - bucket: Bucket - projectRef?: string - isSelected: boolean - style?: CSSProperties - className?: string -} - -export const BucketRow = ({ - bucket, - projectRef = '', - isSelected = false, - style, - className, -}: BucketRowProps) => { - const { can: canUpdateBuckets } = useAsyncCheckPermissions(PermissionAction.STORAGE_WRITE, '*') - const [modal, setModal] = useState(null) - const onClose = () => setModal(null) - - return ( -
- {/* Even though we trim whitespaces from bucket names, there may be some existing buckets with trailing whitespaces. */} - -
-

- {bucket.name} -

- {bucket.public && Public} - {bucket.type === 'ANALYTICS' && ( - - - - - -

Analytics bucket

-
-
- )} -
- - {canUpdateBuckets && isSelected ? ( - - -
diff --git a/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx b/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx index c73beac4c07..41eda652437 100644 --- a/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx +++ b/apps/studio/components/interfaces/Storage/FilesBuckets/index.tsx @@ -67,7 +67,6 @@ export const FilesBuckets = () => { buckets.filter((bucket) => !('type' in bucket) || bucket.type === 'STANDARD').length === 0 ? ( ) : ( - // Add !pt-8 to override the default first:pt-12
diff --git a/apps/studio/components/interfaces/Storage/Storage.constants.ts b/apps/studio/components/interfaces/Storage/Storage.constants.ts index 2d319ec4bb2..996debf5b2d 100644 --- a/apps/studio/components/interfaces/Storage/Storage.constants.ts +++ b/apps/studio/components/interfaces/Storage/Storage.constants.ts @@ -60,14 +60,12 @@ export const CONTEXT_MENU_KEYS = { STORAGE_FOLDER: 'STORAGE_FOLDER', } -// New bucket types configuration - export const BUCKET_TYPES = { files: { displayName: 'Files', singularName: 'file', article: 'a', - description: 'General file storage for most types of digital content.', + description: 'General file storage for most types of digital content', valueProp: 'Store images, videos, documents, and any other file type.', docsUrl: `${DOCS_URL}/guides/storage/buckets/fundamentals`, }, @@ -75,7 +73,7 @@ export const BUCKET_TYPES = { displayName: 'Analytics', singularName: 'analytics', article: 'an', - description: 'Purpose-built storage for analytical workloads.', + description: 'Purpose-built storage for analytical workloads', valueProp: 'Store large datasets for analytics and reporting.', docsUrl: `${DOCS_URL}/guides/storage/analytics/introduction`, }, @@ -83,7 +81,7 @@ export const BUCKET_TYPES = { displayName: 'Vectors', singularName: 'vector', article: 'a', - description: 'Purpose-built storage for vector data.', + description: 'Purpose-built storage for vector data', valueProp: 'Store, index, and query your vector embeddings at scale.', docsUrl: `${DOCS_URL}/guides/storage/vectors`, }, diff --git a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePolicies.tsx b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePolicies.tsx index 3eddab93402..2df739a44e9 100644 --- a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePolicies.tsx +++ b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePolicies.tsx @@ -15,7 +15,7 @@ import { useDatabasePolicyDeleteMutation } from 'data/database-policies/database import { useDatabasePolicyUpdateMutation } from 'data/database-policies/database-policy-update-mutation' import { useBucketsQuery } from 'data/storage/buckets-query' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' -import { Loader } from 'lucide-react' +import { GenericSkeletonLoader } from 'ui-patterns' import ConfirmModal from 'ui-patterns/Dialogs/ConfirmDialog' import { formatPoliciesForStorage } from '../Storage.utils' import { StoragePoliciesBucketRow } from './StoragePoliciesBucketRow' @@ -182,9 +182,9 @@ export const StoragePolicies = () => { return (
{isLoading ? ( -
- -
+ + + ) : (
diff --git a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesPlaceholder.tsx b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesPlaceholder.tsx index 50bee986b54..acc450aac78 100644 --- a/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesPlaceholder.tsx +++ b/apps/studio/components/interfaces/Storage/StoragePolicies/StoragePoliciesPlaceholder.tsx @@ -1,10 +1,10 @@ -import { CardContent, Card } from 'ui' +import { Card, CardContent } from 'ui' const StoragePoliciesPlaceholder = () => ( -

- Create a bucket first to start writing policies! +

+ Create a bucket first to start writing policies

diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx index 3911ec4150c..4adb087aa5f 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/S3Connection.tsx @@ -125,7 +125,7 @@ export const S3Connection = () => {
Connection - Connect to your bucket using any S3-compatible service via the S3 protocol. + Connect to your bucket using any S3-compatible service via the S3 protocol
@@ -153,7 +153,7 @@ export const S3Connection = () => { @@ -242,7 +242,7 @@ export const S3Connection = () => {
Access keys - Manage your access keys for this project. + Manage your access keys for this project
diff --git a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx index 14254f3aef2..2929585ddb6 100644 --- a/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx +++ b/apps/studio/components/interfaces/Storage/StorageSettings/StorageSettings.tsx @@ -16,6 +16,7 @@ import UpgradeToPro from 'components/ui/UpgradeToPro' import { useProjectStorageConfigQuery } from 'data/config/project-storage-config-query' import { useProjectStorageConfigUpdateUpdateMutation } from 'data/config/project-storage-config-update-mutation' import { useBucketsQuery } from 'data/storage/buckets-query' +import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' import { useAsyncCheckPermissions } from 'hooks/misc/useCheckPermissions' import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization' import { DOCS_URL } from 'lib/constants' @@ -47,12 +48,10 @@ import { } from './StorageListV2MigrationCallout' import { STORAGE_FILE_SIZE_LIMIT_MAX_BYTES_CAPPED, - STORAGE_FILE_SIZE_LIMIT_MAX_BYTES_FREE_PLAN, STORAGE_FILE_SIZE_LIMIT_MAX_BYTES_UNCAPPED, StorageSizeUnits, } from './StorageSettings.constants' import { convertFromBytes, convertToBytes } from './StorageSettings.utils' -import { useCheckEntitlements } from 'hooks/misc/useCheckEntitlements' const formId = 'storage-settings-form' @@ -250,7 +249,7 @@ export const StorageSettings = () => { render={({ field }) => ( Optimize and resize images on the fly.{' '} diff --git a/apps/studio/components/layouts/ProjectLayout/index.tsx b/apps/studio/components/layouts/ProjectLayout/index.tsx index 43bc5ec4668..451cb975512 100644 --- a/apps/studio/components/layouts/ProjectLayout/index.tsx +++ b/apps/studio/components/layouts/ProjectLayout/index.tsx @@ -64,7 +64,6 @@ export interface ProjectLayoutProps { productMenu?: ReactNode selectedTable?: string resizableSidebar?: boolean - stickySidebarBottom?: boolean productMenuClassName?: string } @@ -79,7 +78,7 @@ export const ProjectLayout = forwardRef - + {productMenu} diff --git a/apps/studio/next.config.js b/apps/studio/next.config.js index 8ee8cdbdf9e..32fd52b74a1 100644 --- a/apps/studio/next.config.js +++ b/apps/studio/next.config.js @@ -149,6 +149,11 @@ const nextConfig = { destination: '/project/:ref/storage/files', permanent: true, }, + { + source: '/project/:ref/storage/policies', + destination: '/project/:ref/storage/files/policies', + permanent: true, + }, { source: '/project/:ref/storage/buckets/:bucketId', destination: '/project/:ref/storage/files/buckets/:bucketId', @@ -156,7 +161,12 @@ const nextConfig = { }, { source: '/project/:ref/settings/storage', - destination: '/project/:ref/storage/settings', + destination: '/project/:ref/storage/files/settings', + permanent: true, + }, + { + source: '/project/:ref/storage/settings', + destination: '/project/:ref/storage/files/settings', permanent: true, }, { diff --git a/apps/studio/pages/project/[ref]/auth/hooks.tsx b/apps/studio/pages/project/[ref]/auth/hooks.tsx index b3a04bfb3ba..302f3129d17 100644 --- a/apps/studio/pages/project/[ref]/auth/hooks.tsx +++ b/apps/studio/pages/project/[ref]/auth/hooks.tsx @@ -41,7 +41,7 @@ Hooks.getLayout = (page) => ( {page} diff --git a/apps/studio/pages/project/[ref]/auth/oauth-server.tsx b/apps/studio/pages/project/[ref]/auth/oauth-server.tsx index 58e88fa8636..4f70f8e00f2 100644 --- a/apps/studio/pages/project/[ref]/auth/oauth-server.tsx +++ b/apps/studio/pages/project/[ref]/auth/oauth-server.tsx @@ -18,7 +18,7 @@ ProvidersPage.getLayout = (page) => ( {page} diff --git a/apps/studio/pages/project/[ref]/database/types.tsx b/apps/studio/pages/project/[ref]/database/types.tsx index 43ce203922e..4ca21bc0530 100644 --- a/apps/studio/pages/project/[ref]/database/types.tsx +++ b/apps/studio/pages/project/[ref]/database/types.tsx @@ -17,7 +17,7 @@ const DatabaseEnumeratedTypes: NextPageWithLayout = () => {
diff --git a/apps/studio/pages/project/[ref]/storage/policies.tsx b/apps/studio/pages/project/[ref]/storage/policies.tsx deleted file mode 100644 index debcf304dfb..00000000000 --- a/apps/studio/pages/project/[ref]/storage/policies.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { StoragePolicies } from 'components/interfaces/Storage/StoragePolicies/StoragePolicies' -import DefaultLayout from 'components/layouts/DefaultLayout' -import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import { ScaffoldContainer } from 'components/layouts/Scaffold' -import StorageLayout from 'components/layouts/StorageLayout/StorageLayout' -import type { NextPageWithLayout } from 'types' - -const StoragePoliciesPage: NextPageWithLayout = () => { - return -} - -StoragePoliciesPage.getLayout = (page) => ( - - - - {page} - - - -) - -export default StoragePoliciesPage diff --git a/apps/studio/pages/project/[ref]/storage/settings.tsx b/apps/studio/pages/project/[ref]/storage/settings.tsx deleted file mode 100644 index fb18607e983..00000000000 --- a/apps/studio/pages/project/[ref]/storage/settings.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { S3Connection } from 'components/interfaces/Storage/StorageSettings/S3Connection' -import { StorageSettings } from 'components/interfaces/Storage/StorageSettings/StorageSettings' -import DefaultLayout from 'components/layouts/DefaultLayout' -import { PageLayout } from 'components/layouts/PageLayout/PageLayout' -import { ScaffoldContainer } from 'components/layouts/Scaffold' -import StorageLayout from 'components/layouts/StorageLayout/StorageLayout' -import type { NextPageWithLayout } from 'types' - -const StorageSettingsPage: NextPageWithLayout = () => { - return ( - <> - - - - ) -} - -StorageSettingsPage.getLayout = (page) => ( - - - - {page} - - - -) -export default StorageSettingsPage diff --git a/apps/studio/public/img/previews/new-storage-preview.png b/apps/studio/public/img/previews/new-storage-preview.png deleted file mode 100644 index 18e6b9344d6..00000000000 Binary files a/apps/studio/public/img/previews/new-storage-preview.png and /dev/null differ diff --git a/packages/ui-patterns/src/MobileSheetNav/MobileSheetNav.tsx b/packages/ui-patterns/src/MobileSheetNav/MobileSheetNav.tsx index 5ed69ad389d..6e06fc0621d 100644 --- a/packages/ui-patterns/src/MobileSheetNav/MobileSheetNav.tsx +++ b/packages/ui-patterns/src/MobileSheetNav/MobileSheetNav.tsx @@ -11,8 +11,7 @@ const MobileSheetNav: React.FC<{ children: React.ReactNode open?: boolean onOpenChange(open: boolean): void - stickyBottom?: boolean -}> = ({ children, open = false, onOpenChange, stickyBottom = false }) => { +}> = ({ children, open = false, onOpenChange }) => { const router = useRouter() const { width } = useWindowSize() @@ -32,10 +31,7 @@ const MobileSheetNav: React.FC<{ showClose={false} size="full" side="bottom" - className={cn( - 'rounded-t-lg overflow-hidden overflow-y-scroll h-[85dvh] md:max-h-[500px]', - stickyBottom ? 'pt-2 pb-0' : 'py-2' - )} + className={cn('rounded-t-lg overflow-hidden overflow-y-scroll h-[85dvh] md:max-h-[500px]')} > }>{children}