-
- {displayProjectName}
-
-
-
-
{branchDisplayName}
+
+
+ {displayProjectName}
+
+
+
+ {branchDisplayName}
+
-
+
)
}
)
-
ProjectBranchSelectorTrigger.displayName = 'ProjectBranchSelectorTrigger'
diff --git a/apps/studio/components/ui/OrganizationProjectSelector.tsx b/apps/studio/components/ui/OrganizationProjectSelector.tsx
index 10e55d027ca..7579ae73eee 100644
--- a/apps/studio/components/ui/OrganizationProjectSelector.tsx
+++ b/apps/studio/components/ui/OrganizationProjectSelector.tsx
@@ -1,9 +1,11 @@
import { keepPreviousData } from '@tanstack/react-query'
import { useDebounce, useIntersectionObserver } from '@uidotdev/usehooks'
-import { OrgProject, useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query'
+import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query'
+import type { OrgProject } from 'data/projects/org-projects-infinite-query'
import { useSelectedOrganizationQuery } from 'hooks/misc/useSelectedOrganization'
import { ChevronsUpDown, HelpCircle } from 'lucide-react'
-import { ReactNode, useEffect, useId, useMemo, useRef, useState } from 'react'
+import type { ReactNode } from 'react'
+import { useEffect, useId, useMemo, useRef, useState } from 'react'
import {
Button,
cn,
@@ -52,6 +54,8 @@ interface OrganizationProjectSelectorSelectorProps {
modal?: boolean
/** When true, render only the command list (no popover/trigger). For use inside sheet or popover. */
embedded?: boolean
+ /** When true, render the desktop (non-embedded) command content without a trigger/popover. */
+ renderOnlyContent?: boolean
className?: string
}
@@ -72,6 +76,7 @@ export const OrganizationProjectSelector = ({
fetchOnMount = false,
modal = false,
embedded = false,
+ renderOnlyContent = false,
className,
}: OrganizationProjectSelectorSelectorProps) => {
const { data: organization } = useSelectedOrganizationQuery()
@@ -80,6 +85,7 @@ export const OrganizationProjectSelector = ({
const [openInternal, setOpenInternal] = useState(false)
const open = _open ?? openInternal
const setOpen = _setOpen ?? setOpenInternal
+ const shouldForceOpen = renderOnlyContent
const listboxId = useId()
const [search, setSearch] = useState('')
@@ -104,7 +110,7 @@ export const OrganizationProjectSelector = ({
fetchNextPage,
} = useOrgProjectsInfiniteQuery(
{ slug, search: search.length === 0 ? search : debouncedSearch },
- { enabled: fetchOnMount || open, placeholderData: keepPreviousData }
+ { enabled: fetchOnMount || open || shouldForceOpen, placeholderData: keepPreviousData }
)
const projects = useMemo(() => data?.pages.flatMap((page) => page.projects), [data?.pages]) || []
@@ -135,8 +141,7 @@ export const OrganizationProjectSelector = ({
if (!isLoadingProjects && isSuccessProjects) {
onInitialLoad?.(projects)
}
- // eslint-disable-next-line react-hooks/exhaustive-deps
- }, [isLoadingProjects, isSuccessProjects])
+ }, [isLoadingProjects, isSuccessProjects, onInitialLoad, projects])
function renderListContent() {
if (isLoadingProjects) {
@@ -190,14 +195,21 @@ export const OrganizationProjectSelector = ({
)
}
return (
-
7 ? 'h-full md:h-[210px]' : ''}>
+ 7 ? 'h-full md:h-[210px]' : ''
+ }
+ >
{projects?.map((project) => (
setOpen(false)}
+ onClose={() => {
+ if (renderOnlyContent) return
+ setOpen(false)
+ }}
renderRow={renderRow}
checkPosition={checkPosition}
isOptionDisabled={isOptionDisabled}
@@ -216,7 +228,10 @@ export const OrganizationProjectSelector = ({
const commandContent = (
{embedded && !!renderActions && (
@@ -229,26 +244,39 @@ export const OrganizationProjectSelector = ({
onValueChange={setSearch}
placeholder={searchPlaceholder}
handleReset={() => setSearch('')}
- wrapperClassName={embedded ? 'shrink-0 border-b' : undefined}
+ wrapperClassName={embedded || renderOnlyContent ? 'shrink-0 border-b' : undefined}
className="text-base sm:text-sm"
/>
-
-
- {renderListContent()}
-
- {!!renderActions && !embedded && (
- <>
-
- {renderActions(setOpen)}
- >
- )}
-
+ {renderOnlyContent ? (
+ <>
+
+
+
+ {renderListContent()}
+
+
+
+ {!!renderActions &&
{renderActions(setOpen)}
}
+ >
+ ) : (
+
+
+ {renderListContent()}
+
+ {!!renderActions && !embedded && (
+ <>
+
+ {renderActions(setOpen)}
+ >
+ )}
+
+ )}
)
@@ -256,6 +284,10 @@ export const OrganizationProjectSelector = ({
return commandContent
}
+ if (renderOnlyContent) {
+ return commandContent
+ }
+
return (
@@ -270,7 +302,6 @@ export const OrganizationProjectSelector = ({